最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

深入學(xué)習(xí)python的yield和generator

 更新時間:2016年03月10日 15:38:52   作者:cotyb  
這篇文章主要為大家詳細介紹了python的yield和generator,針對python的生成器和yield關(guān)鍵字進行深入學(xué)習(xí),感興趣的小伙伴們可以參考一下

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

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

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

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

# codes
def create_counter(n):
 print "create counter"
 while True:
  yield n
  print 'increment n'
  n += 1

cnt = create_counter(2)
print cnt
print next(cnt)
print next(cnt)

# output
<generator object create_counter at 0x0000000001D141B0>
create counter
2
increment n
3

分析一下這個例子:

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

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

#coding
def cube(n):
 for i in range(n):
  yield i ** 3

for i in cube(5):
 print i

#output
0
1
8
27
64

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

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

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

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

>>> for n in (x ** 3 for x in range(5)):
 print('%s, %s' % (n, n * n))

 
0, 0
1, 1
8, 64
27, 729
64, 4096
>>> 

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

總結(jié)
想起了初中時候老師經(jīng)常說的,眼觀千遍,不如手動一遍。

相關(guān)文章

  • Python?ORM框架之SQLAlchemy?的基礎(chǔ)用法

    Python?ORM框架之SQLAlchemy?的基礎(chǔ)用法

    這篇文章主要介紹了Python?ORM框架之SQLAlchemy?的基礎(chǔ)用法,ORM全稱?Object?Relational?Mapping對象關(guān)系映射,更多詳細內(nèi)容需要的小伙伴課題參考下面文章介紹。希望對你的學(xué)習(xí)有所幫助
    2022-03-03
  • 利用Python批量生成任意尺寸的圖片

    利用Python批量生成任意尺寸的圖片

    不知道大家有沒有遇到過,因檢驗需要1000張,分別從1*1到1000*1000像素的圖片。搜索一番過后發(fā)現(xiàn)還是Python實現(xiàn)比較方便,遂決定用Python實現(xiàn)這一功能,下面分享給大家,有需要的可以參考。
    2016-08-08
  • PyQt5的相對布局管理的實現(xiàn)

    PyQt5的相對布局管理的實現(xiàn)

    這篇文章主要介紹了PyQt5的相對布局管理的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • Python中l(wèi)ist列表添加元素的3種方法總結(jié)

    Python中l(wèi)ist列表添加元素的3種方法總結(jié)

    這篇文章主要介紹了Python中l(wèi)ist列表添加元素的3種方法總結(jié),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • opencv銀行卡號識別的項目實踐

    opencv銀行卡號識別的項目實踐

    本文主要介紹了opencv銀行卡號識別的項目實踐,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-04-04
  • Series和DataFrame使用簡單入門

    Series和DataFrame使用簡單入門

    這篇文章主要介紹了Series和DataFrame使用簡單入門,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-11-11
  • python實現(xiàn)刪除列表中空字符串元素的兩種方法

    python實現(xiàn)刪除列表中空字符串元素的兩種方法

    本文主要介紹了python實現(xiàn)刪除列表中空字符串元素的兩種方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-03-03
  • Python OpenCV快速入門教程

    Python OpenCV快速入門教程

    這篇文章主要介紹了Python OpenCV快速入門教程,幫助大家更好的利用opencv處理圖像,感興趣的朋友可以了解下
    2021-04-04
  • Python使用__new__()方法為對象分配內(nèi)存及返回對象的引用示例

    Python使用__new__()方法為對象分配內(nèi)存及返回對象的引用示例

    這篇文章主要介紹了Python使用__new__()方法為對象分配內(nèi)存及返回對象的引用,結(jié)合實例形式分析了Python對象初始化及內(nèi)存操作相關(guān)使用技巧,需要的朋友可以參考下
    2019-09-09
  • python numpy庫np.percentile用法說明

    python numpy庫np.percentile用法說明

    這篇文章主要介紹了python numpy庫np.percentile用法說明,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-06-06

最新評論

彩票| 枝江市| 清丰县| 嵊州市| 洛浦县| 江阴市| 玉山县| 鄯善县| 东乡县| 江安县| 新竹县| 昌江| 盐山县| 安义县| 康定县| 乌兰县| 忻州市| 翼城县| 阿坝| 靖远县| 明溪县| 永济市| 门源| 聂拉木县| 南澳县| 鄢陵县| 义乌市| 肥乡县| 德格县| 孟津县| 玉环县| 阿克陶县| 海兴县| 苍梧县| 哈尔滨市| 博湖县| 山东省| 盘山县| 雅江县| 凌源市| 浏阳市|