Python的生成器是個(gè)很強(qiáng)大的東西,特別是在python3.0版本以后。以最簡(jiǎn)單的方式讓大家快速理解生成器。
高碑店網(wǎng)站制作公司哪家好,找成都創(chuàng)新互聯(lián)!從網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站建設(shè)、微信開(kāi)發(fā)、APP開(kāi)發(fā)、成都響應(yīng)式網(wǎng)站建設(shè)等網(wǎng)站項(xiàng)目制作,到程序開(kāi)發(fā),運(yùn)營(yíng)維護(hù)。成都創(chuàng)新互聯(lián)自2013年創(chuàng)立以來(lái)到現(xiàn)在10年的時(shí)間,我們擁有了豐富的建站經(jīng)驗(yàn)和運(yùn)維經(jīng)驗(yàn),來(lái)保證我們的工作的順利進(jìn)行。專注于網(wǎng)站建設(shè)就選成都創(chuàng)新互聯(lián)。1、正常的寫(xiě)法
來(lái)看個(gè)例子,比如輸出一個(gè)自定義長(zhǎng)度的列表一般這么寫(xiě):
這里傳入的參數(shù)時(shí)10,所以會(huì)得到一個(gè)包含10個(gè)元素的列表:
那當(dāng)我傳入的是10W的時(shí)候,那生成的這個(gè)列表就很大了,也占內(nèi)存,運(yùn)行腳本也占cpu。
2、改良后寫(xiě)法
改良一下代碼,把他寫(xiě)成一個(gè)迭代的類:
這里面self.b就記錄了每次執(zhí)行next方法的位置,知道每次是第幾次執(zhí)行next方法,所以執(zhí)行保證了每次輸出的是期望的值,其實(shí)這就是迭代了,每運(yùn)行一次函數(shù)都被記錄已運(yùn)行的狀態(tài)。當(dāng)被調(diào)用的時(shí)候才返回值,否則就處于等待被調(diào)用的狀態(tài)
運(yùn)行結(jié)果:
所以這改良后的代碼就解決了當(dāng)你輸入10W的時(shí)候占用資源的問(wèn)題,因?yàn)檩斎?0W后,只要當(dāng)調(diào)用next函數(shù)的時(shí)候才返回值,不是一次返回一個(gè)那么大的列表出來(lái)。
3、生成器
那么第二步中的代碼跟第一步比起來(lái)又太多了感覺(jué),那么生成器就來(lái)了
再改良代碼:
只需改下第一步中的代碼a.append(n)為yield n,這就是一個(gè)生成器了,然后通過(guò)for語(yǔ)句來(lái)調(diào)用生成器的值。
任何一個(gè)帶有yield語(yǔ)句的函數(shù)都是生成器,當(dāng)你直接調(diào)用這個(gè)函數(shù)時(shí),內(nèi)部的代碼是不會(huì)被執(zhí)行的,只有調(diào)用yield里面的next函數(shù)才會(huì)去執(zhí)行代碼,for循環(huán)也就是會(huì)自動(dòng)去調(diào)用這個(gè)next函數(shù)來(lái)輸出值。
可以理解為一個(gè)函數(shù)被yield中斷了,下載再次調(diào)用時(shí)繼續(xù)從上一次中斷的位置繼續(xù)執(zhí)行代碼并返回值。
講的比較簡(jiǎn)單,不知道大家理解了沒(méi)有。