国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

Python yield使用方法示例

2019-11-25 18:36:20
字體:
來源:轉載
供稿:網友

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 东兰县| 中山市| 蒲江县| 福鼎市| 天全县| 郴州市| 普定县| 庐江县| 体育| 鱼台县| 伊金霍洛旗| 乐陵市| 紫阳县| 盘锦市| 苏尼特左旗| 平罗县| 寻甸| 马公市| 即墨市| 白沙| 日土县| 林芝县| 榆社县| 剑阁县| 邳州市| 甘泉县| 喀什市| 尚义县| 新余市| 马关县| 宁武县| 玉树县| 霸州市| 万荣县| 宕昌县| 旬邑县| 威宁| 开鲁县| 兰西县| 吉安市| 新昌县|