python

Python | Python 일급 함수(First Class function)

no-easy-ray 2022. 1. 26. 14:11

파이썬의 일급 함수에 대해서 정리해 보려고 합니다.

 

특정 프로그래밍 언어에서 함수가 일급이라는 것은 다음의 조건을 만족하는 경우 일급 함수라고 합니다.

 

  1. 함수가 object 유형의 인스턴스인 경우.
  2. 함수를 변수에 저장할 수 있는 경우.
  3. 함수를 다른 함수에 매개변수로 전달할 수 있는 경우.
  4. 함수에서 다른 함수를 반환할 수 있는 경우.
  5. list, dict 등과 같은 데이터 구조에 저장할 수 있는 경우.

 

각각을 예시를 통해 확인해 보도록 하겠습니다.

 

함수가 object 유형의 인스턴스인 경우.

먼저 간단한 예시로 변수에 1을 할당해 보겠습니다.

num = 1 # 변수에 1을 할당
print(type(num))               # <class 'int'>
print(issubclass(int, object)) # True

후 타입을 확인해보면 int라는 클래스이고, int클래스는 object를 상속받는 것을 확인할 수 있습니다.

 

따라서 동일하게 확인을 해보면

def im_object():
    return 'Im object'

print(type(im_object))               # <class 'function'>
print(isinstance(im_object, object)) # True

위와 같이 함수가 object유형의 인스턴스인 것을 확인할 수 있습니다.

 

함수를 변수에 저장할 수 있는 경우.

def im_object():
    return 'Im object'

v_func = im_object # 변수에 저장
print(v_func())    # Im object

함수를 변수에 저장하여 해당 변수로 함수를 실행할 수 있습니다.

 

함수를 다른 함수에 매개변수로 전달할 수 있는 경우.

def relay_func(msg):
    return f'>> sub : {msg}'

def main_func(func):
    print('>> run main')
    print(func('hello'))

main_func(relay_func)
# >> run main
# >> sub : hello

메인 함수에 relay_func을 매개변수로 전달하여 메인 함수 내에서 relay_func함수를 실행하는 예제입니다.

 

다른 예시로 자주 사용되는 map함수에서도 매개변수로 전달하여 사용할 수 있습니다.

# map에 함수를 전달
result = list(map(relay_func, 'ABCDE'))
print(result) 
# ['>> sub : A', '>> sub : B', '>> sub : C', '>> sub : D', '>> sub : E']

 

함수에서 다른 함수를 반환할 수 있는 경우.

def create_adder(x):
    def adder(y):
        return x + y
    return adder

adder_100 = create_adder(100)
print(adder_100(10)) # 110
print(adder_100(20)) # 120
print(adder_100(30)) # 130

create_adder함수에서는 adder라는 다른 함수를 반환하고 있는 걸 확인할 수 있습니다.

 

list, dict 등과 같은 데이터 구조에 저장할 수 있는 경우.

def adder_1(x):
    return x + 1
    
def adder_2(x):
    return x + 2
    
def adder_3(x):
    return x + 3

adder_dict = {'one':adder_1, 'two': adder_2, 'three': adder_3}
adder_list = [adder_1, adder_2, adder_3]

print(adder_dict)
print(adder_list)

print(adder_dict.get('one')(100)) # 101
print(adder_list[1](100))         # 102

위와 같이 list, dict형태에 저장 가능한 것을 확인할 수 있습니다.

 

마무리

일급 함수에 대한 내용은 파이썬뿐만 아니라 다은 프로그래밍 언어에도 적용이 되는 내용인 것 같습니다.

함수형 프로그래밍을 할 때 일급 함수에 대한 내용이 나오는데, 일급 함수에 대한 내용을 따로 정리해 볼 수 있는 시간이었던 것 같습니다.

 

감사합니다.

 

참고자료

https://book.pythontips.com/en/latest/decorators.html#giving-a-function-as-an-argument-to-another-function

https://www.w3schools.com/python/python_classes.asp

https://www.geeksforgeeks.org/first-class-functions-python/

https://stackoverflow.com/questions/27392402/what-is-first-class-function-in-python

https://www.tutorialspoint.com/first-class-citizens-in-python

https://velog.io/@shchoice/First-class-Function%EC%9D%BC%EA%B8%89-%ED%95%A8%EC%88%98-Higher-order-Function%EA%B3%A0%EC%9C%84-%ED%95%A8%EC%88%98