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산출:
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 StopIteration2. 생성기란 무엇입니까?
정의: 생성기는 함수와 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.
부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.
Copyright© 2022 湘ICP备2022001581号-3