如何避免python中的StopIteration错误

时间:2013-06-26 10:43:26

标签: python iteration stopiteration

我有一行从多个列表中提取变量,我希望它能避免出现StopIteration错误,以便它可以移动到下一行。目前我正在使用break函数,这避免了StopIteration,但只给了我列表中的第一项,如果我要将它打印出来,它会留下一个空白行。

以下是我的两个具有相同问题的迭代。

def compose_line5(self, synset_offset, pointer_list):
        self.line5 = ''''''
        for item in pointer_list:
            self.line5 += '''http://www.example.org/lexicon#'''+synset_offset+''' http://www.monnetproject.eu/lemon#has_ptr '''+pointer_list.next()+'''\n'''            
            break
        return self.line5

    def compose_line6(self, pointer_list, synset_list): 
        self.line6 = ''''''
        for item in synset_list:
            self.line6 += '''http://www.example.org/lexicon#'''+pointer_list.next()+''' http://www.monnetproject.eu/lemon#pos '''+synset_list.next()+'''\n'''                      
            break
        return self.line6

这是我没有休息的错误:

Traceback (most recent call last):
  File "wordnet.py", line 225, in <module>
    wordnet.line_for_loop(my_file)
  File "wordnet.py", line 62, in line_for_loop
    self.compose_line5(self.synset_offset, self.pointer_list)
  File "wordnet.py", line 186, in compose_line5
    self.line5 += '''http://www.example.org/lexicon#'''+self.synset_offset+''' http://www.monnetproject.eu/lemon#has_ptr '''+self.pointer_list.next()+'''\n'''
StopIteration

是否有快速解决方法,或者我必须捕获我使用iter()的每个方法的异常?

1 个答案:

答案 0 :(得分:3)

在compose_line5中,使用item而不是pointer_list.next(),你已经在遍历pointer_list。

对于compose_line6,您似乎希望同时迭代两个列表。使用Is there a better way to iterate over two lists, getting one element from each list for each iteration?的热门答案 (我假设两个列表长度相同)

是的,如果手动调用.next(),迭代器协议将引发StopIteration(不是错误,只是发出迭代结束的异常)。 pythonic使用它的方法是将它用作普通迭代器(例如,循环遍历它)而不是在其上调用.next()。

您的代码有一些问题,除了您可能想要查看的内容之外 - 请查看http://www.python.org/dev/peps/pep-0008/

例如,无需使用&#39;&#39;&#39;&#39;&#39;&#39;什么时候&#39;&#39;就足够了。而不是做+ =,你可能想要创建一个列表然后加入到最后。如果你只是从函数中返回它们,不知道为什么你要把东西存放在自己身上。