首頁  >  文章  >  後端開發  >  Python中生成器和迭代器的簡單介紹(附範例)

Python中生成器和迭代器的簡單介紹(附範例)

不言
不言原創
2018-09-27 14:53:592639瀏覽

這篇文章帶給大家的內容是關於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 &#39;done&#39;

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 &#39;done&#39;

呼叫函數

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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn