python——生成器详解
一、生成器的由來(lái)
列表和列表生成器都無(wú)法解決內(nèi)存受限的問(wèn)題,列表中的所有數(shù)據(jù)都保存在內(nèi)存中,以至于列表中的元素的太多了,當(dāng)列表中的元素超過(guò)超過(guò)幾十萬(wàn)甚至幾百萬(wàn),大量數(shù)據(jù)占用電腦內(nèi)存,從而導(dǎo)致內(nèi)存溢出,不利于我們后面的編程,所以要引用生成器
二、生成器定義
生成器是python中的一個(gè)對(duì)象(按照某種規(guī)律,來(lái)生成元素的對(duì)象),生成器不是列表,保存了產(chǎn)生元素的算法,同時(shí)會(huì)記錄游標(biāo)的位置(現(xiàn)在拿到第幾個(gè)元素了),為了下次繼續(xù)拿數(shù)據(jù),而不是從頭開(kāi)始拿數(shù)據(jù)。可以通過(guò)一直調(diào)用next()方法獲取值,這個(gè)對(duì)象不保存數(shù)據(jù),每次調(diào)用會(huì)返回一個(gè)值,即做到了列表的好處,又不占用空間。
三、創(chuàng)建生成器
第一種方法:通過(guò)列表生成式來(lái)創(chuàng)建
generator:表示生成器
第二種方法:通過(guò)函數(shù)創(chuàng)建生成器(yield)
1、例如創(chuàng)建有限的斐波拉且數(shù)列
yield一般用于創(chuàng)建生成器,作用:返回后面變量(b)給生成器,而不是返回給函數(shù)的,b就是斐波拉且數(shù)列中的一個(gè)元素
只要在函數(shù)中有yield關(guān)鍵字,那么當(dāng)前這個(gè)函數(shù)是屬于生成器中保存的算法,算法實(shí)現(xiàn)的功能就是生成b
不會(huì)打印done
2、例如創(chuàng)建無(wú)限的斐波拉且數(shù)列,不能用for循環(huán)
注意:yield:是沒(méi)有返回值的,如果賦值的話會(huì)打印None
輸出結(jié)果為:
四、遍歷生成器中的元素
第一種方法:
通過(guò)next(g),每調(diào)用一次next(),就會(huì)拿掉一個(gè)值(表達(dá)式中的第一個(gè)值),當(dāng)已經(jīng)遍歷到生成器的結(jié)尾,會(huì)拋一個(gè)異常StopIteration。第4次調(diào)用next()的時(shí)候,生成器中已經(jīng)沒(méi)有數(shù)據(jù)了,繼續(xù)調(diào)用會(huì)報(bào)錯(cuò)
第二種方法:
通過(guò)for循環(huán)遍歷,for循環(huán)不會(huì)拋出異常
for循環(huán)的打印結(jié)果為:4,5,6,7,因?yàn)檎{(diào)用了一次next(g),游標(biāo)已經(jīng)往下走了,
第三種方法
object內(nèi)置的__next__,當(dāng)已經(jīng)遍歷到生成器的結(jié)尾,會(huì)拋一個(gè)異常StopIteration
第四種方法
send函數(shù):但是生成器的第一個(gè)值必須使用send(None),后面的值就沒(méi)有限制了
總結(jié)
以上是生活随笔為你收集整理的python——生成器详解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: python—类和对象之浅拷贝和深拷贝详
- 下一篇: python——迭代器