Data Engineering/python

EP12 | 고급 Python 활용 #1 | 함수형 프로그래밍 (Map, Filter, Reduce, List Comprehension)

ygtoken 2025. 3. 19. 22:49
728x90

이 글에서 다루는 개념

Python에서는 함수형 프로그래밍(Functional Programming) 개념을 활용하여 보다 간결하고 효율적인 코드를 작성할 수 있습니다.
이번 글에서는 다음 내용을 학습합니다.

  • 고차 함수(First-Class Function) 개념
  • map(), filter(), reduce() 함수 활용법
  • 리스트 컴프리헨션(List Comprehension)과 비교
  • 함수형 프로그래밍을 활용한 실용적인 예제

1️⃣ 함수형 프로그래밍이란?

함수형 프로그래밍(Functional Programming)은 함수를 일급 객체(First-Class Citizen)로 다루는 프로그래밍 패러다임입니다.
Python은 객체지향 언어이지만, 함수형 프로그래밍 요소도 지원합니다.

📌 Python의 함수형 프로그래밍 특징

  • 함수를 변수에 저장할 수 있음
  • 함수를 인자로 전달 가능
  • 함수를 반환할 수 있음
def square(x):
    return x * x

# 함수를 변수에 할당
func = square
print(func(5))  # 25

2️⃣ map(), filter(), reduce() 함수

Python의 map(), filter(), reduce() 함수는 반복문을 줄이고 가독성을 높이는 함수형 도구입니다.

🔹 map() – 모든 요소에 함수 적용

map(함수, 이터러블)을 사용하면 모든 요소에 함수를 적용할 수 있습니다.

numbers = [1, 2, 3, 4, 5]
squared = list(map(lambda x: x**2, numbers))
print(squared)  # [1, 4, 9, 16, 25]

🔹 filter() – 특정 조건을 만족하는 요소 필터링

filter(함수, 이터러블)을 사용하면 특정 조건을 만족하는 요소만 남길 수 있습니다.

numbers = [1, 2, 3, 4, 5, 6]
evens = list(filter(lambda x: x % 2 == 0, numbers))
print(evens)  # [2, 4, 6]

🔹 reduce() – 누적 연산 수행

reduce(함수, 이터러블)을 사용하면 누적 연산을 수행할 수 있습니다.
(⚠ functools.reduce를 사용해야 함)

from functools import reduce

numbers = [1, 2, 3, 4, 5]
sum_result = reduce(lambda x, y: x + y, numbers)
print(sum_result)  # 15 (1+2+3+4+5)

3️⃣ 리스트 컴프리헨션 (List Comprehension)

리스트 컴프리헨션을 사용하면 반복문 없이 리스트를 생성할 수 있습니다.

# 일반적인 방법
numbers = [1, 2, 3, 4, 5]
squared = [x**2 for x in numbers]
print(squared)  # [1, 4, 9, 16, 25]

 

📌 리스트 컴프리헨션과 map() 비교

numbers = [1, 2, 3, 4, 5]

# map() 사용
squared_map = list(map(lambda x: x**2, numbers))

# 리스트 컴프리헨션 사용
squared_list = [x**2 for x in numbers]

print(squared_map)   # [1, 4, 9, 16, 25]
print(squared_list)  # [1, 4, 9, 16, 25]

💡 리스트 컴프리헨션은 map()보다 가독성이 좋고 성능도 더 좋음!


🔹 조건이 포함된 리스트 컴프리헨션

# 짝수만 필터링
evens = [x for x in range(10) if x % 2 == 0]
print(evens)  # [0, 2, 4, 6, 8]

 

📌 리스트 컴프리헨션과 filter() 비교

numbers = list(range(10))

# filter() 사용
evens_filter = list(filter(lambda x: x % 2 == 0, numbers))

# 리스트 컴프리헨션 사용
evens_list = [x for x in numbers if x % 2 == 0]

print(evens_filter)  # [0, 2, 4, 6, 8]
print(evens_list)    # [0, 2, 4, 6, 8]

📌 실전 문제: 함수형 프로그래밍 연습하기


문제 1: map()을 사용하여 리스트의 각 요소를 제곱하기

📌 리스트 [1, 2, 3, 4, 5]의 각 요소를 제곱한 새로운 리스트를 생성하세요.

numbers = [1, 2, 3, 4, 5]
# 🔽 여기에 코드 작성
numbers = [1, 2, 3, 4, 5]
squared = list(map(lambda x: x**2, numbers))
print(squared)  # [1, 4, 9, 16, 25]

문제 2: filter()를 사용하여 홀수만 추출하기

📌 리스트 [1, 2, 3, 4, 5, 6, 7, 8, 9]에서 홀수만 추출하세요.

numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9]
# 🔽 여기에 코드 작성
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9]
odds = list(filter(lambda x: x % 2 != 0, numbers))
print(odds)  # [1, 3, 5, 7, 9]

문제 3: reduce()를 사용하여 리스트의 모든 값 곱하기

📌 리스트 [1, 2, 3, 4, 5]의 모든 값을 곱한 결과를 반환하세요.

from functools import reduce
numbers = [1, 2, 3, 4, 5]
# 🔽 여기에 코드 작성
from functools import reduce

numbers = [1, 2, 3, 4, 5]
product = reduce(lambda x, y: x * y, numbers)
print(product)  # 120

문제 4: 리스트 컴프리헨션을 사용하여 1부터 10까지 제곱값 리스트 생성하기

📌 1부터 10까지 숫자의 제곱을 리스트 컴프리헨션으로 생성하세요.

# 🔽 여기에 코드 작성
squared = [x**2 for x in range(1, 11)]
print(squared)  # [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

 

728x90