반복자를 여러 번 반복할 수 없는 이유는 무엇입니까? 포괄적인 탐색 및 솔루션
다음 코드를 고려하세요.
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!