# 외부 함수 선언
def outer_function():
# 중첩 함수( = 내부 함수) 선언
def inner_function():
print("this is a inner function")
inner_function()
outer_function()
# 결과
>>> this is a inner function
def generate_power(base_number):
# 중첩 함수에서 외부 함수의 변수에 접근 가능
def nth_power(power):
return base_number ** power
# 중첩 함수 이름을 리턴
return nth_power
# generate_power(2)함수를 calculate_power_of_two라는 변수에 저장
calculate_power_of_two = generate_power(2)
# 저장해둔 함수를 호출. 즉, Closure호출. Closure호출시 내부 함수가 실행됨
print(calculate_power_of_two(7))
# 결과 (2**7의 결과)
>>> 128
## 참고 ##
print(calculate_power_of_two)
# 결과
<function generate_power.<locals>.nth_power at 0x7f8fd01ca4c0>
유료 회원에 한해서 대박 주식 정보를 알려주는 함수인 jackpot_stock_info가 있다고 하자.
jackpot_stock_info 함수 실행전에 해당 유저가 유료 유저인지 꼭 확인해야 한다.
이를 데코레이터로 구현해보자.
# 데코레이터 함수 작성
def is_paid_user(func): # func는 이 함수 안에 넣을 함수 이름을 말함
user_paid = True # 테스트를 위해 true로만 설정
# 실제 실행하려고 한 함수를 중첩 함수를 통해 실행시킨다.
def wrapper(): # 호출할 함수를 감싸는 함수
if user_paid:
return func()
else:
return
return wrapper # closure 함수로 만듦
# 데코레이터 함수 적용
@is_paid_user
def jackpot_stock_info():
return "buy now!"
# 데코레이터가 적용된 함수 실행
print(jackpot_stock_info())
# 결과
>>> buy now!
def is_paid_user(func):
user_paid = True
def wrapper():
if user_paid:
return func()
else:
return
return wrapper
def jackpot_stock_info():
return "buy now!"
# 먼저 데코레이터 함수를 실행시키는 구문(=이 함수를 실행시킬 세팅이 되었다고 보면됨)이 어떤 변수에 할당되고,
# 데코레이터 함수를 호출하는 구문에서는 인자값으로 실제 호출하고자 하는 jackpot_stock_info 함수가 전달됨
check_user_first = is_paid_user(jackpot_stock_info)
# 데코레이터 함수(->클로저 개념 이용)가 실행시키는 변수를 함수처럼 실행하면,
# 데코레이터 함수의 내부 함수가 호출되는데 내부 함수는 jackpot_stock_info 함수를 리턴하므로 이때 jackpot_stock_info 함수가 실행된다.
print(check_user_first())
In [1]:
def outer_func(num):
# 중첩 함수에서 외부 함수의 변수에 접근 가능
def inner_func():
print(num)
return '안녕'
return inner_func # 중첩 함수 이름을 리턴합니다.
In [2]:
closure_func = outer_func(10) # <--- First-class function
closure_func() # <--- Closure 호출
Out [2]:
>>> 10
>>> '안녕'
del outer_func
In [4]:
closure_func()
Out [2]:
>>> 10
>>> '안녕'
# before
def calc_square(digit):
return digit * digit
def calc_power_3(digit):
return digit * digit * digit
def calc_quad(digit):
return digit * digit * digit * digit
print (calc_square(2))
print (calc_power_3(2))
print (calc_quad(2))
# 결과
>>> 4
>>> 8
>>> 16
# after
def calc_power(n):
def power(digit):
return digit ** n
return power
power2 = calc_power(2)
power3 = calc_power(3)
power4 = calc_power(4)
print (power2(2))
print (power3(2))
print (power4(2))
# 결과
>>> 4
>>> 8
>>> 16
1에서 5까지 1승부터 5승까지 출력하기 (위 calc_power() 함수를 사용해서 list_data 리스트 변수에 1승부터 5승까지 계산 클로져 함수를 넣어서 사용)
list_data = list()
for num in range(1, 6):
list_data.append(calc_power(num))
for func in list_data:
print(func(2))
# 결과
>>> 2
>>> 4
>>> 8
>>> 16
>>> 32