👩‍💻 Develope/Python

[Python] 이터레이터(iterator)와 제너레이터(generator)

heywantodo 2023. 5. 4. 10:38
728x90
반응형

[Python] 이터레이터 (iterator)와 제너레이터(generator)

이터레이터 (iterator) 란?

반복 가능한 객체 (iterable)에서 요소하나씩 꺼내오는 역할

예를 들어 리스트, 튜플, 문자열 등의 객체는 반복 가능한 객체 (iterable) 임

이러한 객체에서 for 루프를 이용해 요소를 하나씩 꺼내올 때, 이터레이터가 사용됨 

 

이터레이터 사용 예시

1. iter() 함수를 이용해서 리스트 my_list를 이터레이터로 변환

2. next() 함수를 이용해 이터레이터에서 값을 하나씩 가져옴

my_list = [1, 2, 3, 4, 5]
my_iter = iter(my_list)

print(next(my_iter)) # 1
print(next(my_iter)) # 2
print(next(my_iter)) # 3

 

제너레이터 (generator)

제너레이터(generator)이터레이터(iterator)를 생성하는 함수, 제너레이터 함수를 호출하면 이터레이터를 반환함

이터레이터를 통해 제너레이터 함수에서 생성된 값들을 하나씩 가져올 수 있음

제너레이터 함수는 'yield' 키워드를 사용하여 값을 반환함 

 

제너레이터 사용 예시

1. my_generator() 함수는 제너레이터 함수로 n을 입력으로 받아서 for문을 통해 0부터 (n-1)까지의 숫자의 제곱을 계산

2. 계산한 값을 yield 키워드를 이용해서 반환 

def my_generator(n):
    for i in range(n):
        yield i ** 2

gen = my_generator(5)

print(next(gen)) # 0
print(next(gen)) # 1
print(next(gen)) # 4
print(next(gen)) # 9
print(next(gen)) # 16

 

for문으로 한번에 결과 출력 할 수 있음 

for i in gen:
    print(i)

 

🤔 일반 함수와 제너레이터의 차이

 

1. 함수에서 return문이 실행되면 함수가 종료되는 반면에, 제너레이터에서 return문이 실행되면

StopIteration 예외가 발생

(실행 상태를 끝내는 것이 아니라, 제너레이터의 실행을 종료시키고 마지막 값을 반환 )

 

ex)

#제너레이터
def my_generator():
    yield 1
    yield 2
    return 3
    yield 4

#일반 함수
def my_function():
    return 3

제너레이터 함수 호출

: next 함수를 호출하여 제너레이터의 값을 하나씩 가져올 수 있는데,

마지막으로 next 함수를 호출하면 StopIteration 예외가 발생하며 반환된 값이 예외 메시지에 포함됨

gen = my_generator()
print(next(gen))  # 1
print(next(gen))  # 2
print(next(gen))  # StopIteration: 3

일반 함수 호출

: return 문에서 바로 값이 반환됨 

result = my_function()
print(result)  # 3

 

2. 만약 리스트에 있는 모든 원소를 반환하려면, 리스트의 모든 원소를 메모리에 미리 할당한 다음에 반환해야 함, 제너레이터를 사용하면 각 값이 필요한 시점에 생성되므로 모든 값을 메모리에 할당 할 필요가 없음 

 

하지만 제너레이터는 순서대로 값이 반환이 되기 때문에, 앞의 값을 반환하려면 제너레이터를 다시 초기화하거나 새로운 제너레이터를 만들어야 함 

 

🔎결론

✔ 제너레이터는 데이터를 순차적으로 처리하거나 큰 데이터를 처리할 때 유용

✔ 전체 파일을 한 번에 읽어들이지 않고, 한 줄씩 처리하면서 메모리 사용량을 줄일 수 있음

✔ 무한한 시퀀스를 생성하는 경우에도 유용함 

 

 

728x90
반응형