如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?这样就不必创建完整的list,从而节省大量的空间。在Python中,这种一边循环一边计算的机制,称为生成器:generator。
要创建一个generator,有很多种方法。第一种方法很简单,只要把一个列表生成式的
[]
改成()
,就创建了一个generator
可以通过
next()
函数获得generator的下一个返回值
但是基本不会用next()
来获取值,而是通过for
循环来迭代取值。
g = (x * x for x in range(10))
print(g)
<generator object <genexpr> at 0x1022ef630>
print(next(g))
print(next(g))
结果为:
0和1
定义generator的另一种方法。如果一个函数定义中包含yield关键字,那么这个函数就不再是一个普通函数,而是一个generator
def fib(max):
n, a, b = 0, 0, 1
while n < max:
yield b
L = (b, a + b)
a = L[0]
b = L[1]
n = n + 1
return 'done'
print(fib(6))
这样就是通过generator来实现求斐波那契数列
杨辉三角定义如下:
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
把每一行看做一个list,试写一个generator,不断输出下一行的list:
def triangles():
L = [1]
while True:
yield L
L1 = [0] + L[:]
L = [L[i]+L1[i] for i in range(len(L))] + [1]
i = 0
for t in triangles():
print(t)
i = i + 1
if i == 10:
break
个人遇到的问题:当L=[1]
、L1=[0, 1]
时,L2 = [L[i]+L1[i] for i in range(len(L))] = [1]
。
并非[1, 1]
!