34-高级特性之generator(2)

1. generator表达式:

generator表达式

def test1():
L = [ x2 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),'\n')

for x in g: #还能用4次
print(x)

print(next(g),'\n') #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('\n')
    for x in g: #现在g里面还能生产3个元素
    print("x = ", x)

posted @ 2018-03-04 14:04  hzhang_NJU  阅读(138)  评论(0)    收藏  举报