一 生成器与yield
若函数体包含yield关键字,再调用函数,并不会执行函数体代码,得到的返回值即生成器对象
>>> def my_range(start,stop,step=1):
... print(‘start...‘)
... while start < stop:
... yield start
... start+=step
... print(‘end...‘)
...
>>> g=my_range(0,3)
>>> g
<generator object my_range at 0x104105678>
生成器内置有__iter__和__next__方法,所以生成器本身就是一个迭代器
>>> g.__iter__
<method-wrapper ‘__iter__‘ of generator object at 0x1037d2af0>
>>> g.__next__
<method-wrapper ‘__next__‘ of generator object at 0x1037d2af0>
因而我们可以用next(生成器)触发生成器所对应函数的执行,
>>> next(g) # 触发函数执行直到遇到yield则停止,将yield后的值返回,并在当前位置挂起函数
start...
0
>>> next(g) # 再次调用next(g),函数从上次暂停的位置继续执行,直到重新遇到yield...
1
>>> next(g) # 周而复始...
2
>>> next(g) # 触发函数执行没有遇到yield则无值返回,即取值完毕抛出异常结束迭代
end...
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
二 yield表达式应用
三 三元表达式、列表生成式、生成器表达式
原文:https://www.cnblogs.com/liunaixu/p/12657021.html