這篇文章帶給大家的內容是關於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'
呼叫函數
a=fib2(5) print(a)
輸出結果 #1 2b2a51d19d7c64a0eab3732f7e789d7c
##此時我們發現,不能像之前那樣直接顯示結果,此時定義的fib並不是一個簡單的函數,而是被改造成了生成器。如果想知道產生的結果可以依序執行__next__函數,但每次只回傳一個結果,當沒有更多的元素可以被迭代時將會拋出異常。 另外我們也可以使用for 迴圈和while(需配合try except使用)來列印結果。a=fib2(5) for c in a: print(c)顯示輸出結果 1 1 2 3 5.使用生成器的好處:生成器是根據推導的過程計算下一個元素。再看前兩個函數fib1 和fib2 ,fib1在計算機中開闢一個固定的內存空間用於存儲完整的計算結果,但如果我們想訪問計算結果中的某一個元素,就需要先遍歷整個計算結果,才能透過物件下標或用for 迴圈和if條件判斷拿到我們想要的結果,這樣做的可以實現我們的需求,但將會耗損較多的記憶體空間。而fib2則是依據推算過程計算出下一個元素,因此我們就可以在未建立完整物件之前取得我們想要的元素。從而降低記憶體消耗。
以上是Python中生成器和迭代器的簡單介紹(附範例)的詳細內容。更多資訊請關注PHP中文網其他相關文章!