📌 Python 함수 심화 – Chapter 6-11. 제너레이터
✅ 1. 제너레이터란?
- 제너레이터는 이터레이터를 생성하는 객체.
- 함수 내부에서 yield 키워드를 사용해 정의.
- 이터레이터는 next() 메서드를 사용해 순차적으로 값을 반환할 수 있는 객체.
- 특징
- yield가 있는 함수는 호출 시 제너레이터 객체를 반환.
- next() 호출 시 yield를 만나기 전까지 실행되며, yield 값을 반환하고 실행을 일시 중지함.
- 더 이상 반환할 값이 없으면 StopIteration 예외가 발생.
def test():
print("제너레이터 실습 코드입니다.")
yield "test"
print("첫번째 출력")
test()
print("두번째 출력")
test()
print(test())
- 출력 결과
첫번째 출력
두번째 출력
<generator object test at 0x013ec7400>
- 설명
- test() 함수는 yield가 있어 제너레이터 객체를 반환하지만, next()로 호출하기 전까지는 내부 코드가 실행되지 않음.
✅ 2. 제너레이터의 실행
- next() 함수로 yield가 있는 부분까지 실행되며, 값을 반환하고 실행을 일시 중지.
def test():
print("첫번째 출력")
yield 1
print("두번째 출력")
yield 2
print("세번째 출력")
output = test()
print("네번째 출력")
x = next(output)
print(x)
print("다섯번째 출력")
y = next(output)
print(y)
print("여섯번째 출력")
z = next(output) # StopIteration 예외 발생
print(z)
- 출력 결과
네번째 출력
첫번째 출력
1
다섯번째 출력
두번째 출력
2
여섯번째 출력
세번째 출력
StopIteration
- 설명
- next() 호출 시 yield 키워드까지 실행되고, 값을 반환함.
- 더 이상 반환할 값이 없으면 StopIteration 예외가 발생.
✅ 3. 제너레이터의 사용 이유
- 메모리를 효율적으로 사용해야 하는 경우.
- 조금씩 실행해야 할 때 유용.
- 전체 데이터를 메모리에 올려놓지 않고 필요한 만큼만 처리 가능.
✅ 이해도 체크리스트
- 이터레이터와 제너레이터란?
- 이터레이터: 순차적으로 값을 생성하고 반환할 수 있는 객체. next()를 통해 다음 값을 가져올 수 있음.
- 제너레이터: yield를 사용하여 값을 반환하고 실행을 일시 중지하는 함수. next()로 실행을 이어갈 수 있음.
- 제너레이터 함수를 만드는 방법은?
- 함수 정의: 일반 함수처럼 def로 정의.
- yield 사용: 값을 반환하고, 함수 실행을 일시 중지.
def my_gen():
yield 1
yield 2
yield 3
- 제너레이터 함수를 실행하는 방법은?
- 제너레이터 객체 생성
obj = my_gen()
- next() 함수로 실행
print(next(obj)) # 1
print(next(obj)) # 2
print(next(obj)) # 3
print(next(obj)) # StopIteration 발생
이 정리된 내용을 통해 제너레이터의 개념과 실행 방법을 확실히 익히고, 실무에서도 메모리 효율적인 코드를 작성해 보세요! 🚀
📌 Python 함수 심화 – 이터레이터와 제너레이터 정리
✅ 1. 이터레이터(Iterator)란?
- **이터레이터(Iterator)**는 next() 함수를 사용해 순차적으로 값을 가져올 수 있는 객체입니다.
- for문이나 while문을 통해 값을 하나씩 순회(iterate)할 때 사용됩니다.
- **__iter__()**와 __next__() 메서드를 가지고 있어야 이터레이터가 됩니다.
📚 이터레이터 예시
numbers = [1, 2, 3]
iterator = iter(numbers) # 리스트를 이터레이터로 변환
print(next(iterator)) # 1 출력
print(next(iterator)) # 2 출력
print(next(iterator)) # 3 출력
출력 결과
1
2
3
- iter()로 이터레이터 객체를 만들고, next()로 값을 하나씩 가져옵니다.
- 값이 더 이상 없으면 StopIteration 오류가 발생합니다.
✅ 2. 제너레이터(Generator)란?
- **제너레이터(Generator)**는 yield 키워드를 사용해 이터레이터를 쉽게 생성할 수 있는 함수입니다.
- 일반 함수는 return을 사용하지만, 제너레이터는 yield를 사용하여 값의 흐름을 일시 중지하고, 다음 next() 호출 시 다시 실행됩니다.
- 메모리 효율성이 뛰어나며, 한 번에 하나의 값만 생성하기 때문에 대용량 데이터를 처리할 때 유용합니다.
📚 제너레이터 예시
def simple_gen():
yield 1
yield 2
yield 3
gen = simple_gen()
print(next(gen)) # 1 출력
print(next(gen)) # 2 출력
print(next(gen)) # 3 출력
출력 결과
1
2
3
- **yield**는 값을 반환하고, 함수의 상태를 일시 정지시킵니다.
- 다음 next() 호출 시 중단된 지점에서 다시 실행됩니다.
✅ 3. 제너레이터 함수 만드는 방법
- yield 키워드를 사용하여 값을 하나씩 반환하는 함수로 작성합니다.
- 제너레이터 함수는 return 대신 **yield**를 사용하여 값을 순차적으로 반환합니다.
def countdown(n):
while n > 0:
yield n
n -= 1
- 위 함수는 n부터 1까지 감소하는 숫자를 차례로 생성합니다.
✅ 4. 제너레이터 함수 실행하는 방법
gen = countdown(3)
print(next(gen)) # 3 출력
print(next(gen)) # 2 출력
print(next(gen)) # 1 출력
출력 결과
3
2
1
- **next()**를 호출할 때마다 yield에서 값을 하나씩 반환합니다.
- 값이 더 이상 없으면 StopIteration 오류가 발생합니다.
✅ for문을 사용하여 자동으로 값 가져오기
for num in countdown(3):
print(num)
출력 결과
3
2
1
- for문은 내부적으로 자동으로 next()를 호출하기 때문에 편리하게 사용할 수 있습니다.
✅ 5. yield vs return
구분 yield return
용도 | 제너레이터에서 값을 순차적으로 반환 | 함수에서 최종 결과값을 반환 |
중단 | 함수의 상태를 일시 중단하고, 다음 next() 호출 시 재개 | 함수가 종료되고, 값을 반환하면 함수는 종료됨 |
반환 | 값을 하나씩 반환하며, 반복적으로 사용할 수 있음 | 한 번만 값을 반환하고 함수 종료 |
메모리 | 메모리 효율적 (필요한 값만 처리) | 모든 값을 메모리에 저장 |
⚡️ 결론
- **이터레이터**는 순차적으로 값을 가져올 수 있는 객체이고, map(), filter() 같은 함수에서도 사용됩니다.
- **제너레이터**는 yield를 통해 메모리 효율적으로 값을 하나씩 생성합니다.
- 제너레이터는 대용량 데이터를 처리하거나, 반복적인 작업을 수행할 때 성능과 메모리 효율을 극대화할 수 있습니다.
🚀 Tip!
- 값이 많고 메모리를 아끼고 싶다면 제너레이터를 적극적으로 사용해보세요!
- 간단하게 yield만 사용해도 이터레이터를 쉽게 만들 수 있습니다! 😊
'Python' 카테고리의 다른 글
✅ 개발자로서 실력을 향상시키는 방법 (함수와 내장 함수 활용) (0) | 2025.03.13 |
---|---|
[[OZ코딩스쿨] 초격차 캠프 - 10일차 (함수) Chapter 6-12. 타입 어노테이션과 힌트 (0) | 2025.03.13 |
[[OZ코딩스쿨] 초격차 캠프 - 10일차 (함수) Chapter 6-10. 람다 (0) | 2025.03.13 |
[[OZ코딩스쿨] 초격차 캠프 - 10일차 (함수) Chapter 6-9. 튜플 (0) | 2025.03.13 |
[[OZ코딩스쿨] 초격차 캠프 - 10일차 (함수) Chapter 6-8. 조기 리턴 피보나치 수열 (0) | 2025.03.13 |