OOP(Object Oriented Programming)에서 사용되는 개념 중 하나
변수나 데이터 구조에 넣을 수 있어야 한다
매개변수에 전달할 수 있어야 한다
반환값으로 사용할 수 있어야 한다
함수를 다른 변수와 동일하게 다루는 언어는 일급 함수를 가졌다고 표현
함수를 다른 함수에 매개변수로 제공하거나, 함수가 함수를 반환할 수 있으며, 변수에도 할당할 수 있다
파이썬의 함수는 일급 함수
def func(a, b):
return a + b
k = func #k라는 변수에 func 함수 할당
print(func)
print(k) #func 함수와 k는 같은 주소를 가리킨다
print(k is func)
print(k(1, 2))
#출력 결과
#<function func at 0x017FC4A8>
#<function func at 0x017FC4A8>
#True
#3
def add(a, b):
return a + b
def minus(a, b):
return a - b
calc = [add, minus]
for i in calc:
print(i)
for i in calc:
print(i(10, 5))
#출력 결과
#<function add at 0x0193C4F0>
#<function minus at 0x0193C4A8>
#15
#5
def add(a, b):
return a + b
def minus(a, b):
return a - b
calc = {
"add": add,
"minus": minus,
}
num1 = calc['add'](10, 5)
num2 = calc['minus'](10, 5)
print(num1, num2)
#출력 결과
#15 5
def add(a, b):
return a + b
def add_func(func, a, b): #매개변수로 함수 받음
print(func(a, b))
add_func(add, 1, 2)
#출력 결과
#3
def square(x):
return x*x
def cube(x):
return x*x*x
def my_func(func, args_list):
result = [func(i) for i in args_list]
return result
l = [1, 2, 3, 4, 5]
ans = my_func(square, l)
print(ans)
ans2 = my_func(cube, l)
print(ans2)
#출력 결과
#[1, 4, 9, 16, 25]
#[1, 8, 27, 64, 125]
def func(name):
def printer(): #클로저
print(f'Hello {name}')
return printer
print(func)
f = func("NAME")
f()
#클로저는 다른 함수의 지역변수를 그 함수가 종료된 이후에도 기억할 수 있다
del func
try:
print(func)
except NameError:
print('NameError: func는 존재하지 않습니다')
f()
#출력 결과
#<function func at 0x01AAC4F0>
#Hello NAME
#NameError: func는 존재하지 않습니다
#Hello NAME
printer를 리턴값으로 리턴하여 f라는 변수에 할당한 후 호출한 것을 볼 수 있음
name 같은 함수의 지역변수 값은 함수가 호출된 이후에 메모리상에서 사라지므로 다시 참조할 수 없는데 f 변수에 할당됐던 'NAME'값이 func 함수가 종료된 이후에도 참조가 됨
이러한 printer 같은 함수를 클로저(closure)
[Python] 클로저(closure)
참고
https://developer.mozilla.org/ko/docs/Glossary/First-class_Function
http://schoolofweb.net/blog/posts/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%ED%8D%BC%EC%8A%A4%ED%8A%B8%ED%81%B4%EB%9E%98%EC%8A%A4-%ED%95%A8%EC%88%98-first-class-function/
https://dojang.io/mod/page/view.php?id=2371
https://tibetsandfox.tistory.com/8