Python의 기능적 프로그래밍: 심층 탐색
James Reed
Infrastructure Engineer · Leapcell

기능적 프로그래밍 개요
기능적 프로그래밍은 코드의 모든 부분이 불변하며 순수 함수로 구성되는 스타일을 의미합니다. 순수 함수는 다른 함수와 독립적이며 동일한 입력을 받으면 항상 동일한 출력을 생성하는 함수입니다.
또한 기능적 프로그래밍은 함수를 다른 함수의 인수로 전달하고 함수를 반환할 수 있는 특징이 있습니다.
순수 함수 예시
예를 들어, 리스트의 요소 값을 두 배로 늘리려면 다음 함수를 사용할 수 있습니다.
def multiply_2(list): for index in range(0, len(list)): list[index] *= 2 return list
이 코드는 리스트의 요소 값을 수정하므로 순수 함수 형태가 아닙니다. multiply_2()
함수를 여러 번 호출하면 매번 결과가 달라집니다.
multiply_2()
를 순수 함수로 만들려면 다음과 같이 새 리스트를 만들어 반환해야 합니다.
def multiply_2_pure(list): new_list = [] for item in list: new_list.append(item * 2) return new_list
기능적 프로그래밍의 장단점
기능적 프로그래밍의 장점은 주로 순수 함수와 불변 특성으로 인해 프로그램을 더 강력하게 만들고 디버깅 및 테스트가 더 쉽다는 점입니다. 단점은 주로 제약 조건이 많고 작성하기 어렵다는 점입니다.
순수 기능적 프로그래밍 언어(예: Scala)에서는 작성된 함수에 변수가 없으므로 입력이 결정되는 한 출력이 결정되는 것을 보장할 수 있습니다. 변수 사용을 허용하는 프로그래밍 언어에서는 함수 내부의 변수 상태가 불확실하여 동일한 입력이 다른 출력을 초래할 수 있습니다.
Python은 변수 사용을 허용하므로 순수 기능적 프로그래밍 언어가 아닙니다. Python은 기능적 프로그래밍에 대한 부분적인 지원만 제공하며, 주로 map()
, filter()
, reduce()
의 세 가지 함수를 포함하며, 일반적으로 lambda
익명 함수와 함께 사용됩니다. 다음으로 이 세 가지 함수의 사용법을 하나씩 소개합니다.
Python의 기능적 프로그래밍 지원 함수
Python map() 함수
map()
함수의 기본 구문은 다음과 같습니다.
map(function, iterable)
여기서 function
매개변수는 전달될 함수를 나타내며, 내장 함수, 사용자 정의 함수 또는 lambda
익명 함수일 수 있습니다. iterable
은 리스트, 문자열 등 하나 이상의 반복 가능한 객체를 나타냅니다.
map()
함수의 기능은 반복 가능한 객체의 각 요소에 대해 지정된 함수를 호출하고 map
객체를 반환하는 것입니다.
함수는 map
객체를 반환하며, 직접 출력할 수 없습니다. for
루프 또는 list()
함수를 통해 표시할 수 있습니다.
[예제 1] 리스트의 각 요소를 2로 곱하기
listDemo = [1, 2, 3, 4, 5] new_list = map(lambda x: x * 2, listDemo) print(list(new_list))
실행 결과는 다음과 같습니다.
[2, 4, 6, 8, 10]
[예제 2] 여러 반복 가능한 객체를 map() 함수에 매개변수로 전달하기
listDemo1 = [1, 2, 3, 4, 5] listDemo2 = [3, 4, 5, 6, 7] new_list = map(lambda x,y: x + y, listDemo1,listDemo2) print(list(new_list))
실행 결과는 다음과 같습니다.
[4, 6, 8, 10, 12]
map()
함수는 C 언어로 직접 작성되었기 때문에 런타임 시 Python 인터프리터를 통해 간접적으로 호출할 필요가 없으며 내부적으로 많은 최적화가 이루어졌습니다. 따라서 다른 방법과 비교하여 이 방법이 실행 효율이 가장 높습니다.
Python filter() 함수
filter()
함수의 기본 구문은 다음과 같습니다.
filter(function, iterable)
이 형식에서 funcition
매개변수는 전달될 함수를 나타내고 iterable
은 반복 가능한 객체를 나타냅니다.
filter()
함수의 기능은 function
함수를 사용하여 iterable
의 각 요소를 판단하고 True
또는 False
를 반환하는 것입니다. 마지막으로 True
를 반환하는 요소를 새로운 순회 가능한 컬렉션으로 결합합니다.
[예제 3] 리스트에서 모든 짝수 반환
listDemo = [1, 2, 3, 4, 5] new_list = filter(lambda x: x % 2 == 0, listDemo) print(list(new_list))
실행 결과는 다음과 같습니다.
[2, 4]
[예제 4] filter() 함수는 여러 반복 가능한 객체를 허용합니다.
listDemo = [1, 2, 3, 4, 5] new_list = map(lambda x,y: x-y>0,[3,5,6],[1,5,8] ) print(list(new_list))
실행 결과는 다음과 같습니다.
[True, False, False]
Python reduce() 함수
reduce()
함수는 일반적으로 컬렉션에 대한 일부 누적 연산을 수행하는 데 사용됩니다. 기본 구문은 다음과 같습니다.
reduce(function, iterable)
여기서 function
은 두 개의 매개변수를 가진 함수여야 하며 iterable
은 반복 가능한 객체를 나타냅니다.
reduce()
함수는 Python 3.x에서 제거되어 functools
모듈에 배치되었으므로 이 함수를 사용하기 전에 functools
모듈을 가져와야 합니다.
[예제 5] 리스트의 요소 곱 계산
import functools listDemo = [1, 2, 3, 4, 5] product = functools.reduce(lambda x, y: x * y, listDemo) print(product)
실행 결과는 다음과 같습니다.
120
요약
일반적으로 컬렉션의 요소에 대한 일부 연산을 수행할 때 추가, 누적 등과 같이 연산이 매우 간단한 경우 map()
, filter()
, reduce()
를 먼저 고려해야 합니다. 또한 데이터 양이 매우 큰 경우(예: 기계 학습 응용 프로그램) 효율성이 높기 때문에 일반적으로 기능적 프로그래밍 표현이 선호됩니다.
물론 데이터 양이 크지 않은 경우 for
루프와 같은 메서드를 사용할 수도 있습니다. 그러나 컬렉션의 요소에 대해 더 복잡한 연산을 수행해야 하는 경우 코드의 가독성을 고려하여 일반적으로 for
루프가 사용됩니다.
Leapcell: 차세대 웹 호스팅, 비동기 작업 및 Redis용 서버리스 플랫폼
마지막으로 Python 앱 배포에 가장 적합한 플랫폼인 Leapcell을 추천합니다.
1. 다국어 지원
- JavaScript, Python, Go 또는 Rust로 개발합니다.
2. 무제한 프로젝트를 무료로 배포
- 사용량에 대해서만 비용을 지불합니다. 요청이나 요금이 없습니다.
3. 최고의 비용 효율성
- 유휴 요금 없이 사용한 만큼 지불합니다.
- 예: 60ms 평균 응답 시간에서 25달러로 694만 건의 요청을 지원합니다.
4. 간소화된 개발자 경험
- 간편한 설정을 위한 직관적인 UI.
- 완전 자동화된 CI/CD 파이프라인 및 GitOps 통합.
- 실행 가능한 통찰력을 위한 실시간 메트릭 및 로깅.
5. 간편한 확장성 및 고성능
- 쉬운 동시성 처리를 위한 자동 확장.
- 운영 오버헤드가 없어 구축에만 집중할 수 있습니다.
Leapcell Twitter: https://x.com/LeapcellHQ