Python 3.8从零开始学
上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不但能操作数字,而且能操作字符,字符按字典排序取值。