Python reversed() 函数

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() 函数 vs 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 是序列中元素的数量,因为你需要逐个访问每个元素。

上一篇: slice()

下一篇: sorted()

给站长反馈

绿叶网正在不断完善中,小伙伴们如果发现任何问题,还望多多给站长反馈,谢谢!

邮箱:lvyenet@vip.qq.com

「绿叶网」服务号
绿叶网服务号放大
关注服务号,微信也能看教程。
绿叶网服务号