迭代器和生成器綜合例子
因?yàn)榈骱蜕善骰旧鲜腔ネǖ模虼擞行┲R點(diǎn)需要綜合在一起
#1、反向迭代
反向迭代,應(yīng)該也是常有的需求了,例如從一開始迭代的例子裡,有個輸出list 的元素,從1 到5 的
list1 = [1,2,3,4,5] for num1 in list1 : print ( num1 , end = ' ' )
那麼我們從5 到1 呢?這也很簡單, Python 中有內(nèi)建的函數(shù)reversed()
list1 = [1,2,3,4,5] for num1 in reversed(list1) : print ( num1 , end = ' ' )
方向迭代很簡單,可是要注意一點(diǎn)就是:反向迭代僅僅當(dāng)物件的大小可預(yù)先確定或者物件實(shí)現(xiàn)了__reversed__( ) 的特殊方法時才能生效。如果兩者都不符合,那你必須先將物件轉(zhuǎn)換為一個列表才行
其實(shí)很多時候我們可以透過在自訂類別上實(shí)作 __reversed__() 方法來實(shí)現(xiàn)反向迭代。不過有些知識點(diǎn)在之前的篇節(jié)還沒有提到,不過可以相應(yīng)的看下,有編程基礎(chǔ)的,學(xué)完上面的知識點(diǎn)應(yīng)該也能理解的。
# -*- coding: UTF-8 -*- class Countdown: def __init__(self, start): self.start = start def __iter__(self): # Forward iterator n = self.start while n > 0: yield n n -= 1 def __reversed__(self): # Reverse iterator n = 1 while n <= self.start: yield n n += 1 for rr in reversed(Countdown(30)): print(rr) for rr in Countdown(30): print(rr)
輸出的結(jié)果是1 到30 然後30 到1 ,分別是順序列印和倒序列印
2、同時迭代多個序列
#你想同時迭代多個序列,每次分別從一個序列中取一個元素。你有遇過這樣的需求嗎?
為了同時迭代多個序列,使用zip() 函數(shù),具體範(fàn)例:
# -*- coding: UTF-8 -*- names = ['laingdianshui', 'twowater', '兩點(diǎn)水'] ages = [18, 19, 20] for name, age in zip(names, ages): print(name,age)
輸出的結(jié)果:
laingdianshui 18 twowater 19 兩點(diǎn)水 20
其實(shí)zip(a, b) 會產(chǎn)生一個可傳回元組(x, y) 的迭代器,其中x 來自a,y 來自b。一旦其中某個序列到底結(jié)尾,迭代宣告結(jié)束。因此迭代長度跟參數(shù)中最短序列長度一致。注意理解這句話喔,也就是說如果 a , b 的長度不一致的話,以最短的為標(biāo)準(zhǔn),遍歷完後就結(jié)束。
利用zip() 函數(shù),我們還可以把一個key 列表和一個value 列表產(chǎn)生一個dict (字典),如下:
# -*- coding: UTF-8 -*- names = ['laingdianshui', 'twowater', '兩點(diǎn)水'] ages = [18, 19, 20] dict1= dict(zip(names,ages)) print(dict1)
輸出如下結(jié)果:
{'laingdianshui': 18, 'twowater': 19, '兩點(diǎn)水': 20}
這裡提一下, zip() 是可以接受多於兩個的序列的參數(shù),不只是兩個。