python的 是什么-python中的生成器是什么?生成器有什么用处?
在以下的文章之中我們來(lái)了解一下什么是python中生成器。了解一下python生成器是什么,以及生成器在python編程之中能起到什么樣的作用。
python生成器是什么?
通過(guò)列表生成式,我們可以直接創(chuàng)建一個(gè)列表。但是,受到內(nèi)存限制,列表容量肯定是有限的。而且,創(chuàng)建一個(gè)包含100萬(wàn)個(gè)元素的列表,不僅占用很大的存儲(chǔ)空間,如果我們僅僅需要訪問(wèn)前面幾個(gè)元素,那后面絕大多數(shù)元素占用的空間都白白浪費(fèi)了。
所以,如果列表元素可以按照某種算法推算出來(lái),那我們是否可以在循環(huán)的過(guò)程中不斷推算出后續(xù)的元素呢?這樣就不必創(chuàng)建完整的list,從而節(jié)省大量的空間。在Python中,這種一邊循環(huán)一邊計(jì)算的機(jī)制,稱為生成器:generator。
要?jiǎng)?chuàng)建一個(gè)generator,有很多種方法。第一種方法很簡(jiǎn)單,只要把一個(gè)列表生成式的[]改成(),就創(chuàng)建了一個(gè)generator:>>> L = [x * x for x in range(10)]
>>> L
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
>>> g = (x * x for x in range(10))
>>> g
at 0x1022ef630>
我們創(chuàng)建了一個(gè)generator后,通過(guò)for循環(huán)來(lái)迭代它,并且不需要關(guān)心StopIteration的錯(cuò)誤。
generator非常強(qiáng)大。如果推算的算法比較復(fù)雜,用類似列表生成式的for循環(huán)無(wú)法實(shí)現(xiàn)的時(shí)候,還可以用函數(shù)來(lái)實(shí)現(xiàn)。
比如,著名的斐波拉契數(shù)列(Fibonacci),除第一個(gè)和第二個(gè)數(shù)外,任意一個(gè)數(shù)都可由前兩個(gè)數(shù)相加得到:def fib(max):
n, a, b = 0, 0, 1
while n < max:
print(b)
a, b = b, a + b
n = n + 1
return "done"
注意,賦值語(yǔ)句:a, b = b, a + b
相當(dāng)于:t = (b, a + b) # t是一個(gè)tuplea = t[0]b = t[1]
但不必顯式寫(xiě)出臨時(shí)變量t就可以賦值。
上面的函數(shù)可以輸出斐波那契數(shù)列的前N個(gè)數(shù):>>> fib(6)112358"done"
仔細(xì)觀察,可以看出,fib函數(shù)實(shí)際上是定義了斐波拉契數(shù)列的推算規(guī)則,可以從第一個(gè)元素開(kāi)始,推算出后續(xù)任意的元素,這種邏輯其實(shí)非常類似generator。
也就是說(shuō),上面的函數(shù)和generator僅一步之遙。要把fib函數(shù)變成generator,只需要把print(b)改為yield b就可以了:def fib(max):
n, a, b = 0, 0, 1
while n < max: yield b
a, b = b, a + b
n = n + 1
return "done"
這就是定義generator的另一種方法。如果一個(gè)函數(shù)定義中包含yield關(guān)鍵字,那么這個(gè)函數(shù)就不再是一個(gè)普通函數(shù),而是一個(gè)generator:>>> f = fib(6)
>>> f
這里,最難理解的就是generator和函數(shù)的執(zhí)行流程不一樣。函數(shù)是順序執(zhí)行,遇到return語(yǔ)句或者最后一行函數(shù)語(yǔ)句就返回。而變成generator的函數(shù),在每次調(diào)用next()的時(shí)候執(zhí)行,遇到y(tǒng)ield語(yǔ)句返回,再次執(zhí)行時(shí)從上次返回的yield語(yǔ)句處繼續(xù)執(zhí)行。
以上就是本篇文章所講述的所有內(nèi)容,這篇文章主要介紹了相關(guān)于python中生成器的知識(shí),希望你能借助資料從而理解上述所說(shuō)的內(nèi)容。希望我在這片文章所講述的內(nèi)容能夠?qū)δ阌兴鶐椭?#xff0c;讓你學(xué)習(xí)python更加輕松。
更多相關(guān)知識(shí),請(qǐng)?jiān)L問(wèn)Gxl網(wǎng)Python教程欄目。
以上就是python中的生成器是什么?生成器有什么用處?的詳細(xì)內(nèi)容,更多請(qǐng)關(guān)注Gxl網(wǎng)其它相關(guān)文章!
本條技術(shù)文章來(lái)源于互聯(lián)網(wǎng),如果無(wú)意侵犯您的權(quán)益請(qǐng)點(diǎn)擊此處反饋版權(quán)投訴
本文系統(tǒng)來(lái)源:php中文網(wǎng)
總結(jié)
以上是生活随笔為你收集整理的python的 是什么-python中的生成器是什么?生成器有什么用处?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: matlab等距线扫描多边形程序实现_常
- 下一篇: noteexpress 笔记导出_【在库