Python 3.7从零开始学
上QQ阅读APP看书,第一时间看更新

3.6 调试

这里通过设置一些错误让读者认识在编写代码过程中的常见问题,以帮助读者熟悉和解决实际遇到的问题。

(1)对序列中的元素进行访问时,输入序列中不存在的编号,如在greeting='Hello'示例中输入greeting[10],会得到什么结果?输入greeting[-10]又会得到什么结果?在交互模式下进行验证:

     >>> greeting='hello'
     >>> len(greeting)  #获取字符串长度
     5
     >>> greeting[10]   #编号超过最大长度编号
     Traceback (most recent call last):
       File "<stdin>", line 1, in <module>
     IndexError: string index out of range
     >>> greeting[5] #字符串长度为5,但最大编号不是5
     Traceback (most recent call last):
       File "<stdin>", line 1, in <module>
     IndexError: string index out of range
     >>> greeting[len(greeting)-1] #最大编号是字符串长度减1
     'o'
     >>> greeting[-10]
     Traceback (most recent call last):
       File "<stdin>", line 1, in <module>
     IndexError: string index out of range
     >>> greeting[-1]
     'o'
     >>> greeting[-5]
     'h'

从以上输出结果看出,以正数索引时,编号从0开始,最后一个元素的编号是len(str)-1;以负数索引时,从-1开始,可以取到-len(str)的元素。

当索引超出范围时,Python会报一个IndexError错误,即索引越界错误。要确保索引不越界,记得最后一个元素的索引是len(str)-1。

(2)分片操作中,索引值大于列表的最大编号时,操作会报错吗?结果是怎样的?在交互模式下输入如下:

     >>> number=[1,2,3,4,5,6,7,8,9,10]
     >>> number[7:15]
     [8, 9, 10]
     >>> number[-100:-1]
     [1, 2, 3, 4, 5, 6, 7, 8, 9] #最后一个元素没有取到

由以上操作结果看到没有报错,并且超出部分没有输出任何内容。这里要声明一点:分片操作不存在索引越界的问题,分片操作对不存在的编号返回空值,存在的就返回对应值。所以number[7:15]返回[8, 9, 10],number[-100:-1]返回[1, 2, 3, 4, 5, 6, 7, 8, 9]。

(3)输入以下代码会得到什么结果?

     >>> max(a,b,c)
     Traceback (most recent call last):
       File "<stdin>", line 1, in <module>
     NameError: name 'a' is not defined
     >>> max('a','b','c')
     'c'

第一个输出错误信息,因为a、b、c没有定义,这个操作要注意字符串的表示形式。第二个输出结果为c,max不但能操作数字,而且能操作字符,字符按字典排序取值。