张家港做网站优化价格,网络市场调研的五个步骤,深圳的设计网站大全,山东住房建设厅官网站首页第一次见这样的语法
本人之前一直是Java工程师#xff0c;最近接触了一个Python项目#xff0c;第一次看到如下的代码#xff1a;
i sum(letter in target_arr for letter in source_arr)这条语句是计算source 与 target 数组中有几个单词是相同的。
当我第一眼看到这样…第一次见这样的语法
本人之前一直是Java工程师最近接触了一个Python项目第一次看到如下的代码
i sum(letter in target_arr for letter in source_arr)这条语句是计算source 与 target 数组中有几个单词是相同的。
当我第一眼看到这样的写法的时候我的第一感觉是这样的。 我读书少见识少那是真不懂于是赶紧孤狗一下想要一探究竟。
原来这叫生成器表达式
生成器表达式语法
生成器表达式Generator Expression是一种简洁高效地创建迭代器Iterator的方式。它类似于列表推导式List Comprehension但生成器表达式使用圆括号 () 而不是方括号 []。 生成器表达式的语法 (expression for item in iterable if condition) expression对每个元素进行的操作生成迭代器中的值。 item迭代变量表示可迭代对象 iterable 中的每个元素。 iterable可迭代对象例如列表、元组、字符串等。 condition可选的过滤条件只有满足条件的元素才会被处理。 生成器表达式的特点 惰性求值 生成器表达式不会一次性计算所有元素而是按需生成。这样可以节省内存特别是在处理大量数据时。 返回迭代器 生成器表达式返回一个迭代器对象可以通过 for 循环或 next() 函数来遍历其中的元素。 不可索引 迭代器不支持索引操作不能像列表那样通过下标访问元素。 生成器表达式的应用 过滤数据 even_numbers (x for x in range(10) if x % 2 0) # 偶数 映射数据 squares (x**2 for x in range(5)) # 平方数 组合数据 pairs ((x, y) for x in [1, 2] for y in [3, 4]) # [(1, 3), (1, 4), (2, 3), (2, 4)] 传递给函数 sum(x for x in range(100) if x % 3 0) # 3 的倍数之和
生成器表达式 vs. 列表推导式
特点生成器表达式列表推导式返回值迭代器对象列表惰性求值是否内存占用低高适用场景处理大量数据、只需遍历一次的数据需要多次访问数据、需要索引操作的数据
案例分析
回到我们的案例中来我们根据语法解释对我们文章开始的案例进行拆解。
i sum(letter in target_arr for letter in source_arr)(expression for item in iterable if condition)对应关系
语法元素生成器表达式中的元素解释expressionletter in target_arr对于每个 letter判断它是否存在于target_arr 中返回布尔值itemletter迭代变量表示 source_arr 中的每个元素iterablesource_arr可迭代对象源字符串数组condition(无)此处没有过滤条件所有 letter 都会被处理
总结
生成器表达式会遍历 source_arr 中的每个 letter。对于每个 letter计算 letter in target_arr得到一个布尔值True 或 False。sum 函数将这些布尔值相加得到匹配的总次数即 match_score。
注意事项
这里没有使用 if condition 部分表示不对元素进行过滤所有元素都会参与计算。由于 Python 中 True 被视为 1False 被视为 0所以 sum 函数可以直接对布尔值求和。
希望这个详细的语法讲解能帮助您更好地理解生成器表达式的语法和用法
关注我的公众号
欢迎大家关注、点赞、转发一起交流软件开发、架构设计、云原生技术。