파이썬에서는 함수를 일급 객체(First-Class Object) 로 다룹니다. 즉, 함수를 변수에 저장하거나 인자로 전달하고, 반환할 수도 있습니다.
이런 특징을 활용하면 고차 함수, 클로저, 데코레이터 같은 강력한 기능을 사용할 수 있습니다.
이번 글에서는 고차 함수(Higher-Order Function), 클로저(Closure), 데코레이터(Decorator) 를 자세히 알아보겠습니다!
고차 함수(Higher-Order Function)란?
고차 함수는 다른 함수를 인자로 받거나 반환하는 함수를 말합니다.
✅ 고차 함수 특징
1. 함수를 인자로 전달 가능
2. 함수를 반환 가능
3. 람다(lambda)와 함께 사용 가능
📌 고차 함수 기본 예제
def apply_function(func, value):
return func(value)
def square(x):
return x ** 2
print(apply_function(square, 5)) # 25
🔹 apply_function(square, 5) → square(5) 실행
🔹 square 함수를 인자로 전달하여 실행
(1) 고차 함수 예제: map, filter, reduce
🔹 map() – 모든 요소에 함수를 적용
numbers = [1, 2, 3, 4, 5]
squared = list(map(lambda x: x ** 2, numbers))
print(squared) # [1, 4, 9, 16, 25]
🔹 map(함수, 리스트) → 모든 요소에 제곱 함수 적용
🔹 filter() – 조건을 만족하는 요소만 필터링
numbers = [1, 2, 3, 4, 5, 6]
even_numbers = list(filter(lambda x: x % 2 == 0, numbers))
print(even_numbers) # [2, 4, 6]
🔹 filter(조건 함수, 리스트) → 짝수만 필터링
🔹 reduce() – 누적 계산 수행 (functools.reduce)
from functools import reduce
numbers = [1, 2, 3, 4, 5]
product = reduce(lambda x, y: x * y, numbers)
print(product) # 120
🔹 reduce(함수, 리스트) → 리스트 요소를 곱셈 연산
클로저(Closure)란?
클로저(Closure) 는 함수 내부에서 변수를 캡처하여 유지하는 함수입니다. 즉, 외부 함수의 변수를 기억하고 사용할 수 있는 내부 함수입니다.
📌 클로저 기본 구조
def outer_function(value):
def inner_function():
return f"Hello, {value}!"
return inner_function # 내부 함수 반환
closure_func = outer_function("Python")
print(closure_func()) # "Hello, Python!"
🔹 inner_function 내부에서 value 값을 유지
🔹 outer_function 실행 후에도 value 변수를 기억
(1) 클로저 활용 예제: 카운터 함수
def counter():
count = 0
def increment():
nonlocal count
count += 1
return count
return increment
count_up = counter()
print(count_up()) # 1
print(count_up()) # 2
print(count_up()) # 3
🔹 increment 내부 함수가 count 변수를 유지
🔹 nonlocal 키워드를 사용하여 외부 변수 값 변경 가능
데코레이터(Decorator)란?
데코레이터(Decorator) 는 기존 함수의 기능을 변경하거나 확장하는 함수입니다.
✅ 데코레이터 특징
• 기존 코드 수정 없이 기능을 추가할 수 있음
• @데코레이터_이름 문법을 사용하여 함수에 적용
📌 데코레이터 기본 구조
def decorator(func):
def wrapper():
print("함수 실행 전")
func()
print("함수 실행 후")
return wrapper
@decorator
def say_hello():
print("Hello, Python!")
say_hello()
✅ 실행 결과
함수 실행 전
Hello, Python!
함수 실행 후
🔹 @decorator를 사용하면 say_hello() 실행 시 wrapper()가 호출됨
(1) 여러 개의 데코레이터 적용하기
def decorator1(func):
def wrapper():
print("데코레이터 1 실행")
func()
return wrapper
def decorator2(func):
def wrapper():
print("데코레이터 2 실행")
func()
return wrapper
@decorator1
@decorator2
def greet():
print("안녕하세요!")
greet()
✅ 실행 결과
데코레이터 1 실행
데코레이터 2 실행
안녕하세요!
🔹 여러 개의 데코레이터를 적용하면 순차적으로 실행
(2) 인자가 있는 데코레이터
def repeat(n):
def decorator(func):
def wrapper(*args, **kwargs):
for _ in range(n):
func(*args, **kwargs)
return wrapper
return decorator
@repeat(3)
def hello():
print("Hello, Python!")
hello()
✅ 실행 결과
Hello, Python!
Hello, Python!
Hello, Python!
🔹 @repeat(3)을 사용하여 3번 반복 실행
고차 함수, 클로저, 데코레이터 비교 정리
개념 설명 주요 특징
고차 함수 함수를 인자로 받거나 반환하는 함수 map(), filter(), reduce()
클로저 외부 변수 값을 유지하는 함수 nonlocal 키워드 활용
데코레이터 기존 함수에 기능을 추가하는 함수 @decorator 문법 사용
📌 언제 사용할까?
고차 함수 – 함수형 프로그래밍 활용
클로저 – 상태(state) 저장이 필요한 경우
데코레이터 – 코드 수정 없이 기능 추가
마무리 및 요약
고차 함수는 함수를 인자로 받거나 반환하는 함수
클로저는 내부 함수가 외부 변수를 유지하는 함수
데코레이터는 기존 함수에 기능을 추가하는 함수
이제 고차 함수, 클로저, 데코레이터를 활용해 더 효율적인 파이썬 코드를 작성해 보세요! 🚀
#파이썬 #Python #고차함수 #클로저 #데코레이터 #프로그래밍 #개발자 #PythonTips #파이썬공부 #Python3
파이썬 배우기: OOP 기본 – 캡슐화 및 상속 (0) | 2025.03.14 |
---|---|
파이썬 배우기: 정규 표현식(Regex) (0) | 2025.03.12 |
파이썬 배우기: 재귀 함수 활용하기 (0) | 2025.02.27 |
파이썬 배우기: 익명 함수(lambda 함수) (0) | 2025.02.26 |
파이썬 배우기: 위치 인수와 키워드 인수 활용하기 (0) | 2025.02.20 |