python的生成器

1. 可迭代對(duì)象

可以直接作用于for循環(huán)的對(duì)象統(tǒng)稱(chēng)為可迭代對(duì)象:Iterable婿滓。
可以使用isinstance()判斷一個(gè)對(duì)象是否是Iterable對(duì)象淌哟。

from collections import Iterable
print(isinstance([], Iterable)) #列表是可迭代對(duì)象
print(isinstance({}, Iterable)) #字典是
print(isinstance('abc', Iterable)) #字符串是
print(isinstance((x for x in range(10)), Iterable)) #生成器是可迭代對(duì)象
print(isinstance(100, Iterable)) #整數(shù)不是可迭代對(duì)象
print(isinstance((), Iterable)) #元組是
True
True
True
True
False
True

2. 迭代器

可以被next()函數(shù)調(diào)用并不斷返回下一個(gè)值的對(duì)象稱(chēng)為迭代器:Iterator席赂。
可以使用isinstance()判斷一個(gè)對(duì)象是否是Iterator對(duì)象。

from collections import Iterator
print(isinstance((x for x in range(10)), Iterator))
print(isinstance([], Iterator))
print(isinstance({}, Iterator))
print(isinstance('abc', Iterator))

True
False
False
False

所以生成器都是Iterator對(duì)象霹抛,但list谴咸、dict轮听、str雖然是Iterable,卻不是Iterator岭佳。

3. 生成器

生成器指的就是生成器對(duì)象:
生成器其實(shí)是一種特殊的迭代器血巍。

  1. 可以由生成器表達(dá)式得到;
#(expr for iter_var in iterable) 

L= (i +1 for i in range(10) if i %2)
print(type(L))
print(next(L))
print(next(L))
print(next(L))

#generator  生成器

<class 'generator'>
2
4
6
  1. 可以使用yield關(guān)鍵字得到一個(gè)生成器函數(shù)驼唱,調(diào)用這個(gè)函數(shù)得到一個(gè)生成器對(duì)象藻茂。
  • 函數(shù)體中包含yield語(yǔ)句的函數(shù),反正生成器對(duì)象
  • 生成器對(duì)象玫恳,是延遲計(jì)算辨赐、惰性求值的。
#實(shí)現(xiàn)計(jì)數(shù)器
def inc():
    def counter():
        i = 0 
        while True:
            i += 1
            yield i 
    c= counter()  #c是生成器京办,可以使用next求值
    return lambda : next(c)

foo = inc()

print(foo())
print(foo())
1
2
#打印斐波那契數(shù)列
def fib():
    x = 0
    y = 1
    while True:
        yield y
        x, y = y, x+y
        
foo = fib() #調(diào)用了yield的函數(shù)才是生成器  
print(type(foo)) #foo是個(gè)生成器

for _ in range(5):
    print(next(foo))  #打印5次 next(foo)

for _ in range(100):
    next(foo)  #先執(zhí)行100次next(foo)
print(next(foo))  #再打印出第101次
<class 'generator'>
1
1
2
3
5
6356306993006846248183

4. 總結(jié)

關(guān)系圖:

http://qiniu.mykernel.cn/%E7%94%9F%E6%88%90%E5%99%A8.png

更多歡迎訪問(wèn):http://www.mykernel.cn/

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末掀序,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子惭婿,更是在濱河造成了極大的恐慌不恭,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,294評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件财饥,死亡現(xiàn)場(chǎng)離奇詭異换吧,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)钥星,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,493評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)沾瓦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人谦炒,你說(shuō)我怎么就攤上這事贯莺。” “怎么了宁改?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,790評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵缕探,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我还蹲,道長(zhǎng)爹耗,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,595評(píng)論 1 284
  • 正文 為了忘掉前任谜喊,我火速辦了婚禮鲸沮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘锅论。我一直安慰自己讼溺,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,718評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布最易。 她就那樣靜靜地躺著怒坯,像睡著了一般。 火紅的嫁衣襯著肌膚如雪藻懒。 梳的紋絲不亂的頭發(fā)上剔猿,一...
    開(kāi)封第一講書(shū)人閱讀 49,906評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音嬉荆,去河邊找鬼归敬。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的汪茧。 我是一名探鬼主播椅亚,決...
    沈念sama閱讀 39,053評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼舱污!你這毒婦竟也來(lái)了呀舔?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,797評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤扩灯,失蹤者是張志新(化名)和其女友劉穎媚赖,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體珠插,經(jīng)...
    沈念sama閱讀 44,250評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡惧磺,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,570評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了捻撑。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片磨隘。...
    茶點(diǎn)故事閱讀 38,711評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖布讹,靈堂內(nèi)的尸體忽然破棺而出琳拭,到底是詐尸還是另有隱情,我是刑警寧澤描验,帶...
    沈念sama閱讀 34,388評(píng)論 4 332
  • 正文 年R本政府宣布白嘁,位于F島的核電站,受9級(jí)特大地震影響膘流,放射性物質(zhì)發(fā)生泄漏絮缅。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,018評(píng)論 3 316
  • 文/蒙蒙 一呼股、第九天 我趴在偏房一處隱蔽的房頂上張望耕魄。 院中可真熱鬧,春花似錦彭谁、人聲如沸吸奴。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,796評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)则奥。三九已至,卻和暖如春狭园,著一層夾襖步出監(jiān)牢的瞬間读处,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,023評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工唱矛, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留罚舱,地道東北人井辜。 一個(gè)月前我還...
    沈念sama閱讀 46,461評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像管闷,于是被迫代替她去往敵國(guó)和親粥脚。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,595評(píng)論 2 350

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

  • 迭代 如果給定一個(gè)list或tuple渐北,我們可以通過(guò)for循環(huán)來(lái)遍歷這個(gè)list或tuple阿逃,這種遍歷我們稱(chēng)為迭代...
    Mr_Bluyee閱讀 978評(píng)論 0 1
  • 為了理解什么是 yield,你必須理解什么是生成器铭拧。在理解生成器之前赃蛛,讓我們先走近迭代。 可迭代對(duì)象 當(dāng)你建立了一...
    lintong閱讀 430評(píng)論 0 3
  • 一搀菩、總體內(nèi)容 1.1呕臂、協(xié)程的介紹 1.2、迭代器以及迭代器的應(yīng)用 1.3肪跋、生成器(生成器與迭代器保存的都是生成數(shù)據(jù)...
    IIronMan閱讀 861評(píng)論 0 1
  • 文章來(lái)源:python 生成器和迭代器有這篇就夠了 什么是迭代器歧蒋? 迭代器是訪問(wèn)集合元素的一種方式。迭代器對(duì)象從集...
    YYL07閱讀 537評(píng)論 0 4
  • 14/30:#筆墨里的時(shí)光州既,自?shī)首詷?lè)堅(jiān)持寫(xiě)作三十天#第14天 帥小子寄宿后谜洽,我的時(shí)間開(kāi)始空出來(lái),想著應(yīng)該學(xué)...
    小甜甜007閱讀 489評(píng)論 7 6