Written on
·
244
1
남박사님 안녕하세요~. 수업 재밌게 듣고 있습니다.
아래 코드의 클로져에 대한 내용은 이해했습니다.
import time
def time_checker(func):
def inner_function(*args, **kwargs):
start_time = time.time()
result = func(*args, **kwargs)
end_time = time.time()
print(type(result))
print("함수 {} 동작시간 {}".format(func.__name__, end_time-start_time))
return result
return inner_function
def test1():
for i in range(5):
time.sleep(0.1)
f = time_checker(test1)
f()
1. f= time_checker(test1)
time_checker 실행하여 f에 inner_function 리턴 후, result에 test1()의 값(None) 담음
2.f()
inner_function 실행하여 print() 및 test1()의 값 리턴
@time_checker # test1 = time_checker(test1)
def test1():
for i in range(5):
time.sleep(0.1)
test1()
1.@time_checker [ #test1 = time_checker(test1) ]
test1 = time_checker(test1) -->time_checker 실행하여 test1에 inner_function 리턴 후, result에 test1()의 값(None) 담음
2.test1()
test1()이 곧 inner_function()이므로 print() 및 test1()의 값 리턴
3.헷갈리는 점
이제 test1()이 inner_function이 되었고, test1() 정의 아래의 func도 test1()이니 충돌이 나지 않나요?
def inner_function(*args, **kwargs):
start_time = time.time()
result = func(*args, **kwargs)
end_time = time.time()
print(type(result))
print("함수 {} 동작시간 {}".format(func.__name__, end_time-start_time))
return result
P.S 저의 경우 time_checker의 동작 시간이 0.54초로 오차가 너무 큽니다. 컴퓨터 사양의 문제일까요,,?
Answer 2
1
이제 test1()이 inner_function이 되었고, test1() 정의 아래의 func도 test1()이니 충돌이 나지 않나요?
test1이 timer_checker의 func 인자로 넘어갔고 test1 함수가 확장이 된 개념이기 때문에 test1()이 inner_function이 된 게 아닙니다. 그러므로 확장된 함수의 인자로 func에 test1가 담기게 되고 func()를 호출함으로써 확장된 함수의 test1 함수가 호출되는 역할을 하게 됩니다.
물론 이 모든 행위는 test1()을 호출하는 순간 동작하며 호출 되기 전까지는 메모리에 정의만 된 상태로 유지되게 됩니다. 이렇게 함수를 메모리에 확장하여 보관해놓는게 클로저의 핵심적인 내용이라 보시면 됩니다.
0