본문 바로가기
Python

[Python] Week 21: 고급 문법 - 이터레이터와 제너레이터

by cogito21_python 2024. 6. 1.
반응형

Day 1: 이터레이터의 기본 개념

  • 강의 내용:
    • 이터레이터의 정의와 필요성
      • 이터레이터의 개념과 장점
      • 이터레이터 프로토콜
    • 이터레이터의 동작 방식
      • __iter__() 메서드와 __next__() 메서드
  • 실습:
    • 기본 이터레이터 작성 및 사용 예제
# 이터레이터 클래스 정의
class MyIterator:
    def __init__(self, limit):
        self.limit = limit
        self.counter = 0

    def __iter__(self):
        return self

    def __next__(self):
        if self.counter < self.limit:
            self.counter += 1
            return self.counter
        else:
            raise StopIteration

# 이터레이터 사용
my_iter = MyIterator(5)
for number in my_iter:
    print(number)  # 1 2 3 4 5

 

Day 2: 내장 이터레이터

  • 강의 내용:
    • 파이썬 내장 이터레이터
      • 리스트, 튜플, 딕셔너리 등의 내장 이터레이터
    • 이터레이터 함수
      • iter(), next() 함수
  • 실습:
    • 내장 이터레이터와 이터레이터 함수를 사용한 예제
# 내장 이터레이터 예제
numbers = [1, 2, 3, 4, 5]
iter_numbers = iter(numbers)

print(next(iter_numbers))  # 1
print(next(iter_numbers))  # 2
print(next(iter_numbers))  # 3

# for 루프를 사용한 내장 이터레이터 예제
for num in numbers:
    print(num)  # 1 2 3 4 5

 

Day 3: 제너레이터의 기본 개념

  • 강의 내용:
    • 제너레이터의 정의와 필요성
      • 제너레이터의 개념과 장점
      • 제너레이터 함수와 yield 키워드
    • 제너레이터와 이터레이터의 차이점
  • 실습:
    • 기본 제너레이터 작성 및 사용 예제
# 제너레이터 함수 정의
def my_generator():
    yield 1
    yield 2
    yield 3

# 제너레이터 사용
gen = my_generator()
print(next(gen))  # 1
print(next(gen))  # 2
print(next(gen))  # 3

# for 루프를 사용한 제너레이터 예제
for value in my_generator():
    print(value)  # 1 2 3

 

Day 4: 제너레이터 표현식

  • 강의 내용:
    • 제너레이터 표현식의 개념
      • 리스트 컴프리헨션과의 차이점
      • 제너레이터 표현식의 문법
    • 제너레이터 표현식 사용 예제
  • 실습:
    • 제너레이터 표현식을 사용하는 예제 작성
# 제너레이터 표현식 정의
gen_expr = (x * x for x in range(5))

# 제너레이터 표현식 사용
for value in gen_expr:
    print(value)  # 0 1 4 9 16

 

Day 5: 제너레이터와 성능

  • 강의 내용:
    • 제너레이터의 성능 장점
      • 메모리 효율성
      • 대규모 데이터 처리
    • 제너레이터와 리스트 비교
  • 실습:
    • 제너레이터와 리스트를 비교하는 예제 작성
# 리스트와 제너레이터 비교
import sys

# 리스트 컴프리헨션
list_comp = [x * x for x in range(1000)]
print("리스트 크기:", sys.getsizeof(list_comp))  # 리스트 크기 출력

# 제너레이터 표현식
gen_expr = (x * x for x in range(1000))
print("제너레이터 크기:", sys.getsizeof(gen_expr))  # 제너레이터 크기 출력

 

Day 6: 고급 제너레이터

  • 강의 내용:
    • 고급 제너레이터 기법
      • send() 메서드
      • close() 메서드
      • throw() 메서드
    • 고급 제너레이터 사용 예제
  • 실습:
    • 고급 제너레이터 기능을 사용하는 예제 작성
# 제너레이터 함수 정의
def my_generator():
    try:
        while True:
            value = (yield)
            print(f"Received: {value}")
    except GeneratorExit:
        print("Generator closed")

# 제너레이터 사용
gen = my_generator()
next(gen)
gen.send(10)  # 'Received: 10'
gen.send(20)  # 'Received: 20'
gen.close()   # 'Generator closed'

 

Day 7: 이터레이터와 제너레이터 종합 연습 및 프로젝트

  • 강의 내용:
    • 이터레이터와 제너레이터 종합 연습 문제 풀이
      • 다양한 이터레이터와 제너레이터 관련 문제
      • Q&A 세션
    • 미니 프로젝트
      • 주제 선정 및 프로그램 설계
      • 이터레이터와 제너레이터를 활용한 프로그램 구현 및 테스트
  • 실습:
    • 종합 연습 문제 풀기
    • 미니 프로젝트 작성 및 발표
# 연습 문제 1: 숫자 범위 생성기 제너레이터 작성
def range_generator(start, end):
    current = start
    while current < end:
        yield current
        current += 1

for num in range_generator(1, 10):
    print(num)  # 1 2 3 4 5 6 7 8 9

# 연습 문제 2: Fibonacci 수열 제너레이터 작성
def fibonacci_generator():
    a, b = 0, 1
    while True:
        yield a
        a, b = b, a + b

fib_gen = fibonacci_generator()
for _ in range(10):
    print(next(fib_gen))  # 0 1 1 2 3 5 8 13 21 34

# 미니 프로젝트 예제: 로그 파일 분석기
def log_reader(file_path):
    with open(file_path, "r") as file:
        for line in file:
            yield line.strip()

# 로그 파일 읽기 및 분석
for log_line in log_reader("logfile.txt"):
    print(log_line)

# 파일 크기가 매우 큰 경우 제너레이터를 사용하여 메모리 효율적으로 처리할 수 있음

 

이 강의는 파이썬의 고급 문법인 이터레이터와 제너레이터를 익히는 것을 목표로 하며, 각 강의는 이론과 실습을 포함합니다. 다음 주차에 대한 상세 강의를 원하시면 말씀해 주세요!

 

반응형