파이썬의 데코레이터 개념에 대해 알아보기에 앞서, "first-class function"과 "closure"에 대해서 나름대로 학습했다. 부정확하지만 지금까지 이해한 바를 기록해두려고 한다.
#### A programming language is said to have First-class functions when functions in that language are treated like any other variable. [출처](https://developer.mozilla.org/en-US/docs/Glossary/First-class_Function)즉, 어떤 프로그래밍 언어에서 함수가 문자형, 숫자형 등과 같은 여타 변수들과 동일하게 취급된다면 그 언어는 "1급 함수"를 가진다고 간주된다. 아래의 코드는 [유튜브 강좌](https://www.youtube.com/watch?v=kr0mpwqttM0)를 참조했음을 미리 밝힌다.
def square(x):
return x*x
f = square
print(f(6))
위의 간단한 예제에서, square는 인자의 제곱을 리턴하는 함수이지만, 동시에 f 라는 변수에 할당될 수도 있다. 일반적으로는 f=square(5)
등과 같이 함수에 인자를 넣은 상태만을 떠올리겠지만, 괄호 "()"를 붙이지 않으면 함수는 실행되지 않으며, 위와 같이 변수에 함수를 저장하는 것이 가능하다. 이는 파이썬 쉘에서 간단히 확인할 수 있다.
>>> def square(x):
... return x*x
...
>>> f=square
>>> print(square)
<function square at 0x7f9a281b1040>
>>> print(f)
<function square at 0x7f9a281b1040>
그렇기 때문에 f(5)
을 쉘에서 입력한다면, square(5)
와 같은 결과를 출력할 것이다.
def square(x):
return x*x
def cube(x):
return x*x*x
위의 두 함수 square
, cube
는 각각 인자의 제곱과 세제곱을 반환한다.
def my_map(func, arg_list):
result=[] ..........................(1)
for i in arg_list:
result.append(func(i))..........(2)
return result.......................(3)
cubes = my_map(cube, [1,2,3,4,5])
print(cubes)
my_map이라는 함수는, func라는 함수와, arg_list라는 리스트를 인자로 받는다. 순서대로 위 코드를 살펴보자면 다음과 같다.
(1)에서 빈 리스트를 만든다.
(2) arg_list라는 배열 안의 각 요소 i에 대해, 이를 인자이자 함수인 func에게 집어넣는다. 거기서 반환(저장)된 값을 가져와 빈 리스트에 더한다.
(3) 빈 리스트인 result에 (2) 에서 더한 값을 저장한다 (함수를 실행하지는 않고 단순히 결과만을 저장한다)
그렇기 때문에 앞서 정의한 cube
함수를 인자로 취하면 [1,8,27,64,125]라는 결과가 출력되겠지만, 만약 square
함수를 my_func
함수의 인자로 대입했다면 [1,4,9,16,25] 라는 결과가 출력되었을 것이다.