๐Ÿงฒ ์ œ๋„ˆ๋ ˆ์ดํ„ฐ

may_soouuยท2020๋…„ 8์›” 24์ผ
0

์ œ๋„ˆ๋ ˆ์ดํ„ฐ ํ‘œํ˜„์‹

๋ฐ˜๋ณต์ž(iterator)๋ฅผ ์ƒ์†ํ•ด ๋งŒ๋“  ๊ธฐ๋Šฅ์ด ์ œ๋„ˆ๋ ˆ์ดํ„ฐ ํด๋ž˜์Šค์ด๋‹ค.
์ œ๋„ˆ๋ ˆ์ดํ„ฐ๋Š” ํ‘œํ˜„์‹๊ณผ ์ •์˜๋ฌธ์„ ์ œ๊ณตํ•œ๋‹ค.

์ •์˜๋ฌธ์˜ ๊ฒฝ์šฐ, ํ•จ์ˆ˜์ฒ˜๋Ÿผ def๋ฅผ ์‚ฌ์šฉํ•˜์ง€๋งŒ,
๋ฐ˜ํ™˜๊ฐ’์„ return ๋Œ€์‹  yield ๋กœ ํ‘œํ˜„ํ•œ๋‹ค.

ํ•จ์ˆ˜๋Š” ํ•œ๋ฒˆ ์‹ค์Ÿํ•˜๋ฉด ๋‚ด๋ถ€์˜ ์ฒ˜๋ฆฌ๋œ ๋‚ด์šฉ์„ ์ „๋ถ€ ์‚ญ์ œํ•œ๋‹ค.
์ œ๋„ˆ๋ ˆ์ดํ„ฐ ๊ฐ์ฒด๋Š” ํŠน์ • ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ด๋„ ๊ฐ์ฒด๊ฐ€ ์†Œ๋ฉธ๋˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๋‹ค์Œ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•ด ๋Œ€๊ธฐํ•œ๋‹ค.

์ œ๋„ˆ๋ ˆ์ดํ„ฐ ํ‘œํ˜„์‹์€ ๊ด„ํ˜ธ ์•ˆ์— ์ปดํ”„๋ฆฌํ—จ์…˜ ํ‘œ๊ธฐ๋ฒ•์„ ์‚ฌ์šฉํ•œ๋‹ค.

g = (x for x in range(3))
print(g)
   #result : <generator object <genexpr> at 0x7fdfefd7f4a0>

print(next(g)) #result : 0 
print(next(g)) #result : 1
print(next(g)) #result : 2

* ์›์†Œ๋ฅผ ํ•˜๋‚˜์”ฉ ๊ฐ€์ ธ์˜ค๋‹ค๊ฐ€ ๋” ์ด์ƒ ๋ฐ˜ํ™˜ํ•  ์›์†Œ๊ฐ€ ์—†์œผ๋ฉด

stopIteration ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒ ํ•œ๋‹ค.

print(next(g,'์ข…๋ฃŒ')) #result : 2, '์ข…๋ฃŒ'
๐Ÿ‘ผ๐Ÿป์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€๋งŒ, ๋Œ€์‹ ํ•  ๋ฉ”์‹œ์ง€๋ฅผ ๋„ฃ์œผ๋ฉด ์˜ˆ์™ธ๋ฌธ๊ตฌ(์ข…๋ฃŒ)๊ฐ€ ๋œฌ๋‹ค.๐Ÿ‘ผ๐Ÿป


* ํ•œ ๋ฒˆ ์‚ฌ์šฉํ•œ ์ œ๋„ˆ๋ ˆ์ดํ„ฐ๋Š” ๋‹ค์‹œ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค๋ฅธ ๋ณ€์ˆ˜์— ํ• ๋‹นํ•ด์„œ ๋ชจ๋“  ์›์†Œ๋ฅผ ๊บผ๋‚ด์™€์•ผ ํ•œ๋‹ค.
g_ = (x for x in range(3))

-------์ œ๋„ˆ๋ ˆ์ดํ„ฐ ๊ฐ์ฒด์˜ ์›์†Œ๋ฅผ ๋ฐ”๋กœ ์ถ”์ถœํ•˜๋ ค๋ฉด ?!-------
[*g_] ๋ฆฌ์ŠคํŠธ ์•ž์— ๋ณ„ ๋ถ™์ด๊ธฐ !

์ œ๋„ˆ๋ ˆ์ดํ„ฐ ์ •์˜๋ฌธ

์ œ๋„ˆ๋ ˆ์ดํ„ฐ๋ฅผ ์ •์˜ํ•  ๋•Œ๋Š” ํ•จ์ˆ˜ ๋ฌธ์žฅ๊ณผ yield ์‚ฌ์šฉํ•œ๋‹ค.

  • ํ˜ธ์ถœํ•˜๋ฉด yield ๋ฅผ ๋งŒ๋‚˜๋Š” ๊ณณ๊นŒ์ง€ ์‹คํ–‰ํ•˜๊ณ , ๋‹ค์Œ ํ˜ธ์ถœ์ด ์žˆ์„ ๋•Œ๊นŒ์ง€ yield ๋‹ค์Œ ๋ฌธ์žฅ์€ ์ฒ˜๋ฆฌํ•˜์ง€ ์•Š๋Š”๋‹ค.
def gen_():
    print('์ฒ˜๋ฆฌ๋ฐฉ์‹1')
    yield 1
    print('์ฒ˜๋ฆฌ๋ฐฉ์‹2')
    
g2 = gen_() #์ œ๋„ˆ๋ ˆ์ดํ„ฐ ๊ฐ์ฒด ์ƒ์„ฑ
print(next(g2))   #result: ์ฒ˜๋ฆฌ๋ฐฉ์‹1
                           1

์ œ๋„ˆ๋ ˆ์ดํ„ฐ ๊ฐ์ฒด๋ฅผ ์ฒ˜๋ฆฌํ•˜๋ฉด ์ฒซ๋ฒˆ์งธ print๋ฌธ์„ ์ถœ๋ ฅํ•˜๊ณ  ๊ฐ’์„ ๋ฐ˜ํ™˜

def gen_():
    print('์ฒ˜๋ฆฌ๋ฐฉ์‹1')
    yield 1
    print('์ฒ˜๋ฆฌ๋ฐฉ์‹2')
    
g2 = gen_() #์ œ๋„ˆ๋ ˆ์ดํ„ฐ ๊ฐ์ฒด ์ƒ์„ฑ
print(next(g2))           #result : ์ฒ˜๋ฆฌ๋ฐฉ์‹1
                                    1
print(next(g2,'์ข…๋ฃŒ'))     #result : ์ฒ˜๋ฆฌ๋ฐฉ์‹2
 > yield ๋ฌธ์„ ๋งŒ๋‚˜์ง€ ๋ชปํ•ด ์ข…๋ฃŒ ์ฒ˜๋ฆฌ       ์ข…๋ฃŒ

๋‘ ๋ฒˆ next ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•ด์„œ ์ œ๋„ˆ๋ ˆ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋ฉด yield ๋Š” ํ•œ๋ฒˆ๋งŒ ์ž‘๋™๋˜๊ณ , ๋”๋Š” ์ฒ˜๋ฆฌํ•  yield ๊ฐ€ ์—†์–ด ์‚ฌ์šฉ์ด ์ข…๋ฃŒ๋œ๋‹ค.


๐Ÿคทโ€โ™‚๏ธ๐Ÿคท๐Ÿผโ€โ™€๏ธ๐Ÿคท๐Ÿป ๊ทธ๋ž˜์„œ ์ œ๋„ˆ๋ ˆ์ดํ„ฐ๋ฅผ ์™œ ์“ฐ์ง€,,,?


๐Ÿ‘€ ์˜ˆ์ œ ํ’€์–ด๋ณด๊ธฐ

  • ์ œ๋„ˆ๋ ˆ์ดํ„ฐ๋Š” Lazy Evaluation ๊ตฌํ˜„์ฒด์ด๋‹ค.

    lazy evaluation ์ด๋ž€?
    ์–ด๋–ค ๊ฐ’์ด ์‹ค์ œ๋กœ ์“ฐ์ผ ๋•Œ ๊นŒ์ง€ ๊ทธ ๊ฐ’์˜ ๊ณ„์‚ฐ์„ ๋’ค๋กœ ๋ฏธ๋ฃจ๋Š” ๋™์ž‘ ๋ฐฉ์‹
    ์ฆ‰, ํ•„์š”ํ•  ๋•Œ ๊ฐ’์„ ๊ณ„์‚ฐํ•ด์ฃผ๋Š” ๊ฐ์ฒด๋‹ค

    ๊ทธ๋ž˜์„œ ์‹œ๊ฐ„๊ณผ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ ˆ์•ฝํ•  ์ˆ˜ ์žˆ๋‹ค

  • ๋ฆฌ์ŠคํŠธ ์ปดํ”„๋ฆฌํ—จ์…˜๊ณผ์˜ ์ฐจ์ด์ ์€

    ๋ฆฌ์ŠคํŠธ ์ปดํ”„๋ฆฌํ—จ์…˜ :
    ์ˆœํ™˜๋ฌธ์— ์žˆ๋Š” ๊ฐ์ฒด๊ฐ€ ํ•œ๋ฒˆ์— ์ถœ๋ ฅ๋œ๋‹ค.
    ๋Œ€๊ด„ํ˜ธ๋กœ ๋ฌถ๋Š”๋‹ค []

    ์ œ๋„ˆ๋ ˆ์ดํ„ฐ:
    ์ปดํ”„๋ฆฌํ—จ์…˜์„ () ์†Œ๊ด„ํ˜ธ๋กœ ๋ฌถ๋Š”๋‹ค


L = [ 1,2,6,9]
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_iter(comprehension_list)

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

    						(์ถœ์ฒ˜ : ์œ„์ฝ”๋“œ)

์ปดํ”„๋ฆฌํ—จ์…˜๊ณผ ์ œ๋„ˆ๋ ˆ์ดํ„ฐ ๋‘๊ฐ€์ง€ ๊ฒฝ์šฐ ๊ฐ๊ฐ ์‹คํ–‰ํ•ด๋ณด๋ฉด
์ปดํ”„๋ฆฌํ—จ์…˜์˜ ๊ฒฝ์šฐ,

comprehension_list=
sleep 1s
sleep 1s
sleep 1s
sleep 1s
1
2
6
9

์ œ๋„ˆ๋ ˆ์ดํ„ฐ์˜ ๊ฒฝ์šฐ,

generator_exp=
sleep 1s
1
sleep 1s
2
sleep 1s
6
sleep 1s
9

๐Ÿคทโ€โ™‚๏ธ ๊ถ๊ธˆ์ฆ : ํ•จ์ˆ˜์— ์ œ๋„ˆ๋ ˆ์ดํ„ฐ ์ž‘์„ฑ ์‹œ, ๋ฆฌํ„ด ๋Œ€์‹  yield ๋ฅผ ์จ์•ผํ•œ๋‹ค๊ณ  ํ–ˆ๋Š”๋ฐ, ๊ทธ๋ƒฅ return ์œผ๋กœ ๊ฐ’์„ ๋ฐ›์•„๋„ ์ƒ๊ด€์—†๋Š”๊ฑธ๊นŒ?,, > ๋•Œ์— ๋”ฐ๋ผ ๋‹ค๋ฆ„

profile
back-end ๊ฐœ๋ฐœ์ž

0๊ฐœ์˜ ๋Œ“๊ธ€