2011-09-18 51 views
2

我正在努力通過「瞭解Python艱難之路」,並且遇到了障礙。這本書給出了一個單元測試,並要求你寫一個函數來滿足測試。但是當我將這個函數導入到交互式shell來測試它時,任何輸入都會返回'方向',我不知道爲什麼。if,elif,else鏈不能正常工作?

這裏是我的代碼:

def pos(item): 
    """ Get part of speech for item. """ 
    pos = '' 
    if item == 'north' or 'south' or 'east': 
     return 'direction' 
    elif item == 'go' or 'kill' or 'eat': 
     return 'verb' 
    elif item == 'the' or 'in' or 'of': 
     return 'stop' 
    elif item == 'bear' or 'princess': 
     return 'noun' 
    else: 
     try: 
      int(item) 
      return 'number' 
     except ValueError: 
      return 'error' 
+3

' bool('south')'評估爲'True' –

+0

嗯,我想知道你爲什麼要在第一行設置空字符串「pos」。你別在別的地方使用它。 –

+0

嗯,那個空字符串是舊代碼片段中的剩餘字符。 – colinwd

回答

8

你應該這樣寫:

if item == 'north' or item == 'south' or item == 'east': 

,或者:

if item in ('north', 'south', 'east'): 

這同樣適用於剩餘的分支。

要解釋爲什麼你原來的代碼失敗了,考慮與Python的解析下面的表達式:

item == 'north' or 'south' or 'east' 

什麼Python做如下(注意,這表示解析的順序括號):

(item == 'north') or 'south' or 'east' 

這裏有三個子表達式。 item == 'north'很可能是錯誤的(除非您碰巧輸入了'north')。然而,'south''east',當在布爾上下文(即條件)中評估時,始終爲True,所以最終結果爲(item == 'north') or True or True,當然這是True

+0

太棒了!非常感謝。 – colinwd

4

您正在使用or錯誤。它應該是

if item == 'north' or item == 'south' or item == 'east': 

,或者更地道,

if item in ('north', 'south', 'east') 

這是錯誤的上來的原因是因爲Python的方式把括號中的表達。你可能會認爲它做

if item == ('north' or 'south' or 'east') 

但什麼是實際發生的情況是

if (item == 'north') or ('south') or ('east') 

'south',是一個非空字符串,總是True。 (雖然,前者不會或者由於工作方式,因爲'north' or 'south' or 'east'將進行評估,以'east' Python的短路or。但是,這是更復雜,你不必擔心。)


順便說一下,你可能更喜歡以下成語,儘管你的成語一樣好。

items = {} 
items['north'] = items['south'] = items['east'] = 'direction' 
items['go'] = items['kill'] = items['eat'] = 'verb' 
items['the'] = items['in'] = items['of'] = 'stop' 
items['bear'] = items['princess'] = 'noun' 

try: 
    return items[item] 
except KeyError: 
    pass 

try: 
    int(item) 
except ValueError: 
    pass 
else: 
    return 'number' 

return 'error' 
1
if item == 'north' or 'south' or 'east': 

決定之間或者是一切的真值。非空字符串有真truthvalue,所以給出的輸入'west',這個計算結果爲:

if False or True or True: 

相反,你要

if item == 'north' or item == 'south' or item == 'east': 

,或者,更Python:

if item in ('north', 'south', 'east'):