繁体   English   中英

为什么Python有“逆转”?

[英]Why does Python have `reversed`?

为什么Python内置函数reversed

为什么不使用x[::-1]而不是reversed(x)


编辑@TanveerAlam 指出 reversed 实际上不是一个函数,而是一个类,尽管列在内置函数页面上

>>> a= [1,2,3,4,5,6,7,8,9,10]
>>> a[::-1]
[10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
>>> reversed(a)
<listreverseiterator object at 0x10dbf5390>

第一种表示法急切地产生反转; 第二个是给你一个反向迭代器,它可能更便宜,因为它有可能只根据需要生成元素

reversed回报反向迭代。

[::-1]向对象询问切片

Python对象试图返回您可能期望的内容

>>> [1, 2, 3][::-1]
[3, 2, 1]
>>> "123"[::-1]
'321'

这很方便 - 特别是对于字符串和元组。

但请记住,大多数代码不需要反转字符串。

reversed()最重要的作用是使代码更易于阅读和理解

它返回迭代器而不创建新序列的事实是次要的

来自文档

PEP 322:反向迭代一个新的内置函数revers(seq)()接受一个序列并返回一个迭代器,它以相反的顺序循环遍历序列的元素。

>>>
>>> for i in reversed(xrange(1,4)):
...    print i
...
3
2
1

与扩展切片相比,例如range(1,4)[:: - 1],reverse()更容易阅读,运行速度更快,并且使用的内存更少。

请注意,reversed()只接受序列,而不接受任意迭代器。 如果要反转迭代器,首先将其转换为带有list()的列表。

>>>
>>> input = open('/etc/passwd', 'r')
>>> for line in reversed(list(input)):
...   print line
...

首先, reversed不是内置函数。

>>> type(reversed)
<type 'type'>

它是一个对序列进行评估并给出序列相反顺序的类。

尝试:

>>> help(reversed)
Help on class reversed in module __builtin__:

class reversed(object)
 |  reversed(sequence) -> reverse iterator over values of the sequence

当我们将参数传递给它时,它充当迭代器,

>>> l = [1, 2, 3, 4]
>>> obj = reversed(l)
>>> obj
<listreverseiterator object at 0x0220F950>
>>> obj.next()
4
>>> obj.next()
3
>>> obj.next()
2
>>> obj.next()
1
>>> obj.next()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration

而切片操作返回整个列表,这对于较大的列表而言不是内存效率。

这就是为什么在Python 2中,我们有range (返回整个列表)以及xrange (在每次迭代时生成每个元素)。

>>> l[::-1]
[4, 3, 2, 1]

反转返回一个反向迭代器。

x [:: - 1]返回一个列表。

In [1]: aaa = [1,2,3,4,5]

In [4]: aaa[::-1]
Out[4]: [5, 4, 3, 2, 1]

In [5]: timeit(aaa[::-1])
1000000 loops, best of 3: 206 ns per loop

In [6]: reversed(aaa)
Out[6]: <listreverseiterator at 0x104310d50>

In [7]: timeit(reversed(aaa))
10000000 loops, best of 3: 182 ns per loop
aList = [123, 'xyz', 'zara', 'abc', 'xyz'];
print type(reversed(aList))

bList = [123, 'xyz', 'zara', 'abc', 'xyz'];
print type(bList[::-1])

输出:

<type 'listreverseiterator'>
<type 'list'>

reversed函数返回一个反向迭代。 [::-1]返回一个列表。

因为reverse会返回一个迭代器。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM