创建生成器
创建L
和g
的区别仅在于最外层的[]
和()
,L
是一个list,而g
是一个generator。
>>> L = [x * x for x in range(10)]
>>> L
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
>>> g = (x * x for x in range(10))
>>> g
<generator object <genexpr> at 0x000000000315B200>
通过next()
函数获得generator的下一个返回值
>>> next(g)
0
>>> next(g)
1
调用next到没有元素的时候,会有StopIteration的错误
循环打印
>>> g = (x * x for x in range(10))
>>> for n in g:
... print(n)
...
0
1
4
9
16
25
36
49
64
81
def fib(max):
n, a, b = 0, 0, 1
while n < max:
print(b)
a, b = b, a + b
n = n + 1
return 'done'
a, b = b, a + b
相当于:
t = (b, a + b) # t是一个tuple 元组
a = t[0]
b = t[1]
如果一个函数定义中包含yield
关键字,那么这个函数就不再是一个普通函数,而是一个generator
def fib(max):
n, a, b = 0, 0, 1
while n < max:
yield b
a, b = b, a + b
n = n + 1
return 'done'
>>> f = fib(6)
>>> f
<generator object fib at 0x104feaaa0>
generator的函数,每次调用
next()
的时候执行,遇到
yield
语句返回,再次执行时从上次返回的
yield
语句处继续执行