[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. 만약 리스트에 있는 모든 원소를 반환하려면, 리스트의 모든 원소를 메모리에 미리 할당한 다음에 반환해야 함, 제너레이터를 사용하면 각 값이 필요한 시점에 생성되므로 모든 값을 메모리에 할당 할 필요가 없음
하지만 제너레이터는 순서대로 값이 반환이 되기 때문에, 앞의 값을 반환하려면 제너레이터를 다시 초기화하거나 새로운 제너레이터를 만들어야 함
🔎결론
✔ 제너레이터는 데이터를 순차적으로 처리하거나 큰 데이터를 처리할 때 유용
✔ 전체 파일을 한 번에 읽어들이지 않고, 한 줄씩 처리하면서 메모리 사용량을 줄일 수 있음
✔ 무한한 시퀀스를 생성하는 경우에도 유용함
'👩💻 Develope > Python' 카테고리의 다른 글
[Python] 정규 표현식 (1) | 2023.05.10 |
---|---|
[Python] Logging 사용법 (0) | 2023.05.08 |
[Python] 데코레이터 (decorator) (0) | 2023.05.03 |
[Pandas] 결측치 제거 & 교체 (0) | 2023.04.21 |
[Pandas] 데이터 프레임의 컬럼을 DB 테이블에 검색하기 (0) | 2023.04.14 |