python代码大全和用法用量_Python生成器的使用方法和示例代码
本文是《Effect Python 編寫高質(zhì)量Python代碼的59個(gè)有效方法》的學(xué)習(xí)筆記。主要記錄生成器的使用方法和示例代碼。
返回隊(duì)列的函數(shù)
如果函數(shù)要產(chǎn)生一系列結(jié)果,那么最簡(jiǎn)單的做法就是把這些結(jié)構(gòu)都放在一份列表里,然后將其返回給調(diào)用者。
def index_words(text):
"""用append方法將這些此的首字母索引添加到result列表中,并在函數(shù)結(jié)束時(shí)將其返回給調(diào)用者。"""
result = []
if text:
result.append(0)
for index, letter in enumerate(text):
if letter == ' ':
result.append(index+1)
return result
輸入一些測(cè)試值,驗(yàn)證該函數(shù)能正常運(yùn)行:
>address = 'Four score and seven years ago...'
result = index_words(address)
print(result[:3])
打印
[0, 5, 11]
生成器函數(shù)
這個(gè)函數(shù)改用生成器(generator)來(lái)寫會(huì)更好。生成器是使用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的每一個(gè)值,都會(huì)由迭代器返回給調(diào)用者。
def index_words_iter(text):
if text:
yield 0
for index, letter in enumerate(text):
if letter == ' ':
yield index + 1
result = list(index_words_iter(address))
注意:生成器函數(shù)返回的迭代器是有狀態(tài)的,調(diào)用者不應(yīng)該反復(fù)使用。
由于迭代器只能產(chǎn)生一輪結(jié)果。在拋出過(guò)StopIteration異常的迭代器或生成器上面繼續(xù)迭代第二輪,是不會(huì)有結(jié)果的。為解決此問(wèn)題,我們可以明確地使用該迭代器制作一份列表,將它的全部?jī)?nèi)容都遍歷一次,并賦值到這份列表里,然后就可以在復(fù)制出來(lái)的數(shù)據(jù)列表上面多次迭代了。
為類實(shí)現(xiàn)生成器
下面是一個(gè)可以迭代的容器類,用來(lái)從文件中讀取每行數(shù)據(jù)。
class ReadFileLines(object):
"""
可以迭代的容器類,從文件中獲取數(shù)據(jù)
"""
def __init__(self, path):
self.path = path
def __iter__(self):
with open(self.path) as f:
for line in f:
yield line
多次迭代
如果想多次迭代生成器的數(shù)據(jù),可以使用下面的函數(shù)。該函數(shù)會(huì)逐步拷貝生成器的所有數(shù)據(jù),然后返回一個(gè)隊(duì)列數(shù)據(jù)。
def normalize_defensive(datas):
"""
從生成器返回一份可以多次迭代的數(shù)據(jù)
:param datas:容器
:return: result:隊(duì)列(list)
"""
# 確保調(diào)用者傳進(jìn)來(lái)的參數(shù),并不是迭代器對(duì)象本身
if iter(datas) is iter(datas):
raise TypeError('Must supply a container')
# TODO
result = []
for data in datas:
# TODO
result.append(data)
return result
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。如果你想了解更多相關(guān)內(nèi)容請(qǐng)查看下面相關(guān)鏈接
總結(jié)
以上是生活随笔為你收集整理的python代码大全和用法用量_Python生成器的使用方法和示例代码的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 一本通 1064:奥运奖牌计数--AC
- 下一篇: 动画学信奥 漫画学算法 CSP-J入门级