4.5 反向迭代

2018-02-24 15:26 更新

問題

你想反方向迭代一個(gè)序列

解決方案

使用內(nèi)置的 reversed() 函數(shù),比如:

>>> a = [1, 2, 3, 4]
>>> for x in reversed(a):
...     print(x)
...
4
3
2
1

反向迭代僅僅當(dāng)對象的大小可預(yù)先確定或者對象實(shí)現(xiàn)了 __reversed__() 的特殊方法時(shí)才能生效。如果兩者都不符合,那你必須先將對象轉(zhuǎn)換為一個(gè)列表才行,比如:

# Print a file backwards
f = open('somefile')
for line in reversed(list(f)):
    print(line, end='')

要注意的是如果可迭代對象元素很多的話,將其預(yù)先轉(zhuǎn)換為一個(gè)列表要消耗大量的內(nèi)存。

討論

很多程序員并不知道可以通過在自定義類上實(shí)現(xiàn) __reversed__() 方法來實(shí)現(xiàn)反向迭代。比如:

class Countdown:
    def __init__(self, start):
        self.start = start

    # Forward iterator
    def __iter__(self):
        n = self.start
        while n > 0:
            yield n
            n -= 1

    # Reverse iterator
    def __reversed__(self):
        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)

定義一個(gè)反向迭代器可以使得代碼非常的高效,因?yàn)樗辉傩枰獙?shù)據(jù)填充到一個(gè)列表中然后再去反向迭代這個(gè)列表。

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號