#生成器generator
python中,一边循环一边计算的机制,成为生成器
利用生成器,可以减少内存使用
生成方法一生成器表达式
1
2
3a = (x for x in range(10))
for b in a: print(b,end=' ')
print()生成方法二生成器函数
1
2
3
4
5
6
7def fib(maxn):
n,a,b = 0,0,1
while n<maxn:
yield b
a,b = b,a+b
n = n+1
a = fib(8);print(a)#a是一个generator输出方法一for循环迭代输出
1
2for x in a: print(x,end=' ')
print()输出方法二next()迭代输出
1
2
3
4
5
6
7
8while True :
try:
x = next(a)
print(x,end=' ')
except StopIteration as e:
print('\nGenertor return value:',e.value)
break
print(a)
每次调用next()的时候,遇到yield返回,下一次从返回处继续执行
循环不断调用yield,就会不断中断,从而边计算边取值,达到节省内存效果
可以用yield方法调用,当没有更多元素时,抛出StopIteration错误
注意:生成器只能遍历一次
1
2
3
4
5#以下代码只能输出一组结果
for x in a: print(x,end=' ')
print()
for x in a: print(x,end=' ')
print()利用打印杨辉三角
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16def test(maxn):
ans = [1];yield ans
ans = [1,1];yield ans
n,tmp = 2,[1,1]#等式右边相当于一个tuple分别给等式左边变量赋值
while n<maxn:
ans = []
n = n+1
ans.append(1)
for i in range(n-2):
ans.append(tmp[i]+tmp[i+1])
ans.append(1)
tmp = ans
yield ans
a = test(10)
for x in a:
print(x)