生成器
要创建一个生成器,只需要将函数中的return替换为yield即可:
def squares(n=10):
print 'Generating squares from 1 to %d' % (n**2)
for i in xrange(1, n+1):
yield i ** 2
调用生成器时,没有任何代码会即刻执行, 只有从该生成器中请求元素的时候,它才开始执行代码。
generator = squares()
for x in generator:
print x,
Generating squares form 1 to 100
1 4 9 16 25 36 49 64 81 100
标准库itertools
中有一组用于许多常见数据算法的生成器
生成器表达式
懒惰的列表解析
(expr for iter_var in iterable if cond_expr)
生成器表达式使用了“延迟计算”(lazy evaluation),所以它在使用内存上更有效。
例子:
计算平均词长
count = 0
total = 0
for token in tokens:
count += 1
total += len(token)
print total/count
total = sum(len(t) for t in tokens) #生成器表达式
print total/ len(tokens)