본문 바로가기
Python

Generator

by Adam92 2020. 6. 5.

Generator는 제네레이터 함수가 호출될 때 반환되는 iterator의 일종입니다.

제네레이터 함수는 일반적인 함수와는 다르게 yield 구문을 사용해 데이터를 원하는 시점에 반환 / 처리 를 다시 시작할 수 있습니다. 일반적인 함수는 진입점이 하나라면, 제네레이터는 진입점이 여러개입니다. 이러한 특성을 사용하여 원하는 시점에 데이터를 받을 수 있습니다.

 

제네레이터에도 표현식이 있습니다. Lazy evaluation을 위해 사용 될 수 있습니다. Lazy는 실행을 지연시킨다는 의미입니다.

 

Generator 예시

def generator():
    yield 77
    yield 'generator'
    yield False

gen = generator()
print(gen)		# yield문이 포함된 제네레이터 함수를 실행하면 제네레이터객체가 반환되는데, 이때는 함수의 내용이 실행되지 않는다.

print(next(gen))	# next() 라는 built-in method를 통해 제네레이터를 실행시키며, 
print(next(gen))	# next() method 내부적으로 iterator를 인자로 받아 interator의 __next__메서드 실행시킨다.

# == resutls ==
# <generator object generator at 0x7f43b106ff50>
# 77
# generator

 

 

Generator(send 함수)

def generator_send():
    received_value = 0

    while True:

        received_value = yield		# yield로 send로받은 값을 received_value에 할당
        print("received_value = ", end=""), print(received_value)
        yield received_value ** 2

gen = generator_send()
next(gen)
print(gen.send(4))


# == results == 
# received_value = 4
# 16

 

Generator 표현식

all_list = [1, 2, 3, 4, 5, 6, 7, 8]

odd_list = (x for x in all_list if x%2 == 0)	

print(next(odd_list)) # nest() method로 이터레이터의 __next__() 매서드 실행시킴

# == results == 
# 2

제너레이터 표현식은 list comprehension과 비슷한데 괄호만 []가아니고 ()로 변경면 해주면 Generator표현식이 된다.

 

 


 

과제

이번 과제는 다음코드를 실행해보고 분석한 결과를 블로깅하는 과제 입니다. lazy evaluation 이란 무엇인지와 장점 및 리스트 컴프리헨션과의 차이점에 대하여 블로깅 해주세요.

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)

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

''' 
		== results ==
comprehension_list=
sleep 1s
sleep 1s
sleep 1s
1
2
3
generator_exp=
sleep 1s
1
sleep 1s
2
sleep 1s
3
'''

 

코드를 실행시키니, 첫번째로 comprehension_list부분은 for문으로 할당받은 값이 lazy_return으로 들어가  "sleep is"를 3번 출력하고 1, 2, 3을 각각 리턴한뒤 print_iter함수부분에서 각각의 숫자들을 출력한다.

 

두번째로 generator_exp 부분은 제너레이터 표현식에서 제네레이터 함수가 실행되지 않다가 print_inter부분에서 함수가 호출되어 순차대로 값들이 호출되어 각각 출력되는 것 같다.

 

Lazy evaluation

 

list comprehension과의 차이점은 list comprehension은 해당 함수의 값들을 한꺼번에 불러와서 메모리는 다쓰는 반면,

Lazy evaluation은 각각의 값들만 불러오기 떄문에 메모리를 적게 차지한다.

 

 

 

 

 

 

 

 

 

 

'Python' 카테고리의 다른 글

Iterator  (0) 2020.06.04
Python Assignment (List comprehension)  (0) 2020.06.04
Python etc..  (0) 2020.06.04
Modules and Package (Feature)  (0) 2020.06.03
Modules and Package  (0) 2020.06.02