본문 바로가기
인터페이스 개발/Python

Python - 고급 문법[반복자] - 열거 가능 객체, 제너레이터

by cooluk 2020. 7. 28.

Chap.17 고급 문법[반복자] - 열거 가능 객체, 제너레이터

 

반복자

열거 가능 객체, 제너레이터

 

열거 가능 객체

  • for 반복문의 순회 대상 객체

  • 해당 객체의 __iter__() 메서드로 열거 가능 객체 획득
    - 열거 가능 개체는 __iter__() 메서드를 정의해야 함

  • 매 루프마다 __next()__ 함수를 통해 다음 요소를 추출

  • 더 이상 요소가 없는 데 __next()__를 호출하는 경우
    - StopIteration 예외가 발생하고 for 반복문을 끝냄

foriter (for문 내부적 구현)

nums = [11, 22, 33]
it = iter(nums)
while True:
    try:
        num = next(it)
    except StopIteration:
        break
    print(num)

결과

11
22
33

 

 

예제

for문에 동작하는 class를 만들어보자. 2글자씩 뽑아주는


solarterm = Seq("입춘우수경칩춘분청명곡우입하소만망종하지소서대서")
for k in solarterm:
    print(k, end = ',')


결과
입춘,우수,경칩,춘분,청명,곡우,입하,소만,망종,하지,소서,대서,

 

classiter

class Seq:
    def __init__(self, data):
        self.data = data
        self.index = -2

    def __iter__(self):
        # self.index = -2  # 추가해주면 반복가능(사작할때 초기화)
        return self

    def __next__(self):
        self.index += 2  # 먼저 업데이트
        if self.index >= len(self.data):
            # self.index = -2  # 추가해주면 반복가능(마지막 인덱스에서 초기화)
            raise StopIteration  # 예외를 강제로 발생

        return self.data[self.index:self.index+2]

solarterm = Seq("입춘우수경칩춘분청명곡우입하소만망종하지소서대서")
for k in solarterm:
    print(k, end = ',')

for k in solarterm:  # 두번째 for문은 동작하지 않음
    print(k, end = ',')  # index 값이 끝으로 이동해주었기 때문에

결과

입춘,우수,경칩,춘분,청명,곡우,입하,소만,망종,하지,소서,대서,

 

 

제너레이터

  • 객체로 순회가능한 객체를 만드는 거는 다소 귀찮은 작업

  • 제너레이터 함수로 대체 가능

  • 함수에서 데이터를 연속해서 리턴 (yield)

  • 함수가 끝나면(또는 return 실행) StopIteration 예외 발생

  • 함수를 호출하면 함수가 실행되는 것이 아니고 순회 가능 객체가 리턴

  • 순회 가능 객체로 순회할 때 실제 함수가 실행 됨

generator

def seqgen(data):
    for index in range(0, len(data), 2):
        yield data[index:index+2]  # ☆☆☆ 객체로 변환이 된다.

solarterm = seqgen("입춘우수경칩춘분청명곡우입하소만망종하지소서대서")  # generator 객체
print(type(solarterm))
print(solarterm)

for k in solarterm:
    print(k, end = ',')

결과

<class 'generator'>
<generator object seqgen at 0x000002D4B3081E48>
입춘,우수,경칩,춘분,청명,곡우,입하,소만,망종,하지,소서,대서,

댓글