python if子句中的奇怪行为

时间:2013-06-24 20:27:44

标签: python if-statement clause

我在python中写了一个简单的小石头,纸,剪刀游戏,并且在if子句中遇到了一些困难,这里是相关的代码:

def play():
    user = str(input("rock, paper or scissors? Choose one: "))
    print("You chose", user)

    if user == "paper" or "Paper":
        paper()

    elif user == "rock" or "Rock":
        rock()

    elif user == "scissors" or "Scissors":
        scissors()

    else:
        print("Sorry, your choice was not valid, try again please.")
        play()

现在,无论我选择摇滚,纸张还是剪刀,都会触发第一个条件,引导我进入纸张功能。我实际上已经解决了它,这是我放入if条款的第二个条件,“纸”,“摇滚”和“剪刀”,我把它放在第一个字母大写的情况下。我的问题是,为什么第二个条件会触发第一个if子句?当我移除所有第二根弦时,它完全正常,摇滚触发了第二个条件,剪刀触发了第三个,依此类推。我希望这不会太混乱。谢谢。

6 个答案:

答案 0 :(得分:4)

user == "paper" or "Paper"

总是如此。 or运算符测试自身两侧的表达式,如果两者都为真,则or的结果也为真。上面的测试检查(最多)两件事:

  • 表达式user == "paper"是真的吗?如果是这样,整个表达式都是正确的,所以不要检查第二部分,因为无论True or x的值如何,x始终为真。
  • 表达式"Paper"是真的吗?并且因为非零长度的字符串在Python中是正确的,所以这部分总是正确的。

所以即使第一部分是假的,第二部分总是正确的,所以整个表达式总是如此。

你想要这样的东西:

user == "paper" or user == "Paper"

或者,更好的是:

user in ("paper", "Paper")

或者,最重要的是:

user.lower() == "paper"

答案 1 :(得分:2)

您也可以使用列表和in

执行此操作
if user in ["paper", "Paper"]:
    paper()

或使用正则表达式:

import re
user = 'paper'
if re.match('papers?', user):
    paper()
elif re.match('[Rr]ock', user):
    rock()

使用正则表达式,您也可以进行不区分大小写的匹配:

import re
user = 'paper'
if re.match('papers?', user, re.I):
    paper()

将匹配所有:纸张,PapER,PaperS,......

答案 2 :(得分:1)

你想要:

if user == "paper" or user == "Paper":

其他人也一样。

如果你只是把

if "Paper":

Python将其评估为if this_value_is_true。与您基本上评估的代码相同,“如果用户变量等于'纸'或真”,这将永远是星期二。

答案 3 :(得分:1)

if user == "paper" or "Paper":

实际评估为:

(user == "paper")  or "Paper"

,(用户==“纸”的结果)或“纸”

所以这里有两种可能性:

  1. 真或“纸”
  2. 假或“纸”
  3. 在第一种情况下,它返回True,在第二种情况下,它返回"Paper"

    由于“Paper”为True值(所有非空字符串均为True),因此此条件始终为True

    您应该使用:

    if user.lower() == "paper"
    

答案 4 :(得分:1)

我相信我知道你的问题来自哪里:

if user == "paper" or user == "Paper":

那应该解决问题

答案 5 :(得分:1)

此:

if user == "paper" or "Paper":

...被解析为:

if (user == "paper") or "Paper":

如果user实际上等于"paper",那就是if True or "Paper",即True

否则,if False or "Paper""Paper"

由于True"Paper"都是真实的,if总是会发生。