Tech & Development/Programming Languages

[Python] 함수형 프로그래밍

Theo (테오) 2024. 11. 24. 00:54
반응형

함수형 프로그래밍은 함수를 일급 객체로 취급하며, 불변 데이터와 순수 함수를 중심으로 하는 프로그래밍 패러다임입니다. Python은 객체지향 언어이지만, 함수형 프로그래밍의 강력한 기능도 제공합니다. 이 글에서는 Python에서 제공하는 함수형 프로그래밍 기법과 이를 활용하는 방법을 다룹니다.


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

함수형 프로그래밍은 다음과 같은 특징을 가지고 있습니다:

  • 순수 함수: 함수는 입력값만을 사용하며 외부 상태를 변경하지 않습니다.
  • 불변성: 데이터는 변경되지 않고, 항상 새 데이터를 반환합니다.
  • 고차 함수: 함수를 매개변수로 전달하거나 반환할 수 있습니다.

Python에서 함수형 프로그래밍을 지원하는 주요 도구는 map(), filter(), reduce(), 그리고 lambda 함수입니다.


2. map() 함수

map() 함수는 반복 가능한 객체의 각 요소에 대해 함수를 적용하여 새 값을 반환합니다.

사용법

map(function, iterable)
  • function: 각 요소에 적용할 함수.
  • iterable: 적용 대상 데이터(iterable).

예제

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

 


3. filter() 함수

filter() 함수는 조건을 만족하는 요소만 걸러냅니다.

사용법

filter(function, iterable)
  • function: 조건을 정의하는 함수.
  • iterable: 필터링 대상 데이터(iterable).

예제

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


4. reduce() 함수

reduce() 함수는 반복 가능한 객체의 요소를 누적하여 단일 값을 반환합니다. 이 함수는 functools 모듈에서 제공됩니다.

사용법

from functools import reduce

reduce(function, iterable[, initializer])
  • function: 누적 결과를 처리할 함수.
  • iterable: 반복 가능한 데이터(iterable).
  • initializer(선택): 초기값.

예제

from functools import reduce

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

 


5. lambda 함수

lambda 함수는 이름 없는 익명 함수로, 간단한 함수를 짧게 정의할 때 유용합니다.

사용법

lambda arguments: expression

예제

add = lambda x, y: x + y
print(add(3, 5))  # 8

lambda 함수는 map(), filter(), reduce()와 함께 사용하면 더욱 강력합니다.


6. 재귀 함수 (Recursive Function)

재귀 함수는 함수가 자기 자신을 호출하는 구조로, 특정 문제를 반복적으로 쪼개어 해결합니다.

예제: 팩토리얼 계산

def factorial(n):
    if n == 1:
        return 1
    return n * factorial(n - 1)

print(factorial(5))  # 120

재귀는 간결한 코드 작성을 가능하게 하지만, 무한 루프에 빠지지 않도록 종료 조건이 필수적입니다.


7. 클로저 (Closures)

클로저는 함수가 정의될 때의 변수 환경을 기억하여, 외부 함수의 변수를 참조하는 내부 함수를 반환합니다.

예제

def multiplier(factor):
    def multiply(number):
        return number * factor
    return multiply

double = multiplier(2)
print(double(5))  # 10

클로저는 외부 상태를 유지하면서도 캡슐화를 제공하여 함수형 프로그래밍에서 자주 사용됩니다.


함수형 프로그래밍의 장점

  1. 코드 가독성: 데이터 변환 과정을 간결하고 명확하게 표현.
  2. 재사용성: 고차 함수와 익명 함수로 유연한 코드 작성.
  3. 버그 감소: 불변성을 통해 데이터 변경으로 인한 버그를 줄임.

함수형 프로그래밍의 단점

  1. 복잡한 로직: 지나치게 많은 중첩된 함수 사용 시 가독성 저하.
  2. 재귀 한계: Python의 재귀 깊이 제한으로 인해 스택 오버플로우 위험.

Python의 함수형 프로그래밍 도구는 데이터를 변환하고 필터링하며, 복잡한 문제를 간결하게 해결하는 데 유용합니다. map(), filter(), reduce()와 같은 함수와 lambda, 재귀 함수, 클로저를 활용하여 더욱 효율적이고 깔끔한 코드를 작성할 수 있습니다.

반응형