νμ΄μ¬ μ λ€λ μ΄ν°μ λν΄μ μμ보μ
ν¨μ μμμ yieldλ₯Ό μ¬μ©νλ©΄ ν¨μλ μ λλ μ΄ν°κ° λλ©° yieldμλ κ°(λ³μ)μ μ§μ νλ€.
generator ν¨μκ° μ€ν μ€ yield λ₯Ό λ§λ κ²½μ°, ν΄λΉ ν¨μλ κ·Έ μνλ‘ μ μ§ λλ©°, λ°ν κ°μ next() λ₯Ό νΈμΆν μͺ½μΌλ‘ μ λ¬ νκ² λλ€. μ΄ν ν΄λΉ ν¨μλ μΌλ°μ μΈ κ²½μ° μ²λΌ μ’
λ£λλ κ²μ΄ μλλΌ κ·Έ μνλ‘ μ μ§λκ² λλ€.
μΆμ²
def generator_send():
received_value = 0
while True:
received_value = yield
print("received_value = ",end=""), print(received_value)
yield received_value * 2
μ€λͺ : yieldκ°μ λ°μΌλ©΄ μΆλ ₯νκ³ λ°μ κ°μ μ κ³±μ ν΄μ λ°ννλ€.
gen = generator_send()
next(gen)
genμ generator_send()ν¨μλ₯Ό λ΄μμ next()ν¨μμ μΈμλ₯Ό μ€λ€.
μ΄λ κ² λλ©΄ received_value
μμ κ°μ λ°κΈ°μ κΉμ§ λ©μΆ°μλ€.
print(gen.send(2))
>>>received_value = 2
4
κ°μ μ£Όλ©΄ received_valueλ₯Ό μΆλ ₯νκ³ received_valueμ μ κ³±μ ν κ°μ λ°ννλ€. κ·Έλ¦¬κ³ λ€μ yieldκ°μ λ°κΈ°μ κΉμ§ μ€ννκ³ κΈ°λ€λ¦°λ€.
next(gen)
print(gen.send(3))
>>>received_value = 3
6
λκ°μ΄ λ°λ³΅ νλ€.
νμ§λ§!
next(gen)
next(gen)
>>>TypeError: unsupported operand type(s) for *: 'NoneType' and 'int'
next()ν¨μλ₯Ό νΈμΆνκ³ κ°μ μμ£Όκ³ λ next()λ₯Ό νΈμΆνλ©΄ λ°νκ°μ΄ μμ΄μ μ€λ₯κ° λλ€.
μ¦ yieldλ ν¨μμ νλ¦μ μ μ΄ν μ μλ€.
μ»΄ν¨ν° νλ‘κ·Έλλ°μμ λκΈν κ³μ°λ²(Lazy evaluation)μ κ³μ°μ κ²°κ³Όκ°μ΄ νμν λκΉμ§ κ³μ°μ λ¦μΆλ κΈ°λ²μ΄λ€. λ κ°μ§ κ΄λ ¨λ νλͺ©λ€μ΄ μλλ° μ§μ° κ³μ°λ²κ³Ό μ΅μ κ³μ°λ²μ΄λ€.
λκΈνκ² κ³μ°νλ©΄ νμμλ κ³μ°μ νμ§ μμΌλ―λ‘ μ€νμ λ λΉ λ₯΄κ² ν μ μκ³ , λ³΅ν© μμμ κ³μ°ν λ μ€λ₯ μνλ₯Ό νΌν μ μκ³ , 무ν μλ£ κ΅¬μ‘°λ₯Ό μΈ μ μκ³ , 미리 μ μλ κ²μ μ΄μ©νμ§ μκ³ λ³΄ν΅ ν¨μλ‘ μ μ΄ κ΅¬μ‘°λ₯Ό μ μν μ μλ€.
μΆμ²
μμλ μν€λ°±κ³Όμμ λ΄λ¦° μ μμ΄κ³
lazy evaluationμ μ΄ν΄νκΈ° μν΄μ 리μ€νΈ ννμκ³Ό μ λ€λ μ΄ν° ννμκ³Ό λΉκ΅νλ©΄μ μμ보μ
μ λ€λ μ΄ν° ννμμ μ μ¬μ©ν μμλ₯Ό 보μ
import time
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("comprehension_list_print")
print_iter(comprehension_list)
print("generator_exp=")
generator_exp = ( lazy_return(i) for i in L )
print("generators_exp_print")
print_iter(generator_exp)
comprehension_list
λ 리μ€νΈ ννμμΌλ‘ lazy return
μ μμ±νκ³
generator_exp
λ μ λ€λ μ΄ν° ννμμΌλ‘ lazy return
μ μμ±νλ€.
κ·Έλ κ² μμ±λ μ΄ν°λ μ΄λΈ κ°μ²΄μμνλμ© μΆλ ₯νλprint_iter()
ν¨μμ μ§μ΄ λ£λλ€.
μ μ΄μ μ€νν΄ λ³΄μ!
comprehension_list=
sleep 1s
sleep 1s
sleep 1s
comprehension_list_print
1
2
3
generator_exp=
generators_exp_print
sleep 1s
1
sleep 1s
2
sleep 1s
3
μλ¦μ΄ λλλ€!!
리μ€νΈ ννμμΌλ‘ μ€ννλ©΄
comprehension_list=
sleep 1s
sleep 1s
sleep 1s
comprehension_list_print
1
2
3
μ΄λ κ² λ¦¬μ€νΈμ μμλ₯Ό μ λΆ μμ±ν΄μ μ§μ΄ λ£μλ€λκ±Έ μ μ μλ€.
λ°λ©΄ μ λ€λ μ΄ν° ννμμ 보면
generator_exp=
generators_exp_print
sleep 1s
1
sleep 1s
2
sleep 1s
3
generator_exp=
λ°μ μ무κ²λ μλκ±Έ 보λ μμ ν¨μλ₯Ό μ€ννμ§λ μμλ€.
generators_exp_print
λ print_iter
ν¨μκ° μ€νλκ³ λμ λμ€λ κ²μ΄λ―λ‘ μ λ€λ μ΄ν° ννμμΌλ‘ ν λ
μμ μμλ₯Ό μ°κΈ°μ κΉμ§λ ν¨μλ₯Ό μ€ννμ§ μμλ€.