Python输入校验要求仅接受整数和浮点数,为何会错误放行字母输入?
错误原因分析
- 第一个核心错误:
if判断中bonus_pay.isdecimal缺少调用括号,你写的是方法对象本身,没有实际执行校验逻辑。Python中函数/方法对象本身的布尔值恒为True,所以bonus_pay.isdecimal == False永远返回False,整个and连接的if条件就会变为False,自然不会触发后续的校验循环,这就是你输入字母也不会触发校验的直接原因。 - 第二个逻辑错误:校验逻辑运算符使用错误。
while循环里你用了or连接条件,哪怕你修正了括号问题,合法的小数字符串(比如'2.5')调用isnumeric()和isdecimal()都会返回False,or条件会始终成立,导致合法小数也无法通过校验。 - 第三个认知错误:
str.isnumeric()和str.isdecimal()本身就不支持识别带小数点的数值字符串,天生就不能用于校验小数格式的输入。 - 额外冗余问题:没必要先写
if判断再写while循环,直接用while循环做前置校验即可,代码更简洁。
修复方案
推荐用try-except做类型转换校验,这是Python中校验数值输入最稳妥的方案,不管整数还是小数都能覆盖,修复后的绩效奖金校验代码如下:
while True: bonus_pay = input("Please enter the bonus pay for each car made (in £'s): ") try: # 尝试转float,成功就说明是合法数字,跳出循环 float(bonus_pay) break except ValueError: print("Invalid input")
如果你要统一所有输入的校验逻辑,也可以把数值输入校验封装成公共函数,避免重复代码,比如:
def input_number(prompt, max_limit=None, require_int=False): while True: val = input(prompt) try: num = float(val) if max_limit is not None and num > max_limit: print(f"Input cannot exceed {max_limit}") continue if require_int and not num.is_integer(): print("Input must be integer") continue return val except ValueError: print("Invalid input") # 调用示例 hourly_pay = input_number("Please enter the rate of pay for 1 hour: ", require_int=True) bonus_pay = input_number("Please enter the bonus pay for each car made (in £'s): ") hours_worked = input_number("Please enter the number of hours worked: ", max_limit=15, require_int=True) cars_made = input_number(f"Please enter the number of cars made in {hours_worked} hours: ", require_int=True)
这样所有输入的校验逻辑都统一,也不会出现之前的逻辑错误。
内容的提问来源于stack exchange,提问作者AhmedR
相关产品推荐
相关产品推荐

