지난 글에서는 Python의 list comprehension을 다뤘습니다. 이번 글에서는 Python 프로그래밍에서 자주 언급되는 Functional Programming의 개념과 그 중에서도 map, filter, reduce 함수에 대해 알아보겠습니다. 사실 Functional Programming의 개념 부터 다뤄야 더 알맞지만, 우선 대표적인 파이썬의 함수를 시작으로 컨셉 및 관련된 내용들을 순차적으로 다뤄보도록 하겠습니다. 그럼 예시와 함께 시작해 보겠습니다!

1. Functional Programming이란?
Functional Programming(함수형 프로그래밍)은 프로그래밍 패러다임 중 하나로, 함수를 일급 객체로 다루고, 불변성을 유지하며, 순수 함수를 사용하는 것에 초점을 맞춥니다. Python은 완전한 함수형 언어는 아니지만, 이러한 패러다임을 지원하는 여러 도구를 제공합니다. 그 중 map, filter, reduce는 데이터 변환과 필터링 작업에 유용하기도 하고 파이썬을 대표하는 함수이기도 합니다. 처음에는 각각을 다루는 것이 익숙치 않을 수 있는데요, 이번 시리즈를 통해 함수형 프로그래밍의 개념과 사용법들에 익숙해 지실 수 있길 바라겠습니다.
2. map() 함수
map() 함수는 함수와 이터러블(예: 리스트)을 인자로 받아, 이터러블(iterable)의 각 요소에 함수를 적용한 결과를 반환합니다.
map(function, iterable)
예제 1: 리스트의 각 요소를 제곱하기
# 원본 리스트
numbers = [1, 2, 3, 4, 5]
# 각 요소를 제곱하는 함수
def square(x):
return x ** 2
# map을 사용한 변환
squared_numbers = list(map(square, numbers))
print(squared_numbers) # [1, 4, 9, 16, 25]
[code 해석]
- square 함수는 입력값을 제곱 처리.
- map 함수는 numbers 리스트의 각 요소에 square 함수를 적용.
- 결과는
[1, 4, 9, 16, 25]
로 변환.
lambda를 사용 한 map 예제
numbers = [1, 2, 3, 4, 5]
squared_numbers = list(map(lambda x: x ** 2, numbers))
print(squared_numbers) # [1, 4, 9, 16, 25]
3. filter() 함수
filter() 함수는 함수와 이터러블을 인자로 받아, 함수의 조건을 만족하는 요소만 걸러냅니다.
filter(function, iterable)
예제: 짝수만 걸러내기
# 원본 리스트
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
# 짝수인지 확인하는 함수
def is_even(x):
return x % 2 == 0
# filter를 사용한 필터링
even_numbers = list(filter(is_even, numbers))
print(even_numbers) # [2, 4, 6, 8, 10]
[code 해석]
- is_even 함수는 짝수를 확인.
- filter 함수는 numbers 리스트에서 짝수만 남김.
- 결과는
[2, 4, 6, 8, 10]
.
lambda를 사용한 필터링 예제
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
even_numbers = list(filter(lambda x: x % 2 == 0, numbers))
print(even_numbers) # [2, 4, 6, 8, 10]
4. reduce() 함수
reduce() 함수는 이터러블의 요소를 하나씩 누적하여 단일 값으로 만드는 역할을 합니다. 한가지 다른 함수들과 다른 점은 reduce의 경우 functools
모듈에서 가져와야 한다는 것입니다.
from functools import reduce
reduce(function, iterable, initializer=None)
예제: 리스트 요소의 합 계산하기
from functools import reduce
# 원본 리스트
numbers = [1, 2, 3, 4, 5]
# 두 숫자를 더하는 함수
def add(x, y):
return x + y
# reduce를 사용한 합계 계산
sum_of_numbers = reduce(add, numbers)
print(sum_of_numbers) # 15
[code 해석]
- add 함수는 두 숫자 합을 구함.
- reduce 함수는 리스트의 첫 두 요소부터 시작해, 결과를 누적하며 리스트의 끝까지 연산을 진행.
- 최종 결과는
15
.
lambda를 사용한 reduce 예시
from functools import reduce
numbers = [1, 2, 3, 4, 5]
sum_of_numbers = reduce(lambda x, y: x + y, numbers)
print(sum_of_numbers) # 15
5. map, filter, reduce를 조합하기
이번 예제에서는 위 세 가지를 모두 조합해 보도록 해보겠습니다.
텍스트에서 단어 수를 세어 보는 예제를 한번 개발해 보겠습니다. 코드는 다음과 같습니다.
from functools import reduce
text = "Python is easy to learn and fun to use. Python is powerful."
# 텍스트를 단어로 나누기
words = text.split()
# 단어 길이가 3 이상인 단어만 필터링
filtered_words = filter(lambda word: len(word) >= 3, words)
# 단어의 빈도를 계산하기 위해 리스트 변환 후 매핑
word_counts = map(lambda word: (word.lower(), 1), filtered_words)
# 단어 빈도를 합산하여 최종 결과 생성
word_frequency = reduce(
lambda acc, word_count: {**acc, word_count[0]: acc.get(word_count[0], 0) + word_count[1]},
word_counts,
{}
)
print(word_frequency) # {'python': 2, 'easy': 1, 'learn': 1, 'and': 1, 'fun': 1, 'use.': 1, 'powerful.': 1}
[code 해석]
- split()을 사용해 텍스트를 단어 리스트로 나눕니다.
- filter로 단어 길이가 3 이상인 단어만 남깁니다.
- map으로 단어를 소문자로 변환하고, 각 단어에 대한 빈도 값을
(단어, 1)
로 매핑합니다. - reduce로 동일한 단어의 빈도를 합산해 최종 딕셔너리를 만듭니다.
- 최종 결과는 텍스트 내 단어의 빈도를 나타냅니다.
map, filter, reduce는 Python의 유명한 함수들로, 데이터를 변형하고 필터링하며 집계 작업을 간단하게 처리할 수 있는데 유용합니다. pandas 같은 라이브러리와도 궁합이 좋고, 무엇보다 이들을 잘 사용하면 있어 보이는(!) 코드를 작성할 수 있다는 장점도 있습니다. :-) 다음 글에서는 Python의 또 다른 고급 기능인 Generator와 Iterator를 다룰 예정입니다. 많은 기대 부탁드립니다!
'⌨️Programming > 🐍Python' 카테고리의 다른 글
Python Functional Programming #2 (2) | 2025.01.07 |
---|---|
Python List Comprehension 마스터 하기 (0) | 2021.09.08 |