0

我在 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 子句中放入的第二个条件,即“Paper”、“Rock”和“Scissors”,我把它放在那里是为了让人们把第一个字母大写。我的问题是,为什么第二个条件会触发第一个 if 子句?当我移除所有第二根弦时,它工作得非常好,岩石触发了第二个条件,剪刀触发了第三个条件,依此类推。我希望这不会太混乱。谢谢。

4

6 回答 6

5
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"
于 2013-06-24T20:33:42.287 回答
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,Paper,PaperS,...

于 2013-06-24T20:30:09.090 回答
1

你要:

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

其他人也一样。

如果你只是把

if "Paper":

Python 将其评估为if this_value_is_true. 与您基本上评估为“如果用户变量等于'paper'或True”的代码相同,这将始终是tue。

于 2013-06-24T20:29:01.333 回答
1
if user == "paper" or "Paper":

实际上评估为:

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

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

所以这里有两种可能性:

  1. 真或“纸”
  2. 虚假或“纸”

在第一种情况下它返回True,在第二种情况下它返回"Paper"

由于 "Paper" 是一个 True 值(所有非空字符串都是True),所以这个条件总是True

你应该使用:

if user.lower() == "paper"
于 2013-06-24T20:29:47.677 回答
1

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

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

那应该可以解决问题

于 2013-06-24T20:31:15.027 回答
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总是会发生。

于 2013-06-24T20:35:09.397 回答