> 백엔드 개발 > 파이썬 튜토리얼 > 반복자를 여러 번 반복할 수 없는 이유는 무엇입니까?

반복자를 여러 번 반복할 수 없는 이유는 무엇입니까?

Barbara Streisand
풀어 주다: 2024-12-20 16:31:10
원래의
732명이 탐색했습니다.

Why Can't I Iterate Over an Iterator Multiple Times?

반복자를 여러 번 반복할 수 없는 이유는 무엇입니까? 포괄적인 탐색 및 솔루션

다음 코드를 고려하세요.

def test(data):
    for row in data:
        print("first loop")
    for row in data:
        print("second loop")
로그인 후 복사

데이터가 목록 반복자 또는 생성자 표현식과 같은 반복자일 때 두 번 반복하면 예상치 못한 결과가 발생합니다. :

>>> test(iter([1, 2]))
first loop
first loop
>>> test((_ for _ in [1, 2]))
first loop
first loop
로그인 후 복사

이 예제는 "첫 번째 루프"를 여러 번 인쇄하지만 "두 번째 루프"는 결코 인쇄하지 않습니다. 인쇄되었습니다. 이 동작은 다음과 같은 질문을 제기합니다. 처음에는 반복이 작동하지만 두 번째에서는 작동하지 않는 이유는 무엇입니까? 그리고 이 제한 사항을 어떻게 해결할 수 있습니까?

반복자와 소비 이해

반복자는 한 번에 하나의 값을 생성하는 객체입니다. 반복 시 반복자는 소비됩니다. 즉, 한 번 순회하면 다시 반복할 수 없습니다. 생성기, 파일 객체 및 기타 여러 반복 가능한 객체의 경우에도 마찬가지입니다.

이러한 소비 동작은 다음 코드 조각에 예시되어 있습니다.

data = [1, 2, 3]
it = iter(data)

next(it)
# => 1
next(it)
# => 2
next(it)
# => 3
next(it)
# => StopIteration
로그인 후 복사

반복자가 소비되면 더 이상 생성할 요소가 없을 때 StopIteration 예외가 발생합니다. for 루프의 컨텍스트에서 이 예외로 인해 루프가 처음 종료됩니다.

해결 방법 및 대체 접근 방식

동일한 데이터를 반복해야 하는 경우 여러 번 사용할 수 있는 해결 방법은 다음과 같습니다.

1. 목록 만들기:

반복자의 요소를 목록에 저장할 수 있으며, 그런 다음 원하는 만큼 반복할 수 있습니다.

data = list(it)
로그인 후 복사

2 . 독립 반복자에는 tee()를 사용하세요.

반복자가 많은 수의 요소를 처리하는 경우 목록을 만드는 것이 비효율적일 수 있습니다. itertools.tee() 함수를 사용하면 단일 소스에서 여러 개의 독립적인 반복자를 생성할 수 있습니다.

import itertools
it1, it2 = itertools.tee(data, 2) # create as many as needed
로그인 후 복사

이러한 각 반복자는 다른 반복자에 영향을 주지 않고 개별적으로 탐색할 수 있습니다.

3. 시퀀스로 변환:

set와 같은 일부 반복자는 list() 또는 tuple()과 같은 함수를 사용하여 시퀀스로 변환될 수 있습니다. 이 변환은 여러 번 반복할 수 있는 새 개체를 생성합니다.

data = list(sorted(my_set))
로그인 후 복사

반복자의 사용 동작을 이해하고 적절한 해결 방법을 구현하면 원하는 데이터를 확보하면서 반복 가능한 개체의 이점을 얻을 수 있습니다. 여러 번의 반복이 필요합니다.

위 내용은 반복자를 여러 번 반복할 수 없는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿