Python筆記 迭代器 生成器

2021-10-20 13:28:12 字數 3977 閱讀 1323

1.什麼叫迭代?

使用for迴圈遍歷取值的過程,叫做迭代

2.什麼是可迭代物件?

能夠使用for遍歷取值的物件,叫可迭代物件

可迭代物件:str、list、set、tuple 、dict

不可迭代物件: int 、float、class

3.什麼是迭代器?

迭代器是乙個可以記住遍歷的位置的物件

①迭代器物件從集合的第乙個元素開始訪問,直到所有元素被訪問完

②迭代器只能往前不會後退

4.如何判斷乙個物件是不是可迭代物件、迭代器?

from collections import iterable

from collections import iterator

isinstance

( obj, iterable )

#obj是不是可迭代物件

isinstance

( obj, iterator)

#判斷obj是不是迭代器?

5.如何建立迭代器

方法一:直接在可迭代物件(字串,列表或元組物件)上建立迭代器

方法二:把乙個類作為乙個迭代器使用, 需要在類中實現兩個方法iter() 與next() .

①__iter__() 方法:返回乙個特殊的迭代器物件, 這個迭代器物件實現了next() 方法並通過 stopiteration 異常標識迭代的完成。

②__next__() 方法:(python 2 裡是 next())會返回下乙個迭代器物件。

用法

#1. 建立迭代器 ,iter()函式

通過iter

()函式建立可迭代物件(比如:列表、元組、字串)的迭代器.

(字串,列表或元組物件都可用於建立迭代器)

#2. 遍歷取值

迭代器物件可以使用常規 for 語句進行遍歷,

也可以使用next

()函式來取值。iter

()函式實際上就是呼叫了可迭代物件的 __iter__ 方法

1. 什麼是生成器?

生成器是一種特殊的迭代器(乙個沒有__iter__和__next__方法的特殊迭代器),不儲存資料,儲存生成資料的方式

2.為什麼需要引入生成器?

當需要生成好多資料時,如果一下全部產生,將會占用好多記憶體。

eg:建立乙個包含100萬個元素的列表,不僅占用很大的儲存空間,如果我們僅僅需要訪問前面幾個元素,那後面絕大多數元素占用的空間都白白浪費了.

此時引入生成器,需要多少生成多少,什麼時候需要什麼時候繼續,而不用一下子全部產生。

3.生成器特點(節省空間,暫停程式,需要時再繼續執行):

①乙個沒有__iter__和__next__方法的特殊迭代器;

②函式只執行一部分就返回;

③可以讓乙個函式暫停執行,並且儲存上次的值,根據上次的值恢復到原來的樣子,再做接下來的操作;

④迭代器節省空間,實現迴圈;

⑤生成器可以讓乙個看起來像函式的**暫停執行,並根據自己的想法呼叫next/send繼續執行;

4.生成器的2種構建方式

1.將列表推導式的小括號換成中括號;

2.函式中使用yield

# 建立生成器模板

乙個函式中yield,此時這個函式不再是函式,而是生成器的模板

#建立生成器物件

當呼叫乙個函式時,發現該函式中有yield,那麼不再事呼叫函式,而是建立乙個生成器物件

5.生成器執行流程

當第一次呼叫for/next執行時,會從生成器的第一行開始依次向下執行,直到在迴圈中碰見yield,就會返回yield後面的變數/字元;

然後第二次呼叫for/next時,就會從上次的yield後面的**繼續執行,直到在迴圈中再次碰到yield,返回;依次往下,直到沒有了資料。

6.生成器、函式執行流程的區別

函式是順序執行,遇到return語句或者最後一行函式語句就返回。

而generator的函式,在每次呼叫next()的時候執行,遇到yield語句返回,再次執行時從上次返回的yield語句處繼續執行。

7.生成器啟動方式

①可以使用 for i in 生成器物件 來遍歷生成器中的資料,__ next__

②也可以用 next(生成器物件) 來乙個乙個獲取生成器中的值(呼叫next()執行生成器,並 返回yield的值);

③通過send()來啟動生成器,取裡生成器裡面的值(即返回yield的值)如下**

注意:一般 生成器物件.send(none) 不會放到第一次啟動生成器,如果非要這麼做,要傳入none

使用yield完成斐波那契數列

deffibonacci

(n):

a, b =0,

1 count_num =

0while count_num < n:

# 如果函式中有乙個yield語句,那麼這個就不再是函式,而是乙個生成器的模板

yield a

a, b = b, a+b

count_num +=

1# 如果在呼叫時發現這個函式中有yield,那麼此時,不是呼叫函式,而是建立乙個生成器物件

fb = fibonacci(5)

print

("使用for迴圈遍歷生成器中的所有數字"

.center(40,

"-")

)for i in fb:

print

(i)print

("使用next依次生成三次數字"

.center(40,

"-")

)print

(next

(fb)

)print

(next

(fb)

)print

(next

(fb)

)

send()啟動生成器

def

fibonacci

(n):

a, b =0,

1 count_num =

0while count_num < n:

ret =

yield a

print

("ret:"

, ret)

a, b = b, a+b

count_num +=1

fb = fibonacci(5)

print

(next

(fb)

)#send的引數會傳給 yield a ,當做yield a的結果,並賦值給ret

#send的結果是 :下次呼叫 yield時,yield後面a的值

print

(fb.send(

"haha"))

print

(next

(fb)

)# 0

# ret: haha

# 1# ret: none

# 1(我們可以理解為,第一次使用next,先執行等號右邊的**,就將yield a返回給了next

(fb);

然後下次呼叫send時,執行等號左邊的,將send的傳值賦值給ret,再執行後續**;

或者我們可以理解 ret =

yield a 為兩步===

>1.

yield a;

2.ret = arg;其中的arg表示send的傳值,如果不傳值,預設為none,所以當next在send後面呼叫時,就預設傳了none;)

Python 迭代器 生成器

可以直接作用於for迴圈的物件,統稱為可迭代物件 iterable。iterator物件表示的是乙個資料流,iterator物件可以被next 函式呼叫並不斷返回下乙個資料,直到沒有資料時丟擲stopiteration錯誤。可以把這個資料流看做是乙個有序序列,但我們卻不能提前知道序列的長度,只能不斷...

python 迭代器,生成器

什麼事迭代 可直接用作與for迴圈的物件統稱為可迭代物件 可以被next 函式呼叫,並不斷返回下乙個值的物件稱為迭代器,所有的iterable均可以通過內建函式iter 來轉變為iterator。對於迭代器來講,有乙個next 就夠了。在你使用for和in語句時,程式就會自動呼叫即將被處理的物件的可...

python 迭代器 生成器

知識背景 1 呼叫乙個普通的python函式時,一般是從函式的第一行 開始執行,結束於return語句 異常或者函式結束 可以看作隱式的返回none 2 一旦函式將控制權交還給呼叫者,就意味著全部結束。函式中做的所有工作以及儲存在區域性變數中的資料都將丟失 3 再次呼叫這個函式時,一切都將從頭建立。...