Python基礎(chǔ)之迭代器、生成器

這部分理解起來比較費(fèi)勁拟糕,多練習(xí)判呕,多思考~

一 生成器

我們知道列表的大小是有限制的倦踢,假設(shè)我們要放自然數(shù)0~100萬,那這個(gè)列表肯定占了很大內(nèi)存空間佛玄,而且我們也可能只用到其中很小一部分的數(shù)據(jù)硼一,這樣的話我們用列表造成的浪費(fèi)就很大了累澡。但是梦抢,如果這個(gè)列表的元素是有規(guī)律可循的,那我們就可以根據(jù)這個(gè)規(guī)律愧哟,推算到任何一個(gè)元素奥吩,不必創(chuàng)建完整的list,從而節(jié)省大量的空間蕊梧。在Python里霞赫,這種一邊循環(huán)一邊計(jì)算的機(jī)制,稱為生成器generator肥矢。

  1. 第一種簡(jiǎn)單的generator端衰,是把列表生成式的[ ] 改成()即可
L = [i * i for i in range(1,11) if i%2==0]
print(L) # [4, 16, 36, 64, 100]

g=(i * i for i in range(1,11) if i%2==0)
print(g) # <generator object <genexpr> at 0x000002D6BDBADBF8>

通過next(g)可以打印出generator中的元素:

print(next(g))  #4
print(next(g))  #16
print(next(g))  #36
print(next(g))  #64
print(next(g))  #100
# print(next(g)) #StopIteration 沒有足夠的元素,調(diào)用next會(huì)拋出StopIteration甘改。

當(dāng)然更簡(jiǎn)單的是通過for循環(huán)遍歷generator,同時(shí)還防止了StopIteration:

g=(i * i for i in range(1,11) if i%2==0)
for i in  g:
    print(i)

輸出:

4
16
36
64
100

能用for遍歷旅东,說明generator是個(gè)可迭代對(duì)象。

  1. 當(dāng)規(guī)律更復(fù)雜十艾,不能用列表生成式那樣簡(jiǎn)單生成抵代,可以用帶yield 的函數(shù)來生成。一旦函數(shù)帶了yield 關(guān)鍵字忘嫉,那這個(gè)函數(shù)就不是通常的函數(shù)了荤牍,而是generator。
def func():
    print('step 1')
    yield 1
    print('step 2')
    yield (2)
    print('step 3')
    yield (3)

f=func()
print(next(f))
print(next(f))
print(next(f))

看下輸出庆冕,分析下結(jié)果:

step 1
1
step 2
2
step 3
3

第一次執(zhí)行next(f)康吵,函數(shù)內(nèi)部打印了 step 1,再執(zhí)行了 yield 1访递。而且這個(gè)1晦嵌,整好被我們print打印出來了。也就是說next(f)返回了1力九,結(jié)果上類似于return 1 了耍铜,此時(shí)函數(shù)終止在這里。
第二次執(zhí)行next(f)跌前,函數(shù)繼續(xù)往下走棕兼,先打印step 2,再執(zhí)行yield (2)抵乓,函數(shù)終止伴挚,返回 2靶衍,并打印肩钠。
第三次執(zhí)行next(f)腕侄,函數(shù)繼續(xù)往下走槽驶,先打印step 3吁朦,再執(zhí)行yield (3)箫柳,函數(shù)終止涛目,返回 3欺矫,并打印沈跨。
可以得出結(jié)論:帶yield的generator偷厦,遇到y(tǒng)ield函數(shù)終止商叹,并返回相應(yīng)的值。這就是規(guī)則只泼。
等同于用for來遍歷:

f=func()
for i in f:
    print(i)

運(yùn)行結(jié)果完全一樣剖笙。
好像有點(diǎn)亂~對(duì)于一個(gè)generator來說,用for遍歷的效果等同于不停的調(diào)用next(忽略異常)请唱。
到這里弥咪,我們只需要清楚生成器是什么(一邊循環(huán)一邊計(jì)算的機(jī)制),他的兩種常見形式十绑,如何打印元素聚至,執(zhí)行流程即可。

二 迭代器

像上面講到的generator孽惰,可以被next()函數(shù)調(diào)用并不斷返回下一個(gè)值的對(duì)象稱為迭代器:Iterator晚岭。

除此之外,像集合數(shù)據(jù)類型勋功,如list坦报、tuple、dict狂鞋、set片择、str等,可以直接作用于for循環(huán)的對(duì)象統(tǒng)稱為可迭代對(duì)象:Iterable骚揍。generator也可以直接作用于for字管,所以generator同時(shí)也是Iterable。

生成器都是Iterator對(duì)象信不,但list嘲叔、dict、str雖然是Iterable抽活,卻不是Iterator硫戈。因?yàn)镻ython的Iterator對(duì)象表示的是一個(gè)數(shù)據(jù)流,通過next()函數(shù)調(diào)用并不斷返回下一個(gè)數(shù)據(jù)下硕。所以可以把他看成一個(gè)有序的丁逝,未知大小的序列汁胆,可以看成無限大,而我們常見的集合型對(duì)象都是有限大小的霜幼。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末嫩码,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子罪既,更是在濱河造成了極大的恐慌铸题,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,252評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件萝衩,死亡現(xiàn)場(chǎng)離奇詭異回挽,居然都是意外死亡没咙,警方通過查閱死者的電腦和手機(jī)猩谊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,886評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來祭刚,“玉大人牌捷,你說我怎么就攤上這事∥型裕” “怎么了暗甥?”我有些...
    開封第一講書人閱讀 168,814評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)捉捅。 經(jīng)常有香客問我撤防,道長(zhǎng),這世上最難降的妖魔是什么棒口? 我笑而不...
    開封第一講書人閱讀 59,869評(píng)論 1 299
  • 正文 為了忘掉前任寄月,我火速辦了婚禮,結(jié)果婚禮上无牵,老公的妹妹穿的比我還像新娘漾肮。我一直安慰自己,他們只是感情好茎毁,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,888評(píng)論 6 398
  • 文/花漫 我一把揭開白布克懊。 她就那樣靜靜地躺著,像睡著了一般七蜘。 火紅的嫁衣襯著肌膚如雪谭溉。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,475評(píng)論 1 312
  • 那天橡卤,我揣著相機(jī)與錄音扮念,去河邊找鬼。 笑死蒜魄,一個(gè)胖子當(dāng)著我的面吹牛扔亥,可吹牛的內(nèi)容都是我干的场躯。 我是一名探鬼主播,決...
    沈念sama閱讀 41,010評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼旅挤,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼踢关!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起粘茄,我...
    開封第一講書人閱讀 39,924評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤签舞,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后柒瓣,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體儒搭,經(jīng)...
    沈念sama閱讀 46,469評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,552評(píng)論 3 342
  • 正文 我和宋清朗相戀三年芙贫,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了搂鲫。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,680評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡磺平,死狀恐怖魂仍,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情拣挪,我是刑警寧澤擦酌,帶...
    沈念sama閱讀 36,362評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站菠劝,受9級(jí)特大地震影響赊舶,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜赶诊,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,037評(píng)論 3 335
  • 文/蒙蒙 一笼平、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧甫何,春花似錦出吹、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,519評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至巍耗,卻和暖如春秋麸,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背炬太。 一陣腳步聲響...
    開封第一講書人閱讀 33,621評(píng)論 1 274
  • 我被黑心中介騙來泰國打工灸蟆, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人亲族。 一個(gè)月前我還...
    沈念sama閱讀 49,099評(píng)論 3 378
  • 正文 我出身青樓炒考,卻偏偏與公主長(zhǎng)得像可缚,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子斋枢,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,691評(píng)論 2 361

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