๐ ์ ๋ค๋ ์ดํฐ
ํ์ด์ฌ ์ ๋ค๋ ์ดํฐ์ ๋ํด์ ์์๋ณด์
์ ๋ค๋ ์ดํฐ
์ ๋ค๋ ์ดํฐ์ ์ ์
- iterator๋ฅผ ์์ฑํด์ฃผ๋ ํจ์, ํจ์์์ yield ํค์๋๋ฅผ ์ฌ์ฉํ๋ค.
yield๊ฐ ๋ญ์ผ!
-
ํจ์ ์์์ yield๋ฅผ ์ฌ์ฉํ๋ฉด ํจ์๋ ์ ๋๋ ์ดํฐ๊ฐ ๋๋ฉฐ yield์๋ ๊ฐ(๋ณ์)์ ์ง์ ํ๋ค.
-
generator ํจ์๊ฐ ์คํ ์ค yield ๋ฅผ ๋ง๋ ๊ฒฝ์ฐ, ํด๋น ํจ์๋ ๊ทธ ์ํ๋ก ์ ์ง ๋๋ฉฐ, ๋ฐํ ๊ฐ์ next() ๋ฅผ ํธ์ถํ ์ชฝ์ผ๋ก ์ ๋ฌ ํ๊ฒ ๋๋ค. ์ดํ ํด๋น ํจ์๋ ์ผ๋ฐ์ ์ธ ๊ฒฝ์ฐ ์ฒ๋ผ ์ข
๋ฃ๋๋ ๊ฒ์ด ์๋๋ผ ๊ทธ ์ํ๋ก ์ ์ง๋๊ฒ ๋๋ค.
์ถ์ฒ
yield๊ฐ์ ๋ฐ๋ ์์
def generator_send():
received_value = 0
while True:
received_value = yield
print("received_value = ",end=""), print(received_value)
yield received_value * 2
ํจ์ ์์์ 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)์ ๊ณ์ฐ์ ๊ฒฐ๊ณผ๊ฐ์ด ํ์ํ ๋๊น์ง ๊ณ์ฐ์ ๋ฆ์ถ๋ ๊ธฐ๋ฒ์ด๋ค. ๋ ๊ฐ์ง ๊ด๋ จ๋ ํญ๋ชฉ๋ค์ด ์๋๋ฐ ์ง์ฐ ๊ณ์ฐ๋ฒ๊ณผ ์ต์ ๊ณ์ฐ๋ฒ์ด๋ค.
๋๊ธํ๊ฒ ๊ณ์ฐํ๋ฉด ํ์์๋ ๊ณ์ฐ์ ํ์ง ์์ผ๋ฏ๋ก ์คํ์ ๋ ๋น ๋ฅด๊ฒ ํ ์ ์๊ณ , ๋ณตํฉ ์์์ ๊ณ์ฐํ ๋ ์ค๋ฅ ์ํ๋ฅผ ํผํ ์ ์๊ณ , ๋ฌดํ ์๋ฃ ๊ตฌ์กฐ๋ฅผ ์ธ ์ ์๊ณ , ๋ฏธ๋ฆฌ ์ ์๋ ๊ฒ์ ์ด์ฉํ์ง ์๊ณ ๋ณดํต ํจ์๋ก ์ ์ด ๊ตฌ์กฐ๋ฅผ ์ ์ํ ์ ์๋ค.
์ถ์ฒ
์์๋ ์ํค๋ฐฑ๊ณผ์์ ๋ด๋ฆฐ ์ ์์ด๊ณ
lazy evaluation์ ์ดํดํ๊ธฐ ์ํด์ ๋ฆฌ์คํธ ํํ์๊ณผ ์ ๋ค๋ ์ดํฐ ํํ์๊ณผ ๋น๊ตํ๋ฉด์ ์์๋ณด์
์ ๋๋ ์ดํฐ ํํ์(generator expression)
- ์ ๋๋ ์ดํฐ ํํ์์ 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
ํจ์๊ฐ ์คํ๋๊ณ ๋์ ๋์ค๋ ๊ฒ์ด๋ฏ๋ก ์ ๋ค๋ ์ดํฐ ํํ์์ผ๋ก ํ ๋
์์ ์์๋ฅผ ์ฐ๊ธฐ์ ๊น์ง๋ ํจ์๋ฅผ ์คํํ์ง ์์๋ค.
Lazy Evaluation์ ์ฅ์
- ์ ์์ ์ ์๋๋ฐฉ์์์ ๋ณด์๋ฏ์ด Lazy Evaluation์ ํ์ํ ๋ ๊ฐ์๋๋ฉด ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฌ๋ฅผ ํ์ง ์๋๋ค. ๊ทธ๋ฌ๋ฏ๋ก ๋ฉ๋ชจ๋ฆฌ ๋ญ๋น๋ฅผ(๋ฆฌ์์ค ๋ญ๋น)๋ฅผ ๋ฐฉ์งํ ์ ์๋ค.
Author And Source
์ด ๋ฌธ์ ์ ๊ดํ์ฌ(๐ ์ ๋ค๋ ์ดํฐ), ์ฐ๋ฆฌ๋ ์ด๊ณณ์์ ๋ ๋ง์ ์๋ฃ๋ฅผ ๋ฐ๊ฒฌํ๊ณ ๋งํฌ๋ฅผ ํด๋ฆญํ์ฌ ๋ณด์๋ค https://velog.io/@sdk1926/์ ๋ค๋ ์ดํฐ์ ์ ๊ท์: ์์์ ์ ๋ณด๊ฐ ์์์ URL์ ํฌํจ๋์ด ์์ผ๋ฉฐ ์ ์๊ถ์ ์์์ ์์ ์ ๋๋ค.
์ฐ์ํ ๊ฐ๋ฐ์ ์ฝํ ์ธ ๋ฐ๊ฒฌ์ ์ ๋ (Collection and Share based on the CC Protocol.)
์ข์ ์นํ์ด์ง ์ฆ๊ฒจ์ฐพ๊ธฐ
๊ฐ๋ฐ์ ์ฐ์ ์ฌ์ดํธ ์์ง
๊ฐ๋ฐ์๊ฐ ์์์ผ ํ ํ์ ์ฌ์ดํธ 100์ ์ถ์ฒ ์ฐ๋ฆฌ๋ ๋น์ ์ ์ํด 100๊ฐ์ ์์ฃผ ์ฌ์ฉํ๋ ๊ฐ๋ฐ์ ํ์ต ์ฌ์ดํธ๋ฅผ ์ ๋ฆฌํ์ต๋๋ค