First-Class
파이썬의 함수는 first class 하다.
아래 작업들을 수행할 수 있으면 프로그램 개체를 first-class 하는 것으로 정의한다.
- 함수 결과로 리턴할 수 있다.
- 함수 인수로 전달 가능하다.
- 데이터의 구조에 저장하거나 변수에 저장할 수 있다.
- 런타임에 생성할 수 있다.
first class object 로써의 함수라는 의미로 first class function 이라는 용어가 사용되고 있다.
사실상 모든 파이썬 함수는 first-class 성질을 가지고 있는 것이다.
1. 변수에 함수 할당해보기
def add(x):
return x+x
print (add(5))
f = add
print (add)
print (f)
위 파이썬 코드의 실행 결과는 아래와 같다.
f 도 함수처럼 동작할까?
코드를 수정하고 실행해보자.
def add(x):
return x+x
print (add(5))
f = add
print (add)
print (f)
print(f(10))
2. 함수의 인자로 사용해보기
def add(x):
return x+x
def append(func, arg_list):
total = []
for i in arg_list:
total.append(func(i))
return total
li = [1, 2, 3, 4, 5]
print(append(add, li))
위 코드의 결과는 아래 그림과 같다.
append 는 wrapper 함수로,
함수를 하나만 정의하여 기존의 함수나 모듈을 수정할 필요 없이 사용자가 편리하게 쓸 수 있게한다.
이는 함수가 여러개 일때 빛을 발한다.
def add(x):
return x+x
def sub(x):
return x-x
def mul(x):
return x*x
def div(x):
return x/x
def append(func, arg_list):
total = []
for i in arg_list:
total.append(func(i))
return total
li = [1, 2, 3, 4, 5]
print(append(add, li))
print(append(sub, li))
print(append(mul, li))
print(append(div, li))
기존에 존재하는 함수는 건드리지 않고, 사용가능함을 확인할 수 있다.
3. 함수의 결과값으로 리턴하기
def printer(str):
def print_str():
print('출력 : ', str)
return print_str
print_cute = printer('cute')
print(print_cute)
print_cute()
위 코드의 결과는 아래 그림과 같다.
print_str 함수를 printer 함수의 리턴값으로 리턴해 print_cute 변수에 할당했다.
여기서 주의깊게 살펴볼 점은,
str 변수는 지역변수라 함수가 호출된 이후 메모리상에서 없어진다.
참조할 수 없다는 얘기이다.
그런데 어떻게 'cute' 라는 문자열을 printer 함수가 종료되었음에도 불구하고 참조할 수 있었을까?
여기서 우리는 클로저라는 개념을 배워볼 수 있다.
print_str 같은 함수를 클로저라고 부른다.
이 클로저는 다른 함수의 지역변수를 그 함수 종료 시점 이후에도 기억할 수 있는 함수이다.
'Archive > Develop' 카테고리의 다른 글
[ Django ] 이미지 관리 라이브러리 pillow (0) | 2021.03.30 |
---|---|
[ C++ ] 즐거운 은행 놀이 (0) | 2021.03.30 |
[ C++ ] C++의 포인터 (0) | 2021.03.30 |
[ Python ] python Decorator 이용하기 | 코드를 간소화해보자! (0) | 2021.03.30 |
[ Oracle ] oracle 에서 기본으로 제공해주는 HR 스키마를 가지고 활용해보자! (0) | 2021.03.29 |