Python reversed() 语法
reversed() 是 Python 的一个内置函数,它用于对一个可迭代对象中的所有元素进行 “反转” (即逆向排列)。
语法:
reversed(iterable)说明:
reversed() 函数接收单个参数。
iterable(必选):必须是一个序列或实现了 __reversed__() 方法的对象,支持列表、元组、字符串、字节串、range 对象及有序字典(Python 3.8+)等。
reversed() 函数返回的是迭代器,而迭代器本身是一个可迭代对象,因此我们可以使用 list()、tuple()、str() 等函数将其转换为其他容器对象。
注意: reversed() 函数只能用于支持反向迭代的对象。如果尝试对不支持此操作的对象(例如集合 set 或字典 dict,因为它们是无序的)调用 reversed(),则会引发 TypeError 异常。
Python reversed() 摘要
| 使用频率 | 中 |
|---|---|
| 时间复杂度 | O(1) |
| 官方文档 | 查看 |
| 相关函数 | sorted()、slice() |
Python reversed() 示例
接下来,我们通过几个简单的例子来讲解一下 Python reversed() 方法是如何使用的。
示例 1:reversed() 反转列表
nums = [1, 2, 3, 4, 5]
result = reversed(nums)
print(result)
print(list(result))运行结果如下。
<list_reverseiterator object at 0x0000028B00F99B70>
[5, 4, 3, 2, 1]分析:
reversed(nums) 返回的是一个迭代器,我们可以使用 list() 函数将其转换为列表,这样就得到反转后的列表了。
示例 2:reversed() 反转元组
colors = ('red', 'green', 'blue')
result = reversed(colors)
print(result)
print(tuple(result))运行结果如下。
<reversed object at 0x0000021F09649CF0>
('blue', 'green', 'red') 分析:
reversed(colors) 返回的是一个迭代器,我们可以使用 tuple() 函数将其转换为元组,这样就得到反转后的元组了。
示例 3:reversed() 反转字符串
site = '绿叶网'
result1 = reversed(site)
print(result1)
result2 = ''.join(result1) # 将迭代器转换为反转后的字符串
print(result2)运行结果如下。
<reversed object at 0x0000016DE0B59B70>
网叶绿分析:
reversed(site) 返回的是一个迭代器,我们可以使用 join() 函数将其转换为字符串,这样就得到反转后的字符串了。
示例 4:reversed() 反转字典
students = {'Jack': 1001, 'Lucy': 1002, 'Tony': 1003}
result = reversed(students)
print(result)
print(list(result))运行结果如下。
<dict_reversekeyiterator object at 0x0000012C7A003BF0>
['Tony', 'Lucy', 'Jack']分析:
使用 reversed() 函数对字典反向排列,其实针对的是字典的键。
提示: 从 Python 3.7 之后,字典中元素的排列顺序与定义时的顺序相同,也就是说字典本质上是有序的。
示例 5:自定义可逆对象
(python,yes)
class MyReversible:
def __init__(self, data):
self.data = data
def __reversed__(self):
# 必须返回一个迭代器,不能直接返回列表
return iter(self.data[::-1]) # 自定义逆序逻辑
obj = MyReversible([10, 20, 30])
print(list(reversed(obj)))运行结果如下。
[30, 20, 10]reversed() 函数与 reverse() 方法
实际上,列表本身有一个用于实现反转的 reverse() 方法,它和 reversed() 函数之间的区别如下。
- reversed() 是一个函数,不仅可以用于列表,还可以用于其他序列。此外,它不会修改原来的列表。
- reverse() 是一个方法,只能用于列表。此外,它会修改原来的列表。
| reversed() 函数 | reverse() 方法 | |
|---|---|---|
| 适用对象 | 任意序列 | 仅列表 |
| 内存效率 | 返回新迭代器,元数据不变 | 修改原列表,无返回值 |
| 返回值 | 高(迭代器惰性计算) | 高(直接修改原列表) |
| 原对象是否修改 | 否 | 是 |
示例 6:reversed() 函数
cities = ['北京', '上海', '广州', '深圳', '杭州']
result = list(reversed(cities))
print(cities)
print(result)运行结果如下。
['北京', '上海', '广州', '深圳', '杭州']
['杭州', '深圳', '广州', '上海', '北京']示例 7:reverse() 方法
cities = ['北京', '上海', '广州', '深圳', '杭州']
cities.reverse()
print(cities)运行结果如下。
['杭州', '深圳', '广州', '上海', '北京']常见问题
1. 为什么 reversed() 不能直接用于无序容器(如集合)?
reversed() 函数的目的是为了提供一个序列的反向视图。而像 集合 (set) 这样的数据结构,其根本特性就是无序性。这意味着集合中的元素没有固定的排列顺序,所以 “反转” 一个无序的集合是没有意义的,也无法定义其行为。
因此,当我们尝试对一个无序容器(如 set 或普通 dict)调用 reversed() 时,Python 会抛出 TypeError 异常,告诉你该对象不是可逆的。
2. 如何实现自定义类的逆序逻辑?
如果你创建了自己的 Python 类,并且希望它的对象能够支持 reversed() 函数(即能够被反向迭代),你需要在类中定义一个特殊的魔术方法:__reversed__()。
__reversed__() 方法应该返回一个迭代器,这个迭代器能够以相反的顺序生成你类中的元素。
3. reversed() 的时间复杂度是多少?
reversed() 函数本身在创建反向迭代器时的操作是非常高效的,通常是 O(1) 的时间复杂度。这意味着无论你传入的序列有多长,创建这个迭代器所需的时间都是常数级别的。这个效率得益于 reversed() 的 “惰性求值(lazy evaluation)” 特性。它并不会在调用时立即生成所有反转后的元素并存储起来,而只是准备好如何反向迭代的机制。
真正的计算和遍历开销发生在你开始迭代这个返回的迭代器的时候(例如,在 for 循环中,或者当你将其转换为 list() 时)。此时,迭代的时间复杂度是 O(n),其中 n 是序列中元素的数量,因为你需要逐个访问每个元素。
