问题
对数据序列转换或过滤后,执行聚合操作,比如 sum() , min() , max()等。
解决方案
一个非常优雅的实现方式,使用一个生成器表达式去过滤或转换数据,再执行相关操作。比如,如果你想计算平方和,可以像下面这样做:
# case-1
nums = [1, 2, 3, 4, 5]
s = sum(x * x for x in nums)
print(s)
55
# case-2
s = ('ACME', 50, 123.45)
print(','.join(str(x) for x in s))
ACME,50,123.45
讨论
上面的示例演示了当生成器表达式作为一个单独参数,传递给函数时的巧妙语法,实际上并不需要多加一个括号。 比如,下面这些语句是等效的:
s = sum((x * x for x in nums)) # 显式的传递一个生成器表达式对象
s = sum(x * x for x in nums) # 更加优雅的实现方式,省略了括号
使用一个生成器表达式作为参数,会比先创建一个临时列表更加高效和优雅。 比如,如果你不使用生成器表达式的话,你可能会考虑使用下面的实现方式:
nums = [1, 2, 3, 4, 5]
s = sum([x * x for x in nums])
这种方式同样可以达到想要的效果,但是它会多一个步骤,先创建一个额外的列表。 对于小型列表可能没什么关系,但是如果元素数量非常大时, 它会创建一个巨大的仅仅被使用一次就被丢弃的临时数据结构。而生成器方案会以迭代的方式转换数据,因此更省内存。
网友评论