你需要在数据序列上执行聚集函数(比如 sum()
, min()
, max()
), 但是首先你需要先转换或者过滤数据
nums = [1, 2, 3, 4, 5]
s = sum(x * x for x in nums)
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])
这种方式同样可以达到想要的效果,但是它会多一个步骤,先创建一个额外的列表。 对于小型列表可能没什么关系,但是如果元素数量非常大的时候, 它会创建一个巨大的仅仅被使用一次就被丢弃的临时数据结构。而生成器方案会以迭代的方式转换数据,因此更省内存
同时在使用一些聚集函数比如min()和max()时候更加倾向生成器版本。
min_shares = min(s['shares'] for s in portfolio)
min_shares = min(portfolio, key=lambda s: s['shares'])