Python yield使用方法樣本

來源:互聯網
上載者:User
1. iterator
疊代器最簡單例子應該是數組下標了,且看下面的c++代碼:

代碼如下:


int array[10];
for ( int i = 0; i < 10; i++ )
printf("%d ", array[i]);

疊代器工作在一個容器裡(array[10]),它按一定順序(i++)從容器裡取出值(array[i])並進行操作(printf("%d ", array[i])。

上面的代碼翻譯成python:

代碼如下:


array = [i for i in range(10)]
for i in array:
print i,

首先,array作為一個list是個容器,其次list這個內建類型有預設的next行為,python發現這些之後採取的秘密的沒被各位看到的動作是:拿出array這丫容器的疊代器,從裡面next一下把值給i供for迴圈主體處置,for把這個值print了。

現在的問題是資料可以做容器疊代,代碼可以嗎?

2. constructor

怎麼把函數變成constructor? 在函數體裡有yield就行了!

代碼如下:


def gen():
print 'enter'
yield 1
print 'next'
yield 2
print 'next again'

for i in gen():
print i

各位!python看到gen函數裡出現yield,知道可以用next了,問題是怎麼對代碼這個容器玩next?
從容器裡拿到iterator的時候它還什麼也不是,處在容器入口處,對於數組來說就是下標為-1的地方,對於函數來說就是函數入口嘛事沒幹,但是萬事俱備就欠next。
開始for i in g,next讓itreator爬行到yield語句存在的地方並傳回值,
再次next就再爬到下一個yield語句存在的地方並傳回值,依次這樣直到函數返回(容器盡頭)。
您一定看出來上面代碼的輸出是:
enter
1
next
2
next again

3. 使用yield
yield的代碼疊代能力不但能打斷函數執行還能記下斷點處的資料,下次next書接上回,
這正是遞迴函式需要的。
例如中序遍曆二叉樹:
(應該是David Mertz寫的)

代碼如下:


def inorder(t):
if t:
for x in inorder(t.left):
yield x
yield t.label
for x in inorder(t.right):
yield x
for n in inorder(tree)
print n

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.