理解python的yield

225 阅读2分钟

stackoverflow高赞回答之:What does the “yield” keyword do?

地址:stackoverflow.com/questions/2…


想要理解yield,就必须要知道什么是生成器,想要理解什么是生成器,就必须理解什么是迭代器。

可迭代对象(Iterables)

逐一的阅读元素就叫做迭代(Iteration)

>>> mylist = [1, 2, 3]
>>> for i in mylist:
...    print(i)
1
2
3

所有你可以用for in的都是迭代器,list,strings...

这些可迭代的方法很方便,因为您可以随意读取它们,但是您将所有值都存储在内存中,当拥有很多值时,这并不总是想要的。

生成器(Generators)

生成器是迭代器,一种可迭代的对象,您只能迭代一次。生成器未将所有值存储在内存中,而是即时生成值:

>>> mygenerator = (x*x for x in range(3))
>>> for i in mygenerator:
...    print(i)
0
1

除了使用()代替[]之外,其余部分完全相同。但是,您不能第二次在mygenerator中执行i,因为生成器只能使用一次:它们先计算0,然后忘记它,然后计算1,最后一次计算4。

yield

yield是一个像return一样使用的关键字,只是函数将返回一个生成器。

>>> def createGenerator():
...    mylist = range(3)
...    for i in mylist:
...        yield i*i
...
>>> mygenerator = createGenerator() # create a generator
>>> print(mygenerator) # mygenerator is an object!
<generator object createGenerator at 0xb7555c34>
>>> for i in mygenerator:
...     print(i)
0
1
4

这是一个无用的示例,但是当您知道函数将返回大量的值(只需要读取一次)时,它就很方便。

要掌握yield,您必须了解当调用函数时,在函数主体中编写的代码不会运行。该函数仅返回生成器对象,这有点棘手:-)

然后,您的代码将从每次停止使用生成器的地方继续。

迭代的内部机制

迭代是一个包含可迭代对象(实现__iter __()方法)和迭代器(实现__next __()方法)的过程。可迭代对象是可以从中获取迭代器的任何对象。迭代器是使您可以迭代可迭代对象的对象。

Iteration is a process implying iterables (implementing the __iter__() method) and iterators (implementing the __next__() method). Iterables are any objects you can get an iterator from. Iterators are objects that let you iterate on iterables.

名词解释:

迭代: iteration 可迭代对象:iterables 迭代器:iterators 迭代:interate