1 def generate_power(base_number):
2 def nth_power(power):
3 return base_number ** power
4
5 return nth_power
6
7
8 calculate_power_of_two = generate_power(2)
9 calculate_power_of_two(7)
함수 실행라인 순서
1->8->1->2->5->9->2->3
코드가 위에서 아래로 내려오니 1번라인의 generate_power(base_number)가 시작되고
인자를 받기위해 8번라인 generate_power(2)에서 인자를 받는다.
그러면 아래와같은 상태가된다.
1 def generate_power(2):
2 def nth_power(power):
3 return 2 ** power
4
5 return nth_power
6
7
8 calculate_power_of_two = generate_power(2)
9 calculate_power_of_two(7)
def generate_power(2) 함수가 실행됐지만 내부의 def nth_power(power)는 받을 인자가 없어 실행되지 않고
아래로 내려와 def generate_power(2)의 return nth_power가 되어 아래코드의 함수를 호출하는 상태가 된다.
def nth_power(power):
3 return 2 ** power
이 상태가 8번라인의 generate_power(2)가 할당된 calculate_power_of_two 안에 들어가고
9번라인의 인자 7이 할당되어
9 calculate_power_of_two(7)
2번라인 def nth_power(power)함수에 들어가 아래와같이 되고 최종적으로 2 ** 7 즉, 2의 7승인 128이 리턴된다.
2 def nth_power(7):
3 return 2 ** 7
1 def welcome_decorator(func):
3
4 def wrapper():
5
6 return func()+"welcome to WECODE!"
7
8 return wrapper
9
10 @welcome_decorator
11 def greeting():
12 return "Hello, "
13
14 greeting()
1 def welcome_decorator(func):
3
4 def wrapper():
5
6 return func()+"welcome to WECODE!"
7
8 return wrapper
9
10
11 def greeting():
12 return "Hello, "
13
14 deco=welcome_decorator(greeting) -- 클로저로표현방법
15 deco() --
1)과 2)는 실행결과가 "Hello, welcome to WECODE!"로 결과가 일치한다.
클로저로 실행할것을 데코레이터로 실행하면 더 간단하기때문에 데코레이터를 사용한다.
이제 데코레이터 실행순서를 알아보겠다
1 def welcome_decorator(func):
3
4 def wrapper():
5
6 return func()+"welcome to WECODE!"
7
8 return wrapper
9
10 @welcome_decorator
11 def greeting():
12 return "Hello, "
13
14 greeting()
현재 14번 라인에 greeting()을 선언했으므로 greeting()이 실행되어야하는데 11번라인 def greeting() 바로윗줄에
@welcome_decorator 이렇게 @로 1번라인 함수를 데코레이터 해준것을 볼수 있다.
이럴경우 선언은 greeting()을 했지만 def greeting() 윗줄의 @welcome_decorator 함수인 def welcome_decorator(func)가 먼저 실행이 된다.
14번라인의 greeting()은 아래코드를 함축한것으로 이해하면된다.
deco=welcome_decorator(greeting) -- 클로저로표현방법
deco()
그러면 결과는 "Hello, welcome to WECODE!"로 나오게 된다.