2013-06-26 3 views
4

여러 줄에서 변수를 가져 오는 줄이 있는데 다음 줄로 이동할 수 있도록 StopIteration 오류가 발생하지 않도록하고 싶습니다. 현재 break 함수를 사용하고 있지만 StopIteration을 피할 수는 있지만 목록의 첫 번째 항목 만 제공하고 그 뒤에 빈 줄을 남깁니다.Python에서 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

왜 self.pointer_list.next()를 호출하고 pointer_list를 전달합니까? – doctorlove

+0

죄송합니다, 오타! 어쨌든 차이는 없습니다! – Johnnerz

+2

여기에 아무 것도 인용 할 필요가 없습니다. 줄 바꿈을 포함하지 않고 인용 부호가 지나치게 길어집니다. 더 나은 방법은 문자열 형식을 사용하는 것입니다. ''http://www.monnetproject.eu/lemon#has_ptr{}\n'.format(synset_offset, pointer_list.next ('))'. –

답변

3

compose_line5에서 pointer_list.next() 대신 item을 사용하십시오. 이미 pointer_list를 반복하고 있습니다.

compose_line6의 경우 두 목록을 동시에 반복하는 것으로 보입니다. Is there a better way to iterate over two lists, getting one element from each list for each iteration? 에서 최고 대답 (나는 두 목록이 같은 길이입니다 있으리라 믿고있어)

예, 반복자 프로토콜 StopIteration을 인상합니다 사용 (하지 오류, 반복의 끝을 신호 만 예외)를 호출합니다. next()를 수동으로 실행하십시오. 그것을 사용하는 pythonic 방법은 일반적인 iterator (예를 들어, 그것을 반복)로 사용하고 그것에 .next()를 호출하지 않는 것입니다. 예를 들어, 필요 '접미사를'때 '' ''을 ''사용하지하는 http://www.python.org/dev/peps/pep-0008/

볼 -

코드는 당신이보고 싶을 수 이상 몇 가지 문제가 있습니다. + =를 사용하는 대신 목록을 작성한 다음 끝에 참여할 수 있습니다. 함수에서 방금 반환하는 경우 왜 자기를 저장하는지 잘 모르겠습니다.

+0

Line5에서 잘 작동하지만 Line6에서'synset_list :'에있는 항목을 사용하여 해당 시간만큼 반복하면 두 개의 목록이 같은 길이 일뿐입니다 편집 : 거기서 편집을 보았습니다. 감사!! – Johnnerz

+0

6의 코드 예제는 pointer_list와 synset_list를 모두 사용합니다. 실제로 synset_list에서 아무것도 사용할 필요가 없다면 pointer_list를 반복하지 않는 것이 어떻습니까? –

+0

내가 그 말을했을 때 미안해. – Johnnerz

관련 문제