【目录】
任务目标写一个模拟幼儿园老师分苹果的小程序,用try...except
语句处理可能出现的异常。
最终输出的结果为"X个苹果,平均分给X个小朋友,每人分X个,剩下X个。"
提示:程序至少会遇到2个类型的异常。
【代码示例:96-1】
def division():
'''功能:分苹果'''
print("\n===================== 分苹果了 =====================\n")
apple = int(input("请输入苹果的个数:")) # 输入苹果的个数
children = int(input("请输入来了几个小朋友:")) # 输入小朋友人数
result = apple//children # 计算每人分几个苹果
remain =apple-result*children # 计算余下几个苹果
print(apple,"个苹果,平均分给",children,"个小朋友,每人分",result,
"个,剩下",remain,"个。")
if __name__ == '__main__':
division() # 调用分苹果的函数
上面的代码是我们之前学的内容,现在我们需要给上面的代码加上一个异常处理机制。
写代码前我们分析该程序可能会有2个异常:
一是除数为0的抛出的ZeroDivisionError
异常。
二是苹果和小朋友的数量输入成小数或者不是数据,抛出ValueError
异常。
如果程序有多个异常,我们可以在try...except
语句中再添加except
语句。
或者使用我们上节课学的except (异常类型1,异常类型2,异常类型3...) as 别名:
语句。
【代码框架】
try:
# 可能会发生异常的代码块
except (异常类型1,异常类型2,异常类型3…) as 别名:
# 输出异常的具体内容
print(别名)
【代码示例:96-2】
def division():
'''功能:分苹果'''
print("\n===================== 分苹果了 =====================\n")
apple = int(input("请输入苹果的个数:")) # 输入苹果的个数
children = int(input("请输入来了几个小朋友:"))
result = apple//children # 计算每人分几个苹果
remain =apple-result*children # 计算余下几个苹果
print("%d个苹果,平均分给%d个小朋友,每人分%d个,剩下%d个。" % (apple, children, result,remain ))
if __name__ == '__main__':
try: # 捕获异常
division() # 调用分苹果的函数
except ZeroDivisionError as e: # 处理ZeroDivisionError异常
print("输入错误:",e) # 输出错误原因
except ValueError as e: # 处理ValueError异常
print("输入错误:",e) # 输出错误原因
【代码解析】
def division():
division[dɪˈvɪʒn]:除法。
def语句定义一个名为division
的函数。
print("\n===================== 分苹果了 =====================\n")
第二行代码打印了一个分隔线的提示信息。
apple = int(input("请输入苹果的个数:")) # 输入苹果的个数
这里注意如果终端输入的是小数,程序也会报错,因为小数类型的字符串转换成整数需要先转换成浮点数,再转换成整数。
以将字符串"3.3"
转换成整数为例:
由于"3.3"
是一个浮点数字符串,无法直接转换成整数。可必须先将字符串转换成浮点数,然后再将浮点数转换成整数。
注意:将浮点数转换成整数时,会将小数部分直接舍弃,只保留整数部分。
s = "3.3"
f = float(s) # 将字符串转换成浮点数
i = int(f) # 将浮点数转换成整数
print(i) # 输出结果为3
3
将浮点数转换成整数时,会将小数部分直接舍弃,只保留整数部分。所以最终结果为3。
接收用户输入的苹果个数,并将其转换为整数类型。
children = int(input("请输入来了几个小朋友:"))
children [ˈtʃɪldrən]:孩子们。
接收用户输入的小朋友人数,并将其转换为整数类型。
result = apple//children
result [rɪˈzʌlt]:结果。
计算每个小朋友分到的苹果个数,使用整除运算符//
。
%
是取余数操作符,用于返回除法的余数。
例如,5 % 3 = 2,表示5除以3的余数是2。
//
是整除操作符,用于返回两个数相除的整数部分。
例如,5 // 3 = 1,表示5除以3的整数部分是1。
print(5 % 3)
print(5 // 3)
【终端输出】
2
1
remain =apple-result*children
remain [rɪˈmeɪn]:剩余。
苹果总数-每个小朋友分到的苹果数*小朋友数 = 剩下的苹果个数
print("%d个苹果,平均分给%d个小朋友,每人分%d个,剩下%d个。" % (apple, children, result ,remain ))
这行代码使用了字符串格式化的方式输出一句话。
"%d个苹果,平均分给%d个小朋友,每人分%d个,剩下%d个。"
是一个格式化字符串,其中的%d
表示将要插入一个整数值。
代码中的% (apple, children, result ,remain)
表示将 apple、children 、 result、remain 依次插入到格式化字符串中的 %d
的位置上。
假设 apple 的值为10,children 的值为5,result 的值为2,remain的值为0,那么最终输出的结果为"10个苹果,平均分给5个小朋友,每人分2个,剩下0个。"
if __name__ == '__main__':
判断当前模块是否为主模块,即直接运行的模块。
if name == 'main':
是Python中的一个常用语句,它的作用是判断当前模块是否作为主程序运行。
如果当前模块是作为主程序运行,那么if name == 'main':
后面的代码块将被执行。
如果当前模块是被其他模块导入的,那么if name == 'main':
后面的代码块将不被执行。
这样设计的目的是为了让模块既可以作为独立的程序运行,又可以作为其他模块的组件导入使用
可参考文章85. if name == "main"的作用和原理(适合小白)
try:
捕获异常语句的关键字。
division()
调用分苹果的函数。
try 后接可能出现错误的代码块。
division()
就表示可能出现错误的代码块。
【调用函数的语法】
函数名(参数1, 参数2, ...)
其中,函数名是要调用的函数的名称,参数是传递给函数的值或变量。
except ZeroDivisionError as e: # 处理ZeroDivisionError异常
except
是关键字。
ZeroDivisionError
是异常名称。
as
是关键字,不能更改。
e
是别名,它记录了异常的具体内容,这里的e
你可以根据你自己的喜好来命名。
注意最后要加英文冒号:
哦。
print("输入错误:",e)
输出程序记录的异常内容,根据该内容我们可以排查是什么地方发生了异常。
except ValueError as e: # 处理ValueError异常
ValueError
是异常名称。print("输入错误:",e) # 输出错误原因
输入不同的值,终端显示结果如下所示:
【输入苹果的数量为5,小朋友的数量为3】
【输入苹果的数量为3,小朋友的数量为5】
【输入苹果的数量为5,小朋友的数量为0】
integer division or modulo by zero
意思是整数除法或取模运算中除数为零。
这个错误通常发生在代码中进行整数除法或取模运算时,除数的值为零,导致无法进行计算。
integer [ˈɪntɪdʒə]:整数。
division[dɪˈvɪʒn]:除法。
modulo [ˈmɒdjʊləʊ]:模。
【输入苹果的数量为5,小朋友的数量为3.3】
invalid[ɪnˈvælɪd]:无效的。
literal [ˈlɪtərəl]:文本,常量。
base [beɪs]:基础。
输入错误: invalid literal for int() with base 10: ‘3.3’
invalid literal for int() with base 10: '3.3'
表示用户输入的字符串是'3.3'
,而int()函数无法将这个字符串解析为一个有效的整数。
注意小数类型的字符串转换成整数需要先转换成浮点数,再转换成整数。
【输入苹果的数量为R】
invalid literal for int() with base 10: 'R'
表示用户输入的字符串是’R’,而int()函数无法将这个字符串解析为一个有效的整数。
输入错误: invalid literal for int() with base 10: ‘R’
除了多个except语句,我们还可以用except (异常类型1,异常类型2) as 别名
的方式改写上面的代码。
【代码示例:96-3】
def division():
'''功能:分苹果'''
print("\n===================== 分苹果了 =====================\n")
apple = int(input("请输入苹果的个数:")) # 输入苹果的个数
children = int(input("请输入来了几个小朋友:"))
result = apple//children # 计算每人分几个苹果
remain =apple-result*children # 计算余下几个苹果
print("%d个苹果,平均分给%d个小朋友,每人分%d个。" % (apple, children, result))
if __name__ == '__main__':
try: # 捕获异常
division() # 调用分苹果的函数
except (ZeroDivisionError,ValueError)as e:
print("输入错误:",e) # 输出错误原因
【代码解析】
except (ZeroDivisionError,ValueError)as e:
print("输入错误:",e) # 输出错误原因
except
是关键字。
在except
语句后面使用一对英文圆括号()
将可能出现的异常名称括起来,多个异常名称之间用英文逗号,
分隔。
ZeroDivisionError
异常名称。
ValueError
异常名称。
as
是关键字,不能更改。
e
是别名,它记录了异常的具体内容,这里的e
你可以根据你自己的喜好来命名。
:
注意最后要加英文冒号哦。
print(e)
输出程序记录的异常内容,根据该内容我们可以排查是什么地方发生了异常。