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와 일치한다.