迭代器和生成器綜合例子

因為迭代器和生成器基本上是互通的,因此有些知識點需要綜合在一起

#1、反向迭代

反向迭代,應該也是常有的需求了,例如從一開始迭代的例子裡,有個輸出list 的元素,從1 到5 的

list1 = [1,2,3,4,5]
for num1 in list1 :
    print ( num1 , end = ' ' )

那麼我們從5 到1 呢?這也很簡單, Python 中有內建的函數reversed()

list1 = [1,2,3,4,5]
for num1 in reversed(list1) :
    print ( num1 , end = ' ' )

方向迭代很簡單,可是要注意一點就是:反向迭代僅僅當物件的大小可預先確定或者物件實現了__reversed__( ) 的特殊方法時才能生效。如果兩者都不符合,那你必須先將物件轉換為一個列表才行

其實很多時候我們可以透過在自訂類別上實作 __reversed__() 方法來實現反向迭代。不過有些知識點在之前的篇節還沒有提到,不過可以相應的看下,有編程基礎的,學完上面的知識點應該也能理解的。

# -*- 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)

輸出的結果是1 到30 然後30 到1 ,分別是順序列印和倒序列印

2、同時迭代多個序列

#你想同時迭代多個序列,每次分別從一個序列中取一個元素。你有遇過這樣的需求嗎?

為了同時迭代多個序列,使用zip() 函數,具體範例:

# -*- coding: UTF-8 -*-
names = ['laingdianshui', 'twowater', '两点水']
ages = [18, 19, 20]
for name, age in zip(names, ages):
     print(name,age)

輸出的結果:

laingdianshui 18
twowater 19
两点水 20

其實zip(a, b) 會產生一個可傳回元組(x, y) 的迭代器,其中x 來自a,y 來自b。一旦其中某個序列到底結尾,迭代宣告結束。因此迭代長度跟參數中最短序列長度一致。注意理解這句話喔,也就是說如果 a , b 的長度不一致的話,以最短的為標準,遍歷完後就結束。

利用zip() 函數,我們還可以把一個key 列表和一個value 列表產生一個dict (字典),如下:

# -*- coding: UTF-8 -*-
names = ['laingdianshui', 'twowater', '两点水']
ages = [18, 19, 20]
dict1= dict(zip(names,ages))
print(dict1)

輸出如下結果:

{'laingdianshui': 18, 'twowater': 19, '两点水': 20}

這裡提一下, zip() 是可以接受多於兩個的序列的參數,不只是兩個。

繼續學習