假设我们用Python编写模拟银行操作的游戏,需要处理用户存款的输入,然后计算总余额。你可能会遇到一些常见的问题,比如用户输入的不是数字,而是字符或者列表,导致程序报错而终止。
如何避免上述情况的发生,更多优雅地处理用户输入的数据,而不让程序崩溃呢?此时,我们就需要用到while循环和try-except语句来处理报错。
一、示例分析
在下面的代码中,如果我们直接用 input() 来获取用户的输入,再将这个输入加到余额上,可能会遇到一个类型错误。
balance = 100.0
num = input("请输入存款金额:")
balance += num # 这里会报错,因为num是字符串类型
print("当前余额:", balance)
错误信息如下所示。这是因为 input() 函数返回的是字符串,而我们尝试将它与数字(浮点数)相加时,就会造类型不匹配的错误,因为Python语法规则中是 不允许不同类型的数据直接进行相加运算的。
TypeError: unsupported operand type(s) for +=: 'float' and 'str'
二、解决方案
1. 解决方案一:将输入转换为浮点数
我们可以通过 float() 函数将用户的输入从字符串转换为浮点数,这样可以统一数据类型。修改后的代码如下所示:
balance = 100.0
num = float(input("请输入存款金额:")) # 把输入转换为浮点数
balance += num
print("当前余额:", balance)
这样基本上就能解决数据类型的问题,但是如果用户输入了非数字字符(比如字母),程序仍然会报错。
当用户意外输入非数字字符时,例如输入字母 "a",Python 会抛出值错误(ValueError),因为字母无法转换为浮点数。错误信息如下:
ValueError: could not convert string to float: 'a'
因此,这种常用操作并不能完成解决我们遇到的问题,这种情况怎么办呢?这时,我们就需要使用我们的第二种文案了:
2.解决方案二:使用 try-except 处理异常
为了避免上述类型不区配的错误,我们可以使用 try-except 语句来捕获这个异常,并给用户返回一个友好的提示信息。这样可以避免程序崩溃,同时提醒用户重新输入。示例代码如下:
balance = 100.0while True:try:num = float(input("请输入存款金额:"))break # 如果转换成功,跳出循环except ValueError:print("输入无效,请输入一个数字。") # 捕获值错误并提示用户balance += num
print("当前余额:", balance)
上述代码中,我们用try ... except来截获数据类型不匹配的报错,然后用一个while循环,在输入无效数据后再次提示输入金额信息,而不是直接结束程序,这样的设计更加科学。
这样,当用户输入字母时,程序会提示用户“输入无效,请输入一个数字。”并要求重新输入。
用户输入数字时,数字将会被正确转换并加到余额中。
三、学后总结
使用 try-except 语句不仅可以让程序更健壮,还可以提升用户体验,避免因为错误的输入导致程序崩溃。
这个实用技巧可以用在需要获取用户输入并进行处理时,有效减少报错,使我们的程序更加pythonic。