亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Python > 正文

深入學習python的yield和generator

2020-01-04 17:38:45
字體:
來源:轉載
供稿:網友
這篇文章主要為大家詳細介紹了python的yield和generator,針對python的生成器和yield關鍵字進行深入學習,感興趣的小伙伴們可以參考一下
 

前言
沒有用過的東西,沒有深刻理解的東西很難說自己會,而且被別人一問必然破綻百出。雖然之前有接觸過python協程的概念,但是只是走馬觀花,這兩天的一次交談中,別人問到了協程,頓時語塞,死活想不起來曾經看過的東西,之后突然想到了yield,但為時已晚,只能說概念不清,所以本篇先縷縷python的生成器和yield關鍵字。

什么是生成器
1、生成器是一個特殊的程序,可以被用作控制循環的迭代行為
2、生成器類似于返回值為數組的一個函數,這個函數可以接收參數,可以被調用,但是,不同于一般的函數會一次性返回包含了所有數值的數組,生成器一次只產生一個值,這樣消耗的內粗數量大大減少,而且允許調用函數可以很快的開始處理前幾個返回值。因此,生成器看起來像一個函數但是表現的卻像一個迭代器。
python中的生成器
python提供了兩種基本的方式。

1)、生成器函數:也是用def來定義,利用關鍵字yield一次返回一個結果,阻塞,重新開始
2)、生成器表達式:返回一個對象,這個對象只有在需要的時候才產生結果
下面詳細講解。

1、生成器函數
為什么叫生成器函數?因為他隨著時間的推移生成了一個數值隊列。一般的函數在執行完畢之后會返回一個值然后退出,但是生成器函數會自動掛起,然后重新拾起繼續執行,他會利用yield關鍵字關起函數,給調用者返回一個值,同時保留了當前的足夠多的狀態,可以使函數繼續執行。生成器和迭代協議是密切相關的,可迭代的對象都有一個__next()__成員方法,這個方法要么返回迭代的下一項,要么引起異常結束迭代。
為了支持迭代協議,擁有yield語句的函數被編譯為生成器,這類函數被調用時返回一個生成器對象,返回的對象支持迭代接口,即成員方法__next()__繼續從中斷處執行執行。
看下面的例子:

# codesdef create_counter(n): print "create counter" while True:  yield n  print 'increment n'  n += 1cnt = create_counter(2)print cntprint next(cnt)print next(cnt)# output<generator object create_counter at 0x0000000001D141B0>create counter2increment n3

分析一下這個例子:

  • 在create_counter函數中出現了關鍵字yield,預示著這個函數每次只產生一個結果值,這個函數返回一個生成器(通過第一行輸出可以看出來),用來產生連續的n值
  • 在創造生成器實例的時候,只需要像普通函數一樣調用就可以,但是這個調用卻不會執行這個函數,這個可以通過輸出看出來
  • next()函數將生成器對象作為自己的參數,在第一次調用的時候,他執行了create_counter()函數到yield語句,返回產生的值2
  • 我們重復的調用next()函數,每次他都會從上次被掛起的地方開始執行,直到再次遇到了yield關鍵字

為了更加深刻的理解,我們再舉一個例子。

#codingdef cube(n): for i in range(n):  yield i ** 3for i in cube(5): print i#output0182764

所以從理解函數的角度出發我們可以將yield類比為return,但是功能確實完全不同,在for循環中,會自動遵循迭代規則,每次調用next()函數,所以上面的結果不難理解。

2、生成器表達式
生成器表達式來自于迭代和列表解析的組合,關于列表解析的概念和用法可以參見我之前的博客,生成器表達式和列表解析類似,但是他使用尖括號而不是方括號括起來的。如下代碼:

>>> # 列表解析生成列表>>> [ x ** 3 for x in range(5)][0, 1, 8, 27, 64]>>> >>> # 生成器表達式>>> (x ** 3 for x in range(5))<generator object <genexpr> at 0x000000000315F678>>>> # 兩者之間轉換>>> list(x ** 3 for x in range(5))[0, 1, 8, 27, 64]

就操作而言,生成器表如果使用大量的next()函數會顯得十分不方便,for循環會自動出發next函數,所以可以按下面方式使用:

>>> for n in (x ** 3 for x in range(5)): print('%s, %s' % (n, n * n)) 0, 01, 18, 6427, 72964, 4096>>> 

兩者比較
一個迭代既可以被寫成生成器函數,也可以被協程生成器表達式,均支持自動和手動迭代。而且這些生成器只支持一個active迭代,也就是說生成器的迭代器就是生成器本身。

總結
想起了初中時候老師經常說的,眼觀千遍,不如手動一遍。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产一区二区三区直播精品电影| 国产精品一区二区久久久久| 国产成人高清激情视频在线观看| 精品动漫一区二区| 亚洲第一免费播放区| 国外成人在线直播| 在线日韩日本国产亚洲| 精品成人乱色一区二区| 亚洲成人av在线| 高清在线视频日韩欧美| 亚洲欧美一区二区三区久久| 国产成人在线视频| 久久亚洲国产成人| 久久久久久久影院| 亚洲欧美日韩第一区| 国产区精品在线观看| 国产视频丨精品|在线观看| 国产成+人+综合+亚洲欧美丁香花| 欧美精品中文字幕一区| 97超碰国产精品女人人人爽| 欧美激情视频网站| 欧美激情视频网址| 国产精品一区二区在线| 欧美在线视频一区二区| 日本国产欧美一区二区三区| 国产一区玩具在线观看| 欧美最猛性xxxxx免费| 久久影视电视剧凤归四时歌| 欧美日韩中文字幕| 日韩一级裸体免费视频| 国内揄拍国内精品少妇国语| 亚洲石原莉奈一区二区在线观看| 亚洲电影中文字幕| 日韩av影视综合网| 欧洲美女7788成人免费视频| 亚洲图片欧洲图片av| 26uuu另类亚洲欧美日本老年| 色先锋资源久久综合5566| 欧美精品第一页在线播放| 日韩专区中文字幕| www.欧美视频| 欧美高清视频一区二区| 欧美一区二区三区图| 精品日本美女福利在线观看| 亚洲一区二区三区在线视频| 日韩精品在线视频观看| 精品久久久香蕉免费精品视频| 深夜成人在线观看| 国产在线精品自拍| 欧美激情女人20p| 国产午夜精品全部视频播放| 日韩欧美在线视频日韩欧美在线视频| 欧美国产日韩一区二区三区| www.亚洲一二| 日本久久亚洲电影| 日本精品一区二区三区在线播放视频| 久久精品国产v日韩v亚洲| 九九综合九九综合| 91日本在线观看| 国产剧情久久久久久| 日韩中文在线视频| 5566日本婷婷色中文字幕97| 亚洲欧美制服第一页| 亚洲人线精品午夜| 亚洲欧美激情四射在线日| 精品久久久一区二区| 日韩毛片在线看| 欧美国产精品va在线观看| 国产精品久久久久秋霞鲁丝| 亚洲人av在线影院| 精品久久久久人成| 国产一区二区三区三区在线观看| 4438全国亚洲精品在线观看视频| 亚洲色无码播放| 亚洲性视频网站| 美日韩精品免费观看视频| 国内揄拍国内精品少妇国语| 亚洲欧洲国产伦综合| 欧洲精品久久久| 国产精品福利在线| 日韩av电影在线免费播放| 亚洲精品久久久久久久久久久久| 91精品国产91久久久久久| 欧美大成色www永久网站婷| 日韩av在线精品| 日韩中文字幕精品视频| 国产成人精品优优av| 欧美寡妇偷汉性猛交| 欧洲成人午夜免费大片| 91高清在线免费观看| 国产视频精品一区二区三区| 一夜七次郎国产精品亚洲| 国产精品综合不卡av| 777午夜精品福利在线观看| 国产999在线观看| 精品久久久香蕉免费精品视频| 国产精品观看在线亚洲人成网| 欧美成年人视频网站| 国产精品久久久久久一区二区| 欧美性猛交xxxx乱大交极品| 国产精品视频专区| 最新日韩中文字幕| 亚洲国产美女精品久久久久∴| 成人黄色av免费在线观看| 97超级碰碰人国产在线观看| 97婷婷大伊香蕉精品视频| xxxxx91麻豆| 久久精品国产2020观看福利| 在线日韩中文字幕| 欧美视频在线免费看| 成人性生交大片免费看小说| 久久久久久中文| 欧美视频在线观看免费网址| 欧美大片免费观看在线观看网站推荐| 亚洲欧美制服丝袜| 亚洲精品电影网在线观看| 性欧美办公室18xxxxhd| 色午夜这里只有精品| www.久久久久久.com| 国产精品免费小视频| 国产婷婷色综合av蜜臀av| 一区二区三区视频免费| 国产日韩在线看| 一区二区亚洲欧洲国产日韩| 日韩精品高清在线观看| 国产在线观看91精品一区| 亚洲图片欧美日产| 亚洲va国产va天堂va久久| 欧美国产精品va在线观看| 国产精品美女网站| 狠狠色狠狠色综合日日小说| 亚洲国产又黄又爽女人高潮的| 91精品国产高清| 91天堂在线视频| 国产日韩在线播放| 国产一区二中文字幕在线看| 自拍偷拍亚洲一区| 欧美精品在线网站| 国产一区二区激情| 精品香蕉一区二区三区| 欧美性在线观看| 欧美自拍大量在线观看| 午夜精品三级视频福利| 欧美激情一区二区三区在线视频观看| 97国产精品人人爽人人做| 国产精品老牛影院在线观看| 欧美在线免费视频| 久久精品国产亚洲精品2020| 精品国产91乱高清在线观看| 欧美激情一级欧美精品| 日韩一区二区三区在线播放| 91av视频在线播放| 亚洲xxxx妇黄裸体| 2019中文字幕免费视频| 国产午夜精品视频免费不卡69堂| 亚洲人在线观看| 一区二区在线免费视频| 日韩av影院在线观看| 国产一区二区三区网站| 国内偷自视频区视频综合| 国产精品成人va在线观看| 精品中文字幕在线2019| 日韩成人xxxx| 亚洲人成在线播放|