鱼C论坛

 找回密码
 立即注册
查看: 2184|回复: 4

[已解决]不懂为什么sorted()可以直接出序列,但reversed() 却要list

[复制链接]
发表于 2023-4-14 00:54:09 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
reversed() 为啥不能像sorted()直接出列表。有什么缘故或用途?
python原则不是就简吗
最佳答案
2023-4-14 00:56:22
`sorted()` 和 `reversed()` 两个函数在 Python 中的设计有所不同。`sorted()` 是用于对一个可迭代对象(例如列表、元组等)进行排序,并返回一个新的已排序的列表。因此,当你调用 `sorted()` 函数时,它会直接返回一个新的排序后的列表。

而 `reversed()` 函数设计上的目标是创建一个倒序的迭代器。它并不会直接返回一个倒序的列表,而是返回一个可迭代的 `reversed` 对象。这样的设计有其优势,尤其是在处理大型数据集时,因为不需要为新的列表分配额外的内存空间。你可以使用 `for` 循环遍历 `reversed` 对象,也可以通过 `list()` 函数将其转换为一个新的列表。

简单来说,`reversed()` 函数的设计初衷是节省内存空间,提高代码执行效率,因此它返回的是一个可迭代的对象,而不是一个新的列表。在某些情况下,这个设计理念更符合 Python 的简洁原则。但如果你需要一个倒序的列表,只需用 `list()` 函数将 `reversed()` 返回的对象转换即可。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-4-14 00:56:22 | 显示全部楼层    本楼为最佳答案   
`sorted()` 和 `reversed()` 两个函数在 Python 中的设计有所不同。`sorted()` 是用于对一个可迭代对象(例如列表、元组等)进行排序,并返回一个新的已排序的列表。因此,当你调用 `sorted()` 函数时,它会直接返回一个新的排序后的列表。

而 `reversed()` 函数设计上的目标是创建一个倒序的迭代器。它并不会直接返回一个倒序的列表,而是返回一个可迭代的 `reversed` 对象。这样的设计有其优势,尤其是在处理大型数据集时,因为不需要为新的列表分配额外的内存空间。你可以使用 `for` 循环遍历 `reversed` 对象,也可以通过 `list()` 函数将其转换为一个新的列表。

简单来说,`reversed()` 函数的设计初衷是节省内存空间,提高代码执行效率,因此它返回的是一个可迭代的对象,而不是一个新的列表。在某些情况下,这个设计理念更符合 Python 的简洁原则。但如果你需要一个倒序的列表,只需用 `list()` 函数将 `reversed()` 返回的对象转换即可。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2023-4-14 01:04:42 | 显示全部楼层
isdkz 发表于 2023-4-14 00:56
`sorted()` 和 `reversed()` 两个函数在 Python 中的设计有所不同。`sorted()` 是用于对一个可迭代对象(例 ...

每次都是看似懂了,转念 又不懂,主要是不了解内存还有python对内存的管理和应用。reversed()倒序迭代器以及遍历运行中不也需要内存?
可能在超大型数据中省了这部分数据的固定带ID的内存把
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-4-14 01:14:46 | 显示全部楼层
Mever 发表于 2023-4-14 01:04
每次都是看似懂了,转念 又不懂,主要是不了解内存还有python对内存的管理和应用。reversed()倒序迭代 ...

是的,你的理解是正确的。reversed() 作为一个倒序迭代器,其在运行过程中确实需要一定的内存空间。但它与直接创建一个倒序列表相比,在内存使用上有明显优势。

当我们使用 reversed() 函数时,它会返回一个迭代器对象。迭代器的特点是惰性求值(lazy evaluation),即它只会在需要计算下一个值时才会进行计算。这意味着,当你遍历一个大型数据集时,reversed() 只需要保存当前值以及计算下一个值所需的最小信息,而不需要一次性将整个倒序数据集加载到内存中。因此,它在内存使用上更加高效。

对于大型数据集来说,这种方式可以显著减少内存占用。在实际应用中,尤其是处理大型数据集时,这种设计可以帮助我们节省内存资源,提高代码执行效率。

当然,如果你需要一个倒序列表,可以使用 list() 函数将 reversed() 返回的迭代器对象转换为列表。在这种情况下,整个列表将被加载到内存中,内存占用会相应增加。但在许多情况下,我们可能只需要遍历数据,而不需要实际创建一个新的倒序列表。这时,使用 reversed() 迭代器是一个更加节省内存的选择。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2023-4-14 01:32:39 | 显示全部楼层
谢谢~
同样enumerate()函数也是一样,需要list才出列表
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-23 21:29

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表