为什么Python有“逆转”?

时间:2014-11-18 02:45:56

标签: python language-design

为什么Python具有内置函数reversed

为什么不使用x[::-1]代替reversed(x)


修改 @TanveerAlam pointed out reversed 实际上不是一个函数,而是一个类,尽管列出了页面Built-in Functions

6 个答案:

答案 0 :(得分:7)

>>> 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>

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

答案 1 :(得分:2)

reversed返回一个反向迭代器。

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

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

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

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

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

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

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

From the docs

  

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

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

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

     

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

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

答案 2 :(得分:1)

首先,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]

答案 3 :(得分: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

答案 4 :(得分:0)

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]返回一个列表。

答案 5 :(得分:-1)

因为reverse会返回迭代器。