迭代器 在Python如果一個對象可被迴圈(遍歷)該對象中每一個元素的過程叫做迭代。例如 ,字典、字元串、列表、元祖、集合等。他們可被迭代的原因是,都有一個共同的內置函數__iter__。通過執行內置對象的__next__函數,可以依次列印該對象的所有元素。例如 有一個列表,該列表存儲了1-100的 ...
迭代器
在Python如果一個對象可被迴圈(遍歷)該對象中每一個元素的過程叫做迭代。例如 ,字典、字元串、列表、元祖、集合等。他們可被迭代的原因是,都有一個共同的內置函數__iter__。通過執行內置對象的__next__函數,可以依次列印該對象的所有元素。例如 有一個列表,該列表存儲了1-100的數值,但是我們只想列印前50的個元素。
1 flag=True 2 l=[x for x in range(1,101)] 3 4 l_iter = l.__iter__() 5 while flag: 6 try: 7 item=l_iter.__next__() 8 if item==51: 9 flag=False 10 break 11 else: 12 print(item) 13 14 except: 15 break
在While迴圈中迭代器將一直迴圈執行__next__()函數,但迭代器本身並不知道它要迭代多少個元素。當執行到最後元素時,還會繼續執行__next__()函數,但此時沒有元素可被迭代了,由於迭代器找不到可被迭代元素,將會報錯。因此我們在使用while迴圈時,配合異常捕獲代碼 try except一起使用,當迭代過程中出現異常,將會自動停止下一次迴圈。
生成器:
假設我們 有個需求,除第一個 和第二個元素外,其他元素依次為前兩個元素之和。
我們可以這樣寫
1 def fib1(max): 2 n,a,b=0,0,1 3 while n<max: 4 print(b) 5 a,b=b,a+b 6 n=n+1 7 return 'done' 8 9 a=fib1(5) 10 print(a)
輸出結果
1 1 2 1 3 2 4 3 5 5 6 done
推導過程如圖
用另外一種方法
1 def fib2(max): 2 n,a,b=0,0,1 3 while n<max: 4 yield b 5 a,b=b,a+b 6 n=n+1 7 return 'done'
調用該函數
1 a=fib2(5) 2 print(a)
輸出結果 1 <generator object fib at 0x0000000002800518>
此時我們發現,不能像之前那樣直接顯示結果,此時定義的fib並不是一個簡單的函數,而是被改造成了生成器。如果想知道生成的結果可以依次執行__next__函數,但每次只返回一個結果,當沒有更多的元素可以被迭代時將會拋出異常。
另外我們也可以使用for 迴圈和while(需配合try except使用)列印結果。
1 a=fib2(5) 2 for c in a: 3 print(c)
顯示輸出結果 1 1 2 3 5.
使用生成器的好處:生成器是根據推導的過程計算下一個元素。再看前兩個函數 fib1 和fib2 ,fib1在電腦中開闢一個固定的記憶體空間用於存儲完整的計算結果,但如果我們想訪問計算結果中的某一個元素,就需要先遍歷整個計算結果,才能通過對象下標或者用for 迴圈和if條件判斷 拿到我們想要的結果,這樣做的可以實現我們的需求,但將會耗損較多的記憶體空間。而fib2則是依據推算過程計算出下一個元素,因此我們就可以在未創建完整對象之前獲取我們想要的元素。從而降低記憶體消耗。