为了理解yield关键字,首先我们要看一下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,只有使用时才将其加载出来。
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