람다 표현식은 def 키워드 없이 함수를 식(expression) 형태로 간결하게 작성하는 방법입니다. 이름이 없는 함수를 만들기 때문에 익명 함수(Anonymous Function) 라고도 부릅니다.
기본 문법은 다음과 같습니다.
lambda 매개변수들 : 반환값으로 사용할 식
실제로 작성해보면 아래와 같습니다.
# 람다 표현식 작성 — 객체로 출력됨
lambda x: x + 10
# <function <lambda> at 0x...>
이름이 없기 때문에 그냥 실행하면 함수 객체가 반환됩니다. 호출하려면 변수에 할당하거나, 즉시 호출해야 합니다.
# 변수에 할당 후 호출
add_ten = lambda x: x + 10
print(add_ten(5)) # 15
print(add_ten(20)) # 30
람다 표현식을 괄호로 감싼 뒤 바로 인수를 전달하면 즉시 호출할 수 있습니다.
# (lambda 매개변수: 식)(인수)
result = (lambda x, y: x + y)(3, 7)
print(result) # 10
람다 표현식이 가장 많이 쓰이는 곳은 map(), filter(), sorted() 같은 함수의 인수로 전달할 때입니다. 별도의 함수를 def로 정의하지 않아도 되기 때문에 코드가 훨씬 간결해집니다.
numbers = [1, 2, 3, 4, 5]
# map(): 각 요소에 함수 적용
result = list(map(lambda x: x * 2, numbers))
print(result) # [2, 4, 6, 8, 10]
# filter(): 조건에 맞는 요소만 추출
evens = list(filter(lambda x: x % 2 == 0, numbers))
print(evens) # [2, 4]
# sorted(): 정렬 기준 지정
pairs = [(1, 'b'), (3, 'a'), (2, 'c')]
sorted_pairs = sorted(pairs, key=lambda x: x[1])
print(sorted_pairs) # [(3, 'a'), (1, 'b'), (2, 'c')]
람다 표현식은 간결함이 장점이지만, 그만큼 할 수 없는 것도 있습니다.
# ❌ 람다 표현식 안에서 새 변수 생성 불가
# lambda x: (y = x + 10) # SyntaxError!
# ✅ 변수가 필요한 경우 def 함수로 작성
def add_and_store(x):
y = x + 10
return y
| 구분 | lambda | def |
|---|---|---|
| 변수 생성 | ❌ 불가 | ✅ 가능 |
| 코드 길이 | 한 줄 | 여러 줄 |
| 이름 | 없음 (익명) | 있음 |
| 적합한 상황 | 간단한 일회성 함수 | 복잡한 로직 |
람다 표현식 안에서도 조건 분기를 표현할 수 있습니다. 단, 일반 if문과 다르게 콜론을 붙이지 않고, if를 사용했다면 반드시 else도 함께 작성해야 합니다.
# 조건부 표현식: 값 if 조건 else 다른값
is_even = lambda x: "짝수" if x % 2 == 0 else "홀수"
print(is_even(4)) # 짝수
print(is_even(7)) # 홀수
elif는 사용할 수 없지만, else 안에 조건부 표현식을 중첩해서 비슷하게 구현할 수 있습니다.
# elif 대신 else 안에 중첩
grade = lambda score: "A" if score >= 90 else ("B" if score >= 80 else "C")
print(grade(95)) # A
print(grade(85)) # B
print(grade(70)) # C
다만 중첩이 깊어지면 가독성이 떨어지므로, 이런 경우에는 def로 함수를 작성하는 것이 더 좋습니다.