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

首頁 > 編程 > Python > 正文

Python函數(shù)式編程指南(四):生成器詳解

2020-02-23 01:36:52
字體:
供稿:網(wǎng)友

4. 生成器(generator)

4.1. 生成器簡介

首先請確信,生成器就是一種迭代器。生成器擁有next方法并且行為與迭代器完全相同,這意味著生成器也可以用于Python的for循環(huán)中。另外,對于生成器的特殊語法支持使得編寫一個(gè)生成器比自定義一個(gè)常規(guī)的迭代器要簡單不少,所以生成器也是最常用到的特性之一。

從Python 2.5開始,[PEP 342:通過增強(qiáng)生成器實(shí)現(xiàn)協(xié)同程序]的實(shí)現(xiàn)為生成器加入了更多的特性,這意味著生成器還可以完成更多的工作。這部分我們會(huì)在稍后的部分介紹。

4.2. 生成器函數(shù)

4.2.1. 使用生成器函數(shù)定義生成器

如何獲取一個(gè)生成器?首先來看一小段代碼:
代碼如下:
>>> def get_0_1_2():
...   yield 0
...   yield 1
...   yield 2
...
>>> get_0_1_2
<function get_0_1_2 at 0x00B2CB70>

我們定義了一個(gè)函數(shù)get_0_1_2,并且可以查看到這確實(shí)是函數(shù)類型。但與一般的函數(shù)不同的是,get_0_1_2的函數(shù)體內(nèi)使用了關(guān)鍵字yield,這使得get_0_1_2成為了一個(gè)生成器函數(shù)。生成器函數(shù)的特性如下:

1.調(diào)用生成器函數(shù)將返回一個(gè)生成器;
代碼如下:
>>> generator = get_0_1_2()
>>> generator
<generator object get_0_1_2 at 0x00B1C7D8>

2.第一次調(diào)用生成器的next方法時(shí),生成器才開始執(zhí)行生成器函數(shù)(而不是構(gòu)建生成器時(shí)),直到遇到y(tǒng)ield時(shí)暫停執(zhí)行(掛起),并且yield的參數(shù)將作為此次next方法的返回值;
代碼如下:
>>> generator.next()
0

3.之后每次調(diào)用生成器的next方法,生成器將從上次暫停執(zhí)行的位置恢復(fù)執(zhí)行生成器函數(shù),直到再次遇到y(tǒng)ield時(shí)暫停,并且同樣的,yield的參數(shù)將作為next方法的返回值;
代碼如下:
>>> generator.next()
1
>>> generator.next()
2

4.如果當(dāng)調(diào)用next方法時(shí)生成器函數(shù)結(jié)束(遇到空的return語句或是到達(dá)函數(shù)體末尾),則這次next方法的調(diào)用將拋出StopIteration異常(即for循環(huán)的終止條件);
代碼如下:
>>> generator.next()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration

5.生成器函數(shù)在每次暫停執(zhí)行時(shí),函數(shù)體內(nèi)的所有變量都將被封存(freeze)在生成器中,并將在恢復(fù)執(zhí)行時(shí)還原,并且類似于閉包,即使是同一個(gè)生成器函數(shù)返回的生成器,封存的變量也是互相獨(dú)立的。
我們的小例子中并沒有用到變量,所以這里另外定義一個(gè)生成器來展示這個(gè)特點(diǎn):
代碼如下:
>>> def fibonacci():
...   a = b = 1
...   yield a
...   yield b

發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 旬邑县| 永平县| 洛扎县| 云霄县| 进贤县| 阳山县| 和龙市| 永福县| 新营市| 阆中市| 元阳县| 久治县| 资讯 | 谢通门县| 天水市| 金溪县| 襄汾县| 廊坊市| 紫云| 彭州市| 庆元县| 河北省| 贡觉县| 鹤峰县| 沛县| 天全县| 北川| 黑山县| 监利县| 蒲江县| 镇巴县| 黎城县| 民勤县| 开阳县| 黄梅县| 镇宁| 仪征市| 改则县| 平陆县| 会宁县| 安泽县|