728x90
반응형
1. Lambda 함수의 정의 및 구문
- 람다 함수는 이름 없이 정의되는(anonymous function) 작고 한 줄짜리 함수
- 일반적인 def 키워드를 사용한 함수보다 훨씬 짧게 함수를 정의
- 람다 함수의 기본 구문
- 1. lambda 키워드: 람다 함수를 정의하는 데 사용
- 2. 인자들: 함수가 받을 수 있는 인자들을 나열 (예: x, x, y 등).
- 3. : (콜론): 인자와 표현식을 구분
- 4. 표현식: 이 표현식은 평가(evaluate)되어 그 결과가 반환
lambda 인자들(arguments): 표현식(expression)
예시: 단일 인자 함수
- EX) 어떤 값에 10을 더하는 함수를 람다로 정의하고 호출하는 방법
add_10 = lambda x: x + 10
print(add_10(5)) # 결과: 15
- 이 람다 함수는 인자 x를 받고 x + 10이라는 표현식을 평가하여 결과를 반환
- 이는 일반적인 def를 사용한 함수와 기능적으로 동일
예시: 다중 인자 함수
- 람다 함수는 여러 인자를 가질 수도 있음
mult = lambda x, y: x * y
print(mult(2, 7)) # 결과: 14
- 이 함수는 두 인자 x와 y를 받아 이들을 곱한 결과를 반환
2. Lambda 함수의 주요 사용 사례
- 람다 함수는 일반적으로 코드 내에서 한 번만 사용되는 간단한 함수가 필요할 때 사용
- 특히, **고차 함수(higher-order functions)**의 인수로 사용될 때 유용성이 극대화
- 고차 함수란 다른 함수를 인수로 받거나 함수를 결과로 반환하는 함수를 의미
- Python의 내장 함수인 sorted, map, filter, reduce 등과 함께 자주 사용
2.1. sorted() 함수에서 정렬 기준으로 사용하기
- sorted() 함수는 key 인수를 사용하여 정렬 기준을 사용자 정의
- 람다 함수는 이 key 인수로 매우 유용하게 사용
- EX) 튜플 리스트 정렬
- 2차원 좌표를 나타내는 튜플 리스트가 있다고 가정해 보겠습니다:
- 기본적으로 sorted()는 첫 번째 요소(x 값)를 기준으로 리스트를 정렬
- 하지만 y 값(두 번째 인덱스, 즉 인덱스 1)을 기준으로 정렬하고 싶다면 람다 함수를 키로 사용 가능
- 정렬할 각 요소(x, 여기서는 튜플)를 인수로 받아 x (y 값)을 반환하며, 이 반환된 값을 기준으로 정렬이 이루어짐
- 이처럼 람다를 사용하면 별도의 정렬 함수를 정의할 필요 X
- EX) 요소들의 합계를 기준으로 정렬
- 각 튜플 요소의 합계(x + y)를 기준으로 정렬
points_2d = [(1, 5), (15, 1), (5, 10), (10, 2)]
# 1) y 값(인덱스 1)을 기준으로 정렬
sorted_by_y = sorted(points_2d, key=lambda p: p[1])
print("sorted_by_y:", sorted_by_y)
## 출력: sorted_by_y: [(15, 1), (10, 2), (1, 5), (5, 10)]
# 2) 각 요소의 합(x + y)을 기준으로 정렬
sorted_by_sum = sorted(points_2d, key=lambda p: p[0] + p[1])
print("sorted_by_sum:", sorted_by_sum)
## 출력: sorted_by_sum: [(1, 5), (10, 2), (5, 10), (15, 1)]
2.2. map() 함수에서 요소 변환에 사용하기
- map() 함수는 시퀀스(sequence, 리스트 등)의 각 요소를 특정 함수를 이용해 변환
- 인수로 함수와 시퀀스를 받음
예시: 모든 요소 2배로 만들기
a = [5, 6, 7]
# map + lambda: 각 요소를 2배
b = list(map(lambda x: x * 2, a))
print("map ->", b)
## 출력: map -> [10, 12, 14]
# 같은 작업 — 리스트 컴프리헨션 (권장)
c = [x * 2 for x in a]
print("list comprehension ->", c)
## 출력: list comprehension -> [10, 12, 14]
- map 함수는 맵 객체(map object)를 반환하므로 결과를 확인하려면 리스트로 변환해야 합니다.
참고: map 함수와 람다를 사용하는 것보다 **리스트 컴프리헨션(list comprehension)**을 사용하는 것이 더 간결하고 일반적으로 선호됩니다. 위 코드를 리스트 컴프리헨션으로 작성하면 다음과 같습니다: c = [x * 2 for x in a].
2.3. filter() 함수에서 조건 필터링에 사용하기
- filter() 함수는 시퀀스의 요소들 중 특정 조건 함수가 True를 반환하는 요소만 걸러낼 수 있음
- 인수로 함수와 시퀀스를 받음
- EX) 짝수만 걸러내기
a = [5, 6, 7, 8, 9, 10]
# 짝수만 필터링
evens = list(filter(lambda x: x % 2 == 0, a))
print("filter evens ->", evens)
## 출력: filter evens -> [6, 8, 10]
# 같은 작업 — 리스트 컴프리헨션 (권장)
evens_comp = [x for x in a if x % 2 == 0]
print("comprehension evens ->", evens_comp)
## 출력: comprehension evens -> [6, 8, 10]
- filter 함수가 반환하는 객체를 리스트로 변환
참고: map과 마찬가지로 filter와 람다 조합 대신 리스트 컴프리헨션이 더 간결하게 사용될 수 있습니다. 예: c = [x for x in a if x % 2 == 0].
2.4. reduce() 함수에서 누적 계산에 사용하기
- reduce() 함수는 함수를 요소들에 반복적으로 적용하여 단일 값을 반환
- reduce를 사용하려면 functools 모듈에서 reduce를 명시적으로 가져와야 합니다.
- EX) 리스트의 모든 요소 곱하기
from functools import reduce
# 예: 리스트 요소들의 곱
a = [1, 2, 3, 4]
product_a = reduce(lambda x, y: x * y, a)
print("reduce product:", product_a)
## 출력: reduce product: 24
# 주의: reduce는 첫 두 요소부터 시작해 누적 적용 (항상 두 인자 받는 함수 필요)
- reduce 함수에 사용되는 람다 함수는 항상 두 개의 인자를 받아야 함(x, y).
3. 기타 활용 (Itertools)
- 람다 함수는 itertools 모듈의 groupby와 같은 다른 고급 기능에서도 키로 사용
- groupby 함수는 반복 가능한 객체(iterable)를 키 함수에 따라 그룹화하는 데 사용 [http://jk25.tistory.com/213 참고]
예를 들어, 리스트 a를 '3보다 작은지 여부'를 기준으로 그룹화할 때 람다 함수를 사용할 수 있습니다:
from itertools import groupby
# 1) 간단한 연속 그룹화 예
data = [1, 1, 2, 2, 3, 1]
for key, group in groupby(data):
print(key, "->", list(group))
## 출력:
# 1 -> [1, 1]
# 2 -> [2, 2]
# 3 -> [3]
# 1 -> [1]
# 2) 딕셔너리 리스트를 특정 키(age)로 그룹화할 때 (정렬 필요)
people = [
{"name": "Tim", "age": 25},
{"name": "Jen", "age": 25},
{"name": "Bob", "age": 30},
{"name": "Ann", "age": 20}
]
# age 기준으로 정렬한 다음 그룹화
people_sorted = sorted(people, key=lambda x: x['age'])
for age, group in groupby(people_sorted, key=lambda x: x['age']):
print(age, ":", [p['name'] for p in group])
## 출력:
# 20 : ['Ann']
# 25 : ['Tim', 'Jen']
# 30 : ['Bob']
********권장 사항*******
- 람다는 짧고 단순한 식(expression)에 적합
- 복잡한 로직은 가독성을 위해 def로 정의하는 것이 좋습니다.
- map/filter + lambda 대신 리스트 컴프리헨션이나 제너레이터 표현식이 더 파이썬답고 가독성이 좋음 [https://jk25.tistory.com/207 참고]
- sorted(..., key=...), groupby(..., key=...)처럼 함수 객체가 곧바로 필요한 곳에서는 람다가 특히 유용
728x90
반응형
'프로그래밍 > Python' 카테고리의 다른 글
| [파이썬 / 기본] Logging (0) | 2025.10.24 |
|---|---|
| [파이썬 / 기본] Errors and Exceptions (오류와 예외처리) (0) | 2025.10.23 |
| [파이썬 / 기본] itertools (0) | 2025.10.21 |
| [파이썬 / 기본] collections (0) | 2025.10.20 |
| [파이썬 / 기본] String " " (0) | 2025.10.19 |