제너레이터 함수
yield로 값을 지연 생성하기
제너레이터 함수은(는) CoddyKit의 무료 Python Academy 강의입니다. 이것은 4개 중 2번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Python Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Python Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
제너레이터란 무엇인가요
제너레이터 함수는 일반 함수처럼 보이지만 return 대신 또는 return과 함께 yield를 사용합니다. 이 함수를 호출해도 본문이 실행되지는 않습니다. 대신 반복자인 제너레이터 객체가 반환됩니다.
def gen():
yield 1
yield 2
yield 3
g = gen()
print(type(g).__name__)
print(list(g))yield가 실행을 일시 중지함
next()를 호출할 때마다 함수는 yield를 만날 때까지 실행되고, 해당 값을 반환한 다음 상태를 멈춘 상태로 유지합니다. 다음 호출에서는 yield 바로 다음부터 실행을 재개합니다.
def steps():
print('start')
yield 'a'
print('resumed')
yield 'b'
g = steps()
print(next(g))
print(next(g))제너레이터 반복하기
제너레이터는 반복자이므로 for 반복문이 자동으로 제너레이터를 실행하고, 함수가 끝나면 반복을 멈춥니다. 이때 내부적으로 StopIteration이 발생합니다.
def countdown(n):
while n > 0:
yield n
n -= 1
for x in countdown(4):
print(x)지연 평가
제너레이터는 지연 방식으로 동작합니다. 요청할 때만 값이 생성됩니다. 따라서 메모리를 많이 사용하지 않고도 매우 크거나 무한한 수열을 표현할 수 있습니다.
def naturals():
n = 1
while True:
yield n
n += 1
g = naturals()
print(next(g), next(g), next(g))yield 사이의 상태
지역 변수는 yield 지점 사이에서도 값을 유지합니다. 제너레이터는 별도의 수동 인덱스 관리 없이 중단된 위치를 자연스럽게 기억합니다.
def fib():
a, b = 0, 1
while True:
yield a
a, b = b, a + b
g = fib()
print([next(g) for _ in range(7)])제너레이터와 리스트 만들기 비교
일반 함수는 전체 리스트를 한 번에 만들고 반환합니다. 제너레이터는 요청될 때마다 항목을 생성합니다. 수열이 크거나 중간에 일찍 멈출 수 있다면 제너레이터를 사용하세요.
def squares_list(n):
result = []
for i in range(n):
result.append(i * i)
return result
def squares_gen(n):
for i in range(n):
yield i * i
print(squares_list(5))
print(list(squares_gen(5)))일찍 멈추기
생성이 지연되므로 반복문에서 빠져나오면 제너레이터는 나머지 값을 아예 계산하지 않습니다.
def naturals():
n = 1
while True:
print('producing', n)
yield n
n += 1
for x in naturals():
if x > 3:
break
print('got', x)제너레이터 안의 return
제너레이터에서 값이 없는 return은 제너레이터를 끝낼 뿐입니다. 이때 StopIteration이 발생합니다. 반환한 값이 있다면 예외의 value 속성이 되지만, 대부분의 반복문은 이를 무시합니다.
def up_to(stop):
i = 0
while True:
if i >= stop:
return
yield i
i += 1
print(list(up_to(4)))제너레이터는 한 번만 사용 가능
모든 반복자와 마찬가지로 제너레이터도 한 번 소비됩니다. 끝까지 소비한 뒤에는 아무것도 생성하지 않습니다. 새로운 제너레이터를 얻으려면 함수를 다시 호출하세요.
def gen():
yield 1
yield 2
g = gen()
print(list(g))
print(list(g))
print(list(gen()))제너레이터로 필터링하기
제너레이터를 사용하면 깔끔한 데이터 pipeline을 만들 수 있습니다. 여기서는 짝수만 한 번에 하나씩 생성합니다.
def evens(numbers):
for n in numbers:
if n % 2 == 0:
yield n
print(list(evens(range(10))))제너레이터 연결하기
제너레이터는 다른 제너레이터를 소비할 수 있으므로 각 단계가 지연 방식으로 동작하는 다단계 pipeline을 만들 수 있습니다.
def numbers(n):
for i in range(n):
yield i
def doubled(src):
for x in src:
yield x * 2
print(list(doubled(numbers(5))))빠른 확인
제너레이터 함수에 대한 이해도를 확인해 보세요.
복습
제너레이터 함수를 배웠습니다.
yield는 실행을 일시 중지하고 재개하며, 지역 상태를 보존합니다.- 함수를 호출하면 지연 방식으로 동작하는 제너레이터 객체가 반환됩니다.
- 메모리 효율적이며 pipeline과 무한 스트림에 적합합니다.
- 다른 모든 반복자처럼 한 번만 사용할 수 있습니다.
다음은 더욱 간결한 제너레이터 표현식입니다.
자주 묻는 질문
“제너레이터 함수” 강의는 무료인가요?
네 — “제너레이터 함수” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Python Academy 강의 전체를 잠금 해제할 수 있습니다. Python Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“제너레이터 함수”에서 뭘 배우나요?
yield로 값을 지연 생성하기 브라우저에서 직접 실행하는 실습 코드로 Python Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
Python Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 Python Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 2번째 강의입니다.
“제너레이터 함수” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 Python Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 Python Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- 반복자 프로토콜
- 제너레이터 함수
- 제너레이터 표현식
- yield from과 위임