为什么范围(开始,结束)不包括结束?

新手上路,请多包涵
>>> range(1,11)

给你

[1,2,3,4,5,6,7,8,9,10]

为什么不是 1-11?

他们是随机决定那样做还是有一些我没有看到的价值?

原文由 MetaGuru 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 309
2 个回答

因为调用 range(0, 10) 更常见,它返回 [0,1,2,3,4,5,6,7,8,9] 包含 10 个元素,等于 len(range(0, 10)) 。请记住,程序员更喜欢基于 0 的索引。

另外,请考虑以下常见代码片段:

 for i in range(len(li)):
    pass

你能看出如果 range() 正好上升到 len(li) 这会有问题吗?程序员需要显式地减去 1。这也符合程序员更喜欢 for(int i = 0; i < 10; i++) 而不是 for(int i = 0; i <= 9; i++) 的普遍趋势。

如果您经常调用以 1 开头的范围,您可能需要定义自己的函数:

 >>> def range1(start, end):
...     return range(start, end+1)
...
>>> range1(1, 10)
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

原文由 moinudin 发布,翻译遵循 CC BY-SA 4.0 许可协议

尽管这里有一些有用的算法解释,但我认为添加一些简单的“现实生活”推理可能会有所帮助,以说明为什么它以这种方式工作,我发现这在向年轻的新手介绍该主题时很有用:

对于像“范围(1,10)”这样的东西,可能会因为认为一对参数代表“开始和结束”而产生混淆。

它实际上是启动和“停止”。

现在,如果它 “结束”值,那么,是的,您可能希望该数字将作为序列中的最后一个条目包含在内。但这不是“结束”。

其他人错误地称该参数为“count”,因为如果您只使用“range(n)”,那么它当然会迭代“n”次。当您添加 start 参数时,此逻辑就会中断。

所以重点是要记住它的名字:“ 停止”。这意味着它是到达时迭代将立即停止的点。不是 那一点之后。

因此,虽然“开始”确实代表要包含的第一个值,但在达到“停止”值时它会“中断”,而不是在停止之前继续处理“那个”。

我在向孩子们解释这一点时使用的一个类比是,具有讽刺意味的是,它比孩子们表现得更好!它并没有在它应该停止 之后 停止——它没有完成它正在做的事情就立即停止了。 (他们明白了;))

另一个类比——当你开车时,你不会 通过 停止/让行/“让路”标志,最终它会停在你的车旁边或后面的某个地方。从技术上讲,当你停下来时你仍然没有达到它。它不包括在“你在旅途中传递的东西”中。

我希望其中一些有助于向 Pythonitos/Pythonitas 解释!

原文由 dingles 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题