如果函數要返回一系列結果,我們常見的方法就是將結果放到一份列表中,然后返回給調用者。比如下面的函數,返回字符串中每個單詞的首字母在真?zhèn)€字符串中的索引:
創(chuàng)新互聯(lián)建站是一家集網站建設,武夷山企業(yè)網站建設,武夷山品牌網站建設,網站定制,武夷山網站建設報價,網絡營銷,網絡優(yōu)化,武夷山網站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強企業(yè)競爭力??沙浞譂M足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網需求。同時我們時刻保持專業(yè)、時尚、前沿,時刻以成就客戶成長自我,堅持不斷學習、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實用型網站。
運行結果:
上述的結果完全符合我們的預期,但 get_word_index 函數不夠簡潔。下面我們嘗試使用生成器來實現:
運行結果:
改寫之后,不僅運行結果符合要求,由于不需要和 result 列表交互,函數也變得非常簡潔。下面我們就來詳細學習下生成器吧~
生成器是指使用 yield 表達式的函數,調用生成器函數時,它并不會真的運行,而是會返回迭代器。每次在這個迭代器上面調用內置的 next 函數時,迭代器就會把生成器推進到下一個 yield 表達式那里。生成器傳給 yield 的值均會由迭代器返回給調用者。
此外,如果輸入量非常大,使用列表作為返回值,那么程序就有可能耗盡內存并崩潰。相反,使用生成器之后,則可以應對任意長度的輸入數據。
例如,下面這個生成器函數可以獲取文件中單詞的索引,而不管文件內容多大,該函數執(zhí)行時消耗的內存,只由單行的文本長度決定:
其中 test_generator.txt 中的內容如下:
運行結果:
下面這句話特別重要: 生成器函數返回的迭代器,是由狀態(tài)的,及調用者不應該反復使用它 。我們那 word_index_iter 來說明:
如果想重復調用,請將其封裝成容器:
運行結果:
關于上述自定義容器的實現原理,我的另外一篇文章做了詳細介紹,鏈接奉上:
創(chuàng)建一個函數用來計算三個數的和,如下:
下來,我們對其進行調用:
假設我們要計算這個函數返回結果的平均值。那么此時,我們只需將和值除以參數個數即可,那么參數個數怎么獲取呢?你可能會說:數一下就知道了。那么假設此時有很多的參數,你還去數嗎?此時,明顯這個方法是不恰當的,那么有沒有更加方便、高效的方法呢?我們接著往下看。
通過上面這個例子,我們不但可以獲取參數個數,還可以獲取所有變量名以及默認返回值。此時,我們只需根據自己的需求,去應用就可以了,那么以上的問題,就自然解決了。
共享變量的方法。
沒有辦法直接實現你的需求,但是,你可以用共享變量的方法實現,比如:
def worker(procnum, return_dict):
'''worker function'''
print str(procnum) + ' represent!'
return_dict[procnum] = procnumif __name__ == '__main__':
manager = Manager()
return_dict = manager.dict()
jobs = [] ? ?for i in range(5):
p = multiprocessing.Process(target=worker, args=(i,return_dict))
jobs.append(p)
p.start() ? ?for proc in jobs:
proc.join() ? ?print return_dict.values()