2013-03-15 44 views
1

我有點困惑,我希望立即解決這種問題,因爲它是如此的好。出於某種原因,這個代碼...你能像python一樣返回python表達式的值嗎?或不是

def process(self, command): 
    return (command == "Quit" or "quit" or "Q" or "q") 

...產生在我的計劃,這是否相同的輸出...

def process(self, command): 
    return True 

什麼?但是,此代碼執行如我所料:

def process(self, command): 
    return (command == "Quit") 

有人可以幫忙嗎?

+2

你期待什麼?你也不能在C++中做到這一點。你需要'command ==「Q」或者命令==「q」......' – 2013-03-15 00:36:03

+2

是'('Quit','quit','Q','q')'你正在做什麼? – isedev 2013-03-15 00:38:59

+1

問題名稱與描述有什麼關係?很明顯,你正在返回'return(command ==「Quit」)'中的表達式的值,所以...你真的對此感到困惑嗎? – abarnert 2013-03-15 00:42:01

回答

7

讓我們挑這個除了有點:

>>> command = 'foo' 
>>> command == "Quit" or "quit" or "Q" or "q" 
'quit' 

這是因爲or運營商是如何工作的。它會查找第一個類似True的值並將其返回。如果沒有找到,則返回False

這裏你的命令被解析爲:

((((command == "Quit") or "quit") or "Q") or "q") 

因此,解析由左到右,如果command不等於"Quit",您有:

(((False or "quit") or "Q") or "q") 

但在這裏,"quit"是非空字符串,所以python認爲它是「真實的」,所以它被返回。


現在我們知道爲什麼不工作,讓我們看看如何解決它:

的規範辦法做這樣的事情是使用in操作一些物體上支持它:

def process(self, command): 
    return command in ("Quit","quit","Q","q") 

Tuple的很好(他們會比列表執行更好)。但是,如果您要反覆使用它,則set將執行得最快,只要您可以避免一遍又一遍地構建它。

+0

非常感謝。 – 2013-03-15 00:39:26

1
def process(self, command): 
    return command in ("Quit" , "quit" , "Q" , "q")