본문 바로가기
⌨️Programming/🐍Python

Python Functional Programming #1

by 코푸보이 2024. 12. 12.
반응형

 지난 글에서는 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 해석]

  1. square 함수는 입력값을 제곱 처리.
  2. map 함수는 numbers 리스트의 각 요소에 square 함수를 적용.
  3. 결과는 [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 해석]

 

 

  1. is_even 함수는 짝수를 확인.
  2. filter 함수는 numbers 리스트에서 짝수만 남김.
  3. 결과는 [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 해석]

  1. add 함수는 두 숫자 합을 구함.
  2. reduce 함수는 리스트의 첫 두 요소부터 시작해, 결과를 누적하며 리스트의 끝까지 연산을 진행.
  3. 최종 결과는 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 해석]

 

  1. split()을 사용해 텍스트를 단어 리스트로 나눕니다.
  2. filter로 단어 길이가 3 이상인 단어만 남깁니다.
  3. map으로 단어를 소문자로 변환하고, 각 단어에 대한 빈도 값을 (단어, 1)로 매핑합니다.
  4. reduce로 동일한 단어의 빈도를 합산해 최종 딕셔너리를 만듭니다.
  5. 최종 결과는 텍스트 내 단어의 빈도를 나타냅니다.

 

map, filter, reduce는 Python의 유명한 함수들로, 데이터를 변형하고 필터링하며 집계 작업을 간단하게 처리할 수 있는데 유용합니다. pandas 같은 라이브러리와도 궁합이 좋고, 무엇보다 이들을 잘 사용하면 있어 보이는(!) 코드를 작성할 수 있다는 장점도 있습니다. :-) 다음 글에서는 Python의 또 다른 고급 기능인 GeneratorIterator를 다룰 예정입니다. 많은 기대 부탁드립니다!

반응형

'⌨️Programming > 🐍Python' 카테고리의 다른 글

Python Functional Programming #2  (2) 2025.01.07
Python List Comprehension 마스터 하기  (0) 2021.09.08