Python3的生成器

来源:互联网 发布:上班玩游戏 知乎 编辑:程序博客网 时间:2024/06/05 06:22

跟普通函数不同的是,生成器是一个返回迭代器的函数,只能用于迭代操作,更简单点理解生成器就是一个迭代器。

列表推导式用中括号,生成器表达式用小括号

>>>[i for i in range(5)]       #列表解析
>>>g = (i for i in range(5))   #小括号() #生成器表达式,不用yield的表达形式>>> type(g)          #这是一个迭代对象<class 'generator'>>>>print(next(g))    #next(g)相当于g.__next__()0>>>print(next(g))  1  >>>print(next(g))    #迭代到头是len(list(range(5)))2     #或者直接用sum迭代到头>>> sum(g)9>>> print(next(g))  #迭代到头再迭代生产会报错Traceback (most recent call last):  File "<pyshell#6>", line 1, in <module>    print(next(g))StopIteration

在 Python 中,使用了 yield 的函数被称为生成器(generator)。在调用生成器运行的过程中,每次遇到 yield 时,函数会暂停,并保存当前所有的运行信息,返回yield的值在下一次执行 next()方法时,从当前位置继续运行
生成器函数和普通函数定义类似,不过要有标志性语句:yeild,返回生成器,通过next进行断电式运行。

>>> def gener():    yield 3 >>> g=gener();type(g)<class 'generator'>>>> next(g)3>>> next(g)Traceback (most recent call last):  File "<pyshell#12>", line 1, in <module>    next(g)StopIteration
>>> def gen_test():    while True:        yield 3        print('once time')>>> g=gen_test()   #生成器对象g>>> type(g)<class 'generator'>>>> next(g) #生成器执行到yield暂停,并返回yield值3>>> next(g) #生成器从暂停处开始执行,到下一个yield执行完停止once time3>>> next(g)once time3

下面例子对比上面例子,区别yield&print和yield&return连用的结果,形象化理解生成器的yield执行层级

>>> def gen_test1():    while True:        yield 3        return "stop"   >>> g1=gen_test1()>>> type(g1)<class 'generator'>>>> next(g1)3>>> next(g1)    #从上一次yield停止处执行returnTraceback (most recent call last):  File "<pyshell#13>", line 1, in <module>    next(g1)StopIteration: stop

以下实例使用 yield 实现斐波那契数列:

import sys def fibonacci(n):    #生成器函数————斐波那契    a,b,counter=0,1,0    while True:        if (counter>n):             return        yield a   #yield在return后,先不报错返回,在停止        a,b=b,a+b        counter +=1f=fibonacci(10)    #f是一个迭代器,由生成器返回生成 while True:    try:        print (next(f), end=" ")   #next()调用生成器    except StopIteration:   #异常提示        sys.exit()>>>0 1 1 2 3 5 8 13 21 34 55
原创粉丝点击