본문 바로가기
  • hazard_dev@__
  • hazard_dev@__
Python

Python_Generator/Iterator이게 뭐야 대체!

by Hazard3_o00sung 2020. 2. 14.
728x90

본 포스트는 Python 3.7기반으로 작성되었음을 알려드립니다.

 

Python_Generator/Iterator이게 뭐야 대체!

 

먼저 iterator(이하 이터레이터) 를 먼저 알아야 합니다.

문자열, 리스트, 딕셔너리 등을 반복적으로 처리하는 객체를 iterable object라고 합니다.

 

1
2
3
for i in range(1,10):
 
    print(i)
cs

위 예제를 가르킵니다.

 

그렇다면 iterator객체는 어떻게 동작하는지 예제코드를 통해 살펴보겠습니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
= [1,2,3,4]
 
= iter(a)
 
next(b)
 
next(b)
 
next(b)
 
next(b)
 
next(b) #stopiteration error occur
 
 
cs

 

위와같이 a라는 리스트를 생성합니다. 그 후 b라는 변수에 a를 __iter__()함수를 사용하여 이터레이터 프로토콜을 구현하는 컨테이너 객체로 변형 시킵니다.

 

next(b)는 리스트의 첫요소를 꺼낸 후 다음 반환값을 가르킵니다. 마지막 반환값이 없는 next(b)는 stopiteration 오류를 발생시키며 메서드가 종료됩니다.


그렇다면 Generator 는 무었일까요?

제너레이터는 이터레이터를 작성하는 방법 중 하나 입니다. yield 키워드가 포함됩니다.

caller가 method를 호출할 때, return 키워드는 반환값을 반환하고 메서드를 종료한 후, 호출자에게 값을 반환합니다. 반면 yield키워드는 각 반환값을 호출자에게 반환한 후, 값이 없을때 메서드가 종료되는 특징을 지니고 있습니다.

 

제너레이터는 매우 효율적입니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
def fibo():
 
    a=0
 
    b=1
 
    while True:
 
        yield b
 
        a = b
 
        b = a+b
 
if __name__ == '__main__':
 
    f = fibo()
 
    print(next(f))
 
    print(next(f))
 
    print(next(f))
 
    print(next(f))
 
print(next(f))
 
cs

 

위 코드는 제너레이터를 활용한 피보나치 수열을 구현한 코드입니다.

 

 

이해가기 힘든 부분은 댓글남겨주시면 감사하겠습니다. 피드백환영!!

 

읽어주셔서 감사합니다~

728x90

댓글