定义
生成器 (generator)
- 一种定义体中含有yield关键词的函数被调用时得到的对象
- 有时指上述的函数
迭代器 (iterator)
- 一种实现了无参数__next__方法和__iter__方法的对象(实例)
- python内建的一种类,其继承自collections.Iterable (py3.4)
可迭代对象
实现了__iter__或__getitem__方法的对象
范例
class GeneratorSampleInClass:
def __iter__(self):
for item in [1, 2, 3]:
yield item
g = GeneratorSampleInClass()
print(type(GeneratorSampleInClass.__iter__)) # <class 'function'>
print(type(g.__iter__())) # <class 'generator'>
print(dir(g.__iter__())) # [..., '__next__', ...]
def generator_sample_in_function():
for item in [1, 2, 3]:
yield item
print(type(generator_sample_in_function)) # <class 'function'>
print(type(generator_sample_in_function())) # <class 'generator'>
print(dir(generator_sample_in_function)) # 没有__next__方法
print(dir(generator_sample_in_function())) # [..., '__next__', ...]
class IteratorSampleInClass:
def __iter__(self):
return self
def __next__(self):
for item in [1, 2, 3]:
yield item
from collections import Iterator
i = IteratorSampleInClass()
print(isinstance(i, Iterator)) # True
注意
- 迭代器是可迭代对象
- 生成器也是迭代器
- 不要把yield和yield from搞混,后者虽然可以简化for循环中的yield语句,但其的定义较复杂,我也不是很明白,这里就不做展开
作用
- 更优雅的代码
- 更有效处理大型对象 (不用一次性读入所有数据)
- 其他 (例:生成器还可以通过.send()方法变身为协程)