[[OZ코딩스쿨] 초격차 캠프 - 10일차 (함수) Chapter 6-11. 제너레이터

2025. 3. 13. 12:27·Python

📌 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. 제너레이터의 사용 이유

  • 메모리를 효율적으로 사용해야 하는 경우.
  • 조금씩 실행해야 할 때 유용.
  • 전체 데이터를 메모리에 올려놓지 않고 필요한 만큼만 처리 가능.

✅ 이해도 체크리스트

  1. 이터레이터와 제너레이터란?
    • 이터레이터: 순차적으로 값을 생성하고 반환할 수 있는 객체. next()를 통해 다음 값을 가져올 수 있음.
    • 제너레이터: yield를 사용하여 값을 반환하고 실행을 일시 중지하는 함수. next()로 실행을 이어갈 수 있음.
  2. 제너레이터 함수를 만드는 방법은?
    • 함수 정의: 일반 함수처럼 def로 정의.
    • yield 사용: 값을 반환하고, 함수 실행을 일시 중지.
def my_gen():
    yield 1
    yield 2
    yield 3
  1. 제너레이터 함수를 실행하는 방법은?
    • 제너레이터 객체 생성
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
'Python' 카테고리의 다른 글
  • ✅ 개발자로서 실력을 향상시키는 방법 (함수와 내장 함수 활용)
  • [[OZ코딩스쿨] 초격차 캠프 - 10일차 (함수) Chapter 6-12. 타입 어노테이션과 힌트
  • [[OZ코딩스쿨] 초격차 캠프 - 10일차 (함수) Chapter 6-10. 람다
  • [[OZ코딩스쿨] 초격차 캠프 - 10일차 (함수) Chapter 6-9. 튜플
Chansman
Chansman
안녕하세요! 코딩을 시작한 지 얼마 되지 않은 초보 개발자 찬스맨입니다. 이 블로그는 제 학습 기록을 남기고, 다양한 코딩 실습을 통해 성장하는 과정을 공유하려고 합니다. 초보자의 눈높이에 맞춘 실습과 팁, 그리고 개발하면서 겪은 어려움과 해결 과정을 솔직하게 풀어내려 합니다. 함께 성장하는 개발자 커뮤니티가 되기를 바랍니다.
  • Chansman
    찬스맨의 프로그래밍 스토리
    Chansman
  • 전체
    오늘
    어제
    • 분류 전체보기 (672) N
      • Python (32)
      • 프로젝트 (43)
      • 과제 (25)
      • Database (40)
      • 멘토링 (11) N
      • 특강 (37) N
      • 기술블로그 (38) N
      • 기술블로그-Fastapi편 (28) N
      • 기술블로그-Django편 (152)
      • 기술블로그-Flask편 (35)
      • AI 분석 (4)
      • HTML & CSS (31)
      • JavaScript (17)
      • AWS_Cloud (21)
      • 웹스크래핑과 데이터 수집 (14)
      • Flask (42)
      • Django (72)
      • Fastapi (2) N
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
Chansman
[[OZ코딩스쿨] 초격차 캠프 - 10일차 (함수) Chapter 6-11. 제너레이터
상단으로

티스토리툴바