ContextManager를 공부하다가 나온 yield 키워드.
[Python] 파일 읽고 쓰기 with문 - ContextManager
Python에서 자원을 읽고 쓸 때, try-except 문을 사용하지 않고 with문을 사용한다고 한다.try-except 문을 사용해서 파일을 읽고 쓰게 되면, finally에서 연결 끊는 코드를 안해주면 자원을 계속 실행하고
itstudentstudy.tistory.com
그리고 yield 키워드를 가지고 있는 함수를 Generator 함수라고 하는데,,
yield 키워드는 뭐고? Generator 함수는 뭘까?
📌 Yield 키워드
def test(value):
print("_start_")
yield value * 10
print("_continue_")
yield value * 5
print("_end_")
for i in test(10):
print(i)
# _start_
# 100
# _continue_
# 50
# _end_
return은 값을 반환 후 함수를 종료시키지만, yield는 값을 전달 후 그대로 멈춰있다가 next()를 통해서 다음 값을 실행시킨다.
for문은 iter 내장함수를 호출시켜 자동으로 next 값을 해주는 형태라 별도 next() 필요 없다. iter 함수는 밑에 설명 있음.
for문을 사용하지 않고 같은 값을 출력하고 싶으면 next()함수를 직접 호출해야함. next() 함수로 다음 요청이 오면 멈췄던 지점부터 실행을 재개한다. (yield 다음 코드부터 진행)
def test(value):
print("_start_")
yield value * 10
print("_continue_")
yield value * 5
print("_end_")
t = test(10)
print(next(t))
print(next(t))
try:
# 멈췄던 곳부터 실행을 재개하여, _end_를 출력하고 함수 끝에 도달
print(next(t))
except StopIteration:
# 제너레이터가 완전히 종료되었으므로, 이 예외를 잡고 정상 종료
pass
📌 Generator(제너레이터) 함수
제너레이터 함수는 yield 키워드와 함께 사용되며, yield 키워드가 쓰인 함수는 제너레이터 함수라고 볼 수 있다.
제너레이터 객체는 이터레이터의 한 형태로 yield 키워드에서 전달해주는 값을 하나하나 꺼낼 수 있는 형태인데,,, 먼저 이터레이터를 알아야한다.
❓ Iterator(이터레이터)
python에 Iterable 객체는 set, list, dict,,, 등 반복 가능한 객체이다.
Iterator 함수는 Iterable 객체에서 순차적으로 값을 꺼낼 수 있는 객체이다.
l = [1,2,3,4,5]
il = iter(l)
print(type(l)) # <class 'list'>
print(type(il)) # <class 'list_iterator'>
print(next(l)) # 오류 발생
print(next(il)) # 1 정상 출력
list type인 l 변수에서 next 함수를 사용해 다음 값을 꺼내오려고 하면 TypeError: 'list' object is not an iterator 오류가 발생한다.
iter 내장 함수로 타입으로 변환시켜 next 함수를 사용하면 정상적으로 다음 값을 꺼내올 수 있다.
이터레이터 객체는 __iter__와 __next__ 내장함수가 구현되어있어야하는데 제너레이터는 자동으로 구현하고 있다.

흠,,, 그니까
이터레이터 객체는 값을 하나씩 꺼내올 수 있는 객체이고
제너레이터는 이터레이터의 한 형태로, 값을 하나씩 꺼내올 수 있다.
값을 하나씩 꺼내올 수 있게 하는 이유는 제너레이터에 yield 키워드가 존재하기 때문! 👌❓
next 호출을 하면 멈춰있던 제너레이터 함수를 진행시키고 yield 키워드를 만나면 값을 전달시킴.
'AI > Python' 카테고리의 다른 글
[Python] 파일 읽고 쓰기 with문 - ContextManager (0) | 2025.10.12 |
---|---|
[Python] 클래스의 던더 변수 및 메소드 (0) | 2025.10.04 |
[Python] 클래스와 변수 + 접근지정자 getter, setter (0) | 2025.10.01 |
[Python] datetime 모듈 (0) | 2025.09.25 |
[Python] ascii code <-> string 변환 방법 (0) | 2025.09.10 |