본문 바로가기
언어/Python

[Generator]

by 코딩맛집 2023. 2. 1.

Generator란?

iterator를 생성해주는 함수

 

특징

  • iterable한 순서가 지정됨
  • 순서의 다음 값은 필요에 따라 계산된다.(느슨하게 평가됨)
  • 함수의 내부 로컬 변수를 통해 내부상태가 유지된다.
  • 무한한 순서가 있는 객체를 모델링할 수 있다.(데이터 스트림)
  • 자연스러운 스트림 처리를 위 파이프라인으로 구성할 수 있다. (JAVA에서 파일 스트림 처리시에 특정 바이트단위로 반복하는 것을 말하는 것 같다.)

 

Generator 사용해보기

>>> def test_generator():
...     yield 1
...     yield 2
...     yield 3
... 
>>> gen = test_generator()
>>> type(gen)
<class 'generator'>
>>> next(gen)
1
>>> next(gen)
2
>>> next(gen)
3
>>> next(gen)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration

 

for문에서 사용할 수 있다

>>> import collections
>>> isinstance(gen, collections.Iterable)
True
>>> for i in test_generator():
...     print(i)
... 
1
2
3

generator를 동시에 두개 생성하면, 서로가 다른 객체이며, 각기 따로 동작한다.

>>> h = test_generator()
>>> i = test_generator()
>>> h == i
False
>>> h is i
False
>>> next(h)
1
>>> next(i)
1
>>> next(h)
2
>>> next(i)
2
>>> next(i)
3
>>> next(h)
3

그 때 그 때 생성되는 무한한 순서의 객체를 모델링할 수 있다. 그리고 이렇게 무한하게 숫자를 리턴할 수 있는 이유는 generator를 실행할떄마다 느슨하게 평가되며 내부의 변수가 유지되고 있기 때문이다.

 

List, Set, Tuple Dictionary 표현식의 내부도 generator이다.

 

yield from

  • Python 3.3 이상부터 사용 가능
  • yield문을 여러 번 바깥으로 전달하려면 for문을 아래와 같이 사용한다.
>>> def three_generator():
...     a = [1, 2, 3]
...     for i in a:
...             yield i
... 
>>> gen = three_generator()
>>> list(gen)
[1, 2, 3]

이러한 상황에서 for문 대신에 iterable한 객체를 yield할 때는 yield from iterable로 값을 전달할 수 있다.

>>> def three_generator():
...     a = [1, 2, 3]
...     yield from a
... 
>>> gen = three_generator()
>>> list(gen)
[1, 2, 3]

 

'언어 > Python' 카테고리의 다른 글

[데이터 타입] List, Tuple, Set, Dictionary, 문자열  (0) 2023.02.01
[lambda] sorted key  (0) 2023.01.13