Python에서 반복자와 생성기는 데이터 시퀀스 작업을 위한 강력한 도구입니다. 전체 시퀀스를 메모리에 저장하지 않고도 데이터를 반복할 수 있습니다. 이 블로그에서는 실용적인 예를 통해 반복자와 생성기를 간단하고 이해하기 쉬운 방식으로 설명합니다.
정의: 반복자는 컬렉션의 모든 요소(예: 목록 또는 튜플)를 한 번에 하나씩 탐색할 수 있는 Python의 개체입니다. 이는 __iter__() 및 __next__()라는 두 가지 메서드 구현을 포함하는 반복자 프로토콜을 따릅니다.
반복자의 작동 방식:
__iter__(): 이 메서드는 반복자 객체 자체를 반환합니다.
__next__(): 이 메서드는 컬렉션에서 다음 값을 반환합니다. 더 이상 반환할 항목이 없으면 StopIteration 예외가 발생합니다.
사용자 정의 반복자의 예:
class MyIterator: def __init__(self, data): self.data = data self.index = 0 def __iter__(self): return self def __next__(self): if self.index < len(self.data): result = self.data[self.index] self.index += 1 return result else: raise StopIteration my_iter = MyIterator([1, 2, 3]) for item in my_iter: print(item)
출력:
1 2 3
설명: 이 예에서 MyIterator는 숫자 목록을 반복하는 사용자 정의 반복자 클래스입니다. __next__() 메서드는 목록의 다음 항목을 반환하고 더 이상 반환할 항목이 없으면 StopIteration을 발생시킵니다.
Python은 목록, 튜플, 사전 및 세트와 같은 내장 컬렉션에 대한 기본 반복자를 제공합니다. iter 함수를 사용하여 이러한 컬렉션에서 반복자를 가져온 다음 next를 사용하여 컬렉션을 반복할 수 있습니다.
my_list = [1, 2, 3] my_iter = iter(my_list) print(next(my_iter)) # Output: 1 print(next(my_iter)) # Output: 2 print(next(my_iter)) # Output: 3 # print(next(my_iter)) # This will raise StopIteration
정의: 생성기는 함수와 Yield 키워드를 사용하여 정의되는 Python의 특수한 유형의 반복자입니다. 생성기를 사용하면 값을 한꺼번에 메모리에 저장하지 않고도 일련의 값을 반복할 수 있으므로 목록보다 메모리 효율성이 더 높습니다.
발전기 작동 방식:
예:
def my_generator(): yield 1 yield 2 yield 3 gen = my_generator() for item in gen: print(item)
출력:
1 2 3
설명: 이 예에서 my_generator는 세 개의 값을 하나씩 생성하는 생성기 함수입니다. 각 항복 호출은 값을 생성하고 다음 값이 요청될 때까지 함수를 일시 중지합니다.
메모리 효율성: 생성기는 즉시 값을 생성하고 전체 시퀀스를 메모리에 저장하지 않으므로 대규모 데이터 세트 또는 데이터 스트림 작업에 이상적입니다.
예:
def large_sequence(): for i in range(1, 1000001): yield i gen = large_sequence() print(next(gen)) # Output: 1 print(next(gen)) # Output: 2
설명: 이 생성기는 메모리에 모두 저장하지 않고 백만 개의 숫자 시퀀스를 생성하여 메모리 효율성을 보여줍니다.
반복자:
사용자 정의 반복 가능 객체: 반복 논리에 대한 추가 제어가 필요한 경우
무한 시퀀스: 센서의 데이터와 같이 끝없이 이어지는 값 시퀀스를 생성합니다.
발전기:
지연 평가: 대규모 데이터 세트를 한 번에 한 항목씩 처리합니다.
파이프라인: 스트리밍 방식으로 데이터를 처리하는 데이터 처리 파이프라인을 구축합니다.
정의: 생성기 표현식은 생성기를 생성하는 간결한 방법을 제공합니다. 목록 이해와 유사하지만 대괄호 대신 괄호를 사용합니다.
예:
gen_exp = (x * x for x in range(5)) for value in gen_exp: print(value)
출력:
0 1 4 9 16
설명: 이 생성기 표현식은 0에서 4까지의 숫자를 제곱하는 생성기를 생성합니다.
예 1: 대용량 파일 읽기
def read_large_file(file_path): with open(file_path, 'r') as file: for line in file: yield line for line in read_large_file('large_file.txt'): print(line.strip())
설명: 이 생성기 함수는 큰 파일을 한 줄씩 읽어 한 번에 한 줄씩 생성합니다. 전체 파일을 메모리에 로드하지 않기 때문에 메모리 효율적입니다.
예 2: 피보나치 수열
def fibonacci(): a, b = 0, 1 while True: yield a a, b = b, a + b fib = fibonacci() for _ in range(10): print(next(fib))
출력:
0 1 1 2 3 5 8 13 21 34
설명: 이 생성기 함수는 무한한 피보나치 수열을 생성합니다. 생성기를 사용하여 잠재적으로 무한한 값 시퀀스를 생성하는 방법을 보여줍니다.
* An iterator is an object that allows you to traverse through all the elements of a collection one at a time, implementing the `__iter__()` and `__next__()` methods.
* A generator is a special type of iterator defined using a function and the `yield` keyword, allowing you to generate values on the fly without storing them all in memory.
* Generators are memory-efficient, as they generate values on the fly. They are useful for processing large datasets, building data pipelines, and working with potentially infinite sequences.
* Generator expressions use parentheses and produce values one at a time, whereas list comprehensions use square brackets and generate the entire list in memory.
위 내용은 Python에서 반복자와 생성기를 사용하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!