34-高级特性之generator(2)

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),'\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  阅读(102)  评论(0编辑  收藏  举报