[英]if, elif, else chain not working correctly?
我正在努力學習“以艱難的方式學習Python”,我遇到了障礙。 本書給出了單元測試,並要求您編寫一個函數來滿足測試要求。 但是,當我將此函數導入交互式shell以測試它時,任何輸入都返回'方向',我無法弄清楚原因。
這是我的代碼:
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') or 'south' or 'east'
這里有三個子表達式。 item == 'north'
可能是假的(除非您碰巧輸入'north'
)。 但是,當在布爾上下文(即條件)中求值時, 'south'
或'east'
始終為True
,因此最終得到(item == 'north') or True or True
,這當然是True
。
你使用的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'
if item == 'north' or 'south' or 'east':
確定或之間的所有事物的真值。 非空字符串具有True truevalue,因此在輸入'west'
,此值評估為:
if False or True or True:
相反,你想要
if item == 'north' or item == 'south' or item == 'east':
或更多pythonic:
if item in ('north', 'south', 'east'):
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.