點(diǎn)評:很多人面試者都會(huì)寫迭代器和生成器,但是卻無法準(zhǔn)確的解釋什么是迭代器和生成器。
如果你也有同樣的困惑,可以參考下面的回答。
迭代器是實(shí)現(xiàn)了迭代器協(xié)議的對象。跟其他編程語言不同,Python中沒有用于定義協(xié)議或表示約定的關(guān)鍵字,像interface、protocol這些單詞并不在Python語言的關(guān)鍵字列表中。
Python語言通過魔法方法來表示約定,也就是我們所說的協(xié)議,而__next__和__iter__這兩個(gè)魔法方法就代表了迭代器協(xié)議。
生成器是迭代器的語法升級版本,讓我們可以用更為簡單的帶來實(shí)現(xiàn)一個(gè)迭代器。
面試中經(jīng)常會(huì)讓面試者寫生成斐波那契數(shù)列的迭代器,下面給出參考代碼,其他的迭代器可以如法炮制。
class Fib(object): def __init__(self, num): self.num = num self.a, self.b = 0, 1 self.idx = 0 def __iter__(self): return self def __next__(self): if self.idx < self.num: self.a, self.b = self.b, self.a + self.b self.idx += 1 return self.a raise StopIteration()
如果用生成器的語法來改寫上面的代碼,代碼會(huì)簡單優(yōu)雅很多。
def fib(num): a, b = 0, 1 for _ in range(num): a, b = b, a + b yield a 可以通過for-in循環(huán)從迭代器對象中取出值,也可以使用next函數(shù)取出迭代器對象中的下一個(gè)值。