프로그래밍 언어가 함수를 일급 객체로 취급하는 경우 일급 함수를 지원한다고 한다.
Python 은 일급 함수를 지원한다.
(Java의 함수는 1급 객체가 아니다. Kotlin의 함수는 1급 객체라고 한다.)
일급 객체(First-Class Citizen)란?
다른 객체들에 일반적으로 적용 가능한 연산을 모두 지원하는 객체를 가리킨다.
1. 변수나 데이터 구조에 할당할 수 있다.
2. 객체의 인자로 넘길 수 있다.
3. 객체의 리턴 값으로 리턴이 가능해야 한다.
위 3가지 조건을 만족하면 1급객체라고 할 수 있다.
일급 함수의 속성
- 함수는 Object 유형의 인스턴스이다.
- 함수를 변수에 저장할 수 있다.
- 함수를 다른 함수에 매개변수로 전달할 수 있다.
- 함수에서 함수를 반환할 수 있다.
- List, HashTable 같은 데이터구조에 저장할 수 있다.
1. 함수는 객체이다.
Python 함수는 일급 객체이다.
아래 코드에서는 a변수에 함수를 할당한다. 이러한 할당 자체로는 함수를 호출하지 않는다.
a는 startOrder 함수가 참조하는 함수 객체를 가져와서 이를 가리키는 새로운 함수를 만든다.
msglist = [
"Select One",
]
def startOrder(message):
return message
print(startOrder(msglist[0]))
a = startOrder
print(a(msglist[0]))
2. 함수는 다른 함수에 인수로 전달할 수 있다.
함수는 객체이기 때문에 다른 함수에 인수로 전달할 수 있다.
다른 함수를 인수로 받아들일 수 있는 함수를 고차 함수라고도 한다.
아래 코드에서 함수를 인수로 사용하는 welcome함수를 만들었다.
def showMenu(m):
return m
def showMenuDouble(m):
return m + " " + m
def welcome(func, msg):
show = func(msg)
print(show)
welcome(showMenu, "Ice tea")
welcome(showMenuDouble, "Ice tea")
3. 함수는 다른 함수를 반환할 수 있다.
함수는 객체이기 때문에 다른 함수에서 함수를 반환 할 수 있다.
아래 코드의 create_calc는 자신의 내부에서 만들어진 calc함수를 반환한다.
내부에서 만든 calc 함수는 중첩함수 라고 하며, 자신의 바깥에 있는 create_calc의 지역 변수에 접근할 수 있다.
def add(x, y):
return x + y
def mul(x, y):
return x * y
def create_calc(func, x):
offset = 20
def calc(y):
y += offset
return func(x, y)
return calc
newadder = create_calc(add, 15)
newmuler = create_calc(mul, 10)
print(newadder(20)) # 55
print(newmuler(15)) # 350
위 코드는 데코레이터의 개념이 살짝 들어간 코드이며 이번 포스팅에서 설명한 '1. 함수는 객체이다', '2. 함수는 다른 함수의 인자로 전달할 수 있다' 에 대한 개념을 모두 담고 있다.
next : closure
'Lang > Python' 카테고리의 다른 글
[Python] Decorator (데코레이터) (0) | 2021.12.03 |
---|---|
[Python] Closure (클로저) (0) | 2021.12.02 |
Tkinter 로 계산기 만들기 (0) | 2020.06.18 |