Python生成器和迭代器學習筆記

定義

生成器 (generator)

  1. 一種定義體中含有yield關鍵詞的函數被調用時獲得的對象
  2. 有時指上述的函數

迭代器 (iterator)

  1. 一種實現了無參數__next__方法和__iter__方法的對象(實例)
  2. python內建的一種類,其繼承自collections.Iterable (py3.4)

可迭代對象

實現了__iter__或__getitem__方法的對象python

範例

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()方法變身爲協程)
相關文章
相關標籤/搜索