1. Python 기초 문법(Iterator와 Generator)

Date:

Python Iterator

  • 값을 차례대로 꺼낼 수 있는 객체
  • Python에서는 이터레이터만 생성하고 값이 필요한 시점이 되었을 때 값을 만들어 출력
  • 지연 평가 : 데이터 생성을 뒤로 미룸
  • 반복자라고 불림

image

__iter__메서드

dir함수를 통해 반복가능한 객체인지 확인 가능

image
image

__next__메서드

  • 다음 항목을 가져오는 메서드
  • __iter__메소드를 가지고 있는 자료형은 기본적으로 __next__메소드를 지원함
  • for문에서 in뒤에 오는 자료형이 iterator 자료형임
  • 마지막 항목에서 __next__호출할 경우 StopIteration error 발생

📰code

it=[1,2,3].__iter__()
print(it.__next__())
print(it.__next__())
print(it.__next__())

🔍result

1  
2  
3  

image

이터레이터 언패킹

📰code

a,b,c = map(int,['1','2','3'])
print(a,b,c)

🔍result

1 2 3

이터레이터 만들어 보기(실습)

  • __iter__ : 이터레이터로 사용
  • __next__ : 다음 수 출력
  • __getitem__ : 값 출력

📰code

class Counter:
    def __init__(self, stop):
        self.current = 0
        self.stop = stop
    def __iter__(self):
        return self
    def __getitem__(self,index):
        if index < self.stop:
            return index
        else : 
            raise IndexError
    def __next__(self):
        if self.current < self.stop:
            r=self.current
            self.current +=1
            return r
        else:
            raise StopIteration
            
for i in Counter(3):
    print(i,end=' ')

🔍result

0 1 2 

iter와 next함수

  • __iter__()메소드와 __next__ 메소드는 함수로도 사용이 가능하다
  • iter(), next() 형식으로 사용 가능함

iter()

  • 기존 __iter__ 메서드를 이용한 iterator화와 동일한 방식
  • iter(반복자객체)형식으로 iterator화 가능함

📰code

it = iter(range(10))
it2= range(10).__iter__()
print(type(it))
print(type(it2))

🔍result

<class 'range_iterator'>  
<class 'range_iterator'>

next()

  • 기존 __next__ 메서드를 활용하여 다음 숫자를 반환한 방식과 동일한 방식
  • next(반복자객체)형식으로 다음 숫자 반환함

📰code

it = iter(range(10))
print(it.__next__(),end=' ')
print(next(it),end=' ')
print(it.__next__(),end=' ')
print(next(it),end=' ')

🔍result

0 1 2 3



Python generator

  • iteratort를 생성해주는 함수
  • 함수 내에서 yield 키워드를 사용하면 자동으로 Generator로 바뀜
  • 제너레이터는 함수 안에서 yield라는 키워드로 iterator의 __iter__, __next__을 대신함
  • 발생자라고 불림

📰code

def generator():
    yield 0
g=generator()
print(dir(g))

🔍result image

yield

  • Iterator의 경우 __next__ 메서드 안에서 직접 Return으로 반환했지만,
  • Generator의 경우 yield에지정한 값이 __next__메서드 반환값으로 나옴
  • 마지막에 도달할 경우 iterator는 raise로 예외를 발생시켰지만, generator는 자동으로 발생함
  • generator 객체에서 __next__ 메서드 호출 시 함수 안의 yield에서 값을 발생시킴

image

  • yield뒤에는 함수도 올수 있다

📰code

def upper_g(x):
    for i in x:
        yield i.upper()
        
alpha = ["a",'b','c','d']
for i in upper_g(alpha):
    print(i, end=' ')

🔍result

A B C D 

yield - from

  • yield from의 경우 뒤에 이터레이터, 제너레이터 객체가 오면 그 요소 개수만큼 전달함

📰code

def upper_g():
    yield from ["a",'b','c','d']
        
for i in upper_g():
    print(i, end=' ')

🔍result

a b c d 

📌reference

💡 수정 필요한 내용은 댓글이나 메일로 알려주시면 감사하겠습니다!💡 

Categories:

Updated:

댓글