python关键字yield

原文

想要理解 yield 先要理解 generators 在此之前要理解 iterables

iterables

当创建一个 list 的时候,可以一个一个的读取数据。这种一个一个读取项目元素称作 iteration

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

这里 mylist 是 iterable 当使用 list comprehension 时,创建了一个 list 也是 iterable

>>> mylist = [x*x for x in range(3)]
>>> for i in mylist:
... print(i)
0
1
4

所有可以使用 for ... in ... 的都是 iterable; listsstrings
这些 iterables 用着很顺手,但是他们都是存在内存当中的,有时可能并不希望这样,尤其是数据量大的时候

Generators

是 iterators 但是只能迭代一次。Generators 并不在内存存储数据,而是实时生成数据

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

使用 () 代替 [] 但是,mygenerator 不能迭代第二次。

yield

是一个关键字,使用上类似 return 函数会返回一个 generator

>>> 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

当你调用函数的时候,里面的代码并没有执行,只是返回一个 generator 对象。
然后在使用 for 的时候代码会一次执行