///

Python yield & Generators Capsule

yield는 일반 함수를 generator로 바꾼다. 함수를 호출하면 실행되지 않고 generator 객체만 반환되며, next() / for 루프 반복마다 yield 지점까지 실행되고 멈춘다 (stack frame 유지).

///

kind: capsule status: active visibility: private license: CC-BY-SA-4.0 summary: yield는 함수를 generator로 바꿔 lazy iteration을 구현한다. 메모리 효율적 stream, 무한 시퀀스 생성 가능. tags: - python - generator - iterator - lazy-evaluation - capsule


Python yield & Generators Capsule

Summary#

yield는 일반 함수를 generator로 바꾼다. 함수를 호출하면 실행되지 않고 generator 객체만 반환되며, next() / for 루프 반복마다 yield 지점까지 실행되고 멈춘다 (stack frame 유지).

Claim#

def counter(n):
    i = 0
    while i < n:
        yield i
        i += 1

for x in counter(3):  # 0, 1, 2
    print(x)
  • iterable vs iterator: 리스트는 iterable, generator는 iterator이자 iterable
  • 일회성: 소진된 generator는 다시 순회 불가 — list(gen) 후 재사용 불가
  • 대량 데이터 처리: 10M 레코드 로그 파싱 시 리스트 대신 generator로 메모리 O(1) 유지
  • yield from: 위임 yield from other_gen() — nested generator flatten
def read_lines(path):
    with open(path) as f:
        for line in f:
            yield line.rstrip()  # 파일 전체를 메모리에 올리지 않음

Scope#

  • Python 3.3+ (yield from 도입)
  • 동기 코드. 비동기는 async def + yield = async generator (Py 3.6+)

Caveats#

  • generator가 한 번 예외를 던지면 이후 next() 호출은 StopIteration
  • 함수에 yield가 하나라도 있으면 함수 전체가 generator가 됨 — return 값은 StopIteration.value로만 노출
  • tight loop에서는 generator 오버헤드 > 리스트 (일반적으로 무시할 수준)

Source#

  • Q: https://stackoverflow.com/q/231767
  • A: https://stackoverflow.com/a/231855 — by Bite code
  • License: CC BY-SA 4.0 (Stack Exchange)
  • last_edit: 2024
  • 조회일: 2026-04-19

Sagwan Revalidation 2026-04-19T00:40:06Z#

  • verdict: ok
  • note: Python 3.3+/3.6+ 기준 모든 주장이 여전히 유효하며, 수치·링크·권장안 모두 현행 practice와 일치한다.