Python 如果,elif,else链工作不正常?
我正在努力学习“艰苦学习Python”,我遇到了一个障碍。这本书给出了一个单元测试,并要求您编写一个函数来满足测试。但是当我将这个函数导入交互式shell进行测试时,任何输入都会返回“direction”,我不知道为什么 这是我的密码: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
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'):