L = [ 1,2,3]
def generate_square_from_list():
result = ( x*x for x in L )
print(result)
return result
def print_iter(iter):
for element in iter:
print(element)
print_iter( generate_square_from_list() )
데이터에 순차적인 접근이 가능한 generator 표현식이다. generator 함수는 일반 함수의 return(반환) 후 종료와는 달리 yield(산출) 후 현 상태에 머문다는 차이가 있다. 주로 iter 함수(다음 차례의 순번을 전달)와 next 함수(다음 순번의 값을 출력)를 통해 제어한다. lazy evaluation은 generator 함수에서 함수 호출 시에만 실행이 되도록 의도적으로 연산을 지연시키는 표현 방식이다.
함수를 호출 했을 때 연산을 해두고 결과값을 이용하지 않는 경우 메모리의 낭비가 일어난다. 이렇게 사용하지 않을 불필요한 연산으로 리소스가 낭비되는 것을 방지하기 위해 lazy evaluation을 사용하게 되면 generator가 사용 됐을 경우에만 generator가 진행하게 된다.
import time
import random
counter = random.randrange(1, 11) # 1부터 10사이의 랜덤 값 생성
print("counter: {}".format(counter))
def return_one_after_five_sec():
print("please wait for 5 seconds")
time.sleep(5)
print("return 1")
return 1
print("[let's make one_list !]")
one_list = [return_one_after_five_sec() for x in range(10)]
# counter 숫자만큼 값 출력
print("[let's print one_list !]")
for item in one_list:
counter -= 1
print(item)
if counter == 0:
break
결과값
counter: 1
[let's make one_list !]
please wait for 5 seconds
return 1
please wait for 5 seconds
return 1
please wait for 5 seconds
return 1
please wait for 5 seconds
return 1
please wait for 5 seconds
return 1
please wait for 5 seconds
return 1
please wait for 5 seconds
return 1
please wait for 5 seconds
return 1
please wait for 5 seconds
return 1
please wait for 5 seconds
return 1
[let's print one_list !]
1
Process finished with exit code 0
import time
import random
counter = random.randrange(1, 11) # 1부터 10사이의 랜덤 값 생성
print("counter: {}".format(counter))
def return_one_after_five_sec():
print("please wait for 5 seconds")
time.sleep(5)
print("return 1")
return 1
print("[let's make one_generator !]")
one_generator = (return_one_after_five_sec() for x in range(10)) # generator 생성
# counter 숫자만큼 값 출력
print("[let's print one_generator !]")
for item in one_generator:
counter -= 1
print(item)
if counter == 0:
break
결과값
counter: 1
[let's make one_generator !][let's print one_generator !]
please wait for 5 seconds
return 1
1