欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python yield使用方法示例

 更新時(shí)間:2013年12月04日 11:01:20   作者:  
這篇文章主要介紹了Python yield使用方法,大家參考使用吧

1. iterator
疊代器最簡單例子應(yīng)該是數(shù)組下標(biāo)了,且看下面的c++代碼:

復(fù)制代碼 代碼如下:

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

疊代器工作在一個(gè)容器里(array[10]),它按一定順序(i++)從容器里取出值(array[i])并進(jìn)行操作(printf("%d ", array[i])。

上面的代碼翻譯成python:

 

復(fù)制代碼 代碼如下:

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

首先,array作為一個(gè)list是個(gè)容器,其次list這個(gè)內(nèi)建類型有默認(rèn)的next行為,python發(fā)現(xiàn)這些之后采取的秘密的沒被各位看到的動(dòng)作是:拿出array這丫容器的疊代器,從里面next一下把值給i供for循環(huán)主體處置,for把這個(gè)值print了。

現(xiàn)在的問題是數(shù)據(jù)可以做容器疊代,代碼可以嗎?

2. constructor

怎么把函數(shù)變成constructor?  在函數(shù)體里有yield就行了!

復(fù)制代碼 代碼如下:

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

for i in gen():
    print i

各位!python看到gen函數(shù)里出現(xiàn)yield,知道可以用next了,問題是怎么對代碼這個(gè)容器玩next?
從容器里拿到iterator的時(shí)候它還什么也不是,處在容器入口處,對于數(shù)組來說就是下標(biāo)為-1的地方,對于函數(shù)來說就是函數(shù)入口嘛事沒干,但是萬事俱備就欠next。
開始for i in g,next讓itreator爬行到y(tǒng)ield語句存在的地方并返回值,
再次next就再爬到下一個(gè)yield語句存在的地方并返回值,依次這樣直到函數(shù)返回(容器盡頭)。
您一定看出來上面代碼的輸出是:
enter
1
next
2
next again

3. 使用yield
yield的代碼疊代能力不但能打斷函數(shù)執(zhí)行還能記下斷點(diǎn)處的數(shù)據(jù),下次next書接上回,
這正是遞歸函數(shù)需要的。
例如中序遍歷二叉樹:
(應(yīng)該是David Mertz寫的)

復(fù)制代碼 代碼如下:

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

相關(guān)文章

最新評論