π§ κ·Έλμ νλ‘μ νΈλ₯Ό μ§νν λ μ¬λ¬ κΈ°λ₯μ ꡬννλ©° λ°μ½λ μ΄ν°λ₯Ό νμ©νκ³€ νμμ§λ§, ν΄λ‘μ λ 무μμΈκ°? λ°μ½λ μ΄ν°λ 무μμΈκ°? λΌλ μ§λ¬Έμ μμ μκ² λμ Έλ³΄λ©΄ λ§μ‘±μ€λ¬μ΄ λ΅λ³μ΄ νμ΄ λμ€μ§ μμμ μΈμ§νμκΈ°μ νλ² μ§κ³ λμ΄κ°κ³ μ νλ€.
def greeting():
def hello():
print("Hello!")
hello()
>>> greeting()
Hello!
hello() ν¨μλ λΆλͺ¨ν¨μ μμμλ§ μ¬μ©ν μ μλ€.
μμ κ°μ΄ μ€μ²©ν¨μλ₯Ό μ°λ μ΄μ μλ ν¬κ² κ°λ μ±κ³Ό ν΄λ‘μ κ° μλ€. λ°λ³΅λλ μ‘μ μ ν¨μ μμ μ μ νλ©΄ μ½λ κΈΈμ΄λ₯Ό μ€μΌ μ μλ€. ν΄λ‘μ μ λν΄μλ μλμμ μ€λͺ νλλ‘ νκ² λ€.
ν΄λ‘μ μ μ¬μ©μ ν΅ν΄ λΆλͺ¨ν¨μμ λ³μλ μ 보λ₯Ό κ°λλ€.
μ΄λ€ μ 보λ₯Ό κΈ°λ°μΌλ‘ μ°μ°μ μ€ννκ³ μΆμΌλ κ·Έ μ 보μ μ κ·Όμ μ ννμ¬ λ ΈμΆμ΄λ μμ μ λ§κ³ μ ν λ μ¬μ©νλ€.
ν΄λ‘μ μ μΈ κ°μ§ 쑰건
1) Nested ꡬ쑰λ₯Ό κ°μΆ°μΌ νλ€.
2) μ€μ²©ν¨μκ° λΆλͺ¨ν¨μμ λ³μλ μ 보λ₯Ό μ€μ²©ν¨μ λ΄μμ μ¬μ©ν΄μΌ νλ€.
3) λΆλͺ¨ν¨μλ return κ°μΌλ‘ μ€μ²©ν¨μλ₯Ό return ν΄μΌ νλ€.
μλμ μμλ₯Ό 보λλ‘ νμ.
def generate_power(base_number): #line1
def nth_power(power): #line2
return base_number ** power #line3
return nth_power #line4
>>> calculator = generate_power(2)
>>> calculator(5)
32
generate_power(2)
μμ base_number '2'λ₯Ό λ°μ μνμ΄λ€. calulator(5)
λ₯Ό ν΅ν΄ powerλ₯Ό λ°κ²λκ³ 2μ 5μΉμ΄ κ³μ°λλ€. Decoratorλ, 'ν¨μλ₯Ό μΈμλ‘ λ°μ μλ‘μ΄ ν¨μλ₯Ό λ§λ€μ΄ λ°ννλ ν¨μ' μ΄λ€.
μ’ λ μ€μ μ¬μ©κ³Ό μ°κ΄λκ² μ€λͺ νμλ©΄, "ν¨μ μ€ν μ νΉμ λμμ νκ² νλ κ²" μ΄λΌκ³ ν μ μλ€.
import time
def perf_clock(func):
def perf_clocked(*args):
# μμ μκ°
st = time.perf_counter()
result = func(*args)
# μ’
λ£ μκ°
et = time.perf_counter() - st
# ν¨μλͺ
name = func.__name__
# λ§€κ°λ³μ
arg_str = ','.join(repr(arg) for arg in args)
# μΆλ ₯
print('Result : [%0.5fs] %s(%s) -> %r' %(et, name, arg_str,result))
return result
return perf_clocked
# @λ₯Ό μ΄μ©ν΄μ ν¨μλ₯Ό μλνκΈ° μ μ λ°μ½λ μ΄ν° ν¨μκ° μλ ν¨μλ₯Ό νλΌλ―Έν°λ‘ λ°μ μ€ννλ νν
@perf_clock
def time_func(seconds):
time.sleep(seconds)
@perf_clock
def sum_func(*numbers):
return sum(numbers)
@perf_clock
def fact_func(n):
return 1 if n < 2 else n * fact_func(n-1)
time_func(3) // # Result : [3.00306s] time_func(3) -> None
sum_func(1,2,3) // # Result : [0.00000s] sum_func(1,2,3) -> 6