๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
IT/Python

[Python] ํด๋กœ์ €(Closure) ํ”„๋กœ๊ทธ๋žจ

by ITyranno 2023. 11. 14.
728x90
๋ฐ˜์‘ํ˜•

 

 

 

 

ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์„ธ๊ณ„๋ฅผ ํƒ๊ตฌํ•ฉ์‹œ๋‹ค.

 

 

 

 

<ํด๋กœ์ €(Closure)>
 - ํ•จ์ˆ˜ ์•ˆ์— ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด์„œ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹
 - ํ•จ์ˆ˜ ์•ˆ์— ์žˆ๋Š” ํ•จ์ˆ˜๋Š” ๋ฐ”๊นฅ์ชฝ ํ•จ์ˆ˜์—์„œ ์ฐธ์กฐํ•ด์„œ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ ‘๊ทผํ•ฉ๋‹ˆ๋‹ค.
 - ํ•จ์ˆ˜ ์•ˆ์— ํ•จ์ˆ˜๋Š” ์‚ฌ์šฉ์ด ๋๋‚˜๋ฉด ๋ฉ”๋ชจ๋ฆฌ์—์„œ ํ•ด์ œ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๋ฉด ์ข‹์Šต๋‹ˆ๋‹ค.

 

 

 

 

 

ํด๋กœ์ € ํ•จ์ˆ˜ ์ •์˜ํ•˜๊ธฐ

 

### ํด๋กœ์ € ํ•จ์ˆ˜ ์ •์˜ํ•˜๊ธฐ
def outer_function(x) :
    print(f"#1 : x = {x}")
    ### ๋‚ด๋ถ€ ํ•จ์ˆ˜ ์ •์˜ : ์‹ค์ œ ์‹คํ–‰๋˜๋Š” ํ•จ์ˆ˜
    def inner_function(y) :
        print(f"#2 : y = {y}")
        s = x + y
        print(f"#3 : s = {s}")
        return s
    print("#4 -------")
    return inner_function

 

 

 

ํด๋กœ์ € ํ•จ์ˆ˜ ํ˜ธ์ถœํ•˜๊ธฐ

 

 

### ํด๋กœ์ € ํ•จ์ˆ˜ ํ˜ธ์ถœํ•˜๊ธฐ
closure_exe = outer_function(10)
print(closure_exe)

# - closure_exe๋Š” inner_function ์ž์ฒด๋ฅผ ๋ฆฌํ„ด๋ฐ›์€ ํ•จ์ˆ˜๋ฅผ ์˜๋ฏธํ•จ

 

 

 

 

 

 

 

 

๋‚ด๋ถ€ ํ•จ์ˆ˜ ํ˜ธ์ถœํ•˜๊ธฐ

 

### ๋‚ด๋ถ€ ํ•จ์ˆ˜ ํ˜ธ์ถœํ•˜๊ธฐ
result1 = closure_exe(5)
print(result1)

 

 

 

 

 

 

 

ํด๋กœ์ €๋ฅผ ์ด์šฉํ•˜์—ฌ ๋ˆ„์ ํ•ฉ ๊ณ„์‚ฐํ•˜๊ธฐ

 

### ํด๋กœ์ €๋ฅผ ์ด์šฉํ•˜์—ฌ ๋ˆ„์ ํ•ฉ ๊ณ„์‚ฐํ•˜๊ธฐ
# - ์‚ฌ์šฉํ•จ์ˆ˜๋ช… : outer_function(), inner_function2(num)
# - ์‚ฌ์šฉ๋ณ€์ˆ˜ : total(๋ˆ„์ ๋œ๊ฐ’์„ ์ €์žฅํ•  ๋ณ€์ˆ˜)

def outer_function2() :
    total = 0
    print(f"#1 : total = {total}")
    def inner_function2(num) :
        ### nonlocal : ํด๋กœ์ € ๊ตฌ์กฐ์—์„œ๋Š” ์ƒ์œ„ ๋ณ€์ˆ˜๋ฅผ ๋‚ด๋ถ€ ํ•จ์ˆ˜์—์„œ ์‚ฌ์šฉ๋ชปํ•จ
        #            : ๋”ฐ๋ผ์„œ, nonlocal์„ ์ง€์ •ํ•ด์„œ ์ •์˜ํ•˜๋ฉด ์™ธ๋ถ€ ์˜์—ญ์˜ ๋ณ€์ˆ˜ ์‚ฌ์šฉ๊ฐ€๋Šฅ
        nonlocal total
        print(f"#2 : total = {total} / num = {num}")
        
        total += num
        print(f"#3 : total = {total} / num = {num}")
        
        return total
    print(f"#4-------------------------")
    return inner_function2

 

 

 

์ƒ์œ„ ํ•จ์ˆ˜ ํ˜ธ์ถœ

 

### ์ƒ์œ„ ํ•จ์ˆ˜ ํ˜ธ์ถœ
res_fnc = outer_function2()
res_fnc

 

 

 

 

 

 

๋‚ด๋ถ€ ํ•จ์ˆ˜ ํ˜ธ์ถœ

 

### ๋‚ด๋ถ€ ํ•จ์ˆ˜ ํ˜ธ์ถœ
rs_total = res_fnc(5)
print(rs_total)

 

 

 

 

 

 

 

๋‚ด๋ถ€ ํ•จ์ˆ˜ ํ˜ธ์ถœ

 

### ๋‚ด๋ถ€ ํ•จ์ˆ˜ ํ˜ธ์ถœ
rs_total = res_fnc(10)
print(rs_total)

 

 

 

 

 

<์กฐ๊ฑด๋ถ€ ํด๋กœ์ € ํ•จ์ˆ˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ>

 

def outer_function3(condition) :
    def true_case():
        return "true_case ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜์—ˆ์Šต๋‹ˆ๋‹ค."

    def false_case():
        return "false_case ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜์—ˆ์Šต๋‹ˆ๋‹ค."

    # condition์˜ ๊ฐ’์ด True์ด๋ฉด true_caseํ•จ์ˆ˜ ํ˜ธ์ถœ
    #                 False์ด๋ฉด false_caseํ•จ์ˆ˜ ์ •์˜
    rs = true_case if condition else false_case
    
    return rs

 

 

์ƒ์œ„ ํ•จ์ˆ˜ ํ˜ธ์ถœํ•˜๊ธฐ

 

### ์ƒ์œ„ ํ•จ์ˆ˜ ํ˜ธ์ถœํ•˜๊ธฐ
rs_function = outer_function3(True)
print(rs_function)

rs_functino = outer_function3(False)
print(rs_function)

 

rs_msg = rs_function()
print(rs_msg)

 

 

728x90
๋ฐ˜์‘ํ˜•

loading