問題
反方向迭代一個序列
解決方案
使用內(nèi)置的 reversed()
函數(shù)琅豆,比如:
a = [1, 2, 3, 4]
for x in reversed(a):
print(x, end = ' ')
4 3 2 1
反向迭代僅僅當(dāng)對象的大小可預(yù)先確定或者對象實現(xiàn)了 __reversed__()
的特殊方法時才能生效壁查。 如果兩者都不符合吸耿,則必須先將對象轉(zhuǎn)換為一個列表才行滑凉。需要注意的是番舆,如果可迭代對象元素很多的話,將其預(yù)先轉(zhuǎn)換為一個列表要消耗大量的內(nèi)存遂跟。
討論
通過在自定義類上實現(xiàn) __reversed__()
方法來實現(xiàn)反向迭代茁计。比如:
class Countdown(object):
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 m in Countdown(10):
print(m, end = ' ')
10 9 8 7 6 5 4 3 2 1
for m in reversed(Countdown(10)):
print(m, end = ' ')
1 2 3 4 5 6 7 8 9 10
定義一個反向迭代器可以使得代碼非常的高效, 因為它不再需要將數(shù)據(jù)填充到一個列表中然后再去反向迭代這個列表费封。