반복자는 두 가지 메소드를 구현하는 객체입니다.
기본 반복자 만들기:
class Counter: def __init__(self, start, end): self.current = start self.end = end def __iter__(self): return self # Returns itself as an iterator def __next__(self): if self.current >= self.end: raise StopIteration self.current += 1 return self.current - 1 counter = Counter(1, 4) for number in counter: print(number) # Outputs: 1, 2, 3
이 클래스는 next() 호출을 수동으로 제어하여 끝에 도달하면 중지됩니다. 반복자는 각 요소가 주문형으로 처리되는 시퀀스 작업에 유용합니다.
생성기는 반복자를 만드는 더 간단한 방법입니다. Yield 키워드를 사용하는 함수로 정의되며, Yield에서 함수 실행을 일시 중지하고 next()가 호출되면 다시 시작합니다. 각 항복 문은 함수의 상태를 저장합니다. 즉, 중단된 위치부터 다시 시작할 수 있습니다.
기본 생성기 예:
def countdown(num): while num > 0: yield num num -= 1 for n in countdown(3): print(n) # Outputs: 3, 2, 1
yield가 호출되면 함수는 현재 값을 반환하고 일시 중지된 후 next()가 재개될 때까지 기다립니다.
생성기는 즉시 값을 계산하는데, 이를 지연 평가라고 합니다. 모든 항목을 메모리에 저장하는 목록과 달리 생성기는 필요한 경우에만 항목을 생성하므로 다음과 같은 경우에 이상적입니다.
예: 생성기를 사용하여 대용량 파일 읽기:
def read_large_file(file_path): with open(file_path) as file: for line in file: yield line # Only processes one line at a time
이 접근 방식은 전체 파일을 메모리에 로드하는 것을 방지하므로 대용량 파일에 특히 유용합니다.
생성기 표현식은 목록 이해와 같은 대괄호 대신 괄호를 사용하여 생성기를 생성하는 간결한 방법입니다.
예:
squares = (x * x for x in range(5)) print(next(squares)) # Outputs: 0 print(list(squares)) # Outputs remaining: [1, 4, 9, 16]
여기서 Squares는 요청이 있을 때만 값을 계산하므로 메모리 효율성이 높습니다.
yield from 문은 발전기 작업의 일부를 다른 발전기에 위임하는 데 유용합니다. 이는 모듈화를 위해 발전기를 하위 발전기로 분리하려는 경우에 유용합니다.
예:
def generator_a(): yield 1 yield 2 def generator_b(): yield from generator_a() yield 3 for val in generator_b(): print(val) # Outputs: 1, 2, 3
특히 복잡하거나 중첩된 생성기 체인에서 코드를 간소화하여 결과를 얻을 수 있습니다.
발전기는 다음과 같은 경우에 특히 유용합니다.
반면에 목록은 다음과 같은 경우에 더 좋습니다.
Python은 반복자와 생성기를 사용하여 메모리 효율성과 유연성을 바탕으로 데이터 처리를 제어할 수 있습니다. 대규모 데이터 세트를 처리하고, 데이터를 스트리밍하고, 사용자 정의 반복 가능한 객체를 구축하는 데 필수적입니다.
이것을 익히면 Python 전문가처럼 데이터를 처리하게 될 것입니다! ?
위 내용은 Python 반복자에 대한 깊은 이해: `__iter__` 및 `__next__`를 사용하여 데이터 탐색의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!