真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Python生成器函數(shù) python生成器函數(shù)例子

Python 函數(shù) - 返回生成器

如果函數(shù)要返回一系列結(jié)果,我們常見(jiàn)的方法就是將結(jié)果放到一份列表中,然后返回給調(diào)用者。比如下面的函數(shù),返回字符串中每個(gè)單詞的首字母在真?zhèn)€字符串中的索引:

為定遠(yuǎn)等地區(qū)用戶(hù)提供了全套網(wǎng)頁(yè)設(shè)計(jì)制作服務(wù),及定遠(yuǎn)網(wǎng)站建設(shè)行業(yè)解決方案。主營(yíng)業(yè)務(wù)為做網(wǎng)站、網(wǎng)站設(shè)計(jì)、定遠(yuǎn)網(wǎng)站設(shè)計(jì),以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專(zhuān)業(yè)、用心的態(tài)度為用戶(hù)提供真誠(chéng)的服務(wù)。我們深信只要達(dá)到每一位用戶(hù)的要求,就會(huì)得到認(rèn)可,從而選擇與我們長(zhǎng)期合作。這樣,我們也可以走得更遠(yuǎn)!

運(yùn)行結(jié)果:

上述的結(jié)果完全符合我們的預(yù)期,但 get_word_index 函數(shù)不夠簡(jiǎn)潔。下面我們嘗試使用生成器來(lái)實(shí)現(xiàn):

運(yùn)行結(jié)果:

改寫(xiě)之后,不僅運(yùn)行結(jié)果符合要求,由于不需要和 result 列表交互,函數(shù)也變得非常簡(jiǎn)潔。下面我們就來(lái)詳細(xì)學(xué)習(xí)下生成器吧~

生成器是指使用 yield 表達(dá)式的函數(shù),調(diào)用生成器函數(shù)時(shí),它并不會(huì)真的運(yùn)行,而是會(huì)返回迭代器。每次在這個(gè)迭代器上面調(diào)用內(nèi)置的 next 函數(shù)時(shí),迭代器就會(huì)把生成器推進(jìn)到下一個(gè) yield 表達(dá)式那里。生成器傳給 yield 的值均會(huì)由迭代器返回給調(diào)用者。

此外,如果輸入量非常大,使用列表作為返回值,那么程序就有可能耗盡內(nèi)存并崩潰。相反,使用生成器之后,則可以應(yīng)對(duì)任意長(zhǎng)度的輸入數(shù)據(jù)。

例如,下面這個(gè)生成器函數(shù)可以獲取文件中單詞的索引,而不管文件內(nèi)容多大,該函數(shù)執(zhí)行時(shí)消耗的內(nèi)存,只由單行的文本長(zhǎng)度決定:

其中 test_generator.txt 中的內(nèi)容如下:

運(yùn)行結(jié)果:

下面這句話(huà)特別重要: 生成器函數(shù)返回的迭代器,是由狀態(tài)的,及調(diào)用者不應(yīng)該反復(fù)使用它 。我們那 word_index_iter 來(lái)說(shuō)明:

如果想重復(fù)調(diào)用,請(qǐng)將其封裝成容器:

運(yùn)行結(jié)果:

關(guān)于上述自定義容器的實(shí)現(xiàn)原理,我的另外一篇文章做了詳細(xì)介紹,鏈接奉上:

Python生成器簡(jiǎn)介

Python 中的 yield 關(guān)鍵字鮮為人知,但是作用卻很大,正是因?yàn)橛辛藋ield,才有了Python生成器。

yield 是 Python 的關(guān)鍵字,它用于 從函數(shù)返回而不破壞其局部變量的狀態(tài) ,并且在調(diào)用該函數(shù)時(shí),從最后一個(gè) yield 語(yǔ)句開(kāi)始執(zhí)行。任何包含 yield 關(guān)鍵字的函數(shù)都稱(chēng)為生成器。

Python 中的 yield 關(guān)鍵字的作用類(lèi)似于 Python 中的 return 語(yǔ)句,不同之處在于:

yield的優(yōu)點(diǎn)

yield的缺點(diǎn)

Python 可以使用 括號(hào)() 創(chuàng)建生成器

更多時(shí)候,我們使用 yield 關(guān)鍵字創(chuàng)建生成器

下面這個(gè)生成器,前4次調(diào)用它時(shí),返回的是0-3這幾個(gè)特殊值,第5次調(diào)用它時(shí)返回一個(gè)10-20之間的隨機(jī)整數(shù)。

更多時(shí)候,生成器可以返回?zé)o限的值。

注意 generator() 函數(shù)返回的是一個(gè)生成器對(duì)象,要想獲取它的值,可以像上面那樣在迭代器中取出它的值,我們也可以顯式的調(diào)用next函數(shù)獲取值。

Python | yield Keyword - GeeksforGeeks:

閑話(huà)python 45: 淺談生成器yield

生成器似乎并不是一個(gè)經(jīng)常被開(kāi)發(fā)者討論的語(yǔ)法,因此也就沒(méi)有它的大兄弟迭代器那么著名。大家不討論它并不是說(shuō)大家都已經(jīng)對(duì)它熟悉到人盡皆知,與之相反,即使是工作多年的開(kāi)發(fā)者可能對(duì)生成器的運(yùn)行過(guò)程還是知之甚少。這是什么原因?qū)е碌哪??我猜想大概有以下幾點(diǎn)原因: (1)運(yùn)行流程不同尋常,(2)日常開(kāi)發(fā)不需要,(3)常常將生成器與迭代器混淆。 生成器的運(yùn)行流程可以按照協(xié)程來(lái)理解,也就是說(shuō) 返回中間結(jié)果,斷點(diǎn)繼續(xù)運(yùn)行 。這與我們通常對(duì)于程序調(diào)用的理解稍有差異。這種運(yùn)行模式是針對(duì)什么樣的需求呢? 一般而言,生成器是應(yīng)用于大量磁盤(pán)資源的處理。 比如一個(gè)很大的文件,每次讀取一行,下一次讀取需要以上一次讀取的位置為基礎(chǔ)。下面就通過(guò)代碼演示具體看看生成器的運(yùn)行機(jī)制、使用方式以及與迭代器的比較。

什么是生成器?直接用文字描述可能太過(guò)抽象,倒不如先運(yùn)行一段代碼,分析這段代碼的運(yùn)行流程,然后總結(jié)出自己對(duì)生成器的理解。

從以上演示可以看出,這段代碼定義了一個(gè)函數(shù),這個(gè)函數(shù)除了yield這個(gè)關(guān)鍵字之外與一般函數(shù)并沒(méi)有差異,也就是說(shuō)生成器的魔法都是這個(gè)yield關(guān)鍵字引起的。 第一點(diǎn),函數(shù)的返回值是一個(gè)生成器對(duì)象。 上述代碼中,直接調(diào)用這個(gè)看似普通的函數(shù),然后將返回值打印出來(lái),發(fā)現(xiàn)返回值是一個(gè)對(duì)象,而并不是普通函數(shù)的返回值。 第二點(diǎn),可以使用next對(duì)這個(gè)生成器對(duì)象進(jìn)行操作 。生成器對(duì)象天然的可以被next函數(shù)調(diào)用,然后返回在yield關(guān)鍵字后面的內(nèi)容。 第三,再次調(diào)用next函數(shù)處理生成器對(duì)象,發(fā)現(xiàn)是從上次yield語(yǔ)句之后繼續(xù)運(yùn)行,直到下一個(gè)yield語(yǔ)句返回。

生成器的運(yùn)行流程確實(shí)詭異,下面還要演示一個(gè)生成器可以執(zhí)行的更加詭異的操作:運(yùn)行過(guò)程中向函數(shù)傳參。

返回生成器和next函數(shù)操作生成器已經(jīng)并不奇怪了,但是在函數(shù)運(yùn)行過(guò)程中向其傳參還是讓人驚呆了。 調(diào)用生成器的send函數(shù)傳入?yún)?shù),在函數(shù)內(nèi)使用yield語(yǔ)句的返回值接收,然后繼續(xù)運(yùn)行直到下一個(gè)yield語(yǔ)句返回。 以前實(shí)現(xiàn)這種運(yùn)行流程的方式是在函數(shù)中加上一個(gè)從控制臺(tái)獲取數(shù)據(jù)的指令,或者提前將參數(shù)傳入,但是現(xiàn)在不用了,send方式使得傳入的參數(shù)可以隨著讀取到的參數(shù)變化而變化。

很多的開(kāi)發(fā)者比較容易混淆生成器和迭代器,而迭代器的運(yùn)行過(guò)程更加符合一般的程序調(diào)用運(yùn)行流程,因此從親進(jìn)度和使用熟悉度而言,大家對(duì)迭代器更有好感。比如下面演示一個(gè)對(duì)迭代器使用next方法進(jìn)行操作。

從以上演示來(lái)看,大家或許會(huì)認(rèn)為迭代器比生成器簡(jiǎn)單易用得太多了。不過(guò),如果你了解迭代器的實(shí)現(xiàn)機(jī)制,可能就不會(huì)這么早下結(jié)論了。python內(nèi)置了一些已經(jīng)實(shí)現(xiàn)了的迭代器使用確實(shí)方便,但是如果需要自己去寫(xiě)一個(gè)迭代器呢?下面這段代碼就帶大家見(jiàn)識(shí)以下迭代器的實(shí)現(xiàn)。

在python中,能被next函數(shù)操作的對(duì)象一定帶有__next__函數(shù)的實(shí)現(xiàn),而能夠被迭代的對(duì)象有必須實(shí)現(xiàn)__iter__函數(shù)??戳诉@么一段操作,相信大家對(duì)迭代器實(shí)現(xiàn)的繁瑣也是深有體會(huì)了,那么生成器的實(shí)現(xiàn)是不是會(huì)讓你覺(jué)得更加簡(jiǎn)單易用呢?不過(guò)千萬(wàn)別產(chǎn)生一個(gè)誤區(qū),即生成器比迭代器簡(jiǎn)單就多用生成器。 在實(shí)際開(kāi)發(fā)中,如果遇到與大量磁盤(pán)文件或者數(shù)據(jù)庫(kù)操作相關(guān)的倒是可以使用生成器。但是在其他的任務(wù)中使用生成器難免有炫技,并且使邏輯不清晰而導(dǎo)致可讀性下降的嫌疑。 這大概也能解釋生成器受冷落的原因。不過(guò)作為一個(gè)專(zhuān)業(yè)的開(kāi)發(fā)者,熟悉語(yǔ)言特性是分內(nèi)之事。

到此,關(guān)于生成器的討論就結(jié)束了。本文的notebook版本文件在github上的cnbluegeek/notebook倉(cāng)庫(kù)中共享,歡迎感興趣的朋友前往下載。

python迭代器和生成器的區(qū)別

迭代器

迭代是Python最強(qiáng)大的功能之一,是訪(fǎng)問(wèn)集合元素的一種方式。

迭代器是一個(gè)可以記住遍歷的位置的對(duì)象。

迭代器對(duì)象從集合的第一個(gè)元素開(kāi)始訪(fǎng)問(wèn),直到所有的元素被訪(fǎng)問(wèn)完結(jié)束,迭代器只能往前不會(huì)后退。

迭代器有兩個(gè)基本的方法:iter()和next()。

生成器

在Python中,使用了yield的函數(shù)被稱(chēng)為生成器。

跟普通函數(shù)不同的是,生成器是一個(gè)返回迭代器的函數(shù),只能用于迭代操作,更簡(jiǎn)單點(diǎn)理解生成器就是一個(gè)迭代器。

在調(diào)用生成器運(yùn)行的過(guò)程中,每次遇到y(tǒng)ield時(shí)函數(shù)會(huì)暫停并保存當(dāng)前所有的運(yùn)行信息,返回yield的值,并在下一次執(zhí)行next()方法時(shí)從當(dāng)前位置繼續(xù)運(yùn)行。

調(diào)用一個(gè)生成器函數(shù),返回的是一個(gè)迭代器對(duì)象。

迭代器與生成器之間的區(qū)別:

迭代器是一個(gè)更抽象的概念,任何對(duì)象,如果它的類(lèi)有NEXTiter方法返回自己本身,對(duì)于string、list、dict、tuple等這類(lèi)容器對(duì)象,使用for循環(huán)遍歷是很方便的。在后臺(tái)For語(yǔ)言對(duì)容器對(duì)象條用iter()函數(shù),iter()是Python的內(nèi)置函數(shù)。iter()會(huì)返回一個(gè)定義了next()方法迭代器對(duì)象,在容器中逐個(gè)訪(fǎng)問(wèn)容器的元素,next()也是Python的內(nèi)置函數(shù),next()會(huì)拋出StopIteration異常。

生成器是創(chuàng)新迭代器的簡(jiǎn)單而強(qiáng)大的工具,它們寫(xiě)起來(lái)就好像正則函數(shù),只是在需要返回?cái)?shù)據(jù)的時(shí)候使用yield 語(yǔ)句。

迭代器協(xié)議,對(duì)象需要提供next()方法,它要么返回迭代中的下一項(xiàng),要么就引起一個(gè)StopIteration異常,終止迭代。

可迭代對(duì)象,實(shí)現(xiàn)了迭代器協(xié)議對(duì)象。list、tuple、dict都是Iterable可迭代的對(duì)象,但不是Iterator迭代器對(duì)象。


分享文章:Python生成器函數(shù) python生成器函數(shù)例子
當(dāng)前URL:http://weahome.cn/article/dogohjs.html

其他資訊

在線(xiàn)咨詢(xún)

微信咨詢(xún)

電話(huà)咨詢(xún)

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部