马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
49课时:乱入:生成器
生成器是一种特殊的迭代器,有了迭代器为什么还要生成器呢?因为可以使得python更为简洁优雅,因为生成器不需要在类里面重写__iter_()和__next__()方法,只需要加入一个yield语句。
yield语句
协同程序:所谓的协同程序就是可以运行的独立函数调用,函数可以暂停或者挂起,并在需要的时候从程序离开的地方继续或者重新开始。python里的生成器就类似协同程序。一旦一个函数里面出现了yield语句,这个函数就被视作一个生成器。
以普通函数为例,函数运行后把控制权交还给用户有三种情况:1、出现异常2、遇到return等人为设置的退出动作3、完全运行结束。这就是一个完整的运行流程
加入一个yield语句后运行流程暂停并返回一个值,然后遇到调用回到刚刚暂停的地方继续执行下去。这就是yield语句的作用
举例说明:>>> def my_fun():
print('生成器被执行!')
yield 1
yield 2
>>> test = my_fun()
>>> next(test) #生成器是特殊的迭代器,可以使用next()
生成器被执行! #遇到第一个yield,暂停流程,并把后面的1返回
1
>>> next(test) #再次执行,又遇到yield,暂停并返回2
2
>>> next(test) #再执行,后面没有代码要执行了,就抛出StopIteration
Traceback (most recent call last):
File "<pyshell#15>", line 1, in <module>
next(test)
StopIteration
试试斐波那契数列>>>def fibs():
x = 0
y = 1
while True:
x, y = y, x+y
yield x
>>> for i in fibs():
if i >100:
break
else:
print(i, end=' ')
1 1 2 3 5 8 13 21 34 55 89
[b]
生成器表达式[/b]>>> [i for i in range(10)]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> (i for i in range(10))
<generator object <genexpr> at 0x0392C990>
前者是一个列表推导式,后者把中括号改为圆括号就成为了一个生成器表达式。
生成器表达式返回的是一个生成器对象,可以作为函数的参数来使用。
例如:
>>> sum(i for i in range(10)) #作为参数可以不用加上括号
45
|