本文是一篇關於《Effective Python》書中一節的學習筆記,記錄了示例代碼和思路。 如果函數要產生一系列結果,那麼最簡單的做法就是把這些結果都放在一個列表裡返回。 比如我們要查出字元串中每個詞的首字母在整串字元串中的位置: 該函數的使用: 這個函數思路很明瞭,但存在的問題在於代碼擁擠、冗餘 ...
本文是一篇關於《Effective Python》書中一節的學習筆記,記錄了示例代碼和思路。
如果函數要產生一系列結果,那麼最簡單的做法就是把這些結果都放在一個列表裡返回。
比如我們要查出字元串中每個詞的首字母在整串字元串中的位置:
def index_word(text): result=[] if text: result.append(0) for index,letter in enumerate(text): if letter == ' ': result.append(index+1) return result
該函數的使用:
這個函數思路很明瞭,但存在的問題在於代碼擁擠、冗餘。返回前要把所有結果都放在列表裡,如果輸入量巨大,則程式可能會耗盡記憶體發生崩潰。
這個函數改用生成器(generator)來寫會更好。可以對應任意長度的數據,不會影響到執行時所耗記憶體。
生成器是使用yield表達式的函數。調用生成器函數時,它並不會真的運行,而是會返回迭代器。每次在這個迭代器上面調用內置的next函數時,迭代器會把生成器推進到下一個yield表達式那裡。生成器傳給yield的每一個值,都會由迭代器返回給調用者。
def index_word_iter(text): if text: yield 0 for index,letter in enumerate(text): if letter == ' ': yield index+1
需要註意的是:函數返回的迭代器,只能產生一輪結果,如果繼續迭代第二輪,是不會再有結果的。