第13节,思考边界

上一篇介绍“通过假设来理解程序”的文章中,我在最后留一个问题,为什么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

加入知识星球, 每天收获更多精彩内容

分享日常研究的python技术和遇到的问题及解决方案