본문 바로가기

프로그래밍/python

[python] Higher Order Function(feat. decorator)

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)
      • 원본 함수는 가장 안쪽(깊은 곳)에 들어가 있게 됨 
정리
  • 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