python中的yield关键字
作者:互联网
为了理解yield关键字,首先我们要看一下iterable和iterator。
iterable 和 iterator
在python中,对可iterable的对象使用iter()方法会生成一个iterator。如下:
>>> str = "ab"
>>> iterator = iter(str)
>>> next(iterator)
'a'
>>> next(iterator)
'b'
需要注意的是一个iterator只能使用一次。当iterator将对象遍历完之后,就会抛出异常。
>>> next(iterator)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
当我们在python中使用for in
语句时,其实python是对一个可iterable的对象进行处理,首先生成其iterator,接着不断调用next()
>>> for ch in str:
... print(ch)
a
b
c
d
iterator的官方定义如下:
Iterator
一个代表了数据流的对象。反复调用__next__()方法,不断返回数据流中的数据,直至数据耗尽,抛出StopIteration异常。Iterator需要定义__iter__()方法用于Iterator Object本身。
为什么需要iterator
考虑一个集合存储了许多元素无法同时加载到内存中,这时我们就可以使用iterator,只有使用时才将其加载出来。
generator
generator是一种特殊的iterator,其通过调用一个包含yield关键字的函数或者generator expression生成。
# generator expression
>>> gen_expr = (x**2 for x in range(3))
>>> gen_expr
<generator object <genexpr> at 0x7fbf01547740>
>>> for num in gen_expr:
... print(num)
...
0
1
4
# 使用yield关键字
>>> def create_generator():
... for i in range(3):
... yield i**2
...
>>> gen_yield = create_generator()
>>> next(gen_yield)
0
>>> for i in gen_yield:
... print(i)
...
1
4
参考
- https://stackoverflow.com/questions/2776829/difference-between-pythons-generators-and-iterators
- https://stackoverflow.com/questions/231767/what-does-the-yield-keyword-do
标签:...,iterator,generator,python,yield,next,关键字,gen 来源: https://www.cnblogs.com/pitaya01/p/16349420.html