比较!=不像我期望的那样工作

时间:2015-03-12 20:36:52

标签: python comparison controls operator-keyword flow

我有这个:

salir = ""
while  salir != "s" or salir != "S":
       print("no has salido")
       salir = input("Digit s to exit or enter to continue)
print("saliste")

但操作员!=不起作用,但如果我把它放在:

salir = ""
while  not (salir == "s" or salir == "S"):
       print("no has salido")
       salir = input("Digit s to exit or enter to continue")
print("saliste")

代码工作正常,问题是比较运算符!=因为如果我通过“not ==”更改它就可以了。任何人都可以解释这个问题吗?

4 个答案:

答案 0 :(得分:2)

while  salir != "s" or salir != "S":

如果salir “s”则与“S”不同,如果“S”,则与不同的“即可。 所以,你的情况总是如此。

如果我们更改字母使其更容易理解。

而salir!=“a”或salir!=“b”:

虽然您的变量不同于a或不同于b,但它总是与两个选项中的一个不同,因此条件始终为真。

只需更改变量的大小写即可进行单一比较,例如:

while salir.lower() != "s":

答案 1 :(得分:0)

您正在评估的表达式始终返回True

salir != "s" or salir != "S" == True  # always

如果用户输入's',则salir != "S"

如果用户输入“S”,则salir != "s"

如果要分割这两种情况(而不是调用lower()方法),可以使用循环

while  salir != "s" and salir != "S":
    # Do stuff

根据德莫根定律,这相当于

while  not (salir == "s" or salir == "S"):
    # Do stuff

答案 2 :(得分:0)

您还可以执行以下操作:

salir = ""
while True:
  print("no has salido")
  salir = input("Digit s to exit or enter to continue")
  if salir.lower() == "s": break
print("saliste")

答案 3 :(得分:0)

如果你喜欢正则表达式,我绝对喜欢“重新”模块。

import re

def main():
    counter = 0
    taco = "q"

    while re.search(re.compile(r"s",re.IGNORECASE),taco) == None:
        print("no")
        if counter == 5:
            print("taco = s")
            taco = "S"
        else:
            pass
        counter += 1

if __name__ == '__main__':
    main()

给出了输出:

no
no
no
no
no
no
taco = s

虽然这将使用更多的CPU周期,但它确实允许在自定义设计的正则表达式中具有多个案例或选项时具有更大的灵活性。我通常在我的大部分代码中使用表达式,所以我不觉得浪费一些额外的CPU周期。

re.search将搜索字符串,寻找参数where-as re.match将需要一个字符串来完全匹配你的表达式;这些会返回一个反对象。 re.findall会返回一个结果列表,这样就可以“同时re.findall(...)== 0:”。

有关更多信息,请参阅“re”文档: https://docs.python.org/2/library/re.html