Python 编程导论 Chapter 7 —— 异常与断言


typora-copy-images-to: Python 编程导论

Python 编程导论 Chapter 7 —— 异常与断言


  • 异常,定义为不符合规范的东西

  • 异常类型:

    • TypeError
    • IndexError
    • NameError
    • ValueError

7.1 处理异常

# 普通代码
successFailureRatio = numSuccesses/numFailures
print('The success/failure ratio is', successFailureRatio)
print('Now here')

# 改写为异常处理代码
try:
    successFailureRatio = numSuccesses / numFailures
    print('The success / failure ratio is', successFailureRatio)
except ZeroDivisionError:
    print('No failures, so the success / failure ratio is undefined')
print('Now here')

# 实际练习实现一个满足以下规范的函数。请使用 try-except 代码块
def sumDigits(s):
	"""假设s是一个字符串
		返回s中十进制数字之和
		例如,如果s是'a2b3c',则返回5"""

# 自行思索的过程:    
c = "a2b3c"
e = []
for num in c:
    try:
        d = int(num)
        e.append(d)
    except ValueError:
        pass
result = sum(e)
print(result)


while True:
	val = input('Enter an integer: ')
	try:
		val = int(val)
		print('The square of the number you entered is', val**2)
		break #跳出while循环
	except ValueError:
		print(val, 'is not an integer')
        
# 多态的函数
def readVal(valType, requestMsg, errorMsg):
	while True:
		val = input(requestMsg + ' ')
		try:
			return(valType(val)) #返回前将str转换为valType
		except ValueError:
			print(val, errorMsg)
readVal(int, 'Enter an integer:', 'is not an integer')
# 上述代码可以兼容各种类型的参数
  • 如果一段程序代码中可能引发的异常类型不止一种,那么保留字 except 后面可以接一个异常元组 except (ValueError, TypeError):

在这里插入图片描述

7.2 将异常用作控制流

  • 处理错误的标准方法是使函数返回一个特定值
# 实际练习

def findAnEven(L):
	"""假设L是一个整数列表
		返回L中的第一个偶数
		如果L中没有偶数,则抛出ValueError异常"""
    
def findAnEven(L):   #未完成
    """假设L是一个整数列表
    返回L中的第一个偶数
    如果L中没有偶数,则抛出ValueError异常"""
    all_even = []
    try:
        for item in L :
            if item % 2 == 0 :
                all_even.append(item)
        print(all_even[0])
    except:
        raise ValueError('No Even number at all !')

findAnEven([1,5,3,3])

# 同样规范的另一种实现
def getRatios(vect1, vect2):
		"""假设vect1和vect2是长度相同的数值型列表
			返回一个包含vect1[i]/vect2[i]中有意义的值的列表"""
	ratios = []
	if len(vect1) != len(vect2):
		raise ValueError('getRatios called with bad arguments')
	for index in range(len(vect1)):
		vect1Elem = vect1[index]
		vect2Elem = vect2[index]
		if (type(vect1Elem) not in (int, float)) or (type(vect2Elem) not 			in (int, float)):
			raise ValueError('getRatios called with bad arguments')
		if vect2Elem == 0.0:
			ratios.append(float('NaN')) #NaN = 不是一个数
		else:
			ratios.append(vect1Elem/vect2Elem)
	return ratios

7.3 断言

assert Boolean expression
assert Boolean expression, argument
  • 执行 assert 语句时,先对布尔表达式求值。如果值为 True ,程序就愉快地继续向下执行;如果值为 False ,就抛出一个 AssersionError 异常

  • 确保函数参数具有恰当的类型

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值