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

首頁 > 開發(fā) > Python > 正文

Python generator生成器和yield表達式詳解

2024-09-09 19:02:56
字體:
供稿:網(wǎng)友

前言

Python生成器(generator)并不是一個晦澀難懂的概念。相比于MetaClass和Closure等概念,其較為容易理解和掌握。但相對于程序結(jié)構(gòu):順序、循環(huán)和分支而言其又不是特別的直觀。無論學習任何的東西,概念都是非常重要的。正確樹立并掌握一些基礎(chǔ)的概念是靈活和合理運用的前提,本文將以一種通俗易懂的方式介紹一下generator和yield表達式。

1. Iterator與Iterable

首先明白兩點:

Iterator(迭代器)是可迭代對象; 可迭代對象并不一定是Iterator;

比較常見的數(shù)據(jù)類型list、tuple、dict等都是可迭代的,屬于collections.Iterable類型;

迭代器不僅可迭代還可以被內(nèi)置函數(shù)next調(diào)用,屬于collections.Iterator類型;

迭代器是特殊的可迭代對象,是可迭代對象的一個子集。

將要介紹的gererator(生成器)是types.GeneratorType類型,也是collections.Iterator類型。

也就是說生成器是迭代器,可被next調(diào)用,也可迭代。

三者的包含關(guān)系:(可迭代(迭代器(生成器)))

迭代器:可用next()函數(shù)訪問的對象; 生成器:生成器表達式和生成器函數(shù);

2. Python生成器

python有兩種類型的生成器:生成器表達式和生成器函數(shù)。

由于生成器可迭代并且是iterator,因此可以通過for和next進行遍歷。

2.1 生成器表達式

把列表生成式的[]改成()便得到生成器表達式。

>>> gen = (i + i for i in xrange(10))>>> gen<generator object <genexpr> at 0x0000000003A2DAB0>>>> type(gen)<type 'generator'>>>> isinstance(gen, types.GeneratorType) and isinstance(gen, collections.Iterator) and isinstance(gen, collections.Iterable)True>>>

2.2 生成器函數(shù)

python函數(shù)定義中有關(guān)鍵字yield,該函數(shù)便是一個生成器函數(shù),函數(shù)調(diào)用返回的是一個generator.

def yield_func():  for i in xrange(3):    yield igen_func = yield_func()for yield_val in gen_func:  print yield_val

生成器函數(shù)每次執(zhí)行到y(tǒng)ield便會返回,但與普通函數(shù)不同的是yield返回時會保留當前函數(shù)的執(zhí)行狀態(tài),再次被調(diào)用時可以從中斷的地方繼續(xù)執(zhí)行。

2.3 next與send

通過for和next可以遍歷生成器,而send則可以用于向生成器函數(shù)發(fā)送消息。

def yield_func():  for i in xrange(1, 3):    x = yield i    print 'yield_func',xgen_func = yield_func()print 'iter result: %d' % next(gen_func)print 'iter result: %d' % gen_func.send(100)

結(jié)果:

iter result: 1yield_func 100iter result: 2

簡單分析一下執(zhí)行過程:

line_no 5 調(diào)用生成器函數(shù)yield_func得到函數(shù)生成器gen_func; line_no 6 使用next調(diào)用gen_func,此時才真正的開始執(zhí)行yield_func定義的代碼; line_no 3 執(zhí)行到y(tǒng)ield i,函數(shù)yield_func暫停執(zhí)行并返回當前i的值1. line_no 6 next(gen_func)得到函數(shù)yield_func執(zhí)行到y(tǒng)ield i返回的值1,輸出結(jié)果iter result: 1; line_no 7 執(zhí)行g(shù)en_func.send(100); line_no 3 函數(shù)yield_func繼續(xù)執(zhí)行,并將調(diào)用者send的值100賦值給x; line_no 4 輸出調(diào)用者send接收到的值; line_no 3 執(zhí)行到y(tǒng)ield i,函數(shù)yield_func暫停執(zhí)行并返回當前i的值2. line_no 7 執(zhí)行g(shù)en_func.send(100)得到函數(shù)yield_func運行到y(tǒng)ield i返回的值2,輸出結(jié)果iter result: 2;
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 宿松县| 康乐县| 库车县| 仁化县| 苏尼特右旗| 汉沽区| 明光市| 彭山县| 诸暨市| 黄大仙区| 达日县| 固镇县| 洪江市| 威远县| 延安市| 马龙县| 新田县| 巴青县| 鄢陵县| 江达县| 灵台县| 博客| 高密市| 集安市| 龙州县| 项城市| 张家口市| 改则县| 庆元县| 镇沅| 汪清县| 江门市| 南丰县| 赤峰市| 固阳县| 澄城县| 陵川县| 张家口市| 隆安县| 阳东县| 密山市|