我正在参与「掘金启航计划」

写在之前

上一篇文章中(Python 拓宽之迭代器)咱们学了「迭代器」,今日咱们就来学学另一个 — 「生成器」。假如不出意外的话,「生成器」这个部分是咱们在“类”里面的最后一个知识点,坚持就是胜利。

生成器

不知道你还记得么,在昨日呈现了一个单词咱们还没说:

>>> tuple1 = (x**x for x in range(3))
>>> tuple1
<generator object <genexpr> at 0x0000000001DF16D8>

就是上面那个 generator,现在我能够告知你了,generator 翻译成中文就是“生成器”。

在 Python 中,界说生成器有必要要使用 yield 这个关键词,yield 翻译成中文有「出产」这方面的意思。在 Python 中,它作为一个关键词,是生成器的标志。接下来咱们来看一个比如:

>>> def f():
...    yield 0
...    yield 1
...    yield 2
...
>>> f
<function f at 0x00000000004EC1E0>

上面是写了一个很简单的 f 函数,代码块是 3 个 yield 建议的句子,下面让咱们来看看怎么使用它:

>>> fa = f()
>>> fa
<generator object f at 0x0000000001DF1660>
>>> type(fa)
<class 'generator'>

上述操作能够看出,咱们调用函数得到了一个生成器(generator)目标。

>>> dir(fa)
['__class__', '__del__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__lt__', '__name__', '__ne__','__new__', '__next__', '__qualname__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'close', 'gi_code', 'gi_frame', 'gi_running', 'gi_yieldfrom', 'send', 'throw']

在上面咱们看到了 iter() 和 next(),虽然咱们在函数体内没有显示的写 iter() 和 next(),仅仅是写了 yield,但它就现已是「迭代器」了。既然如此,那咱们就能够进行如下操作:

>>> fa = f()
>>> fa.__next__()
0
>>> fa.__next__()
1
>>> fa.__next__()
2
>>> fa.__next__()
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
StopIteration

从上面的简单操作能够看出:含有 yield 关键词的函数 f() 是一个生成器目标,这个生成器目标也是迭代器。所以就有了这样的界说:把含有 yield 句子的函数称为生成器,生成器是一种用一般函数语法界说的迭代器。

经过上面的比如能够看出,这个生成器(即迭代器)在界说的进程中并没有昨日讲的迭代器那样写 iter(),而是只用了 yield 句子,之后一个普一般通的函数就神奇的成了生成器,相同也具备了迭代器的特性。

yield 句子的作用,就是在调用的时分回来相应的值。下面我来逐行的解释一下上面比如的运转进程:

1.fa = f():fa 引证生成器目标。

2.fa.next():生成器开始履行,遇到了第一个 yield,然后回来后边的 0,而且挂起(即暂停履行)。

3.fa.next():从上次暂停的方位开始,持续向下履行,遇到第二个 yield,回来后边的值 1,再挂起。

4.fa.next():重复上面的操作。

5.fa.next():从上次暂停的方位开始,持续向下履行,但是后边现已没有 yield 了,所以 next() 产生异常。

写在之后

在上面的一系列操作中,不知道你有没有发现,yield 除了作为生成器的标志以外,还有一个「回来值」的功用。咱们知道 return 也有这个功用,那么它跟 return 的这个回来值有什么区别呢?这个你能够先考虑一下,我之后的文章会具体的写一下 yield,敬请期待。

公众号:程序员喵大人,欢迎来撩,各种新鲜资讯,Python材料共享。