一直覺得 Python 的生成器是指 列表生成, 好吧,我讀書少。python
其實呢,生成器是 使用yield 返回實現了迭代器協議的generator 對象。 以下:code
<!-- lang: python --> class Data(object): def __init__(self, *args): self._data = list(args) def __iter__(self): for x in self._data: yield x d = Data(1,2,3) >>> d.__iter__() <generator object __iter__ at 0x7f8556d4cdc8>
在python2 中 使用d.next() 能夠返回 d 的下一個值, 在 python3 中 須要使用 d.next() 返回 d 的生成器的下一個值, 生成器可用於 協程夠造。協程
關於迭代器 根據迭代器協議, 須要實現____iter____() 和 next() 兩個方法, 前者返回迭代器對象,後者返回數據,直到引起StopIteration 異常結束。對象
<!-- lang: python --> class Data(object): def __init__(self, *args): self.data = list(args) self.index = 0 def __iter__(self): return self def __next__(self): if self.index < len(self.data): d = self.data[self.index] self.index +=1 else: raise StopIteration() return d