为什么我的if语句说如果两个字符串不在列表中?

时间:2016-07-09 01:50:51

标签: python python-3.x

基本上我正在创建一个计算器,到目前为止程序要求用户进行加法,减法,乘法和/或除法的操作。然后程序继续创建两个列表,一个包含完整的数字,另一个包含运算符。代码的下一部分应该检查包含运算符的列表是否包含if语句形式的乘法或除法,但if语句失败并且它表示列表包含“*”和“/”时没有,这里的代码不起作用。任何帮助?

if ("*") or ("/") in Oper_NAN:
 print("POSITIVE")
else
  print("NEGATIVE")

问题是if语句总是返回正数而且从不返回负数,即使两个运算符不在列表Oper_NAN中(Oper_NAN中的所有项都是字符串btw)。我是否将if语句标记为错误?谢谢你的阅读!

2 个答案:

答案 0 :(得分:6)

假设:

if ("*") or ("/") in Oper_NAN: print("POSITIVE") else print("NEGATIVE")

or的每一面都会单独评估。所以你正在考虑其中任何一个是否属实:

("*")
("/") in Oper_NAN

第一个是非零长度字符串,在布尔上下文中始终被评估为True。因此,if语句始终为True,因为True或其他内容始终为True

解决此问题的最简单方法是:

 if ("*") in Oper_NAN or ("/") in Oper_NAN:

您也可以使用any()和生成器表达式来编写它,尽管这对于两个字符来说可能有点过分:

if any(c in Oper_NAN for c in "*/"):

答案 1 :(得分:2)

这个if语句基本上分解为:

if True or (condition): #code

python中的所有内容都有一个真值,非空字符串将评估为True

懒惰地评估您的if条件。首先评估左侧,仅当左侧是False时才评估右侧。但是,非空字符串始终为True,因此if条件中的代码将始终执行。

布尔逻辑/真值值内容:P or Q,在以下情况下,PQ将评估为TruePTrue,无论Q是真还是假,或PFalseQTrue,其他每种情况均为{ {1}}。

如果对此感兴趣的话,那就更多" mathy"它的一面,使用了所谓的真值表。

False

您可以使用:

| P | Q | P v Q |
-----------------
| T | T |   T   |
-----------------
| T | F |   T   |
-----------------
| F | T |   T   |
-----------------
| F | F |   F   |
-----------------