定义

生成器 (generator)

  1. 一种定义体中含有yield关键词的函数被调用时得到的对象
  2. 有时指上述的函数

迭代器 (iterator)

  1. 一种实现了无参数__next__方法和__iter__方法的对象(实例)
  2. 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

注意

  1. 迭代器是可迭代对象
  2. 生成器也是迭代器
  3. 不要把yield和yield from搞混,后者虽然可以简化for循环中的yield语句,但其的定义较复杂,我也不是很明白,这里就不做展开

作用

  1. 更优雅的代码
  2. 更有效处理大型对象 (不用一次性读入所有数据)
  3. 其他 (例:生成器还可以通过.send()方法变身为协程)

阿薛
45 声望9 粉丝

超懒