쓰읍..PPT 준비하느라 뭘 배운지도 모르는....그냥 그래서 Python 심화 개념 2개만 들고왔수다.
제너레이터 (Generators)
이터레이터의 한 종류로, 데이터를 한 번에 모두 메모리에 로드하지 않고 필요할 때마다 하나씩 생성하여 처리하는 객체입니다. yield 키워드를 사용하여 값을 생성하며, 제너레이터는 호출될 때마다 이전 상태를 유지하면서 다음 값을 생성합니다.
중요한점,
일반적인 함수는 호출될 때 값을 반환하고 함수 실행이 끝납니다.
하지만 yield를 사용하는 제너레이터는 실행을 멈춘 지점에서 상태를 유지하고, 호출될 때마다 다음 값을 "생성"합니다.
def count_up_to(max): count = 1 while count <= max: yield count count += 1 gen = count_up_to(5) for num in gen: print(num)
1 2 3 4 5
처음 호출되면 yield count에서 count 값을 반환하고 멈춥니다.
다음 호출 시 count += 1이 실행되고, 다시 yield에서 값을 반환합니다.
이런 방식으로 while 루프가 끝날 때까지 반복됩니다.
즉, yield의 유무가 제너레이터와 일반 함수의 가장 큰 차이점입니다.
def my_gen(): yield 1 yield 2 yield 3 gen = my_gen() # 제너레이터 객체 생성 print(next(gen)) # 1 반환 print(next(gen)) # 2 반환 print(next(gen)) # 3 반환 # 이후 호출 시 StopIteration 발생
제너레이터는 모든 yield를 처리한 뒤 반환할 값이 더 이상 없을 때 StopIteration 예외를 발생시킵니다.
즉, 제너레이터 내부에서 반복 조건이 끝나거나(예: while 루프 종료) 더 이상 yield가 실행되지 않을 때, 호출하면 StopIteration이 나옵니다.
StopIteration 이전까지는 계속 호출 가능
StopIteration이 발생하기 전까지는 next(gen)을 계속 호출할 수 있으며, 호출할 때마다 제너레이터는 다음 값을 생성합니다.
즉, yield를 실행할 수 있는 한, 호출할 때마다 새로운 값을 반환합니다.
StopIteration 이후에는 더 이상 값이 없기 때문에 호출해도 아무 소용이 없습니다.
이터레이터 (Iterators)
이터레이터는 반복 가능한 객체에서 순차적으로 데이터를 꺼내는 객체입니다. 이터레이터는 두 가지 핵심 메서드로 구성됩니다:
__iter__(): 이터레이터 객체를 반환.
__next__(): 이터레이터의 다음 값을 반환. 더 이상 반환할 값이 없으면 StopIteration 예외를 발생.
특징:
모든 이터러블(iterable, ex: 리스트, 튜플, 딕셔너리 등)은 이터레이터로 변환 가능.
for 루프에서 내부적으로 이터레이터를 사용해 순회.
# 간단한 이터레이터 예제 class MyIterator: def __init__(self, max): self.max = max self.current = 0 def __iter__(self): return self def __next__(self): if self.current < self.max: self.current += 1 return self.current else: raise StopIteration # 이터레이터 사용 my_iter = MyIterator(5) for value in my_iter: print(value)
1 2 3 4 5