为什么Python整数输入校验逻辑无法正确执行?
代码问题核心原因
- 逻辑运算符优先级错误
not优先级高于or,你写的判断条件实际等价于(not Sens == 0) or (Sens == 1) or (Sens == 2) or (Sens == 3) or (Sens == 4) or (Sens == 5)。只要Sens不等于0,整个判断结果就为真,直接触发Invalid提示,仅当Sens等于0时not Sens ==0为假,后续所有等于1-5的判断也为假,整个条件为假,才不会触发错误提示,和你遇到的现象完全吻合。 - 输入类型不匹配
Python的input()函数默认返回字符串类型,直接和整数0-5做相等判断,结果永远为假,哪怕你输入的内容是"1",和int类型的1比较也会返回不相等。
最简修复方案
使用成员运算符替代冗长的or判断,同时统一判断类型,完全规避逻辑优先级和类型不匹配问题:
Sens = input("""Sensitivity (MIN SENS 0, 1, 2, 3, 4, 5 MAX SENS): """) # 直接和字符串类型的允许值做判断,无需转类型 if Sens not in {'0', '1', '2', '3', '4', '5'}: print("Invalid: [{}]".format(Sens)) print("Defaulting to 1") Sens = '1' # 后续需要用数值的话再转int即可:sens_val = int(Sens)
更健壮的兼容方案
如果允许用户输入前后带空格、或者需要直接使用数值类型,可以增加异常捕获处理非数字输入的场景:
Sens = input("""Sensitivity (MIN SENS 0, 1, 2, 3, 4, 5 MAX SENS): """).strip() try: sens_val = int(Sens) if not 0 <= sens_val <=5: raise ValueError except ValueError: print(f"Invalid: [{Sens}]") print("Defaulting to 1") sens_val = 1
内容的提问来源于stack exchange,提问作者Arjuna
相关产品推荐
相关产品推荐

