Python技術(shù)分享—生成器

生成器

Python技術(shù)分享—生成器

有時候沛善,序列或集合內(nèi)的元素的個數(shù)非常巨大,如果全制造出來并放入內(nèi)存,對計算機(jī)的壓力是非常大的。比如,假設(shè)需要獲取一個10**20次方如此巨大的數(shù)據(jù)序列拆檬,把每一個數(shù)都生成出來,并放在一個內(nèi)存的列表內(nèi)妥凳,這是粗暴的方式竟贯,有如此大的內(nèi)存么?如果元素可以按照某種算法推算出來逝钥,需要就計算到哪個屑那,就可以在循環(huán)的過程中不斷推算出后續(xù)的元素,而不必創(chuàng)建完整的元素集合艘款,從而節(jié)省大量的空間持际。在Python中,這種一邊循環(huán)一邊計算出元素的機(jī)制哗咆,稱為生成器:generator蜘欲。

生成生成器:

g = (x * x for x in range(1, 4))
g
<generator object <genexpr> at 0x1022ef630>

可以通過next()函數(shù)獲得generator的下一個返回值,這點(diǎn)和迭代器非常相似:

next(g)
1
next(g)
4
next(g)
9
next(g)
Traceback (most recent call last):
 File "<pyshell#14>", line 1, in <module>
 next(g)
StopIteration
------------------------------------------------
但更多情況下晌柬,我們使用for循環(huán)姥份。
for i in g:
 print(i)

除了使用生成器推導(dǎo)式郭脂,我們還可以使用yield關(guān)鍵字。

def createNums():
 print("----func start------")
 a,b = 0,1
 for i in range(5):
 # print(b)
 print("--1--")
 yield b
 print("--2--")
 a,b = b,a+b # a,b = 1, 1 a,b = 1,2
 print("--3--")
 print("----func end------")
g= createNums()
next(g) # 如果想得到y(tǒng)ield的值,可以打印next(g)

在 Python中澈歉,使用yield返回的函數(shù)會變成一個生成器(generator)展鸡。 在調(diào)用生成器的過程中,每次遇到y(tǒng)ield時函數(shù)會暫停并保存當(dāng)前所有的運(yùn)行信息埃难,返回yield的值莹弊。并在下一次執(zhí)行next()方法時從當(dāng)前位置繼續(xù)運(yùn)行。

# 斐波那契函數(shù)
def fibonacci(n): 
 a = 0
 b = 1
 counter = 0
 while True:
 if counter > n:
 return
 yield a # yield讓該函數(shù)變成一個生成器
 a, b = b, a + b
 counter += 1
fib = fibonacci(10) # fib是一個生成器
print(type(fib))
for i in fib:
 print(i, end=" ")

生成器是可以循環(huán)的,相比next來說,for循環(huán)更友好

a = createNums()
這兩種取值方式是一樣的N谐尽O渌丁!
a.__next__()
next(a)
for i in a:
 print(i)

send

def test():
 i = 0
 while i<5:
 temp = yield i
 print(temp)
 i+=1
t = test()
next(t)
next(t)
t.send("juran")
next(t)
--------------------------------------------
t = test()
t.send("juran")
Traceback (most recent call last):
 File "/Users/binbin/Desktop/Python/demo.py", line 179, in <module>
 t.send("juran")
TypeError: can't send non-None value to a just-started generator
如何解決這個錯誤?
> next(t)
 t.send("juran")

> send(None)
生成器的應(yīng)用

實(shí)現(xiàn)多任務(wù)

def test1():
 while True:
 print("--1--")
 yield None

def test2():
 while True:
 print("--2--")
 yield None
t1 = test1()
t2 = test2()
while True:
 next(t1)
 next(t2)

(寫在最后悟衩,由于以后每天晚上九點(diǎn)半之后會更新Python基礎(chǔ)的知識點(diǎn),記得來看哦Kò荨)

此文來源于微博和今日頭條:邏二妞座泳,轉(zhuǎn)載請注明出處,謝謝

推薦閱讀

改變世界到語言—python幕与,看完才知道從事python憑什么高薪L羰啤(2019年最新三大方向資源)

這本書教你讀懂大腦中的神經(jīng)元,并一個月內(nèi)掌握Python基礎(chǔ)啦鸣,經(jīng)典

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末潮饱,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子诫给,更是在濱河造成了極大的恐慌香拉,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件中狂,死亡現(xiàn)場離奇詭異凫碌,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)胃榕,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進(jìn)店門盛险,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人勋又,你說我怎么就攤上這事苦掘。” “怎么了楔壤?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵鹤啡,是天一觀的道長。 經(jīng)常有香客問我挺邀,道長揉忘,這世上最難降的妖魔是什么跳座? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮泣矛,結(jié)果婚禮上疲眷,老公的妹妹穿的比我還像新娘。我一直安慰自己您朽,他們只是感情好狂丝,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著哗总,像睡著了一般几颜。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上讯屈,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天蛋哭,我揣著相機(jī)與錄音,去河邊找鬼涮母。 笑死谆趾,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的叛本。 我是一名探鬼主播沪蓬,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼来候!你這毒婦竟也來了跷叉?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤营搅,失蹤者是張志新(化名)和其女友劉穎云挟,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體剧防,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡植锉,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了峭拘。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片俊庇。...
    茶點(diǎn)故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖鸡挠,靈堂內(nèi)的尸體忽然破棺而出辉饱,到底是詐尸還是另有隱情,我是刑警寧澤拣展,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布彭沼,位于F島的核電站,受9級特大地震影響备埃,放射性物質(zhì)發(fā)生泄漏姓惑。R本人自食惡果不足惜褐奴,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望于毙。 院中可真熱鬧敦冬,春花似錦、人聲如沸唯沮。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽介蛉。三九已至萌庆,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間币旧,已是汗流浹背践险。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留吹菱,地道東北人捏境。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像毁葱,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子贰剥,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 迭代 如果給定一個list或tuple倾剿,我們可以通過for循環(huán)來遍歷這個list或tuple,這種遍歷我們稱為迭代...
    Mr_Bluyee閱讀 985評論 0 1
  • 本節(jié)課綱 可迭代對象 迭代器 生成器Python中內(nèi)置的序列,如list担忧、tuple芹缔、str、bytes瓶盛、dict...
    郭_揚(yáng)閱讀 1,229評論 0 0
  • 文章來源:python 生成器和迭代器有這篇就夠了 什么是迭代器最欠? 迭代器是訪問集合元素的一種方式。迭代器對象從集...
    YYL07閱讀 541評論 0 4
  • Generator 函數(shù)的語法 簡介 基本概念 Generator 函數(shù)是 ES6 提供的一種異步編程解決方案惩猫,語...
    站在大神的肩膀上看世界閱讀 4,170評論 0 6
  • 生活就像一輛公交車 身邊的人有的和你同路比較久芝硬,有的很快就分道。但無論走多遠(yuǎn)轧房,都有人會先下車拌阴。 說了再見,又再碰上...
    amy430閱讀 180評論 0 0