请稍候,加载中....

生成器

生成器就是生成迭代器对象的函数,除了可以使用生成式来创建一个生成器外,还可以在函数内部通过yield语句来实现生成器

yield语句

yield语句可以在函数内部多次返回值,与return不一样,return后,函数将会结束,yield语句在返回后,会记住函数内部状态,当下次再次执行函数的时候,会接着上次状态继续执行(记忆局部变量,循环)

def generator_iter():
    yield 1
    yield 2
    yield 3

my_iter = generator_iter()

# 生成器可以被迭代
for i in my_iter:
    print(i)

# 输出 1 2 3
# 通常情况下,当生成器迭代完成后,会自动close,可以选择手动关闭生成器
# my_iter.close()

generator_iter称为生成器函数,执行后返回一个迭代器my_iter,称为生成器

斐波拉契生成器

def fb_generate(n):
    fb_lists = [1, 1]

    for fb in fb_lists:
        if len(fb_lists) < n: 
            fb_lists.append(sum(fb_lists[-2:]))
        yield fb

生成20位斐波拉契数列

for fb in fb_generate(20):
    print(fb)

yield from子迭代表达式

yield表达式也可以通过另一个子生成器生成一个新的迭代器

def generator_iter():
      yield from range(10)
my_iter = generator_iter()
for i in my_iter: print(i)
# 输出0 1 2 3 4 5 6 7 8 9

生成器send方法

yield语句除了可以返回迭代数据,还可以通过send来接受数据

# 通过yield接受外部输入
def generator_send():
    while True:
        # 在此等待输入
        n = yield
        if n % 2 == 0:
             print("%s 是 偶数" % n)
        else:
             print("%s 是非偶数" % n)
my_yield = generator_send()
# next到第一次yield
next(my_yield)

# 通过send向生成器函数发送数据
my_yield.send(10)
# 10 是 偶数
my_yield.send(11)
# 11 是非偶数
my_yield.close()

Python学习手册-