python(4)yield函數

來源:互聯網
上載者:User

這個函資料說叫做函數發生器,看文檔也沒看明白,後來在網上看了一個用法,發現實際上相當於return 語句,如下代碼:

 

def addlist(alist):

    for i in alist:

        yield i + 1

取出alist的每一項,然後把i + 1塞進去。然後通過調用取出每一項:

alist = [1, 2, 3, 4]

for x in addlist(alist):

    print x,

結果為:2 3 4 5

這個調用非常清晰,每到yield i + 1就相當於return i + 1,即執行到這兒,此函數就結束了,有了前面基本的認識,對於後面較進階用法有很大的作用。

 

較進階用法:

原先的yield是作為一條語句使用,現在可將之作為運算式使用。

def g():

    a0 = 'first'

    print 'step a0', 'a0= ', a0

    a1 = yield a0 + ‘_myadd’

    print 'step a1', 'a1 = ', a1

    a2 = yield a1

    print 'step a2', 'a2 = ', a2

f = g()

f.next()

f.send('x1')

f.send('x2')

返回如下結果:

step a0 a0=  first
'first'
step a1 a1 =  x1
'x1'
step a2 a2 =  x2

Traceback (most recent call last):
  File "<pyshell#133>", line 1, in <module>
    f.send('x2')
StopIteration

簡單解釋,前面說到yield相當於return,

調用f.next()時,執行到yield a0,函數掛起,函數值為‘first_myadd’

調用f.send(‘x1’),將運算式yield a0賦值為'x1’,並賦給a1,執行到yield a1,函數掛起,函數值為’x1’

調用f.send(‘x2’),將運算式yield a1賦值為‘x2’,並賦給a2,列印完成後發現沒有yield使其掛起,引發異常

注意,yield運算式值和函數值是不同的概念,像a1, a2通過=擷取的皆為yield運算式值,它們是通過f.send(x)傳遞進來的,而類似

yield a0 + ‘myadd’,則是函數掛起時的值。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.