簡體   English   中英

if,elif,else鏈不能正常工作?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM