본문 바로가기

Programming/Python

[Python] 일급함수(First-class Function)

파이썬로고

 

파이썬의 일급함수(First class Function)에 대해서 정리해보았습니다.

 

일급객체

프로그래밍 언어에서 일급객체(First class Object)란 아래의 조건을 만족하는 객체를 의미합니다.

  1. 변수에 할당할 수 있습니다.
  2. 함수의 인자로 전달할 수 있습니다.
  3. 함수의 리턴값으로 사용할 수 있습니다.
  4. 자료구조에 담을 수 있습니다.

파이썬에서는 숫자, 문자열, 리스트, 딕셔너리 뿐만 아니라 함수도 위의 조건을 만족합니다.

그래서 파이썬의 함수는 일급객체, 그리고 함수를 제공하는 파이썬은 일급 함수를 지원하는 언어입니다.

 

1. 함수를 변수에 할당

# 함수정의
def factorial(n):
    if n==1:
        return 1
    return n * factorial(n-1)

# 변수에 함수 할당
var_func = factorial
# 변수를 통한 함수 실행
print(var_func(10)) # 10! = 3628800

예제에서 factorial 함수는 var_func 변수에 그래도 할당되어 사용됩니다.

위와 같이 파이썬에서 함수는 객체처럼 변수에 저장할 수 있습니다.

 

2. 함수를 인자로 전달

def double_apply(func, n):
	return func(func(n))
    
print(double_apply(factorial,3))# factorial(factorial(3)) = factorial(6) = 6! 720

예제는 함수를 인자로 전달해서 두 번 적용하는 고차함수입니다.

이처럼 파이썬에서는 함수를 함수의 인자로 넘길 수 있습니다.

 

3. 함수를 리턴값으로 사용

def make_logger(func):
    def wrapper(n):
        print(f"Calling {func.__name__}({n})")
        return func(n)
    return wrapper

logged_factorial = make_logger(factorial)
print(logged_factorial(4))
# Calling factorial(4)
# 24

위의 예제에서는 함수를 감싸는 wrapper함수를 반환하여 새 동작을 추가합니다.

위의 구조는 데코레이터의 핵심이기도 합니다.

 

4. 함수를 자료구조에 담을 수 있음

funcs = [abs, factorial, lambda x: x + 10]

for f in funcs:
	print(f(5))  
	# abs(5) = 5
	# factorial(5) = 120
	# 5+10 = 15

위의 예제에서 funcs라는 list에 abs, factorial, lambda 함수를 담고 루프문을 통해 함수를 실행합니다.

위의 예제와 같이 파이썬에서는 자료구조에 함수를 담을 수 있습니다.

 

정리

이번 글에서는 파이썬의 factorial 함수를 예제로 사용하여 일급 함수의 개념과 특징을 정리해보았습니다.
파이썬에서 함수는 변수에 할당할 수 있고, 인자로 전달하거나 반환값으로 사용할 수 있으며,
심지어 자료구조에 담을 수도 있는 완전한 일급 객체입니다.

이러한 특징 덕분에 파이썬은 함수를 유연하고 강력하게 활용할 수 있는 프로그래밍 언어이며,
데코레이터, 클로저, 고차 함수와 같은 다양한 함수형 프로그래밍 기법을 자연스럽게 적용할 수 있습니다.