上一篇介绍“通过假设来理解程序”的文章中,我在最后留一个问题,为什么range函数里,我写的是len(lst)-1, 而不是len(lst)?
lst = [3, 8, 1, 2, 5]
for i in range(len(lst)-1):
if lst[i] > lst[i+1]:
tmp = lst[i]
lst[i] = lst[i+1]
lst[i+1] = tmp
print(lst[-1])
你该如何思考回答这个问题呢?对编程的问题,我们必须重视边界,上一篇文章中,我告诉你通过假设来模拟程序的执行过程,从索引0开始,那是程序开始的位置,索引0是列表的边界,那么列表除此以外,是不是还有一个边界?
列表里有5个数据,列表的长度是5,最大索引是4,现在,我们考虑列表的右侧边界,假设i=4会怎样? 当i=4时,if语句需要比较lst[4] 和 lst[5] 的大小,等等,lst[5] 存在么?不存在,列表最大的索引是4,这就是我在range函数里传入的参数是len(lst)-1的原因。len(lst)-1 的值4,而range(4) 产生的数列中最大值是3,i最大只能为3,当i等于3时,比较lst[3] lst[4] 的值,这一次比较结束后,for循环也就结束了。
对于for循环,我们很容易理解循环开始的条件,却总是忽视循环结束的条件,对于两侧的边界,都需要我们认真思考。
QQ交流群: 211426309