2011-09-18 52 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'):