函數(shù)(3)-- 函數(shù)返回生成器

第16條:考慮用生成器來改寫直接返回列表的函數(shù)

如果一個函數(shù)要產(chǎn)生一系列結(jié)果抵皱,最簡單的做法是把這一系列結(jié)果放在一個列表里,然后返回列表泽裳。
但是這里有個問題蝉稳,如果我們產(chǎn)生的結(jié)果特別多,比如讀取一個很大的文件的所有行劳闹,這時就很容易造成內(nèi)存異常院究。
所以,正常情況下本涕,我們不會去使用一個列表去存儲這種占內(nèi)存特別多的一系列結(jié)果业汰,而是采用一種可以不斷獲取數(shù)據(jù)的方法來實(shí)現(xiàn),這就是之前說到的生成器菩颖。
先看例子:

def index_words(text):
    result = []
    if text:
        result.append(0)
    for index, letter in enumerate(text):
        if letter == ' ':
            result.append(index + 1)
    return result

這個是一個從字符串中取出每個單詞首字母位置的例子样漆,運(yùn)行看下效果:

address = 'Four score and seven years ago...'
result = index_words(address)
print(result[:3])
>>>
[0, 5, 11]

可以看出上面的方法可以完成要求,但是代碼稍顯冗余晦闰,將近一般的代碼用來實(shí)現(xiàn) result 的 append 上面放祟,而現(xiàn)在的重點(diǎn)是獲取首字母位置,如果用生成器來實(shí)現(xiàn)的話呻右,可以這樣:

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))
print(result[:3])
>>>
[0, 5, 11]

換成生成器后跪妥,就完全省去了 result 的 append 相關(guān)代碼,而且声滥,目的很清晰眉撵,就是獲取每個單詞的首字母位置。這里的重點(diǎn)是 yield 表達(dá)式落塑,它會在函數(shù)運(yùn)行的時候返回迭代器纽疟,每次調(diào)用迭代器后,會推到下一次的 yield 位置憾赁,然后由迭代器返回 yield 返回的值污朽。這樣如果傳入的字符串是由一個很大的文本文件讀出來的,就不用擔(dān)心占用太多的內(nèi)存龙考。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蟆肆,一起剝皮案震驚了整個濱河市错蝴,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌颓芭,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,635評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件柬赐,死亡現(xiàn)場離奇詭異亡问,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)肛宋,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評論 3 399
  • 文/潘曉璐 我一進(jìn)店門州藕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人酝陈,你說我怎么就攤上這事床玻。” “怎么了沉帮?”我有些...
    開封第一講書人閱讀 168,083評論 0 360
  • 文/不壞的土叔 我叫張陵锈死,是天一觀的道長。 經(jīng)常有香客問我穆壕,道長待牵,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,640評論 1 296
  • 正文 為了忘掉前任喇勋,我火速辦了婚禮缨该,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘川背。我一直安慰自己贰拿,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,640評論 6 397
  • 文/花漫 我一把揭開白布熄云。 她就那樣靜靜地躺著膨更,像睡著了一般。 火紅的嫁衣襯著肌膚如雪缴允。 梳的紋絲不亂的頭發(fā)上询一,一...
    開封第一講書人閱讀 52,262評論 1 308
  • 那天,我揣著相機(jī)與錄音癌椿,去河邊找鬼健蕊。 笑死,一個胖子當(dāng)著我的面吹牛踢俄,可吹牛的內(nèi)容都是我干的缩功。 我是一名探鬼主播,決...
    沈念sama閱讀 40,833評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼都办,長吁一口氣:“原來是場噩夢啊……” “哼嫡锌!你這毒婦竟也來了虑稼?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,736評論 0 276
  • 序言:老撾萬榮一對情侶失蹤势木,失蹤者是張志新(化名)和其女友劉穎蛛倦,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體啦桌,經(jīng)...
    沈念sama閱讀 46,280評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡伪冰,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,369評論 3 340
  • 正文 我和宋清朗相戀三年尽超,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,503評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡隔嫡,死狀恐怖虐拓,靈堂內(nèi)的尸體忽然破棺而出样勃,到底是詐尸還是另有隱情伪窖,我是刑警寧澤,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布若治,位于F島的核電站慨蓝,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏端幼。R本人自食惡果不足惜菌仁,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,870評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望静暂。 院中可真熱鬧济丘,春花似錦、人聲如沸洽蛀。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽郊供。三九已至峡碉,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間驮审,已是汗流浹背鲫寄。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留疯淫,地道東北人地来。 一個月前我還...
    沈念sama閱讀 48,909評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像熙掺,于是被迫代替她去往敵國和親未斑。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,512評論 2 359

推薦閱讀更多精彩內(nèi)容

  • 〇币绩、前言 本文共108張圖蜡秽,流量黨請慎重府阀! 歷時1個半月,我把自己學(xué)習(xí)Python基礎(chǔ)知識的框架詳細(xì)梳理了一遍芽突。 ...
    Raxxie閱讀 18,966評論 17 410
  • Lua 5.1 參考手冊 by Roberto Ierusalimschy, Luiz Henrique de F...
    蘇黎九歌閱讀 13,835評論 0 38
  • 一试浙、基礎(chǔ)知識:1、JVM寞蚌、JRE和JDK的區(qū)別:JVM(Java Virtual Machine):java虛擬機(jī)...
    殺小賊閱讀 2,388評論 0 4
  • 紅樓夢是叫人放下的書田巴,賈寶玉一出生,就放棄了名利睬澡,再到眾多美人仙去,尤其黛玉走后眠蚂,寶玉就放棄了他一生最珍重的情字煞聪,...
    霜葉紅于2月花閱讀 374評論 0 1
  • 夏天就要到了笛臣,泳池成了絕佳的清涼去處云稚。黑君想問各位一個問題:泳池里有尿嗎?黑君就此咨詢了有關(guān)磚家沈堡,實(shí)話實(shí)說静陈,確實(shí)有...
    我們都愛黑科技閱讀 742評論 0 0