Python if/else语句中的布尔表达式未按预期求值是什么原因?
原代码逻辑错误原因
核心问题:逻辑否定规则使用错误,违反德摩根定律
原代码的if判断条件为if e != 1 and f != 3:,该条件成立的唯一触发场景是:e不等于1 同时 f也不等于3,只有这种情况下才会输出“you got it wrong!”,其余所有场景都会走else分支输出correct。
这就会出现你遇到的问题:
- 当e输入正确(等于1),哪怕f输入错误:
e !=1为假,and连接的整个条件就为假,走else输出correct - 当f输入正确(等于3),哪怕e输入错误:
f !=3为假,and连接的整个条件就为假,走else输出correct - 只有两个输入都错误的时候,才会触发错误提示,完全不符合需求预期。
逻辑修正的原理
你需要的业务逻辑是「两个输入都正确才判定为正确,只要有一个错误就判定为错误」,对应的两种写法都是正确的:
- 正向判断(也就是你修改后的写法):直接判断两个值同时正确
if e == 1 and f == 3: print('correct') else: print("you got it wrong!")
- 反向判断:如果要从错误场景触发的角度写,按照德摩根定律,
not (A and B)等价于not A or not B,因此应该用or而不是and:
# 等价写法 if e != 1 or f != 3: print('you got it wrong!') else: print("correct")
额外优化建议
不要使用eval()处理用户输入,存在极高的安全风险,用户可以输入任意可执行代码执行恶意操作,建议改为类型转换实现同样的效果:
e = int(input('enter 1 ')) f = int(input('enter 3 '))
内容的提问来源于stack exchange,提问作者boxerbobby
相关产品推荐
相关产品推荐

