不知道这是因为Jupyter Notebook还是仅仅是Python处理了异常,但是我正在和朋友一起解决涉及算法的问题
白板代码时,我使用了Python!
exampleList = ['a', 'b', 'c', 'd', 'e']
for i in range(0, len(exampleList)):
for j in range(i + 1, len(exampleList)):
print(exampleList[i], exampleList[j])
基本上,争论是这样的。此代码(一个相似的代码,我已经用一个简单的例子说明了),涉及两个for
循环,必须抛出错误!因为索引i
达到了len(exampleList) - 1
,索引j
在技术上将变为len(exampleList)
,到那时,print(exampleList[i], exampleList[j])
无法正常工作!看起来好像在运行代码时,它确实可以完美打印,并且我认为可以处理IndexError: list index out of range
异常!
我的问题是..这应该是Python中的预期行为吗?因为我正在辩论的人最终告诉我,“进行面试的人注意到了这些事情!您必须能够解释每一行。'
我想了解这部分的处理方式,因此我可以解释为什么它不会引发错误!
答案 0 :(得分:1)
您误解了range()
的工作方式。
Range()
停止从小于给定停止值的第一个值开始计数,在您的情况下,该值等于len(exampleList)-1
。
答案 1 :(得分:1)
range
函数包含下限,但专有包含上限。
您的示例列表包含5个元素。这意味着第一个循环正在运行range(0,5)
,从而使最大值i=4
。这使得第二个循环的最大值为range(5,5)
,这是一个空列表。遍历一个空列表会导致0次迭代。
>>> exampleList = ['a', 'b', 'c', 'd', 'e']
>>> len(exampleList)
5
>>> range(0, 5)
[0, 1, 2, 3, 4]
>>> range(5,5)
[]
答案 2 :(得分:1)
在示例代码中,var latlng1 = var latlng1 = L.latLng(0, 0);
var latlng2 = L.latLng(0, 135);
var distance = latlng1.distanceTo(latlng2); // Distance 15011315.09701543 [meter]
决不等于j
。您说len(exampleList)
,这意味着j in range(i + 1, len(exampleList))
也将始终小于j
。并且,如果为len(exampleList)
,则范围将为空,因为i+1 >= len(exampleList)
的{{1}}始终为空。
所以永远不会抛出错误,因为永远不会执行错误的代码。
答案 3 :(得分:1)
在这种情况下,我们有len(array)= 5 。
第一个循环上的范围函数将迭代返回5个值- [0,1,2,3,4] 。这意味着问题编号应该是最后一个 4 ,对吧?
但是实际上,当您尝试进入第二个循环时, range(4 + 1,5) 实际上会返回一个空白的数字列表,因此不会t完全运行循环的内容。 因此,没有错误。
答案 4 :(得分:0)
请注意exampleList [i]永远不会是e?一旦您的第一个for循环达到len(exampleList)-1,内部循环就会失败,因为它正在检查i + 1是否小于exampleList的长度(不是),因此永远不会到达print语句,从而导致异常不被抛出。
答案 5 :(得分:0)
这对Python来说没有错。仅当尝试访问exampleList[5]
时,该异常才成为问题,而循环永远不会请求。重要的是要记住,range()
不包含上限,但包含下限。
下面我在右侧添加了一些注释以进行解释
exampleList = ['a', 'b', 'c', 'd', 'e']
for i in range(0, len(exampleList)): # includes [0, 1, 2, 3, 4]
for j in range(i + 1, len(exampleList)): # includes all numbers in range[0,4] greater than i
print(exampleList[i], exampleList[j]) # will never exceed 4
答案 6 :(得分:0)
在最外层循环的最后一次迭代中,j将开始等于len(示例)。因此,在此迭代中甚至不执行j循环。因为范围介于len(example)和len(example)-1之间。