新聞中心
創(chuàng)建生成器方法

成都創(chuàng)新互聯(lián)公司專業(yè)成都網(wǎng)站設(shè)計(jì)、成都做網(wǎng)站、外貿(mào)網(wǎng)站建設(shè),集網(wǎng)站策劃、網(wǎng)站設(shè)計(jì)、網(wǎng)站制作于一體,網(wǎng)站seo、網(wǎng)站優(yōu)化、網(wǎng)站營(yíng)銷、軟文營(yíng)銷等專業(yè)人才根據(jù)搜索規(guī)律編程設(shè)計(jì),讓網(wǎng)站在運(yùn)行后,在搜索中有好的表現(xiàn),專業(yè)設(shè)計(jì)制作為您帶來效益的網(wǎng)站!讓網(wǎng)站建設(shè)為您創(chuàng)造效益。
方法一
要?jiǎng)?chuàng)建一個(gè)生成器,有很多種方法。第一種方法很簡(jiǎn)單,只要把一個(gè)列表生成式的[ ]改成( )
創(chuàng)建L和G的區(qū)別僅在于最外層的[ ]和( ),L是一個(gè)列表,而G是一個(gè)生成器。我們可以直接打印出L的每一個(gè)元素,但我們?cè)趺创蛴〕鯣的每一個(gè)元素呢?如果要一個(gè)一個(gè)打印出來,可以通過next()函數(shù)獲得生成器的下一個(gè)返回值:
運(yùn)行結(jié)果:
運(yùn)行結(jié)果:
生成器保存的是算法,每次調(diào)用next(G),就計(jì)算出G的下一個(gè)元素的值,直到計(jì)算到最后一個(gè)元素,沒有更多的元素時(shí),拋出StopIteration的異常。當(dāng)然,這種不斷調(diào)用next()實(shí)在是太變態(tài)了,正確的方法是使用for循環(huán),因?yàn)樯善饕彩强傻鷮?duì)象。所以,我們創(chuàng)建了一個(gè)生成器后,基本上永遠(yuǎn)不會(huì)調(diào)用next(),而是通過for循環(huán)來迭代它,并且不需要關(guān)心StopIteration異常。
相關(guān)推薦:《python視頻教程》
方法2
generator非常強(qiáng)大。如果推算的算法比較復(fù)雜,用類似列表生成式的for循環(huán)無(wú)法實(shí)現(xiàn)的時(shí)候,還可以用函數(shù)來實(shí)現(xiàn)。
比如,著名的斐波拉契數(shù)列(Fibonacci),除第一個(gè)和第二個(gè)數(shù)外,任意一個(gè)數(shù)都可由前兩個(gè)數(shù)相加得到:
1, 1, 2, 3, 5, 8, 13, 21, 34, ...
斐波拉契數(shù)列用列表生成式寫不出來,但是,用函數(shù)把它打印出來卻很容易:
運(yùn)行結(jié)果:
仔細(xì)觀察,可以看出,fib函數(shù)實(shí)際上是定義了斐波拉契數(shù)列的推算規(guī)則,可以從第一個(gè)元素開始,推算出后續(xù)任意的元素,這種邏輯其實(shí)非常類似generator。
也就是說,上面的函數(shù)和generator僅一步之遙。要把fib函數(shù)變成generator,只需要把print(b)改為yield b就可以了:
運(yùn)行結(jié)果:
在上面fib的例子,我們?cè)谘h(huán)過程中不斷調(diào)用yield,就會(huì)不斷中斷。當(dāng)然要給循環(huán)設(shè)置一個(gè)條件來退出循環(huán),不然就會(huì)產(chǎn)生一個(gè)數(shù)列出來。同樣的,把函數(shù)改成generator后,我們基本上從來不會(huì)用next()來獲取下一個(gè)返回值,而是直接使用for循環(huán)來迭代:
運(yùn)行結(jié)果:
但是用for循環(huán)調(diào)用generator時(shí),發(fā)現(xiàn)拿不到generator的return語(yǔ)句的返回值。如果想要拿到返回值,必須捕獲StopIteration錯(cuò)誤,返回值包含在StopIteration的value中:
運(yùn)行結(jié)果:
相關(guān)推薦:
三分鐘看懂什么是Python生成器
本文標(biāo)題:創(chuàng)新互聯(lián)Python教程:Python創(chuàng)建生成器的兩種方法
文章分享:http://m.fisionsoft.com.cn/article/codoced.html


咨詢
建站咨詢
