Python | Python 일급 함수(First Class function)
파이썬의 일급 함수에 대해서 정리해 보려고 합니다.
특정 프로그래밍 언어에서 함수가 일급이라는 것은 다음의 조건을 만족하는 경우 일급 함수라고 합니다.
- 함수가 object 유형의 인스턴스인 경우.
- 함수를 변수에 저장할 수 있는 경우.
- 함수를 다른 함수에 매개변수로 전달할 수 있는 경우.
- 함수에서 다른 함수를 반환할 수 있는 경우.
- 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://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