Python核心编程(第二版)第十章习题答案
10.1 引发异常。以下的哪个因素会在程序执行时引发异常?注意这里我们问的并不是异常的原因。
a)用户;
b)解释器;
c)程序;
d)以上所有;
e)只有b)和c);
f)只有a)和c)。
答案:f
10-2.引发异常。参考上边问题的列表,哪些因素会在执行交互解释器时引发异常?
答案:f
10-3.关键字。用来引发异常的关键字有哪些?
答案:raise
10-4.关键字。try-except和try-finally有什么不同?
答案:
try-except:当try代码块运行出错,except代码块才会被执行(匹配到相应异常时),处理完异常后try-except后的代码会继续往下执行;
try-finally:不管try代码块是否出现异常,最终都会执行finally里的代码。如果出现异常,执行完finally代码块后,异常会继续往上层抛。
10-5.异常。下面这些交互解释器下的Python代码段分别会引发什么异常(参阅表10.2给出的内建异常清单):
(a)>>>if 3 < 4 then:print '3 is less than 4!'
(b)>>>aList = ['Hello','World','Anyone','Home?']
>>>print 'the last string in aList is: ',aList[len(aList)]
(c)>>>x
(d)>>>x = 4 % 0
(e)>>>import math
>>>i = math.sqrt(-1)
答案:
(a)SyntaxError: invalid syntax
(b)IndexError: list index out of range
(c)NameError: name 'x' is not defined
(d)ZeroDivisionError: integer division or modulo by zero
(e)ValueError: math domain error
10-6.改进的open()。为内建的open()函数创建一个封装。使得成功打开文件后,返回文件句柄:若打开失败则返回给调用者None,而不是生成一个异常。这样你打开文件就不需要额外的异常处理语句。
答案:
def try_open(filename,mode = 'r'):
try:
f = open(filename,mode)
except IOError:
return None
return f
if __name__ == "__main__":
print try_open('test1.txt')
10-7.异常。下面两端Python伪代码a)和b)有什么区别?考虑语句A和B的上下文环境。(这么细致的区别要感谢Guido!)
(a)
try:
statement_A
except . . .:
. . .
else:
statement_B
(b)
try:
statement_A
statement_B
except . . .:
. . .
答案:
情况1:
如果statement_A执行出错,则(a)和(b)都不会执行statement_B;
情况2:
如果statement_A执行正常,则(a)和(b)都会执行statement_B——但是,如果statement_B的执行也出错,(b)可以在except子句里捕获到异常并做处理,而(a)则只能将statement_B产生的异常抛给上层调用者。
10–8.改进的raw_input()。本章的开头,我们给出了一个”安全”的float()函数,它建立在内建函数float()上,可以检测并处理float()可能会引发的两种不同异常。同样,raw_input()函数也可能会生成两种异常,EOFError(文件末尾EOF,在Unix下是由于按下了Ctrl+D在Dos下是因为Ctrl+Z)或是KeyboardInterrupt(取消输入,一般是由于按下了Ctrl+C)。请创建一个封装函数safe_input(),在发生异常时返回None。
答案:
def safe_input(example):
symbol = None
try:
symbol = raw_input(example)
except (EOFError, KeyboardInterrupt):
pass
return symbol
if __name__ == '__main__':
print safe_input('please input: ')
10-9.改进的math.sqrt()。math模块包含大量用于处理数值相关运算的函数和常量。不幸的是,它不能识别复数,所以我们创建了cmath模块来支持复数相关运算。请创建一个safe_sqrt()函数,它封装math.sqrt()并能处理负值,返回一个对应的复数。
答案:
import math, cmath
def safe_sqrt(x):
try:
num = math.sqrt(x)
except ValueError:
num = cmath.sqrt(x)
return num
if __name__ == "__main__":
x = float(raw_input('please input a number: '))
print safe_sqrt(x)
说明:内容为网络爬虫练习所得,如侵权,请联系删除
posted on 2021-02-05 18:00 AlphaRobot 阅读(172) 评论(0) 编辑 收藏 举报