1. generator表达式:
#generator表达式
def test1():
L = [ x*2 for x in range(5)] #list conprehension
G = ( x*2 for x in range(5))
p(next(G))
p(next(G))
p(next(G))
p(next(G))
p(next(G)) #因为G的元素个数最大为5
next(G) #报异常StopIteration
#test1()
def test2():
G = ( x*2 for x in range(5))
for g in G: #自动处理了StopIteration
p(g)
#test2()
2. generator函数:yield
def fib(times):
n=0
a,b=0,1
while n<times:
yield b #yield(放弃)函数执行到这个地方会交出CPU控制权,停止执行,调用next再继续
a,b=b,a+b
n=n+1
return "done"
g = fib(5) #应该是5个元素,一次next(g)消耗一个。消耗完这个g就会销毁 {本次已经用了一个元素}
print(next(g),'
')
for x in g: #还能用4次
print(x)
#print(next(g),'
') #g的元素已经被for用完了
3. send(), next(), __next__()
- 都是用来激活generator的函数
send(实参)
可以给generator发送数据,实现外部控制内部对象名.send(None)
等价于next(对象名)
,对象名.__next__()
;所以send()
是核心
代码测试:
def gen(times):
n=0
while n<times:
temp = yield n*2
print("temp = ", temp)
n=n+1
return "done"g = gen(5) #5次循环,5个元素
g.send(None) # 等价于next(g),启动generator,以后默认都会
g.send(666) #发送了666给temp
print(' ')
for x in g: #现在g里面还能生产3个元素
print("x = ", x)