所有的生成器都是迭代器激蹲;
從可迭代的對象中獲取迭代器
一、序列可迭代的原因:iter
函數
迭代對象x時乘瓤,自動調用
iter(x)
- 檢查是否實現
__iter__
方法策泣,返回一個迭代器。 - 沒有實現則统抬,
__getitem__
方法(參數從0開始)危队,創(chuàng)建一個迭代器,嘗試按順序獲取元素金麸。 - 如果失敗挥下,拋出TypeError異常,
"C object is not iterable"
從Python3.4開始棚瘟,檢查對象能否迭代最準確的方法是調用iter(x)函數,不過沒有必要吧解取。
二禀苦、可迭代的對象與迭代器
標準的迭代器接口有兩個方法:
- 無參
__next__
方法, 返回下一個可用元素蔗包,否則拋出StopIteration
異常 -
__iter__
返回self
慧邮,以便于在使用可迭代對象的地方使用迭代器,例如for循環(huán)
經典迭代器
import re
import reprlib
RE_WORD = re.compile('\w+')
class Sentence:
def __init__(self, text):
self.text = text
self.words = RE_WORD.findall(text)
def __repr__(self):
return 'Sentence(%s)' % reprlib.repr(self.text)
def __iter__(self):
return SentenceIterator(self.words)
class SentenceIterator:
def __init__(self, words):
self.words = words
self.index = 0
def __next__(self):
try:
word = self.words[self.index]
except IndexError:
raise StopIteration()
self.index += 1
return word
def __iter__(self):
return self
可迭代對象一定不能是自身的迭代器(可迭代對象必須實現iter方法,但不能實現迭代器)
三忆谓、生成器函數簡化經典迭代器
import re
import reprlib
RE_WORD = re.compile('\w+')
class Sentence:
def __init__(self, text):
self.text = text
self.words = RE_WORD.findall(text)
def __repr__(self):
return 'Sentence(%s)' % reprlib.repr(self.text)
def __iter__(self):
for word in self.words:
yield word
# return
函數返回值倡缠。生成器函數返回生成器。生成器產出或生成值琢唾。
四盾饮、惰性實現
import re
import reprlib
RE_WORD = re.compile('\w+')
class Sentence:
def __init__(self, text):
self.text = text
def __repr__(self):
return 'Sentence(%s)' % reprlib.repr(self.text)
def __iter__(self):
for match in RE_WORD.finditer(self.text):
yield match.group()
# return
五、生成器表達式
import re
import reprlib
RE_WORD = re.compile('\w+')
class Sentence:
def __init__(self, text):
self.text = text
def __repr__(self):
return 'Sentence(%s)' % reprlib.repr(self.text)
def __iter__(self):
return(match.group() for match in RE_WORD.finditer(self.text))
六芍碧、關于生成器的更多內容
生成器也可以用來生成不受數據源限制的值号俐。
標準庫中的生成器函數
Python 3.3 新增 yield from 代替循環(huán)吏饿,還有...