官术网_书友最值得收藏!

4.1.4 反向迭代

在實(shí)際應(yīng)用中,將一個序列逆序輸出是比較常見的操作。對于迭代,這種操作稱為反方向迭代。

對于反向迭代序列,我們可以使用內(nèi)置的reversed()函數(shù),代碼(reversed_iter.py)如下:


a = [1, 2, 3, 4]
print(f'primary a is: {a}')
b = list()
for x in reversed(a):
    b.append(x)
print(f'{a} reversed is: {b}')

執(zhí)行py文件,輸出結(jié)果如下:


primary a is: [1, 2, 3, 4]
[1, 2, 3, 4] reversed is: [4, 3, 2, 1]

反向迭代僅僅當(dāng)對象的大小可預(yù)先確定或者對象實(shí)現(xiàn)了__reversed__()函數(shù)才生效。如果兩者都不符合,必須先將對象轉(zhuǎn)換為一個列表,代碼如下:


f = open('/etc/passwd')
for line in reversed(list(f)):
    print(line, end='')

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

我們可以通過在自定義類上實(shí)現(xiàn)__reversed__()方法來實(shí)現(xiàn)反向迭代,代碼(reversed_iter.py)示例如下:


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 rev_val in reversed(Countdown(20)):
    print(f'reversed order: {rev_val}')
print()
for nor_val in Countdown(20):
    print(f'normal order: {nor_val}')

執(zhí)行py文件,輸出結(jié)果如下:


reversed order: 1
reversed order: 2
...
reversed order: 20

normal order: 20
normal order: 19
...
normal order: 1

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

主站蜘蛛池模板: 闵行区| 邵东县| 永平县| 洞口县| 花莲市| 集贤县| 文山县| 柳州市| 鄂托克前旗| 韶山市| 长丰县| 定陶县| 延吉市| 周口市| 五华县| 三亚市| 壤塘县| 瑞安市| 上犹县| 阿巴嘎旗| 思南县| 桐柏县| 江都市| 澎湖县| 池州市| 雷州市| 延寿县| 大港区| 岳池县| 黄骅市| 贡嘎县| 福建省| 固始县| 益阳市| 阜城县| 舟山市| 齐河县| 东方市| 临澧县| 鹤峰县| 永修县|