定义
如果列表元素可以按照某种算法推算出来,在循环的过程中不断推算出后续的元素呢,一边循环一边计算。
优点
1.节省内存空间
用()创建generator
用()代替列表生成式的[]
g=(x*x for x in range(10))
for i in g:
print(i,end=' ')
运行结果:0 1 4 9 16 25 36 49 64 81
生成器的输出除了用for外,还可以用next()计算下一个值:
g=(x*x for x in range(10))
print(next(g))
print(next(g))
print(next(g))
print(next(g))
运行结果:
0
1
4
9
用yield创建generator
用yield实现斐波那契数列
第二种用for输出
def fib(max):
n,a,b=0,0,1
while n<max:
yield b
a,b=b,b+a
n+=1
return
o=fib(6)
for i in o:
print(i,end=' ')
运行结果:1 1 2 3 5 8
第二种用next()函数输出
def fib(max):
n,a,b=0,0,1
while n<max:
yield b
a,b=b,b+a
n+=1
return
o=fib(6)
print(next(o))
print(next(o))
print(next(o))
print(next(o))
运行结果:
1
1
2
3
用next()控制yield的执行方式
每次调用next()函数时,遇到yield时返回,再次运行时从返回处继续执行
StopIteration错误
在生成器没有下一个值了,但仍然要next时会报错,有时也用StopIteration的value值来存放return值。
def fib(max):
n,a,b=0,0,1
while n<max:
yield b
a,b=b,b+a
n+=1
return 'done'
o=fib(6)
while True:
try:
i=next(o)
print(i)
except StopIteration as e:
print(e.value)
break#important
运行结果:
1
1
2
3
5
8
done
yield 与return的区别
1.是否终止:yield不结束程序执行,return在返回执行结果的同时终止程序执行
2.变量保存:yield退出函数时变量仍然存在,return销毁局部变量
还可以看看《线程、进程、协程/微线程》里yield和send用于协成的应用
参考网址: