본문 바로가기

카테고리 없음

Python : 고차함수(Higher-Order Function) 개념정리

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. 결론

고차함수는 코드의 단순화와 재사용성에 크게 기여하며, 데이터 처리, 정렬, 필터링 등의 작업을 효율적으로 수행할 수 있습니다. 이러한 함수들은 특히 람다 함수와 함께 사용될 때 매우 강력합니다. 고차함수를 적절히 활용하면 보다 직관적이고 우아한 코드를 작성할 수 있습니다.