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