나혼자 코딩
Python 함수 심화: 람다 함수, *args와 **kwargs, 함수형 프로그래밍 본문
전전 글에서 Python의 함수 개념과 기본적인 사용법을 다루었습니다. 이제 한 단계 더 나아가, 람다 함수(Lambda Function), 가변 매개변수(*args, **kwargs), 함수형 프로그래밍을 활용하는 방법을 심도 있게 살펴보겠습니다. 이러한 개념을 숙달하면 Python 코드의 가독성, 재사용성, 확장성을 극대화할 수 있으며, 특히 데이터 분석 및 고급 소프트웨어 개발에서 필수적인 역량이 됩니다.
1. 람다 함수 (Lambda Function)
람다 함수는 이름 없이 간단한 연산을 수행하는 익명 함수로, 주로 고차 함수에서 사용됩니다. 가독성과 유지보수성을 고려하여 사용 범위를 신중히 결정하는 것이 중요합니다.
1-1. 람다 함수 기본 문법
# 일반 함수
def add(a, b):
return a + b
# 람다 함수로 변환
add_lambda = lambda a, b: a + b
print(add(3, 5)) # 출력: 8
print(add_lambda(3, 5)) # 출력: 8
1-2. 람다 함수의 활용
람다 함수는 map()
, filter()
, sorted()
같은 고차 함수와 함께 사용되며, 특히 데이터 변환 및 필터링 작업에서 강력한 성능을 발휘합니다.
numbers = [1, 2, 3, 4, 5]
# map()과 함께 사용 (각 요소를 제곱)
squared = list(map(lambda x: x**2, numbers))
print(squared) # 출력: [1, 4, 9, 16, 25]
# filter()와 함께 사용 (짝수만 필터링)
evens = list(filter(lambda x: x % 2 == 0, numbers))
print(evens) # 출력: [2, 4]
람다 함수는 한 줄로 표현 가능한 간단한 연산에 적합하지만, 복잡한 로직을 포함하면 가독성이 떨어질 수 있으므로 주의가 필요합니다.
2. 가변 매개변수 (*args, **kwargs)
Python에서는 함수의 매개변수 개수를 유동적으로 받을 수 있도록 *args
와 **kwargs
를 제공합니다. 이를 활용하면 정해진 개수 이상의 인자를 처리할 수 있으며, 함수의 재사용성을 높일 수 있습니다.
(1) *args: 여러 개의 위치 인자 받기
*args
는 여러 개의 위치 인자를 튜플 형태로 전달받아 동적으로 처리할 수 있습니다.
def sum_all(*args):
return sum(args)
print(sum_all(1, 2, 3, 4, 5)) # 출력: 15
(2) **kwargs: 여러 개의 키워드 인자 받기
**kwargs
는 여러 개의 키워드 인자를 딕셔너리 형태로 전달받아 유연한 함수 호출을 가능하게 합니다.
def print_info(**kwargs):
for key, value in kwargs.items():
print(f"{key}: {value}")
print_info(name="Alice", age=30, city="Seoul")
# 출력:
# name: Alice
# age: 30
# city: Seoul
(3) *args와 **kwargs 함께 사용하기
이 두 가지를 조합하면, 위치 인자와 키워드 인자를 모두 수용하는 강력한 함수를 설계할 수 있습니다.
def function_example(a, b, *args, **kwargs):
print(f"a: {a}, b: {b}")
print("추가 위치 인자:", args)
print("추가 키워드 인자:", kwargs)
function_example(1, 2, 3, 4, name="Alice", age=25)
출력:
a: 1, b: 2
추가 위치 인자: (3, 4)
추가 키워드 인자: {'name': 'Alice', 'age': 25}
이러한 기법을 사용하면 함수의 유연성을 극대화할 수 있으며, 다양한 입력을 처리하는 범용 함수 작성이 가능합니다.
3. 함수형 프로그래밍 (Functional Programming)
함수형 프로그래밍은 함수를 일급 객체로 다루며, 고차 함수를 적극적으로 활용하는 패러다임입니다. Python에서는 map()
, filter()
, reduce()
등의 함수를 제공하여 함수형 프로그래밍을 지원합니다.
(1) map(): 모든 요소에 함수 적용
numbers = [1, 2, 3, 4, 5]
squared = list(map(lambda x: x**2, numbers))
print(squared) # 출력: [1, 4, 9, 16, 25]
(2) filter(): 조건을 만족하는 요소만 필터링
evens = list(filter(lambda x: x % 2 == 0, numbers))
print(evens) # 출력: [2, 4]
(3) reduce(): 연속적인 연산 수행
reduce()
는 functools
모듈에서 제공되며, 리스트의 모든 값을 누적하여 연산합니다.
from functools import reduce
# 리스트의 모든 요소를 곱하기
def multiply(x, y):
return x * y
result = reduce(multiply, [1, 2, 3, 4, 5])
print(result) # 출력: 120
이러한 함수형 프로그래밍 기법을 활용하면 코드를 간결하게 유지하면서도 강력한 데이터 처리를 수행할 수 있습니다.
마무리
이번 글에서는 람다 함수, 가변 매개변수, 함수형 프로그래밍을 활용하는 방법을 심도 있게 살펴보았습니다.
- 람다 함수는 간단한 연산을 수행하는 익명 함수로 활용할 수 있습니다.
*args
,**kwargs
는 다양한 개수의 인자를 처리하는 유연한 함수 작성에 유용합니다.map()
,filter()
,reduce()
를 활용한 함수형 프로그래밍 기법은 데이터 분석 및 처리에서 강력한 도구가 될 수 있습니다.
이제 Python의 고급 함수를 실무에서 활용하여, 보다 효율적인 코드를 작성해봅시다!