范围内的单人纸牌负数有什么作用?

What a solitaire negative number on range does?

我正在做 John Zelle 关于 Python 的书中的练习,他要求使用循环函数来做斐波那契数列。

没搞定后,我看了看他的决议,是这样的:

n = int(input("Enter the value of n: "))
curr, prev = 1, 1
for i in range(n-2):
    curr, prev = curr+prev, curr
print("The nth Fibonacci number is", curr)

虽然我确实理解了他所做的一部分,但我错过的部分是 (n-2) 范围。

我在 Whosebug 上查看了一下,人们说范围内的负数可以追溯到列表的末尾。但在这种情况下,如果用户提示1,结果将是range(-1).

我的猜测是作者这样做是为了让 for 循环不对斐波那契数列的前两个值求和,因为它们都是 1,并且只有在用户提示 2 来回之后,循环才真正开始加起来。我猜对了吗?

>>> range(-1)
range(0, -1)

因此如果n为1或2且curr(设置为1)为结果,则不会进入for循环。

如果为此输入0或1,代码不进入循环,结果为curr的初始值,即1 。对于任何更高的值,循环将迭代计算正确的值。

您对负值的记忆有点偏差:负索引将从 iterable(例如列表、元组、字符串)的另一端开始工作。一个 range 不完全是 class;本例中的结果是一个空范围。


澄清 OP 评论后

我看到了你的困惑。 range returns 给定值的可迭代。但是,您似乎将限制与索引混淆了。让我们使用一般形式:

r = range(left, right, step)
r[pos]

左*默认为0; **step 默认为 1

这里有一些例子:

>>> r = range(0, 20, 2)
>>> r[-1]
18
>>> r = range(0, -1)
>>> r
[]
>>> r = range(0, -10, -2)
>>> r
[0, -2, -4, -6, -8]
>>> r[-2]
-6

请注意第二个和第三个示例,其中我们对端点使用负值。负 endpoint 和负 index 之间存在区别。端点用于构建列表;如果端点不按步骤隐含的顺序排列,则结果范围为空列表。 range(0, -1)就是这样一个例子。

一旦构建了列表,例如使用 range(0, 20, 2),然后 使用负数 index[= 对该列表的引用45=] 将从列表的右端开始计数。请注意第三个示例,创建一个从 "backward"、0 到 -8 的列表。在这种情况下,负索引也适用于右侧。负右端值、负步长和负索引是三种不同的用法。

这能解决问题吗?