데코레이터 이해를 위한 First-class 함수
기존에 서술한 내용들과 중복될 수 있다
def outer_func(num):
# 중첩 함수에서 상위 함수의 변수에 접근 가능
def inner_func():
print(num)
return 'complex'
return inner_func
fn = outer_func(10) # <--- First-class function
print(fn()) # <--- Closure 호출
def calc_square(digit):
return digit * digit
a = calc_square
print(a)
""" 결과 : function calc_square at 0x7fc5080c4f70
즉, a 라는 변수에 함수가 할당되어 있는 것을 볼 수 있음. """
print(a(2))
""" 결과 : 4
a 에 할당된 calc_square 함수의 인자로 2가 전달되어 값은 4를 리턴함. """
def calc_square(digit):
return digit * digit
def list_square(function, digit_list):
result = []
for digit in digit_list:
result.append(function(digit))
print (result)
num_list = [1, 2, 3, 4, 5]
list_square(calc_square, num_list)
""" 결과 : [1, 4, 9, 16, 25]
calc_square 함수가 list_square 함수의 인자로 전달되어 result 배열에 값 추가. """
def logger(msg):
message = msg
def msg_creator(): # <--- 함수 안에 함수를 만들 수도 있음
print ('[HIGH LEVEL]: ', message)
return msg_creator
log1 = logger('Dave Log-in')
print(log1)
""" 결과 : <function logger.<locals>.msg_creator at 0x7f85180889d0>
log1 에는 리턴된 msg_creator 함수가 들어 있음.(즉, 함수 호출이 아니라 함수가 담겨 있음.)"""
log1()
""" 결과 : [HIGH LEVEL]: Dave Log-in
msg_creator 함수가 호출되어 위와 같은 결과를 리턴함. """