为什么Python具有内置函数reversed
?
为什么不使用x[::-1]
代替reversed(x)
?
修改: @TanveerAlam pointed out reversed
实际上不是一个函数,而是一个类,尽管列出了页面Built-in Functions 。
答案 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()
最重要的作用是使代码更易于阅读和理解。
它返回迭代器而不创建新序列的事实是次要的
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会返回迭代器。