在Python中,迭代器是一個(gè)很重要的東西。良好的迭代器定義灰署,能讓代碼更加清晰匆瓜。
定義一個(gè)迭代器需要實(shí)現(xiàn)兩個(gè)方法__iter__
和__next__
。
__iter__
返回迭代器對(duì)象本身衣赶。它是必需的,以允許容器和迭代器在for .. in ..
語句中使用。
__next__
返回下一個(gè)元素偏塞。當(dāng)沒有元素可返回時(shí),應(yīng)拋出StopIteration
邦鲫。
class X2:
def __init__(self, n: int):
self.list = [x*x for x in range(n)]
self.__count = -1
def __iter__(self):
return self
def __next__(self):
self.__count += 1
try:
return self.list[self.__count]
except IndexError:
raise StopIteration
if __name__ == "__main__":
for each in X2(10):
print(each)
但這樣定義似乎有些太麻煩了灸叼,Python提供了一個(gè)更加簡略的方法:
def X2(n: int):
for i in range(n):
yield i*i
if __name__ == "__main__":
for each in X2(10):
print(each)
事實(shí)上,如下代碼
for each in X2(10):
print(each)
與
t = X2(10)
while True:
try:
each = t.__next__()
except StopIteration:
break
print(each)
是等價(jià)的庆捺。
能看出古今,for .. in ..
的運(yùn)行機(jī)制,就是不斷地調(diào)用被迭代對(duì)象的.__next__()
方法滔以,直到捕獲到StopIteration
異常捉腥。
明白了這一點(diǎn),很容易就能知道你画,Python的死循環(huán)寫法至少有兩種:while True:
和使用for .. in ..
迭代一個(gè)擁有__iter__
和__next__
方法的對(duì)象抵碟,并且這個(gè)對(duì)象的__next__
方法永遠(yuǎn)不會(huì)拋出StopIteration
異常。
附:
next(g)
和g.__next__()
都是調(diào)用了g
的__next__()
方法撬即,只不過next(g)
可能看起來更友好一點(diǎn)立磁。