Python 中yield 以及生成器和迭代器

2021-09-29 22:51:52 字數 2295 閱讀 1476

當你建立了乙個列表,你可以逐個地訪問這個列表的元素,而這個訪問的過程叫做迭代(iteration)

凡是能使用for…in…語句的物件,都叫做可迭代物件,例如:list、string、檔案等等

這些可迭代物件非常方便,因為你可以根據自己的需要來訪問它們。但是同時也需要將所有的值存入記憶體當中,無論你是不是需要所有的值,可能對於乙個列表[x for x in range(100000)],你僅僅想拿到裡面的素數,但當這個列表生成式被執行的時候,已經將所有100000個數字存入了記憶體中。

生成器是一種只能迭代一次的迭代器,生成器不會一次將所有的元素存入記憶體中,而是一邊迭代一邊運算:

yield的使用和return的使用沒什麼區別,只是yield會返回乙個生成器

yield 是乙個類似 return 的關鍵字,迭代一次遇到yield時就返回yield後面的值。

首先,如果你還沒有對yield有個初步分認識,那麼你先把yield看做「return」,這個是直觀的,它首先是個return,普通的return是什麼意思,就是在程式中返回某個值,返回之後程式就不再往下執行了。看做return之後再把它看做乙個是生成器(generator)的一部分(帶yield的函式才是真正的迭代器),好了,如果你對這些不明白的話,那先把yield看做return,然後直接看下面的程式,你就會明白yield的全部意思了:

def

foo():

print

("starting..."

)while

true

: res =

yield

4print

("res:"

,res)

g = foo(

)print

(next

(g))

print

("*"*20

)print

(next

(g))

就這麼簡單的幾行**就讓你明白什麼是yield,**的輸出這個:

starting...

4******

****

****

****

**res:

none

4

1.程式開始執行以後,因為foo函式中有yield關鍵字,所以foo函式並不會真的執行,而是先得到乙個生成器g(相當於乙個物件)

2.直到呼叫next方法,foo函式正式開始執行,先執行foo函式中的print方法,然後進入while迴圈

3.程式遇到yield關鍵字,然後把yield想想成return,return了乙個4之後,程式停止,並沒有執行賦值給res操作,此時next(g)語句執行完成,所以輸出的前兩行(第乙個是while上面的print的結果,第二個是return出的結果)是執行print(next(g))的結果,

4.程式執行print("*"20),輸出20個

5.又開始執行下面的print(next(g)),這個時候和上面那個差不多,不過不同的是,這個時候是從剛才那個next程式停止的地方開始執行的,也就是要執行res的賦值操作,這時候要注意,這個時候賦值操作的右邊是沒有值的(因為剛才那個是return出去了,並沒有給賦值操作的左邊傳引數),所以這個時候res賦值是none,所以接著下面的輸出就是res:none,

6.程式會繼續在while裡執行,又一次碰到yield,這個時候同樣return 出4,然後程式停止,print函式輸出的4就是這次return出的4.

#encoding:utf-8  

defyield_test

(n):

for i in

range

(n):

yield call(i)

print

("i="

,i)#做一些其它的事情

print

("do something."

)print

("end."

)def

call

(i):

return i*

2#使用for迴圈

for i in yield_test(5)

:print

(i,","

)

結果是:

>>

>

0, i=0

2, i=1

4, i=2

6, i=3

8,

i=4

do something.

end.

>>

>

關於Python中的yield

在介紹yield前有必要先說明下python中的迭代器 iterator 和生成器 constructor 一 迭代器 iterator 在python中,for迴圈可以用於python中的任何型別,包括列表 元祖等等,實際上,for迴圈可用於任何 可迭代物件 這其實就是迭代器 迭代器是乙個實現了迭...

關於Python中的yield

在介紹yield前有必要先說明下python中的迭代器 iterator 和生成器 constructor 一 迭代器 iterator 在python中,for迴圈可以用於python中的任何型別,包括列表 元祖等等,實際上,for迴圈可用於任何 可迭代物件 這其實就是迭代器 迭代器是乙個實現了迭...

Python中的yield用法

在python中,我們將帶有 yield 的函式稱之為 generator 生成器 generator可以一邊迴圈一邊計算,是可迭代物件,也就是說可以使用for迴圈來迭代出generator的各個值。一般為了說明generator,都會使用斐波那契數列來舉例,這裡也不例外 如結果所示,呼叫 fab ...