교육2주차(2)

Taixi·2024년 8월 24일

생성형 AI 교육

목록 보기
5/35

인터러블과 이터레이터,제너레이터


이터러블(iterable)

  • 이터러블은 반복 가능한 객체로, 여러 개의 요소를 가지고 있고 이를 반복해서 순회할 수 있는 객체를 의미
  • 파이썬의 객체에 __inter__메소드를 포함하고 있으면, 인터러블 객체라고 부름
a = 1
print(iter(a))

TypeError: 'int' object is not iterable


이터레이터(iterator)

  • 이터레이터는 이터러블 객체의 요소를 하나씩 반환하는 객체
  • 이터레이터 객체는 __next__ 메소드 반드시 포함

이터레이터 만들기

class Season:
    def __init__(self):
        self.data = ["봄", "여름", "가을", "겨울"]
        self.index = 0
    
    def __iter__(self):
        return self
    
    def __next__(self):
        if self.index < len(self.data):
            cur_season = self.data[self.index]
            self.index += 1
            return cur_season
        else:
            raise StopIteration
  
s = Season()
for i in s:
		print(i)  

text = "Hello, Python"

# 문자열을 이터레이터로 변환
iter_text = iter(text)

# 이터레이터를 사용하여 문자 출력
print(next(iter_text))  # 'H'
print(next(iter_text))  # 'e'

✏️StopIteration 예외

numbers = [1, 2, 3]

iter_numbers = iter(numbers)

try:
    while True:
        num = next(iter_numbers)
        print(num)
except StopIteration:
    pass

제너레이터(Generator)

  • 제너레이터는 발전기라는 의미처럼 이 객체를 호출할 때마다 yeild가 작동되 값을 순차적으로 산출
  • Return 키워드 대신 yield라는 키워드를 사용하는 함수, Return이라는 키워드는 결과값을 돌려주고 끝나지만 yield는 실행한 상태를 그대로 저장해 둔채로 잠시 멈추어 준다.
def generator_func():
    yield 1
    yield 2
    yield 3
print(generator_func() # <generator object generator_func at 0x1054b09e0> 
print(hasattr(generator_func(), '__iter__')) # True
print(hasattr(generator_func(), '__next__')) # True
  • yield는 오른쪽값을 함수 밖으로 산출(생산해서 반환하고)하고, 실행을 양보
  • yield로 생성한 함수는 제너레이터를 반환하기 때문에 iter를 사용할 필요없이 바로 next로 yield 오른쪽에 위치한 값을 순차적으로 함수 밖으로 산출
def generator_func():
    yield 1
    yield 2
    yield 3
g = generator_func() # yield를 통해 생성된 제너레이터
print(g) # <generator object generator_func at 0x7fc786582580> 
print(g.__next__()) # 1
print(g.__next__()) # 2
print(g.__next__()) # 3
profile
개발자를 위한 첫시작

0개의 댓글