编程语言
首页 > 编程语言> > python中的yield关键字

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

参考

  1. https://stackoverflow.com/questions/2776829/difference-between-pythons-generators-and-iterators
  2. 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