박미미의 지식에서 쌓는 즐거움

파이썬:: 이터레이터와 제네레이터 개념 본문

IT 공부

파이썬:: 이터레이터와 제네레이터 개념

낑깡좋아 2019. 7. 11. 00:06

자바 개발자인 저는 파이썬을 접하면서 이터레이터, 제네레이터 라는 말을 처음 들어봤습니다.

그 개념부터 이해해보려고 서술형으로 작성합니다. 




이터레이터 (iterator)

리스트, 튜플, 문자열처럼 순회 가능한 객체에는 이터레이터 라는 특별한 객체가 포함되어 있다. 여기서 '리스트, 튜플, 문자열처럼 순회 가능한 객체'를 컨테이너(container)라고 부른다.

이터레이터(iterator)는 컨테이너들이 iterable 하다고 해서 나온 개념인데, iterable의 사전적 의미는 '반복할 수 있는' 이란다.


그럼 이터레이터(iterator)란 무엇인가? 이는 next()를 호출할 때 다음값을 생성해내는 상태를 가진 헬퍼 객체이다. 

next()를 가진 모든 객체는 이터레이터이다. 값을 생성해내는 방법과는 무관하다.

즉 이터레이터는 값 생성기이다. “다음”값을 요청할 때마다 내부 상태를 유지하고 있기 때문에 다음값을 계산하는 방법을 알고있다.


* 이터레이터 예제

>>> s="abc"

>>> it=iter(s)   # 이터레이터 선언

>>> it

<str_iterator object at 0x034D4DD0>

>>>

>>>

>>> next(it)

'a'

>>> next(it)

'b'

>>>

>>> next(it)

'c'

>>>

>>> next(it)

  Traceback (most recent call last):

  File "<pyshell#24>", line 1, in <module>

    next(it)   #더이상 문자가 없기때문에 에러

StopIteration 


보통 이터레이터는 반복이 가능하기 때문에 for문과도 많이 사용된다.


제네레이터 (Generator)

그럼 제네레이터란 무엇일까? 

강의 중에 이터레이터를 만드는 간단하고 강력한 도구...라는데...이 말이 너무 포괄적이라 이해가 안갔다.

 - 모든 제너레이터는 이터레이터이다 (그 반대는 성립하지 않는다)

 - 모든 제너레이터는값을 그 때 그 때 생성한다

 - 제네레이터는 return 함수를 쓰지 않는다. yield를 사용할 뿐.

     함수는 실행이 끝나면 결과값을 넘겨주고 함수 객체는 스택에서 사라진다.


 * yield 란?

 function에서 return과 동일한 역할을 수행한다. (= 결국 반환값?)

iter()와 next() 로 짤 수 있는 코드를 yield 라는 키워드를 이용하여 코드를 간결하게 만들 수 있다.


>>> s ="gold"

>>> len(s)

4

>>>

>>>

>>> list(range(len(s)-1,-1,-1))

[3, 2, 1, 0]

>>>

>>> def reverse(data):

for index in range(len(data)-1,-1,-1):

yield data[index]

 

 

>>>

>>> for item in reverse("gold"):

print(item)

 

 

d

l

o

g

>>>

>>> def abc():

data = "abc"

for char in data:

return char

 

 

>>>

>>> for item in abc():

print(item)

 

 

a

>>> def abc():

data = "abc"

for char in data:

yield char

 

 

>>> for item in abc():

print(item)

 

 

a

b

c

>>>




휴..이 포스트는 이해될때까지 추가보완해서 업로드 하기로...

혹시 지나가시는 길에 잘못된 정보 있으면 댓글로 알려주시면 감사하겠습니다.



 
출처: https://mingrammer.com/translation-iterators-vs-generators/

파이썬 오프라인 강의

Comments