Python入門教程之迭代器和生成器
迭代器
在Python如果一個物件可被迴圈(遍歷)該物件中每一個元素的過程叫做迭代。例如 ,字典、字串、列表、元祖、集合等。他們可被迭代的原因是,都有一個共同的內建函式 __iter__。通過執行內建物件的__next__函式,可以依次列印該物件的所有元素。例如 有一個列表,該列表儲存了1-100的數值,但是我們只想列印前50的個元素。
flag=True
l=[x for x in range(1,101)]
l_iter = l.__iter__()
while flag:
try:
item=l_iter.__next__()
if item==51:
flag=False
break
else:
print(item)
except:
break
在While迴圈中迭代器將一直迴圈執行__next__()函式,但迭代器本身並不知道它要迭代多少個元素。當執行到最後元素時,還會繼續執行__next__()函式,但此時沒有元素可被迭代了,由於迭代器找不到可被迭代元素,將會報錯。因此我們在使用while迴圈時,配合異常捕獲程式碼 try except一起使用,當迭代過程中出現異常,將會自動停止下一次迴圈。
生成器:
假設我們 有個需求,除第一個 和第二個元素外,其他元素依次為前兩個元素之和。
我們可以這樣寫
def fib1(max):
n,a,b=0,0,1
while n<max:
print(b)
a,b=b,a+b
n=n+1
return 'done'
a=fib1(5)
print(a)
輸出結果
1
1
2
3
5
done
推導過程如圖
用另外一種方法
def fib2(max):
n,a,b=0,0,1
while n<max:
yield b
a,b=b,a+b
n=n+1
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則是依據推算過程計算出下一個元素,因此我們就可以在未建立完整物件之前獲取我們想要的元素。從而降低記憶體消耗。
Linux公社的RSS地址 : ofollow,noindex" target="_blank">https://www.linuxidc.com/rssFeed.aspx
本文永久更新連結地址: https://www.linuxidc.com/Linux/2018-10/154609.htm