0

不知道为什么我的代码默认使用这个 elif。但它永远不会到达 else 语句。甚至在最后一个 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'
4

2 回答 2

4

item.find(':')当在 中找不到-1“”时将返回。:item

-1被评估为True-ish,因此这可能是您问题的根源。仅当 " " 以 . 开头时if item.find(':')才会匹配。:item

要解决此问题,只需替换此行:

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

用这条线:

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

如果“”前面的字符:是字母数字,这将有效地检查。

于 2012-09-16T03:12:34.347 回答
3
  • 你的if情况很奇怪:

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

    如果item == '',(item + '\n').rstrip('\n')将等于item, 即''. 我很确定您可以摆脱该代码。

  • 重新排序您的if语句可以消除MOVEI/MOVE问题。
  • 添加到Tadeck 的答案,您需要使用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'

这是您的代码的稍微 Pythonic 版本:

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'
于 2012-09-16T03:21:00.877 回答