Python 如果,elif,else链工作不正常?

Python 如果,elif,else链工作不正常?,python,Python,我正在努力学习“艰苦学习Python”,我遇到了一个障碍。这本书给出了一个单元测试,并要求您编写一个函数来满足测试。但是当我将这个函数导入交互式shell进行测试时,任何输入都会返回“direction”,我不知道为什么 这是我的密码: def pos(item): """ Get part of speech for item. """ pos = '' if item == 'north' or 'south' or 'east': return 'd

我正在努力学习“艰苦学习Python”,我遇到了一个障碍。这本书给出了一个单元测试,并要求您编写一个函数来满足测试。但是当我将这个函数导入交互式shell进行测试时,任何输入都会返回“direction”,我不知道为什么

这是我的密码:

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'

你应该这样写:

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”
很可能为false(除非您碰巧输入了
“north”
)。然而,
'south'
'east'
,当在布尔上下文(即条件)中进行计算时,总是
,因此您最终得到
(item='north')或真或真
,这当然是
您使用的
错误。应该是

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
。(虽然,前者也不起作用,因为由于Python短路的方式,
“北”或“南”或“东”
将被计算为
“东”
。但这更复杂,您不必担心。)


顺便说一句,你可能更喜欢下面这个成语,尽管你的也一样好

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'
确定或之间所有事物的真值。非空字符串具有真实的truthvalue,因此给定输入
'west'
,该值将计算为:

if False or True or True:
相反,你想要

if item == 'north' or item == 'south' or item == 'east':
,或更像蟒蛇:

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

bool('south')
的计算结果为
True
Hmm,我想知道您为什么在第一行将
pos
设置为空字符串。你不能在其他任何地方使用它。啊,是的,那个空字符串是旧代码片段的遗留物。
if item == 'north' or item == 'south' or item == 'east':
if item in ('north', 'south', 'east'):