파이썬에서 함수형 프로그래밍 실습

함수형 프로그래밍은 계산을 함수의 평가로 간주하며, 가변 상태와 반복문 사용을 지양하는 프로그래밍 패러다임입니다. 함수형 프로그래밍은 함수의 계산에 중점을 두며, 부수효과는 최소화합니다.

함수형 프로그래밍에서는 함수가 일급 객체(first-class citizen)로 취급되며, 이는 함수가 다른 객체처럼 조작되고 전달될 수 있다는 것을 의미합니다.

Python은 객체 지향 프로그래밍 언어이지만, 함수형 프로그래밍의 특징도 지원합니다. Python에서 우리는 함수형 스타일의 코드를 작성하여 그 간결함과 효율성을 활용해 실질적인 문제를 해결할 수 있습니다.

1. 필수 개념

1.1 함수는 일급 객체이다

함수형 프로그래밍에서 함수는 일급 객체로 취급됩니다. 이는 함수가 다른 객체처럼 조작되고 전달될 수 있다는 것을 의미합니다.

이 덕분에 함수를 다른 함수의 인수로 전달하거나, 함수에서 함수를 반환할 수 있습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
def square(x):
return x * x

def cube(x):
return x * x * x

def compose(f, g):
return lambda x: f(g(x))

square_of_cube = compose(square, cube)

print(square_of_cube(2))
# 출력: 64

1.2 불변 데이터

함수형 프로그래밍은 불변 데이터를 중시합니다. 이는 데이터 구조가 한 번 생성되면 변경할 수 없음을 의미합니다.

모든 연산은 원래 데이터를 수정하지 않고, 새로운 데이터를 반환해야 합니다.

1
2
3
4
5
6
7
8
9
10
11
def increment(x):
return x + 1

num = 1
num_plus_one = increment(num)

print(num_plus_one)
# 출력: 2

print(num)
# 출력: 1

2. Python의 기능

Python은 순수 함수형 프로그래밍 언어는 아니지만, 함수형 프로그래밍의 일부 기능을 갖추고 있습니다. 이러한 기능은 더 깔끔하고 효율적인 코드를 작성하는 데 도움을 줍니다.

2.1 익명 함수와 람다(Lambda) 표현식

Python은 익명 함수를 지원하여 코드의 가독성을 높여줍니다. 람다 표현식은 간단한 익명 함수를 생성할 수 있는 Python의 중요한 기능입니다.

1
2
3
4
5
6
7
8
# 피보나치 수열을 생성하는 람다 함수
fibonacci = lambda n: n if n <= 1 else fibonacci(n - 1) + fibonacci(n - 2)

# 람다 함수를 사용하여 10번째 피보나치 수를 계산
tenth_fibonacci = fibonacci(10)

print(tenth_fibonacci)
# 출력: 55

이 예시에서 fibonacci 람다 함수는 재귀적으로 피보나치 수열을 생성합니다. 그런 다음, 이 함수를 사용해 10번째 피보나치 수를 계산하면 결과는 55가 됩니다.

2.2 리스트 컴프리헨션

리스트 컴프리헨션(List Comprehension)은 Python에서 매우 강력한 기능으로, 간결한 구문을 통해 리스트를 생성할 수 있게 합니다.

1
2
3
4
5
# 리스트 컴프리헨션 사용
squares = [x * x for x in range(10)]

print(squares)
# 출력: [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

3. 함수형 프로그래밍 실습

3.1 정렬과 맵핑

Python의 내장 함수 sortedmap을 사용하면 리스트를 쉽게 정렬하고 맵핑할 수 있습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
numbers = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5]

# 정렬
sorted_numbers = sorted(numbers)
print(sorted_numbers)
# 출력: [1, 1, 2, 3, 3, 4, 5, 5, 5, 6, 9]

# 제곱 함수 정의
square = lambda x: x * x

# 맵핑
squared_numbers = list(map(square, numbers))
print(squared_numbers)
# 출력: [9, 1, 16, 1, 25, 81, 4, 36, 25, 9, 25]

3.2 필터링과 집계

Python은 filterreduce 같은 내장 필터링 및 집계 함수를 제공합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
from functools import reduce

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

# 필터링
even_numbers = list(filter(lambda x: x % 2 == 0, numbers))
print(even_numbers)
# 출력: [4, 2, 6]

# 집계
summed = reduce(lambda x, y: x + y, numbers)
print(summed)
# 출력: 43

4. 메서드 체이닝을 사용한 파이프 시뮬레이션

Python에서는 Unix 쉘 스크립트와 같은 “Pipe” 개념이 기본적으로 제공되지는 않지만, 메서드 체이닝(Method Chaining)이나 함수 조합을 사용해 유사한 기능을 구현할 수 있습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# 함수 정의
def square(x):
return x ** 2

def double(x):
return x * 2

def add_five(x):
return x + 5

# 파이프 같은 구성을 위한 메서드 체이닝
class Pipeable:
def __init__(self, value):
self.value = value

def pipe(self, func):
self.value = func(self.value)
return self

number = Pipeable(3)

# 메서드 체이닝을 통한 파이프 구성
result = number.pipe(square).pipe(double).pipe(add_five)

print(result.value)
# 출력: 23

이 예시는 Pipeable 클래스를 사용하여 파이프와 같은 구성을 구현하는 방법을 보여줍니다. pipe 메서드를 사용해 각 함수가 이전 결과를 받아들여 처리할 수 있습니다.

요약

함수형 프로그래밍은 함수 계산에 중점을 두며, 부수효과를 최소화하는 새로운 프로그래밍 패러다임입니다.

Python은 함수형 프로그래밍 기능을 지원하여 더 간단하고 효율적인 코드를 작성할 수 있게 합니다. Python은 순수 함수형 언어는 아니지만, 데이터 처리와 응용 프로그램 개발에서 매우 강력한 기능을 제공합니다.

장점:

  • 코드가 간결함
  • 이해 및 유지보수가 쉬움
  • 코드 재사용성을 높임

단점:

  • 학습 비용이 있을 수 있음
  • 일부 상황에서는 명령형 프로그래밍보다 성능이 낮을 수 있음

결론적으로, 함수형 프로그래밍은 모듈화되고 이해하기 쉬운 유지보수성이 높은 코드를 작성하는 데 도움이 되는 강력한 프로그래밍 패러다임입니다. Python에서 함수형 프로그래밍의 기능을 활용해 실질적인 문제를 해결하고, 프로그래밍 효율성을 높여보세요!

Share