python之生成器和迭代器

2021-09-17 19:50:43 字數 2076 閱讀 8915

生成器表示式:返回乙個物件,這個物件只有在需要的時候才產生結果

——生成器函式

為什麼叫生成器函式?因為它隨著時間的推移生成了乙個數值佇列。一般的函式在執行完畢之後會返回乙個值然後退出,但是生成器函式會自動掛起,然後重新拾起急需執行,他會利用yield關鍵字關起函式,給呼叫者返回乙個值,同時保留了當前的足夠多的狀態,可以使函式繼續執行,生成器和迭代協議是密切相關的,迭代器都有乙個__next__()__成員方法,這個方法要麼返回迭代的下一項,要買引起異常結束迭代。

>>> from collections import iterator

>>> isinstance((x for x in range(10)), iterator)

true

>>> isinstance(, iterator)

false

>>> isinstance({}, iterator)

false

>>> isinstance('abc', iterator)

false

生成器都是iterator物件,但list、dict、str雖然是iterable(可迭代物件),卻不是iterator(迭代器)。 把list、dict、str等iterable變成iterator可以使用iter()函式:

123

4>>> isinstance(iter(), iterator)

true

>>> isinstance(iter('abc'), iterator)

true

你可能會問,為什麼list、dict、str等資料型別不是iterator?

這是因為python的iterator物件表示的是乙個資料流,iterator物件可以被next()函式呼叫並不斷返回下乙個資料,直到沒有資料時丟擲stopiteration錯誤。可以把這個資料流看做是乙個有序序列,但我們卻不能提前知道序列的長度,只能不斷通過next()函式實現按需計算下乙個資料,所以iterator的計算是惰性的,只有在需要返回下乙個資料時它才會計算。

iterator甚至可以表示乙個無限大的資料流,例如全體自然數。而使用list是永遠不可能儲存全體自然數的。

小結:凡是可作用於for迴圈的物件都是iterable型別;

凡是可作用於next()函式的物件都是iterator型別,它們表示乙個惰性計算的序列;

集合資料型別如list、dict、str等是iterable但不是iterator,不過可以通過iter()函式獲得乙個iterator物件。

對yield的總結   (1)通常的for..in...迴圈中,in後面是乙個陣列,這個陣列就是乙個可迭代物件,類似的還有鍊錶,字串,檔案。他可以是a = [1,2,3],也可以是a = [x*x for x in range(3)]。

它的缺點也很明顯,就是所有資料都在記憶體裡面,如果有海量的資料,將會非常耗記憶體。

(2)生成器是可以迭代的,但是只可以讀取它一次。因為用的時候才生成,比如a = (x*x for x in range(3))。!!!注意這裡是小括號而不是方括號。

(3)生成器(generator)能夠迭代的關鍵是他有next()方法,工作原理就是通過重複呼叫next()方法,直到捕獲乙個異常。

(4)帶有yield的函式不再是乙個普通的函式,而是乙個生成器generator,可用於迭代

(6)yield就是return返回的乙個值,並且記住這個返回的位置。下一次迭代就從這個位置開始。

(7)帶有yield的函式不僅僅是只用於for迴圈,而且可用於某個函式的引數,只要這個函式的引數也允許迭代引數。

(8)send()和next()的區別就在於send可傳遞引數給yield表示式,這時候傳遞的引數就會作為yield表示式的值,而yield的引數是返回給呼叫者的值,也就是說send可以強行修改上乙個yield表示式值。

(9)send()和next()都有返回值,他們的返回值是當前迭代遇到的yield的時候,yield後面表示式的值,其實就是當前迭代yield後面的引數。

(10)第一次呼叫時候必須先next()或send(),否則會報錯,send後之所以為none是因為這時候沒有上乙個yield,所以也可以認為next()等同於send(none)

python之生成器和迭代器

迭代 遍歷挨個取元素 a 1,2,3,4,5,6 for i in a print i 1,2,3,4,5,6 可迭代物件 實現了迭代器的物件 在產生這個物件的類中定義了 iter 方法 迭代器 迭代器在類中實現了兩個物件 iter 方法 返回迭代器物件本身 next 方法 返回下乙個元素 這裡需要...

python之迭代器和生成器

要將生成器,先講一下列表生成式。列表生成式 如果我們要建立乙個有規律的列表,比如說1 10 list1 1,2,3,4,5,6,7,8,9,10 list1 i for i in range 1,11 列表生成式 print list1 print list1 2 1,2,3,4,5,6,7,8,9...

PYTHON之迭代器和生成器

所謂迭代,就是乙個迴圈,厲遍資料結構 列表,字典,元組等 內元素的過程。字串,列表,字典,元組,集合都是可迭代物件。而迭代器是用與迭代操作 for迴圈 的物件。可迭代物件通過 iter 方法轉變成迭代器,迭代器可以通過next 方法不斷返回下乙個元素直至結束。迭代器的優勢在於它不像列表那樣會預先就把...