본문 바로가기
Python

[Python] 일급 함수 정의와 특징

by 까리한 새우 2025. 1. 25.

이번 글에서는 파이썬(Python)의 일급 함수에 대해 정리를 해보고자 합니다.

 

프로그래밍 언어에서는 함수를 일급 객체로 취급하는 경우 일급 함수를 지원한다고 합니다.

그리고 파이썬은 일급 함수를 지원합니다.

 

일급 객체(First-Class Citizen)란?

다른 객체들에 일반적으로 적용 가능한 연산을 모두 지원하는 객체를 가리킵니다.

1. 변수나 데이터 구조에 할당할 수 있다.
2. 객체의 인자로 넘길 수 있다.
3. 객체의 리턴 값으로 리턴이 가능해야 한다.

위 3가지의 조건을 만족한다면 일급 객체라고 할 수 있습니다.

이 글에서는 단순하게 '일급 객체 = 일급 함수'라고 생각하시면 편합니다.

 

 

파이썬 함수 특징

당연히 일급 함수를 이해하기 위해서는 파이썬 함수의 특징을 알아야 합니다.

왜냐하면, 파이썬의 함수가 일급 함수이기 때문이죠.

  • 실행시점에 런타임 초기화
    - 파이썬의 함수는 실행시점에 런타임을 초기화합니다. (런타임 : 파이썬 프로그램이 실행되고 있는 시간

 

  • 함수를 변수에 할당 가능
def printMsg(msg):
    print('MESSAGE >>', msg)

msg1 = printMsg

print(msg1)
msg1('첫 번째 Message')

 

메시지를 인자로 받는 printMsg() 함수를 정의하고 msg1 변수에 할당하였습니다.

msg1을 출력해 보면 function으로 함수라는 것을 알 수 있습니다.

 

변수에 함수를 할당하였기 때문에, msg1 변수를 사용하여 해당 함수를 호출할 수 있습니다.

 

 

또한, 함수를 list와 dict 등과 같은 데이터 구조에도 저장할 수 있습니다.

def oneMsg(msg):
    return 'oneMsg >> {}'.format(msg)

def twoMsg(msg):
    return 'twoMsg >> {}'.format(msg)

def threeMsg(msg):
    return 'threeMsg >> {}'.format(msg)

msg_list = [oneMsg, twoMsg, threeMsg]
msg_dict = {"one":oneMsg, "two":twoMsg, "three":threeMsg}

print(msg_list[0]('One Message !!'))
print(msg_dict.get('three')('Three Message !!'))

 

 

 

  • 함수를 다른 함수의 인자로 전달 가능
def subMsg(msg):
    print('SUB MESSAGE >>', msg)

def mainMsg(func, msg):
    print('MAIN MESSAGE >>', msg)
    func

msg1 = subMsg('두 번째 Message')

# mainMsg 함수 인자로 msg1 함수를 전달하였다.
mainMsg(msg1, '제가 메인 메시지 입니다.')

# map() 함수 인자로 subMsg 함수를 전달하였다.
list(map(subMsg, ['세 번째 Message', '네 번째 Message', '뒤죽박죽 메시지지롱~']))

 

mainMsg 함수에 subMsg 함수를 매개변수로 전달하여 mainMsg 함수 내에서 subMsg 함수를 실행하는 예제입니다.

조금 복잡해 보이기 위해서 msg1 변수에 subMsg 함수를 할당하였고, mainMsg 함수 인자로 msg1 함수(변수)를 전달하였습니다.

 

위와 같이 다른 함수를 인자로 받아들일 수 있는 함수를 고차 함수라고 합니다.

파이썬에서 제공하는 map(), sorted() 함수 등이 일급 함수에 속합니다.

 

 

map() 함수에 잘 알지 못하고 계신다면 제가 작성한 다른 글인 map()와 추가로 같이 사용되고 언급되는 filter(), reduce() 함수에 대해 쉽게 설명하고 있는 글을 참고하신다면 금방 이해하시게 될 것입니다.

 

[Python] map() filter() reduce() 사용법 정리

Java 언어를 메인으로 하는 개발자 11일차인 나는 자기계발을 위해 python도 퇴근 후 깨잘깨잘 공부하고 있다.하루에 투자하는 시간이 적고 아직 익숙하지 않기에 조금씩 정리를 하기로 마음을 먹

developshrimp.com

 

 

 

    • 함수에서 다른 함수를 반환 가능
def frontMsg(fMsg):
    def backMsg(bMsg):
        return fMsg + " " + bMsg
    return backMsg

helloMsg = frontMsg("Hello")

print(helloMsg('World!!'))
print(helloMsg('Bro!!'))
print(helloMsg('Mello!!'))

 

frontMsg 함수에서는 리턴 값으로 backMsg를 반환하고 있습니다.


 

일급 함수 예시

 

callable

callable은 호출 연산자로서 인자로 들어온 요소가 호출이 가능한 형태인지 확인할 수 있습니다.

 

아래 코드를 보면 'Hello'를 제외하고는 모두 True를 출력합니다.

 

Msg 함수는 당연히 호출이 가능하니 True 가 출력합니다.

str 또한 파이썬에서 제공하는 문자로 변경해 주는 함수이기 때문에(호출가능하기에) True를 출력합니다.

'Hello'는 호출이 가능한 형태가 아닌 단순 문자이기 때문에 False를 반환하는 것을 알 수 있습니다.

def oneMsg(msg):
    return 'oneMsg >> {}'.format(msg)

def twoMsg(msg):
    return 'twoMsg >> {}'.format(msg)

def threeMsg(msg):
    return 'threeMsg >> {}'.format(msg)


print(callable(oneMsg), callable(twoMsg), callable(threeMsg), callable(str), callable('Hello'))

 

 

partial

partial 함수는 인자를 고정하는 함수이다.

 

아래 예제에서와 같이 mul 함수를 사용하여 예를 들어보았다.

from operator import mul
from functools import partial

# 5*10 의 결과와 6*6의 결과 출력 (partial 사용 X)
f = mul(5, 10)
s = mul(6, 6)

print(f)
print(s)

# 5*10 의 결과와 6*6의 결과 출력 (partial 사용 O)
five = partial(mul, 5)
six = partial(mul, 6)

print(five(10))
print(six(6))

# 인자를 고정 후 구구단 5단과 6단 출력
print(list(map(five, range(1, 10))))
print(list(map(six, range(1, 10))))

 

결과에서 볼 수 있듯이 인자를 고정함으로써 구구단의 5단과 6단을 쉽게 출력할 수 있다.

반응형