Higher Order Function ; 2가지 조건 중 하나 이상 만족
- 함수를 함수 인자(Argument) 로 받을 수 있음.
- 함수를 데이터 처럼 다루는 함수
- ex) map(), filter(), sorted() : 첫번째 인자로 함수를 받음
- 함수를 결과 (Return Value)로 반환함
- 함수 내부에서 새로운 함수를 정의하고, 그 함수 자체를 외부로 반환
- 데코레이터(Decorator)를 구현할 때 많이 사용
Decorator
# Decorator
# Wrap another function to extend the functionality without changing the original code
def higher_order_example(func): # 1번 조건 만족(함수를 인자로)
def inside():
print("start ...")
func()
print("end ...")
return inside # 2번 조건 만족(새로운 함수 리턴)
# 데코레이터 적용 (함수 정의 바로 위에 작성해야 합니다)
# 중첩 데코레이터(Bottom-Up 으로 수행)
@higher_order_example # 두번쨰 실행 데코레이터
@higher_order_example # 첫번째 실행 데코레이터
def sample_example():
print("I am inside")
sample_example()
- 데코레이터 :
- 코드를 바꾸지 않고 새로운 기능을 추가(함수의 기능 확장)하기 위해 사용하는 구조(방식)
- 함수의 정의와 동시에 해당 함수를 둘러 싼 함수(Higher Order Function)를 만듦
- 위 예시 설명
- 첫번째 decorator 실행 후 :
- @higher_order_example 함수가 정의 되어 있어야 함. (또는 내장)
- sample_example 함수를 둘러 싼 첫번째 inside(return 함수)를 반환
- temp_func = higher_order_example(sample_example)
- 두번째 decorator 실행 후 :
- temp_func 함수 객체를 둘러 싼 첫번째 inside(return 함수)를 반환
- sample_example = higher_order_example(temp_func)
- 원본 함수는 가장 안쪽(깊은 곳)에 들어가 있게 됨
- 첫번째 decorator 실행 후 :
정리
- Wrapper Layer (감싸는 층): 각 @higher_order_example는 원본 함수 주위에 start...와 end...라는 **새로운 층(Layer)**을 추가합니다.
- LIFO (Last In, First Out) 구조: 데코레이터는 아래부터 위로 적용되지만(Last-in), 호출될 때는 가장 바깥쪽 래퍼부터 실행되어(First-out) start...가 먼저 중첩되어 출력됩니다.
- 코드 수정 없이 기능 추가: sample_example의 본문 코드는 전혀 건드리지 않고도 실행 전후에 원하는 로직(start..., end...)을 쉽게 추가했습니다. 이것이 데코레이터의 가장 강력한 장점입니다.
-------------------------------------------------------------------------------
참고 : 실리콘밸리 엔지니어가 가르치는 파이썬 기초부터 고급까지 (inflearn, 미쿡엔지니어)
-------------------------------------------------------------------------------
'프로그래밍 > python' 카테고리의 다른 글
| [python] Class Construct(__init__) (0) | 2025.12.12 |
|---|---|
| [python] Pypi (pip install) (0) | 2025.12.12 |
| [python] Common Coding Mistakes (0) | 2025.12.09 |
| [python] Docstrings(String Literal) (0) | 2025.12.09 |
| [python] Scope(local, global, enclosing) (0) | 2025.12.07 |