Python 生成器

1.生成器原理

def func():
    print('before yield1')
    yield "i am yield1"   # 将后面的值返回
    print('before yield2')
    yield "i am yield2"
    print('before yield3')
    yield "i am yield3"
f = func() #执行生成器函数,内部不执行
print(f,type(f)) # <generator object func at 0x00000000035EBA40>  <class 'generator'>
res = f.__next__() #执行函数内部前两行
print(res)
res = f.__next__()
print(res)
res = f.__next__()
print(res)
res = f.__next__() #执行出错,有多少个yield,执行多少个next,否则抛出异常
print(res)

 2.yield 与 return

def func(n):
    start = 1
    while True:
        if start > n:
            return
        yield start
        start += 1

f = func(3)
res1 = f.__next__()
res2 = f.__next__()
res3 = f.__next__()
res4 = f.__next__() #出错,函数执行到这里的时候已经退出,找不到下一个yield
print(res1,res2,res3)

 3.send

#send 执行流程,执行发送一个值给当前yield 等号左边变量,执行到下一个yield,返回下一个yield的右边值
def func():
    print('a')
    m = yield 1  #第一次send(None) ,找到第一个yield
    print(m)   # 11
    print('b')
    n = yield 2
    print(n)  # 22
    print('c')

f = func()
f.send(None)#send 与 next 方法类似,send 可以传递一个值,第一次要send 空, 返回1
f.send(11) 
f.send(22)  #抛出异常,找不到下一个yield

 

posted @ 2017-04-29 10:16  1916  阅读(100)  评论(0)    收藏  举报