`range(n, -1, -1)` 和 `reversed(range(0, n+1))` 有什么区别吗?

Eli*_*ICA 5 python python-3.x

它们产生相同的结果。

>>> for i in range(10, -1, -1):
...     print(i)
... 
10
9
8
7
6
5
4
3
2
1
0
Run Code Online (Sandbox Code Playgroud)

对比:

>>> for i in reversed(range(0, 10 + 1):
...     print(i)
... 
10
9
8
7
6
5
4
3
2
1
0
Run Code Online (Sandbox Code Playgroud)

据我了解,Python3range创建一个生成器,而不是将整个范围存储在内存中。reversed我认为,同样一次会产生一个值。有什么理由使用其中一种而不是另一种吗?

Die*_*Epp 3

Python 中的函数reversed()有一个特殊情况,即当您向其传递range(). reversed(range(...))和之间唯一真正的区别是,您可以多次range(...)迭代 a ,但返回一个迭代器,因此它只能使用一次。range()reversed()

>>> iter(range(0, 10))
<range_iterator object at 0x7f735f5badb0>
>>> reversed(range(0, 10))
<range_iterator object at 0x7f735f5baf30>
Run Code Online (Sandbox Code Playgroud)

您可以看到,在这两种情况下,迭代器类型都是range_iterator。因此,循环本身的性能在这两种情况下都是相同的。

由于唯一的开销reversed()是一个额外的函数调用,所以我总是reversed(range(10))更喜欢range(9, -1, -1).