1. 고차함수란?
고차함수(Higher-Order Function)는 하나 이상의 함수를 인수로 받거나, 함수를 반환하는 함수를 의미합니다. 파이썬은 함수를 1급 객체(First-Class Citizen)로 취급하기 때문에, 함수 자체를 변수처럼 전달하거나 반환할 수 있습니다.
이를 통해 코드의 재사용성과 가독성을 높이고, 함수형 프로그래밍 스타일을 구현할 수 있습니다.
2. 주요 고차함수
(1) map()
map() 함수는 반복 가능한 객체(iterable)의 각 요소에 특정 함수를 적용하여 새 객체를 반환합니다.
• 구문: map(function, iterable)
• 예제:
# 모든 리스트 요소를 제곱하는 예제
numbers = [1, 2, 3, 4, 5]
squared = map(lambda x: x ** 2, numbers)
print(list(squared)) # 출력: [1, 4, 9, 16, 25]
(2) filter()
filter() 함수는 주어진 함수의 조건을 만족하는 요소만 걸러냅니다.
• 구문: filter(function, iterable)
• 예제:
# 리스트에서 짝수만 필터링
numbers = [1, 2, 3, 4, 5, 6]
evens = filter(lambda x: x % 2 == 0, numbers)
print(list(evens)) # 출력: [2, 4, 6]
(3) reduce()
reduce()는 리스트의 요소를 누적 계산하여 하나의 결과를 생성합니다. functools 모듈에서 제공됩니다.
• 구문: reduce(function, iterable)
• 예제:
from functools import reduce
# 리스트 요소의 곱 계산
numbers = [1, 2, 3, 4, 5]
product = reduce(lambda x, y: x * y, numbers)
print(product) # 출력: 120
(4) sorted()와 key 매개변수
sorted()는 정렬 기준을 함수로 전달할 수 있어 고차함수의 일종으로 간주됩니다.
• 구문: sorted(iterable, key=function)
• 예제:
# 문자열 길이를 기준으로 리스트 정렬
words = ["banana", "apple", "kiwi", "strawberry"]
sorted_words = sorted(words, key=len)
print(sorted_words) # 출력: ['kiwi', 'apple', 'banana', 'strawberry']
(6) partial()
functools.partial은 함수를 부분적으로 적용(Partial Application)하여 일부 인수를 고정(fix)한 새로운 함수를 생성합니다. 즉, 함수 호출의 기본값을 미리 설정하여 보다 간결한 코드를 작성할 수 있게 합니다.
• 구문:
from functools import partial
new_function = partial(function, fixed_arg1, fixed_arg2, ...)
• 예제:
from functools import partial
# 리스트에서 특정 값을 곱하는 함수
def multiply(x, factor):
return x * factor
# 두 배로 곱하는 함수를 생성
double = partial(multiply, factor=2)
# 리스트에 함수 적용
numbers = [1, 2, 3, 4, 5]
doubled_numbers = list(map(double, numbers))
print(doubled_numbers) # 출력: [2, 4, 6, 8, 10]
(6) 사용자 정의 고차함수
사용자 정의 함수도 다른 함수를 반환하거나 전달받을 수 있습니다.
• 예제:
def apply_function(func, data):
return [func(x) for x in data]
# 제곱 함수를 리스트에 적용
numbers = [1, 2, 3, 4, 5]
result = apply_function(lambda x: x ** 2, numbers)
print(result) # 출력: [1, 4, 9, 16, 25]
3. 실전 예제
다음은 고차함수를 사용하여 텍스트 데이터 처리 과정을 간결하게 구현한 예제입니다.
# 텍스트 데이터를 클린업하는 파이프라인
texts = [" Hello World! ", "Python is fun ", " Functional Programming "]
# 클린업 함수를 정의
def clean_text(text):
return text.strip().lower().replace("!", "")
# 각 텍스트를 클린업하고 길이순으로 정렬
cleaned_texts = map(clean_text,texts)
sorted_texts = sorted(cleaned_texts, key=len)
print(sorted_texts)
# 출력: ['hello world', 'python is fun', 'functional programming']
4. 결론
고차함수는 코드의 단순화와 재사용성에 크게 기여하며, 데이터 처리, 정렬, 필터링 등의 작업을 효율적으로 수행할 수 있습니다. 이러한 함수들은 특히 람다 함수와 함께 사용될 때 매우 강력합니다. 고차함수를 적절히 활용하면 보다 직관적이고 우아한 코드를 작성할 수 있습니다.