我在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子句?当我移除所有第二根弦时,它完全正常,摇滚触发了第二个条件,剪刀触发了第三个,依此类推。我希望这不会太混乱。谢谢。
答案 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"
,(用户==“纸”的结果)或“纸”
所以这里有两种可能性:
在第一种情况下,它返回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
总是会发生。