歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

Python中yield的用法

yield是生成的意思,但是在python中則是作為生成器理解,生成器的用處主要可以迭代,這樣簡化了很多運算模型(還不是很了解是如何簡化的)。

yield是一個表達式,是有返回值的.

當一個函數中含有yield時,它不再是一個普通的函數,而是一個生成器.當該函數被調用時不會自動執行,而是暫停,見第一個例子:

例1:

>>> def mygenerator(): 
...    print 'start...' 
...    yield 5 
... 
>>> mygenerator()            //在此處調用,並沒有打印出start...說明存在yield的函數沒有被運行,即暫停 
<generator object mygenerator at 0xb762502c> 
>>> mygenerator().next()    //調用next()即可讓函數運行. 
start... 

>>> 

如一個函數中出現多個yield則next()會停止在下一個yield前,見例2:

例2:

>>> def fun2(): 
...    print 'first' 
...    yield 5 
...    print 'second' 
...    yield 23 
...    print 'end...' 
... 
>>> g1 = fun2() 
>>> g1.next()            //第一次運行,暫停在yield 5             
first 

>>> g1.next()            //第二次運行,暫停在yield 23 
second 
23 
>>> g1.next()            //第三次運行,由於之後沒有yield,再次next()就會拋出錯誤 
end... 
Traceback (most recent call last): 
  File "<stdin>", line 1, in <module> 
StopIteration 
>>> 

為什麼yield 5會輸出5,yield 23會輸出23?

我們猜測可能是因為yield是表達式,存在返回值.

那麼這是否可以認為yield 5的返回值一定是5嗎?實際上並不是這樣,這個與send函數存在一定的關系,這個函數實質上與next()是相似的,區別是send是傳遞yield表達式的值進去,而next不能傳遞特定的值,只能傳遞None進去,因此可以認為g.next()和g.send(None)是相同的。見例3:

例3:

>>> def fun(): 
...    print 'start...' 
...    m = yield 5 
...    print m 
...    print 'middle...' 
...    d = yield 12 
...    print d 
...    print 'end...' 
... 
>>> m = fun()              //創建一個對象 
>>> m.next()              //會使函數執行到下一個yield前 
start... 

>>> m.send('message')      //利用send()傳遞值 
message                    //send()傳遞進來的 
middle... 
12 
>>> m.next() 
None                      //可見next()返回值為空 
end... 
Traceback (most recent call last): 
  File "<stdin>", line 1, in <module> 
StopIteration 

Copyright © Linux教程網 All Rights Reserved