2013-06-24 46 views
0

我写了一个简单的小石头,剪子,布的游戏在Python和有一些困难的,如果从句,这里的相关代码:怪异的行为,如果条款

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子句?当我把所有的第二根琴弦都取下来的时候,它完全正常工作,摇滚引发了第二种情况,剪刀引起了第三种情况,依此类推。我希望这不是太混乱。谢谢。

+0

这实际上是这里数十个同等问题的重复。不幸的是,搜索它们非常困难。 – abarnert

+0

这个问题在SO上出现过很多次。如果人们的标题更具描述性,其他人就可以从他们的问题和答案中受益。而不是“奇怪的行为......”也许“或”总是在python if语句中返回true“。对于未来的Google搜索来说,这可能更有成效。 – SethMMorton

+0

什么是更有用的标题?我会改变它。对于那个很抱歉。 –

回答

4
user == "paper" or "Paper" 

总是正确的。 or运算符会自行测试表达式的任何一边,如果其中任一个为真,or的结果也是如此。您上面的测试检查(最多)两件事:

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

所以,即使第一部分是假的,第二部分是总是正确的,所以表达式作为一个整体始终是真实的。

你想要的东西是这样的:

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

,或者更好的:

user in ("paper", "Paper") 

或者,最重要的是:

user.lower() == "paper" 
+0

有道理,谢谢。 –

1

你想:

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

相同的其他人。

如果你只是把

if "Paper": 

Python的评估它作为if this_value_is_true。与您基本评估的代码一样“如果用户变量等于”纸“或”真“,这将永远是tue。

+1

'if user.lower()=='paper':' – Matthias

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

其实计算结果为:

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

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

所以这里的2种可能性是:

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

在第一种情况下,它返回True和在第二个返回"Paper"。由于“Paper”为真值(所有非空字符串均为True),所以此条件始终为True

你应该使用:

if user.lower() == "paper" 
+3

我不认为'user =='文件''计算为'user == True'。当'user'是'paper'时'user =='文件''是真的。 –

+0

@ A.E.Drew哦!这是一个错误,固定。 –

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() 

它将匹配所有的:纸,纸,纸,...

1

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

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

这应该解决这个问题

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总是会发生。