이 글은 파이썬 – 퍼스트클래스 함수 (First Class Function) 글을 보고 정리한 글입니다. 내용을 그대로 참고하였습니다.
def square(x):
return x * x
print(square(5))
f = square
print(square)
print(f)
#
25
<function square at 0x7fdac81244c0>
<function square at 0x7fdac81244c0>
def square(x):
return x * x
f = square
print(f(5))
#
25
num_list = [1, 2, 3, 4, 5]
def square(x):
return x * x
def my_map(func, arg_list):
result = []
for i in arg_list:
result.append(func(i)) # square 함수 호출, func == square
return result
squares = my_map(square, num_list) # 두 가지 인자를 전달. 하나는 square 함수 / 하나는 num_list
print(squares)
#
[1, 4, 9, 16, 25]
square
라는 함수를 인자로 하여 num_list
와 함께 인자로 보내서 함수의 결과값을 출력합니다.num_list = [1, 2, 3, 4, 5]
def simple_square(arg_list):
result = []
for i in arg_list:
result.append(i * i)
return result
simple_squares = simple_square(num_list)
print(simple_squares)
#
[1, 4, 9, 16, 25]
def square
처럼 다양하게 함수를 사용하고 싶다면, 함수를 직접 인자로 보내 출력하는 방법을 선택할 수도 있습니다.def square(x):
return x * x
def cube(x):
return x * x * x
def quad(x):
return x * x * x * x
def my_map(func, arg_list):
result = []
for i in arg_list:
result.append(func(i)) # square 함수 호출, func == square
return result
num_list = [1, 2, 3, 4, 5]
squares = my_map(square, num_list)
cubes = my_map(cube, num_list)
quads = my_map(quad, num_list)
print(squares)
print(cubes)
print(quads)
#
[1, 4, 9, 16, 25]
[1, 8, 27, 64, 125]
[1, 16, 81, 256, 625]
square
, cube
, quad
와 같은 여러 개의 함수나 모듈이 있다고 가정했을 때, my_map
과 같은 wrapper 함수
를 하나만 정의하여 기존의 함수나 모듈을 수정할 필요가 없이 편리하게 사용할 수 있습니다.def calc():
a = 3
b = 5
def mul_add(x):
return a * x + b # 함수 바깥쪽에 있는 지역 변수 a, b를 사용하여 계산
return mul_add # mul_add 함수를 반환
c = calc()
print(c(1), c(2), c(3), c(4), c(5))
#
8 11 14 17 20
def calc():
a = 3
b = 5
def mul_add(x):
return a * x + b
return mul_add
c = calc()
print(c(1), c(2), c(3), c(4), c(5))
def calc():
a = 3
b = 5
return lambda x: a * x + b # 람다 표현식을 반환
c = calc()
print(c(1), c(2), c(3), c(4), c(5))
#
8 11 14 17 20
def logger(msg):
def log_message(): # 1
print('Log: ', msg)
return log_message
log_hi = logger('Hi')
print(log_hi) # log_message 오브젝트가 출력됩니다.
log_hi() # "Log: Hi"가 출력됩니다.
#
<function logger.<locals>.log_message at 0x7f83f0184550>
Log: Hi
msg
와 같은 함수의 지역 변수 값은 함수가 호출된 이후에 메모리상에서 사라지므로 다시 참조할 수가 없는데, msg 변수에 할당했던 ‘HI’ 값이 logger 함수가 종료된 이후에도 참조가 됐다는 것입니다.def logger(msg):
def log_message(): # 1
print('Log: ', msg)
return log_message
log_hi = logger('Hi')
print(log_hi) # log_message 오브젝트가 출력됩니다.
log_hi() # "Log: Hi"가 출력됩니다.
del logger # 글로벌 네임스페이스에서 logger 오브젝트를 지웁니다.
# logger 오브젝트가 지워진 것을 확인합니다.
try:
print(logger)
except NameError:
print('NameError: logger는 존재하지 않습니다.')
log_hi() # logger가 지워진 뒤에도 Log: Hi"가 출력됩니다.
#
<function logger.<locals>.log_message at 0x0000022EC0BBAAF0>
Log: Hi
NameError: logger는 존재하지 않습니다.
Log: Hi
# 단순한 일반 함수
def simple_html_tag(tag, msg):
print('<{0}>{1}<{0}>'.format(tag, msg))
simple_html_tag('h1', '심플 헤딩 타이틀')
print('-' * 30)
# 함수를 리턴하는 함수
def html_tag(tag):
def wrap_text(msg):
print('<{0}>{1}<{0}>'.format(tag, msg))
return wrap_text
print_h1 = html_tag('h1') # 1
print(print_h1) # 2
print_h1('첫 번째 헤딩 타이틀') # 3
print_h1('두 번째 헤딩 타이틀') # 4
print_p = html_tag('p')
print_p('이것은 패러그래프 입니다.')
#
<h1>심플 헤딩 타이틀<h1>
------------------------------
<function html_tag.<locals>.wrap_text at 0x7fac481245e0>
<h1>첫 번째 헤딩 타이틀<h1>
<h1>두 번째 헤딩 타이틀<h1>
<p>이것은 패러그래프 입니다.<p>
코딩 도장 클로저 : 클로저에 대한 부분을 참고하였습니다.