[python] generator

김영환·2020년 10월 27일
0

Python

목록 보기
3/11
post-thumbnail

generator

iterator 를 생성해 주는 function 이다. itertor 는 next() 메소드르 이용해 데이터에 순차적으로 접근이 가능한 object이다. generator는 일반함수와 비슷해 보이지만, 가장 큰 차이점은 yield !!
실제 값을 출력하기전에는 함수를 실행하지 않다가 수행하는 순간 출력되는 함수
- 메모리를 효율적으로 사용 할 수 있다.
- 계산 결과 값이 필요할 때까지 계산을 늦추는 효과 >> lazy evalution

yield

generator가 일반 함수와 구분되는 가장 핵심적인 부분이다.
일반적인 함수는 사용이 종료되면 결과값을 호출부로 반환 후 함수 자체를 종료시킨 후 메모리 상에서 클리어 된다. 하지만 yield 를 만난 경우, 해당 함수는 그 상태로 정지 되며, 반환 값을 next() 를 호출한 쪽으로 전달하게 된다. 이후 해당 함수는 일반적인 경우 처럼 종료되는 것이 아니라 그 상태를 유지하게 된다.
즉, 함수에서 사용된 local 변수나 instruction pointer 등과 같은 함수 내부에서 사용된 데이터들이 메모리에 그래도 유지되는 것이다.

def yield_test(n):
    i = 0
    while i < n:
        yield i 
        # return 값과 비슷하게 동작하게 된다, 
        # 하지만 return 값과 다른것중하나는 return 하는 순간 함수는 종료되지만 
        # yield 는 데이터가 여기서 머물게 된다 i가 5이상이 될때까지       
        i += 1

for x in yield_test(5):
    print(x)

lazy evalution

- 메모리를 효율적으로 사용 할 수 있다. 
- 계산 결과 값이 필요할 때까지 계산을 늦추는 효과
import time

L = [1,2,3]

def print_iter(iter):
    for element in iter:
        print(element)
        
def lazy_return(num):
    print("sleep 1s")
    time.sleep(1)
    return num

print("comprehension_list=")
comprehension_list = [lazy_return(i) for i in L]
print_iter(comprehension_list) 

# comprehension_list=
# sleep 1s
# sleep 1s
# sleep 1s
# 1
# 2
# 3


print("generator_exp=")
generator_exp = (lazy_return(i) for i in L)
print_iter(generator_exp)

# generator_exp=
# sleep 1s
# 1
# sleep 1s
# 2
# sleep 1s
# 3

generator_exp

  1. for문이 실행 되면서, generator_exp = (1,2,3)
  2. generator 함수는 일반함수와 동일한 절차로 실행된다.
  3. lazy_return() 함수의 return num=1 인 채로 print_iter() 함수로 넘어간다.
  4. iter => element = 1 이 출력됩니다. (이후 반복)

comprehension_list

  1. for문이 실행 되면서, `comprehension_list = [1,2,3]
  2. 일반 함수와 동일한 절차로 실행된다.
  3. lazy_return() 함수 파라미터의 [lazy_return(i) for i in L]가 모두 실행된 후
    sleep 1s sleep 1s sleep 1s 출력한다.
  4. print_iter()의 파라미터로num=3 들어가서 1 2 3 출력

0개의 댓글