generator란 이터레이터를 생성해주는 함수이다. 메모리를 효율적으로 사용하면서 반복을 수행하도록 돕는 객체다.
이터레이터는 클래스에 __iter__, __next__ 또는 __getitem__ 메서드를 구현해야 한다.
하지만 제너레이터 함수 내부에는 이 메서드들이 내장되어 있기 때문에 이터레이터보다 훨씬 간단하게 작성할 수 있다.
아래 사이트에서 그림을 가져왔는데, 간단히 이해하기 위해서 이 그림을 읽어보았고 간단하게 구현도 해보았다.
def generator():
yield 0
yield 'Alphabet'
yield False
gen = generator()
print(next(gen)) # 0
print(next(gen)) # 'Alphabet'
print(next(gen)) # False
def simple_generator(n):
for i in range(n):
yield i
# generator 함수 호출
my_generator = simple_generator(5)
# 값을 하나씩 가져오기
print(next(my_generator)) # 출력: 0
print(next(my_generator)) # 출력: 1
print(next(my_generator)) # 출력: 2
print(next(my_generator)) # 출력: 3
print(next(my_generator)) # 출력: 4
'''
모든 값을 생성하면 StopIteration 예외가 발생
따라서 보통은 for 루프를 사용하여 모든 값을 순회합니다.
'''
for value in simple_generator(3):
print(value)
# 출력:
# 0
# 1
# 2
코드에서도 yield를 계속 작성했는데, 그렇다면 yield는 무엇일까?
yield 키워드는 해당 키워드를 실행하고 함수를 호출한 쪽으로 다시 프로그램의 제어를 넘겨준다.
설명이 잘 이해가 안 된다면 그냥 위에 쓴 코드 보고 그렇구나 하는 것이 더 편할 수 있다.
본래 파이썬의 일반적인 출력방식은 Return을 사용한 방식이 일반적이다.
그러므로 Return과의 차이는 어떤 점인지를 이해하면 좋다.
Return : Return 함수가 실행되면 반복문 등의 함수 동작이 멈춰지게 된다.
yield : 함수는 일시정지하지만 절대 완전히 끝나는 것이 아니다. 그리고 그 시점에서 어떤 값을 내놓았는지, 변수 등을 모두 기억한다.
즉, yield를 호출하면 원하는 값을 리턴하며, 실행 흐름을 일시 정지하여 함수를 재활용할 수 있는 상태로 만든다.
yield의 작동 방식은 아래 그림과 같다.
generator는 일반적으로 많이 쓰는 것은 아니다.
하지만 결국 선배들의 말씀을 빌려보면, 대용량 데이터를 처리할 때, 극한의 효율이 필요할 때에는 generator가 좋은 방법이 될 것이라고 한다.
잘 모르겠어도 일단은 공부하는 것이 결국 중요하다.
Reference
https://dojang.io/mod/page/view.php?id=2412
'언어 > Python' 카테고리의 다른 글
[Python] Garbage Collection (3) | 2024.03.05 |
---|---|
[Python] itertools 프로그래밍 (2) | 2024.01.16 |
VSCode에서 나타나는 File "<stdin>", line 1 에러 (0) | 2023.10.02 |
파이썬(python) sys.stdin.readline 사용 (0) | 2023.08.04 |
pip/conda 의미, 가상환경의 정확한 의미 (0) | 2023.06.08 |