2012-09-16 100 views
0

不知道爲什麼我的代碼默認爲這個elif。但是它從來沒有進入else語句。甚至可以將索引從最後elif中的邊界錯誤中移除。Python elif無條件聲明

請忽略我不使用正則表達式。這個家庭作業是不允許的。問題是else語句之前的最後一個elif。

if item == '': 
    print ("%s\n" % item).rstrip('\n') 

elif item.startswith('MOVE') and not item.startswith('MOVEI'): 
    print 'Found MOVE' 

elif item.startswith('MOVEI'): 
    print 'Found MOVEI' 

elif item.startswith('BGT'): 
    print 'Found BGT' 

# ... 

elif item.find(':') and item[(item.find(':') -1)].isalpha(): 
    print 'Mya have found a label' 

else: 
    # Never get to this branch 
    print 'Not sure what I found' 
+6

發佈Python代碼時要小心你的縮進。 –

+0

好點。我對此表示歉意。 – Miscue

+1

您可以通過單擊問題下方的「編輯」鏈接來修復它。 –

回答

4

item.find(':')將返回-1當 「:」 不item找到。

-1評價爲True -ish,所以這可能是您的問題的根源。僅當「:」位於item的開頭時,if item.find(':')纔會被匹配。

爲了解決這個問題,只需更換這行:

elif item.find(':') and item[(item.find(':') -1)].isalpha(): 

這一行:

elif ':' in item and item[item.find(':') - 1].isalpha(): 

有效地將檢查,如果字符前面的 「:」 是字母數字。

+0

嗯好的。那麼,我將如何調整該語句以在字符串中查找':'並檢查該字符之前的字符是否爲alpha? – Miscue

+0

@BradCarvalho:查看最新的答案。你只需要改變'find'部分來與'-1'進行比較。如果find()的結果等於'-1',表示該字符串未找到。否則,它會讓你的位置。請記住,如果find()返回0,那麼':'位於字符串的開頭,因此,您將檢查最後一個字符(位於'-1'位置,從最後)是阿爾法。 – Tadeck

+0

啊,簡單修復。再次感謝! – Miscue

3
  • if情況真的很奇怪:

    print ("%s\n" % item).rstrip('\n') 
    

    如果item == '',將等於item,這是''。我敢肯定你可以擺脫那些代碼。

  • 對您的if語句重新排序可以消除MOVEI/MOVE問題。
  • 添加到Tadeck's answer,您需要使用item.find(':') > 0作爲您的條件。如果您的字符串以:,string[0 - 1] == string[-1]開頭,即您的字符串的最後字符。

下面的代碼

if item == '': 
    print '' 
elif item.startswith('MOVEI'): 
    print 'Found MOVEI' 
elif item.startswith('MOVE'): 
    print 'Found MOVE' 
elif item.startswith('BGT'): 
    print 'Found BGT' 
elif item.startswith('ADD'): 
    print 'Found ADD' 
elif item.startswith('INC'): 
    print 'Found INC' 
elif item.startswith('SUB'): 
    print 'Found SUB' 
elif item.startswith('DEC'): 
    print 'Found DEC' 
elif item.startswith('MUL'): 
    print 'Found MUL' 
elif item.startswith('DIV'): 
    print 'Found DIV' 
elif item.startswith('BEQ'): 
    print 'Found BEQ' 
elif item.startswith('BLT'): 
    print 'Found BLT' 
elif item.startswith('BR'): 
    print 'Found BR' 
elif item.startswith('END'): 
    print 'Found END' 
elif item.find(':') > 0 and item[(item.find(':') - 1)].isalpha(): 
    print 'Mya have found a label' 
else: 
    print 'Not sure what I found' 

的可能是固定的版本,這是你的代碼的一個稍微更Python版本:

def test_item(item): 
    tests = ['MOVEI', 'MOVE', 'BGT', 'ADD', 'INC', 'SUB', 'DEC', 'MUL', 'DIV', 'BEQ', 'BLT', 'BR', 'END'] 

    for test in tests: 
    if item.startswith(test): 
     return 'Found ' + test 

    if item.find(':') > 0 and item[(item.find(':') - 1)].isalpha(): 
    return 'Mya have found a label' 
    else: 
    return 'Not sure what I found' 
+0

這也有道理。謝謝! – Miscue

+0

+1這是正確的。我們也可以縮短代碼(通過將所有這些「startswith」條件轉換爲一個),如果這是全部的話。但我相信我們沒有看到(其他代碼)包含更多問題,所以我只給出了OP報告的問題的解決方案。無論如何,很好的答案。 – Tadeck

+0

謝謝。我已經編輯了一個可能的選擇。 – Blender