2011-12-04 17 views
0
commands = ['chat', 'call', 'exit', 'friends', 'status'] 

class MainHub(object): 
    def menu(self): 
     while True: 
      selection = raw_input("> ") 
      if selection != any(commands): 
       print "Not a recognized command!\n" 
      else: 
       print selection 

它打印Get命令「沒有一個公認的命令!」每次,即使選擇是「聊天」或「呼叫」。這是一個非常簡單的代碼片段,但我似乎無法看到它有什麼問題!從輸入

回答

4

你不想any功能,你想要的not in語法:

if selection not in commands: 

any是謂詞演算,並檢查它的任何輸入是True。在這種情況下,你要比較你的輸入any(commands),這是True因爲在commands一個True元素。

+0

嘖嘖嘖嘖。我愚蠢。 – TomKo

+0

有關更多信息,請查看[Python參考](http://docs.python.org/library/)。你也可以找到['any'](http://docs.python.org/library/functions.html#any)。爲了更輕鬆地查找參考資料中的內容,只需對其進行搜索,或執行Google搜索(更容易進行Google搜索)。例如,搜索「Python any」。 –

+0

我沒有提及任何()的文檔,但完全誤解了它。哦,我想我今天學到了一些東西。 – TomKo

0

改變這一行:

if selection != any(commands): 

對於該其它行:

if selection not in commands: 
1

any()返回True如果在迭代的計算結果爲True參數中的元素中的至少一個,並且False否則。所以,你的代碼在這裏:

if selection != any(commands): 

眼見爲commands非空(因此,「真」)的字符串列表,任何只返回True。代碼保留爲:

if selection != True: 

這是沒有意義的:D。你想知道的是,如果selection存在於命令的列表,你可以做到這一點的方法:

if selection not in commands: 

乾杯!

3

選擇!=任何(命令)

這似乎是一個很常見的類初學者的錯誤,雖然我最近纔開始注意到它。另一個常見的嘗試是使用像value == (3 or 4 or 5)這樣的東西,這是基本上同樣的錯誤。

在編程中,比較比較,並設置成員資格測試設置成員測試。他們不會困惑,他們可以用英語表達自己的方式。程序設計要求我們對於我們的意思是精確的,並且不要讓我們被我們的真正含義的隨意措辭誤導。

你寫的意思是「如果selection不等於(commands是否爲真的真值)」。該函數調用返回要麼TrueFalse(事實上,它返回True,因爲commands的至少一個是一個非空字符串 - 事實上,他們都是 - 與非空字符串爲「真十歲上下的」,而空字符串是「false-ish」),並將selection與該值進行比較。它永遠不會是平等的,因爲selection是一個字符串和字符串甚至不是同一種東西TrueFalse,這是布爾,更不用說相等。

你的意思是「如果selection不是commands之一」,即「如果它不是selection包含內commands的情況」。這是一個集合成員問題,而不是比較問題。

在Python中,我們使用in關鍵字完成了設置成員資格測試。語法允許我們寫出完美自然的聲音if selection not in commands:,所以我們不需要與if not (selection in commands):妥協。