不等于大小写字母的比较

Not equals comparison on cased letters

我有这个:

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 ==”,它就可以运行。谁能解释一下这个问题?

你总是评估的表达式returnsTrue

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
while  salir != "s" or salir != "S":

如果 salir 是 "s" 它与 "S" 不同,如果它是 "S",它不同于"s"。 所以,你的条件总是正确的。

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

while salir != "a" 或者 salir != "b":

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

您可以只更改变量的大小写来进行一次比较,例如:

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

您还可以执行以下操作:

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

如果你喜欢正则表达式,我绝对喜欢 "re" 模块。

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 将需要一个字符串来完全匹配您的表达式;这些将 return 重新对象。 re.findall 会 return 一个结果列表,所以也可以 "while re.findall(...) == 0:"。

更多信息请参考"re"文档: https://docs.python.org/2/library/re.html