Python中的迭代器、生成器

from collections import Iterable, Iteratorhtml

1. 可迭代(iterable)對象

參考官網連接python

class I:
    def __init__(self, v):
        self.v = v

    def __iter__(self):
        return iter([self.v])  # 返回的應該是迭代器對象

i = I(2)
print(isinstance(i, Iterable), isinstance(i, Iterator)) # True False
print(iter(i)) # <list_iterator object at 0x00000000021C8358>

class I:
    def __init__(self, v):
        self.v = v

    def __getitem__(self, item):
        if item > self.v:
            raise IndexError
        return item


i = I(2)
print(isinstance(i, Iterable), isinstance(i, Iterator)) # False False
print(iter(i)) # <iterator object at 0x0000000001DFCD30>

2. 迭代器(iterator)

參考官網連接ide

class I:
    def __init__(self, v):
        self.v = v

    def __iter__(self):
        return self

    def __next__(self):
        if self.v < 10:
            self.v += 1
            return self.v
        raise StopIteration

i = I(2)
print(isinstance(i, Iterable), isinstance(i, Iterator))  # True True
print(iter(i)) # <__main__.I object at 0x00000000021E0898>

3. 生成器(generator)

參考官網連接函數

class I:
    def __init__(self, v):
        self.v = v

    def __iter__(self):
        yield 1


i = I(2)
print(isinstance(i, Iterable), isinstance(i, Iterator)) # True False
print(iter(i)) # <generator object I.__iter__ at 0x00000000022204C0>

4. 總結

  1. 只要實現了__iter__方法或者__getitem__方法, 就是iterable, 但Iterable只檢測__iter__方法是否實現, 參見官網連接。推薦使用iter是否返回迭代器判斷能否可迭代。
  2. __getitem__方法的返回有特殊要求, 參見官網連接
  3. 實現了__iter__和__next__方法就是一個iterator。參見pep234
  4. generator是返回一個generator iterator的函數。與普通函數的不一樣在於函數中包含 yield 表達式。

5. 其餘參考

  1. Python可迭代與迭代器
  2. 迭代器
相關文章
相關標籤/搜索