问题
如果需要调用一个换算函数(例如sum()、min()、max()),就需要首先对数据做转换和筛选。
解决方案
在函数参数中使用生成器表达式。
示例1:
nums = [1,2,3,4]
s = sum(x*x for x in nums)
print s
#s=30
示例2:
portfolio=[{'name':'goog','shares':50},{'name':'go','shares':90},{'name':'pp','shares':5},{'name':'gc','shares':23}]
min_shares = min(s['shares'] for s in portfolio)
print min_shares
#min_shares=5
如果不使用生成器做参数,可以考虑以下这种实现:
nums = [1,2,3,4]
s = sum([x*x for x in nums])
#s=30
比起首先创建一个临时的列表,使用生成器做参数通常是更为高效和优雅的方式。对于引入一个这么小的临时列表,无关紧要,但是如果nums非常巨大,那么就会创建一个庞大的数据结构,而且只用一次就丢弃。
基于生成器的解决方案可以以迭代的方式转换数据,因此在内存使用上高效的多。
网友评论