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__即可支持。