-
함수(function)와 1급 객체(first-class citizen)Python 2022. 5. 23. 18:11
프로그래밍에 대한 개념을 다루는 것보다 아무래도 문제들을 해결하기 위해 직접 코드를 치는게 재밌었다 보니 누군가 1급 객체와 같은 개념들에 대해 물어본다면 대답하기 어려워서 누군가에게 설명할 수 있도록 정리해야겠다는 생각에 여러 글로 나눠서 함수, 1급 객체, 클로져, 데코레이터에 대해 쓰고자 합니다.
< 목차 >
쉽게 얘기해서 문제를 해결하기 위해 프로그램을 만든다.
대부분의 프로그램은 클래스의 집합으로 구성되어 있다.
대부분의 클래스는 함수들의 집합으로 구성되어 있다.
즉, 이렇게도 볼 수 있지 않을까?
프로그램 = 함수들의 묶음
함수란
- 작은 단위의 기능을 구현할 수 있도록 만든 코드
- 작으면 작을수록 기능 구현하기에도 좋고 테스트하기에도 용이하다.
- 현재 또는 미래에 재사용이 가능하도록 만든 코드 (재사용성)
1급 객체
객체의 특성을 모두 지닌 것
객체의 특성에는 어떤게 있을까
- 변수나 데이터 구조(리스트, 딕셔너리 등의 자료 구조)에 할당 가능
- 매개변수(인자)로 전달 가능
- 리턴값으로 사용 가능
다른 언어와 달리 Python에는 함수도 객체의 특성을 가지고 있기에 1급 객체이다.
이에 대해 찾아보다 보니 아래의 두 함수가 가지는 차이점에 대해 바로 이해가 안 되서 저와 같은 분들이 계실 수 있기에 차이점에 대해 적어봅니다.
1-1. 함수를 변수에 할당
# 1번 함수 - 변수에 할당 def hello(): print("hello!") a = hello # hello 함수를 a라는 변수에 저장 a() # 2번 함수 def hello(name): def func(): return f'Hello {name}!' return func a1 = hello('bruno') a1() # 실행은 되나 print문이 없어서 실행되는지 알기 어렵다. 리턴값을 print로 찍어보면 알 수 있다. print(a1) # <function hello.<locals>.func at 0x7f07077f2820> 처럼 a1이 저장된 공간 출력 print(a1()) # 리턴값을 출력 : Hello bruno!
우선 1번 함수와 2번 함수의 가장 큰 차이점은 인자로 전달되는 값 유무와 리턴 값의 유무이다.
인자로 전달되는 값 유무는 어떤 값을 전달하느냐 안 하느냐의 차이를 의미하고
리턴되는 값의 유무가 중요하다.
리턴값이 있는 함수를 1번 함수처럼 사용하면 아래처럼 사용할 수 있다.
# 2번 함수를 인자값 없앤 후 1번 함수와 같은 방식으로 정의하면 def hello(): def func(): print('Hello~!') return func a1 = hello # a1은 hello 함수 그 자체를 의미 a1 # 이렇게만 쓰면 함수 그 자체만 의미하는 것이기에 리턴되거나 프린트되는 값이 없다. print(a1) # hello 함수가 저장된 공간이 print된다. # 출력값 <function hello at 0x7f739ce76820> # 리턴되는 값이 있는 경우에는 아래처럼 해야한다. a1 = hello() a1() # 출력값 Hello~!
1-2. 함수를 데이터 구조(자료 구조)에 할당
def add(x, y): return x + y def sub(x, y): return x - y # 함수를 리스트에 할당 list = [add, sub] for i in list: print(i(5, 5)) # 출력값 10 0 # 함수를 딕셔너리에 할당 dict = { 'add': add, 'sub': sub } add1 = dict['add'](5, 5) sub1 = dict['sub'](5, 5) print(add1) # 출력값 : 10 print(sub1) # 출력값 : 0
2. 매개변수(인자)로 전달
def add(x, y): return x + y def add_func(func, x, y): print(func(x, y)) add_func(add, 3, 4) # 출력값 : 7
3. 리턴값으로 사용 가능
def greeting(name): def say(): return f'greeting {name}!' return say func = greeting('bruno') print(func()) # 출력값 : greeting bruno!
< 참고 자료 >
https://shoark7.github.io/programming/python/closure-in-python
'Python' 카테고리의 다른 글
OpenCV - waitKey() 함수 (0) 2022.06.14 python 내장함수 getattr (0) 2022.05.19 날짜 입력 및 D-Day 계산 (0) 2022.04.12 Python shell - help 기능 (0) 2022.01.16 list comprehension 중복 제거 - Object of type set is not JSON serializable (0) 2022.01.16