解析Python中的生成器及其與迭代器的差異
生成器
生成器是一種迭代器,是一種特殊的函數(shù),使用yield操作將函數(shù)構(gòu)造成迭代器。普通的函數(shù)有一個(gè)入口,有一個(gè)返回值;當(dāng)函數(shù)被調(diào)用時(shí),從入口開(kāi)始執(zhí)行,結(jié)束時(shí)返回相應(yīng)的返回值。生成器定義的函數(shù),有多個(gè)入口和多個(gè)返回值;對(duì)生成器執(zhí)行next()操作,進(jìn)行生成器的入口開(kāi)始執(zhí)行代碼,yield操作向調(diào)用者返回一個(gè)值,并將函數(shù)掛起;掛起時(shí),函數(shù)執(zhí)行的環(huán)境和參數(shù)被保存下來(lái);對(duì)生成器執(zhí)行另一個(gè)next()操作時(shí),參數(shù)從掛起狀態(tài)被重新調(diào)用,進(jìn)入上次掛起的執(zhí)行環(huán)境繼續(xù)下面的操作,到下一個(gè)yield操作時(shí)重復(fù)上面的過(guò)程。Python的循環(huán)操作與C語(yǔ)言的實(shí)現(xiàn)不同,如果使用List等數(shù)據(jù)結(jié)構(gòu)需要耗費(fèi)大量的內(nèi)容;循環(huán)操作中使用生成器只需要在內(nèi)存中實(shí)例化一個(gè)對(duì)象,可以減少內(nèi)存占用,提高循環(huán)操作的執(zhí)行速度。
>>>def myG(): ... yield 1 ... yield 2 ... yield 3 ... >>>g=myG() >>>next(g) 1 >>>next(g) 2 >>>next(g) 3 >>>next(g) Traceback (most recent call last): File "<stdin>", line 1, in <module> StopIteration >>>g2=myG() >>>for i in g2: ... print(i) 1 2 3
生成器表達(dá)式
for...[if]...語(yǔ)句可以簡(jiǎn)潔的構(gòu)建一個(gè)List,同時(shí)也可以用來(lái)構(gòu)建生成器。
>>>a=[7,8,9] >>>b=[i**2 for i in a] >>>b [49, 64, 81] >>>ib=(i**2 for i in a) >>>ib <generator object <genexpr> at 0x7f72291217e0> >>>next(ib) 49 >>>next(ib) 64 >>>next(ib) 81 >>>next(ib) Traceback (most recent call last): File "<stdin>", line 1, in <module> StopIteration
迭代器(Iterator)與生成器(Generator)的區(qū)別
迭代器是一個(gè)更抽象的概念,任何對(duì)象,如果它的類(lèi)有next方法(next python3)和iter方法返回自己本身。
每個(gè)生成器都是一個(gè)迭代器,但是反過(guò)來(lái)不行。通常生成器是通過(guò)調(diào)用一個(gè)或多個(gè)yield表達(dá)式構(gòu)成的函數(shù)s生成的。同時(shí)滿足迭代器的定義。
當(dāng)你需要一個(gè)類(lèi)除了有生成器的特性之外還要有一些自定義的方法時(shí),可以使用自定義的迭代器,一般來(lái)說(shuō)生成器更方便,更簡(jiǎn)單。
def squares(start, stop):
for i in xrange(start, stop):
yield i*i
等同于生成器表達(dá)式:
(i*i for i in xrange(start, stop))
列表推倒式是:
[i*i for i in xrange(start, stop)]
如果是構(gòu)建一個(gè)自定義的迭代器:
class Squares(object):
def __init__(self, start, stop):
self.start = start
self.stop = stop
def __iter__(self):
return self
def next(self):
if self.start >= self.stop:
raise StopIteration
current = self.start * self.start
self.start += 1
return current
此時(shí),你還可以定義自己的方法如:
def current(self): return self.start
兩者的相同點(diǎn):對(duì)象迭代完后就不能重寫(xiě)迭代了。
相關(guān)文章
使用sklearn的cross_val_score進(jìn)行交叉驗(yàn)證實(shí)例
今天小編就為大家分享一篇使用sklearn的cross_val_score進(jìn)行交叉驗(yàn)證實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-02-02
python中的多線程鎖lock=threading.Lock()使用方式
這篇文章主要介紹了python中的多線程鎖lock=threading.Lock()使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-06-06
Pytorch上下采樣函數(shù)之F.interpolate數(shù)組采樣操作詳解
最近用到了上采樣下采樣操作,pytorch中使用interpolate可以很輕松的完成,下面這篇文章主要給大家介紹了關(guān)于Pytorch上下采樣函數(shù)之F.interpolate數(shù)組采樣操作的相關(guān)資料,需要的朋友可以參考下2022-04-04
Python文件監(jiān)聽(tīng)工具pyinotify與watchdog實(shí)例
今天小編就為大家分享一篇關(guān)于Python文件監(jiān)聽(tīng)工具pyinotify與watchdog實(shí)例,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2018-10-10
Python標(biāo)準(zhǔn)庫(kù)sched模塊使用指南
這篇文章主要介紹了Python標(biāo)準(zhǔn)庫(kù)sched模塊使用的相關(guān)資料,需要的朋友可以參考下2017-07-07
Python操作Redis之設(shè)置key的過(guò)期時(shí)間實(shí)例代碼
這篇文章主要介紹了Python操作Redis之設(shè)置key的過(guò)期時(shí)間實(shí)例代碼,小編覺(jué)得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下2018-01-01

