카테고리 없음

스파르타 AI-8기 TIL(1/28)-TeamProject

kimjunki-8 2025. 1. 28. 22:21

쓰읍..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