Hi Hi

'Generator'에 해당되는 글 1건

  1. 파이썬(python) - 이터레이터(iterator), 제너레이터(generator)

파이썬(python) - 이터레이터(iterator), 제너레이터(generator)

 


  • 이터레이터(iterator)
    - 내부의 반복문을 관리하는 역학을 해주는 객체
    - 순회 가능한 객체의 요소를 순서대로 접근할 수 있는 객체이다.
    - for 구문은 이터레이터 안의 __next__()메서드를 싱행한다.
    - __nex__t() 는 현재 이터레이터가 가리키고 있는 객체의 요소를 리턴하고 객체의 다음 요소를 가리킨다.

    >>> s = 'abc'
    >>> it = iter(s) // iter 함수는 순회가능한 객체에서 이터레이터를 가져온다.
    >>> it // 이터레이터 객체 이다.
    <str_iterator object at 0x03FCACF0>
    >>> next(it)
    'a'
    >>> next(it)
    'b'
    >>>it.__next__() // 이런식으로 직접 메서드를 실행 시킬 수 있다.
    'c'
    >>> next(it) //
    Traceback (most recent call last):
    File "<interactive input>", line 1, in <module>
    StopIteration

  • 제너레이터(generator)
    - 이터레이터를 만드는 간단하고도 강력한 도구이다.

    ※함수가 호출되면 지역변수와 코드가 스택에 적재되고 코드를 수행한다. 그리고 함수가 끝나면
    결과값을 호출한곳에 넘겨주고 함수 객체는 스택에서 사라진다.

    -함수에 return 대신에 yield를 적어주면 함수를 끝내지 않고 호출한 곳에 갑을 전달 한다.
    >>> def abc():
    ... data = "abc"
    ... for char in data:
    ... yield char
    ...
    >>> abc
    <function abc at 0x040A1228>
    >>> abc()
    <generator object abc at 0x040A3378>
    >>> it = iter(abc())
    >>> next(it)
    'a'
    >>> next(it)
    'b'
    >>> next(it)
    'c'
    >>> next(it)
    Traceback (most recent call last):
    File "<interactive input>", line 1, in <module>
    StopIteration

    >>> def abc():
    ... data = "abc"
    ... for char in data:
    ... return char
    ...
    >>> next(it)
    Traceback (most recent call last):
    File "<interactive input>", line 1, in <module>
    StopIteratio
    n

    - 함수의 상태를 그대로 보존시키고 다시 호출될 수 있다.

    >>> b = (i for i in range(11))
    >>> b
    <generator object <genexpr> at 0x040A3328>
    >>> sum(b)
    55
    >>> a= [1,2,3,4,5,6,7,8,9,10]
    >>> sum(a)
    55

    -데이터를 미리 만들어 놓는 것이 아니라 필요할 때마다 데이터를 생성할 수 있어서 메모리 사용을 줄임.