可迭代對象[2021-03-06]

一绵患、可迭代對象(iterable)

現(xiàn)在凳厢,我們已經(jīng)獲得了一個新線索账胧,有一個叫做“可迭代的”概念

首先先紫,我們從報錯來分析治泥,好像之所以1234不可以for循環(huán),是因為它不可迭代遮精。那么如果“可迭代”居夹,就應(yīng)該可以被for循環(huán)了败潦。

這個我們知道呀,字符串准脂、列表劫扒、元組、字典狸膏、集合都可以被for循環(huán)沟饥,說明他們都是可迭代的

我們怎么來證明這一點呢湾戳?

from collections import Iterable
                             
l = [1,2,3,4]                
t = (1,2,3,4)                
d = {1:2,3:4}                
s = {1,2,3,4}                
                             
print(isinstance(l,Iterable))
print(isinstance(t,Iterable))
print(isinstance(d,Iterable))
print(isinstance(s,Iterable))

結(jié)合我們使用for循環(huán)取值的現(xiàn)象贤旷,再從字面上理解一下,其實迭代就是我們剛剛說的砾脑,可以將某個數(shù)據(jù)集內(nèi)的數(shù)據(jù)“一個挨著一個的取出來”幼驶,就叫做迭代

二韧衣、迭代器(iterator)

img

從第一點可以看到我們常用的字符串盅藻、列表和字典都是可迭代對象,但是可迭代對象除了那些汹族,還包括了迭代器

結(jié)論:

  • 可迭代對象包含迭代器

  • 定義可迭代對象萧求,必須實現(xiàn)iter()方法;定義迭代器顶瞒,必須實現(xiàn)iter()和next()方法夸政。

下面以列表舉個栗子,列表是可迭代對象榴徐,所以可以用iter()方法守问,查看返回值,發(fā)現(xiàn)該返回值也是可迭代對象坑资,也就是說列表是可迭代對象耗帕,列表執(zhí)行完iter()方法后也是可迭代對象,那么可以猜得到那個返回值應(yīng)該就是迭代器了袱贮,然后執(zhí)行next()方法果然可以從里面取值

from collections import Iterable

l = [1,2,3,4]

l_iter = l.__iter__()

print(type(l_iter))        #<class 'list_iterator'>
print(isinstance(l,Iterable))    #true
print(isinstance(l_iter,Iterable))    #true

item = l_iter.__next__()
print(item)        #1
item = l_iter.__next__()
print(item)        #2
item = l_iter.__next__()
print(item)        #3
item = l_iter.__next__()
print(item)        #4
item = l_iter.__next__()
print(item)        #StopIteration

三仿便、生成器(generator)

生成器其實是一種特殊的迭代器,不過這種迭代器更加優(yōu)雅攒巍。它不需要再像上面的類一樣寫__iter__()__next__()方法了嗽仪,只需要一個yiled關(guān)鍵字。 生成器一定是迭代器(反之不成立)柒莉,因此任何生成器也是以一種懶加載的模式生成值闻坚。用生成器來實現(xiàn)斐波那契數(shù)列的例子是:

def fib(max):
    n, prev, curr = 0, 0, 1
    while n<max:
        yield curr
        prev, curr = curr, curr + prev
        n += 1

F = fib(10)
# print(type(F))  <class 'generator'>

#第一種取值方式
x = next(F)
print(x)
x = next(F)
print(x)
x = next(F)
print(x)
y = F.__next__()
print(y)
y = F.__next__()
print(y)
y = F.__next__()
print(y)

#第二種取值方式
for _ in F:
    print(_)

上面的命令執(zhí)行后,生成1兢孝、1窿凤、2仅偎、......、55的一共10個值雳殊,第一種取值方式生成了六個值橘沥,然后就好像固定住了,第二種方式從第七個值開始取相种,懶加載應(yīng)該就是這個意思了威恼。

生成器特殊的地方在于函數(shù)體中沒有return關(guān)鍵字品姓,函數(shù)的返回值是一個生成器對象寝并。當執(zhí)行F = fib(10)返回的是一個生成器對象,此時函數(shù)體中的代碼并不會執(zhí)行腹备,只有顯示或隱示地調(diào)用next或者for循環(huán)的時候才會真正執(zhí)行里面的代碼衬潦。

四、生成器表達式(generator expression)

生成器表達式是列表推倒式的生成器版本植酥,看起來像列表推導式镀岛,但是它返回的是一個生成器對象而不是列表對象。

a = (x for x in range(10))
print(a)

以及

def fib(n):
    m, a, b = 0, 0, 1
    while m < n:
        yield b
        a, b = b, a+b
        m += 1

a = (x for x in fib(10))
print(a)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末友驮,一起剝皮案震驚了整個濱河市漂羊,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌卸留,老刑警劉巖走越,帶你破解...
    沈念sama閱讀 218,204評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異耻瑟,居然都是意外死亡旨指,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評論 3 395
  • 文/潘曉璐 我一進店門喳整,熙熙樓的掌柜王于貴愁眉苦臉地迎上來谆构,“玉大人,你說我怎么就攤上這事框都“崴兀” “怎么了?”我有些...
    開封第一講書人閱讀 164,548評論 0 354
  • 文/不壞的土叔 我叫張陵魏保,是天一觀的道長熬尺。 經(jīng)常有香客問我,道長囱淋,這世上最難降的妖魔是什么猪杭? 我笑而不...
    開封第一講書人閱讀 58,657評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮妥衣,結(jié)果婚禮上皂吮,老公的妹妹穿的比我還像新娘戒傻。我一直安慰自己,他們只是感情好蜂筹,可當我...
    茶點故事閱讀 67,689評論 6 392
  • 文/花漫 我一把揭開白布需纳。 她就那樣靜靜地躺著,像睡著了一般艺挪。 火紅的嫁衣襯著肌膚如雪不翩。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,554評論 1 305
  • 那天麻裳,我揣著相機與錄音口蝠,去河邊找鬼。 笑死津坑,一個胖子當著我的面吹牛妙蔗,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播疆瑰,決...
    沈念sama閱讀 40,302評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼眉反,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了穆役?” 一聲冷哼從身側(cè)響起寸五,我...
    開封第一講書人閱讀 39,216評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎耿币,沒想到半個月后梳杏,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,661評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡掰读,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,851評論 3 336
  • 正文 我和宋清朗相戀三年秘狞,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蹈集。...
    茶點故事閱讀 39,977評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡烁试,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出拢肆,到底是詐尸還是另有隱情减响,我是刑警寧澤,帶...
    沈念sama閱讀 35,697評論 5 347
  • 正文 年R本政府宣布郭怪,位于F島的核電站支示,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏鄙才。R本人自食惡果不足惜颂鸿,卻給世界環(huán)境...
    茶點故事閱讀 41,306評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望攒庵。 院中可真熱鬧嘴纺,春花似錦败晴、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至闲擦,卻和暖如春慢味,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背墅冷。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評論 1 270
  • 我被黑心中介騙來泰國打工纯路, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人俺榆。 一個月前我還...
    沈念sama閱讀 48,138評論 3 370
  • 正文 我出身青樓感昼,卻偏偏與公主長得像装哆,于是被迫代替她去往敵國和親罐脊。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,927評論 2 355

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