作为实践,编程完成下面的任务。
调试硬币抛掷
下面程序的意图是一个简单的硬币抛掷猜测游戏。玩家有两次猜测机会(这
是一个简单的游戏)。但是,程序中有一些缺陷。让程序运行几次,找出缺陷,使该程序能正确运行。
import random guess = ''
while guess not in ('heads', 'tails'):
print('Guess the coin toss! Enter heads or tails:') guess = input()
toss = random.randint(0, 1) # 0 is tails, 1 is heads if toss == guess:
print('You got it!') else:
print('Nope! Guess again!') guesss = input()
if toss == guess: print('You got it!')
else:
print('Nope. You are really bad at this game.')
10.6 小结
断言、异常、日志和调试器,都是在程序中发现和预防缺陷的有用工具。用
Python 语句实现的断言,是实现心智正常检查的好方式。如果必要的条件没有保持为 True,它将尽早给出警告。断言所针对的错误,是程序不应该尝试恢复的,而是应该快速失败。否则,你应该抛出异常。
异常可以由 try 和 except 语句捕捉和处理。logging 模块是一种很好的方式,可以在运行时查看代码的内部,它比使用 print()
函数要方便得多,因为它有不同的日志级别,并能将日志写入文本文件。
调试器让你每次单步执行一行代码。或者,可以用正常速度运行程序,并让调试器暂停在设置了断点的代码行上。利用调试器,你可以看到程序在运行期间,任何时候所有变量的值。
这些调试工具和技术将帮助你编写正确工作的程序。不小心在代码中引入缺陷,这是不可避免的,不论你有多少年的编码经验。
习题
1 .写一条 assert 语句,如果变量 spam 是一个小于 10 的整数, 就触发
AssertionError。
2.编写一条 assert 语句,如果 eggs 和 bacon 包含的字符串彼此相同,而且不论大小写如何,就触发 AssertionError(也就是说,'hello' 和 'hello'
被认为相同, 'goodbye' 和 'GOODbye' 也被认为相同)。
3.编写一条 assert 语句,总是触发 AssertionError。
4.为了能调用 logging.debug(),程序中必须加入哪两行代码?
5.为了让 logging.debug() 将日志消息发送到名为 programLog.txt 的文件中,程序必须加入哪两行代码?
6.5 个日志级别是什么?
7.你可以加入哪一行代码,禁用程序中所有的日志消息?
8.显示同样的消息,为什么使用日志消息比使用 print() 要好?
9.调试控制窗口中的 Step、Over 和Out 按钮有什么区别?
10.在点击调试控制窗口中的Go 按钮后,调试器何时会停下来?
11.什么是断点?
12.在 IDLE 中,如何在一行代码上设置断点?