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
|
a = [1,2,3,4]
b = 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
'Python' 카테고리의 다른 글
파이썬에서의 추상데이터타입![1] (0) | 2020.03.02 |
---|---|
파이썬_객체지향(class,module)[3] (0) | 2020.02.20 |
파이썬_객체지향(class,module)[2] (0) | 2020.02.20 |
파이썬_객체지향(class,module)[1] (0) | 2020.02.19 |
Python__module__은 찍어먹는건가요?[1] (0) | 2020.02.14 |
댓글