深入理解Python中yield關鍵字

2021-08-20 02:47:52 字數 2097 閱讀 9867

生成器是可以迭代的,但只可以讀取它一次。因為用的時候才生成。比如 mygenerator = (x*x for x in 

range(3)),注意這裡用到了(),它就不是陣列,而上面的例子是。

我理解的生成器(generator)能夠迭代的關鍵是它有乙個next()方法,工作原理就是通過重複呼叫next()方法,直到捕獲乙個異常。可以用上面的mygenerator測試。

帶有 yield 的函式不再是乙個普通函式,而是乙個生成器generator,可用於迭代,工作原理同上。

yield 是乙個類似 return 

的關鍵字,迭代一次遇到yield時就返回yield後面的值。重點是:下一次迭代時,從上一次迭代遇到的yield後面的**開始執行。

簡要理解:yield就是 return 返回乙個值,並且記住這個返回的位置,下次迭代就從這個位置後開始。

帶有yield的函式不僅僅只用於for迴圈中,而且可用於某個函式的引數,只要這個函式的引數允許迭代引數。比如array.extend函式,它的原型是array.extend(iterable)。

send(msg)與next()的區別在於send可以傳遞引數給yield表示式,這時傳遞的引數會作為yield表示式的值,而yield的引數是返回給呼叫者的值。——換句話說,就是send可以強行修改上乙個yield表示式值。比如函式中有乙個yield賦值,a 

= yield 5,第一次迭代到這裡會返回5,a還沒有賦值。第二次迭代時,使用.send(10),那麼,就是強行修改yield 5表示式的值為10,本來是5的,那麼a=10

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

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

#encoding:utf-8  

defyield_test

(n):

for i in range(n):

yield call(i)

print("i=",i)

#做一些其它的事情

print("do something.")

print("end.")

defcall

(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.

>>>

def

node._get_child_candidates

(self, distance, min_dist, max_dist):

if self._leftchild and distance - max_dist < self._median:

yield self._leftchild

if self._rightchild and distance + max_dist >= self._median:

yield self._rightchild

while candidates:

node = candidates.pop()

distance = node._get_dist(obj)

if distance <= max_dist and distance >= min_dist:

result.extend(node._values)

candidates.extend(node._get_child_candidates(distance, min_dist, max_dist))

return

result

python深入 Python的深入理解

處理檔案和目錄 python 3 帶有乙個模組叫做 os,代表 作業系統 operating system os 模組 包含非常多的函式用於獲取 和修改 本地目錄 檔案程序 環境變數等的資訊。python 盡最大的努力在所有支援的作業系統上提供乙個統一的api,這樣你就可以在保證程式能夠在任何的計算...

深入理解python中的None

在python中判斷乙個物件是否為空時,我曾經這樣寫 list iflist is not none print list is s list else print list is null 列印結果為 is 從上面的例子可以看出list為空應該列印的是 list is null 但是實際的結果不是...

中gather函式 深入理解Python中的協程

協程 是單執行緒下的併發,又稱微執行緒。英文名是coroutine。它和執行緒一樣可以排程,但是不同的是執行緒的啟動和排程需要通過作業系統來處理。協程是一種比執行緒更加輕量級的存在,最重要的是,協程不被作業系統核心管理,協程是完全由程式控制的。執行效率極高,協程的切換完全由程式控制,不像執行緒切換需...