0Pricing
Python Academy · 강의

제너레이터 함수

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 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. 반복자 프로토콜
  2. 제너레이터 함수
  3. 제너레이터 표현식
  4. yield from과 위임
← Python Academy(으)로 돌아가기