본문 바로가기
Programming/Python

generator, iterator, yield

by Chan_찬 2020. 9. 30.
728x90
반응형

python - generator, iterator, yield

python에서 generator는 interator를 작성하는 편리한 방법이다

호출자가 메서드를 호출할 때,

  • return 은 반환값을 반환하고 메서드를 종료한 후,
    호출자에게 제어를 반환한다
  • yield 는 각 반화값을 호출자에게 반환하고,
    반환값이 모두 소진되었을 때에만 메서드가 종료된다

generator

제너레이터는 파이썬의 시퀀스를 생성하는 객체다

  • 전체 시퀀스를 한 번에 메모리에 생성하고 정렬할 필요엾이, 잠재적으로 아주 큰 시퀀스를 순회할 수 있다
  • 제너레이터를 순회할 때마다 마지막으로 호출된 요소를 기억하고 다음 값을 반환한다
def fib_generator():
  a, b = 0, 1
  while True:
    yield b
    a, b = b, a+b

if __name__ = "__main__":
  fg = fib_generator()
  for _ in range(10):
    print(next(fg), end=' ')

iterator

  • 이터레이터 프로토콜을 구현하는 컨테이너 객체다
  • 객체에 __iter__(), __next__() 메서드를 둘 다 정의하면 이터레이터 프로토콜을 구현한 것이다
  • 컨테이너의 다음값을 반환하는 __next__()메서드
  • 이터레이터 자신을 반환하는 __iter__()메서드
  • 이때 yield 를 사용하면 편리하다

yield

제너레이터 맥락에서 이터레이터를 만드는 강력한 도구다

  • 제너레이터는 최종값을 반환하지만, 이터레이터는 yield 를 사용하여 코드 실행 중에 값을 반환한다
  • __next__()메서드를 호출할 때마다 어떤 값 하나를 추출한 후 해당 yield 표현식의 값을 반환한다
  • 이터레이터는 StopIteration 예외 가 발생할 때까지 값을 반환한다
>>> a = [1,2,3]
>>> def f(a):
...    while a:
...        yield a.pop()
728x90
728x90
BIG

'Programming > Python' 카테고리의 다른 글

lambda - 람다  (0) 2020.10.06
filter(), map()  (0) 2020.10.05
False - 거짓  (0) 2020.09.28
input(), sys.stdin - 코딩테스트 시 입력받기  (0) 2020.09.24
byte-compiled code - python  (0) 2020.09.22
Buy me a coffeeBuy me a coffee

댓글