用生成器來改寫直接返回列表的函數(shù)方法
本文是一篇關(guān)于《Effective Python》書中一節(jié)的學(xué)習(xí)筆記,記錄了示例代碼和思路。
如果函數(shù)要產(chǎn)生一系列結(jié)果,那么最簡單的做法就是把這些結(jié)果都放在一個列表里返回。
比如我們要查出字符串中每個詞的首字母在整串字符串中的位置:
def index_word(text):
result=[]
if text:
result.append(0)
for index,letter in enumerate(text):
if letter == ' ':
result.append(index+1)
return result
該函數(shù)的使用:

這個函數(shù)思路很明了,但存在的問題在于代碼擁擠、冗余。返回前要把所有結(jié)果都放在列表里,如果輸入量巨大,則程序可能會耗盡內(nèi)存發(fā)生崩潰。
這個函數(shù)改用生成器(generator)來寫會更好??梢詫?yīng)任意長度的數(shù)據(jù),不會影響到執(zhí)行時所耗內(nèi)存。
生成器是使用yield表達式的函數(shù)。調(diào)用生成器函數(shù)時,它并不會真的運行,而是會返回迭代器。每次在這個迭代器上面調(diào)用內(nèi)置的next函數(shù)時,迭代器會把生成器推進到下一個yield表達式那里。生成器傳給yield的每一個值,都會由迭代器返回給調(diào)用者。
def index_word_iter(text):
if text:
yield 0
for index,letter in enumerate(text):
if letter == ' ':
yield index+1

需要注意的是:函數(shù)返回的迭代器,只能產(chǎn)生一輪結(jié)果,如果繼續(xù)迭代第二輪,是不會再有結(jié)果的。
以上這篇用生成器來改寫直接返回列表的函數(shù)方法就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Python實現(xiàn)變量數(shù)值交換及判斷數(shù)組是否含有某個元素的方法
這篇文章主要介紹了Python實現(xiàn)變量數(shù)值交換及判斷數(shù)組是否含有某個元素的方法,涉及Python字符串與數(shù)組的相關(guān)賦值、判斷操作技巧,需要的朋友可以參考下2017-09-09
python基礎(chǔ)while循環(huán)及if判斷的實例講解
下面小編就為大家?guī)硪黄猵ython基礎(chǔ)while循環(huán)及if判斷的實例講解。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-08-08
Pandas數(shù)據(jù)分組統(tǒng)計的實現(xiàn)示例
對數(shù)據(jù)進行分組統(tǒng)計,主要適用DataFrame對象的groupby()函數(shù),本文就來詳細的介紹下Pandas數(shù)據(jù)分組統(tǒng)計的實現(xiàn),具有一定的參考價值,感興趣的可以了解下2023-11-11

