R / Richie全部文章 ↑

Python · 2 分钟阅读

`reversed()` 函数

目录


reversed() 返回一个 反向迭代器,适用于任何实现了序列协议(__len__ +
__getitem__)或 __reversed__ 方法的对象,包括 list / tuple / str /
range。


1. 关键点

  • 返回迭代器,不是列表/元组;用 list() / tuple() 包一下就能拿全部元素。
  • 不修改原序列。
  • 一旦迭代完,迭代器就空了,要再次使用需要重新调用 reversed()。

2. 基础示例

s = "hello"

for ch in reversed(s):
    print(ch, end="")            # olleh

print()
print(list(reversed(s)))         # ['o', 'l', 'l', 'e', 'h']
print("".join(reversed(s)))      # 'olleh'

3. 常见用法

3.1 反向遍历列表

nums = [1, 2, 3, 4, 5]
for n in reversed(nums):
    print(n)                     # 5 4 3 2 1

3.2 倒序生成新列表

print(list(reversed([1, 2, 3])))    # [3, 2, 1]
print(tuple(reversed("abc")))       # ('c', 'b', 'a')

3.3 reversed vs 切片 [::-1]

xs = [1, 2, 3, 4]

# 切片:会创建并保留新列表
ys = xs[::-1]                      # [4, 3, 2, 1]

# reversed:惰性,按需产出
it = reversed(xs)                  # iterator

切片返回的是 新 list;reversed 返回的是 iterator。处理大序列时
reversed 更省内存。

3.4 配合 for / range

for i in reversed(range(5)):       # 4 3 2 1 0
    print(i)

4. 自定义类:实现 __reversed__

让自己的类支持 reversed():

class Countdown:
    def __init__(self, start: int) -> None:
        self.start = start

    def __iter__(self):
        return iter(range(self.start))

    def __reversed__(self):
        return iter(range(self.start, -1, -1))


for n in Countdown(5):                # 0 1 2 3 4
    print(n, end=" ")
print()
for n in reversed(Countdown(5)):      # 5 4 3 2 1 0
    print(n, end=" ")

5. 性能与限制

  • reversed(list) 走 C 路径,比 [::-1] 略快 也更省内存。
  • 不能直接对 dict / set 用 reversed:它们没定义顺序索引。
    • dict 在 3.8+ 是插入序,可以 list(reversed(d))(d 是 dict 时其实不行)
    • 3.8+ 可用 list(reversed(d.keys())) 或者直接 reversed(list(d))。

6. 小结

  • reversed(seq) 返回迭代器,惰性、不修改原序列。
  • 适合大序列 / 一次性反向遍历。
  • 想拿新列表?用切片 [::-1];要迭代就 reversed()。
  • 自定义类实现 __reversed__ 即可支持。