Quick Syntax
users = [
{"name": "Mina", "age": 26},
{"name": "Jin", "age": 21},
]
ordered = sorted(users, key=lambda user: user["age"])
formatter = lambda name: name.strip().title()lambda는 key=나 짧은 callback처럼 한 표현식으로 끝나는 동작에 적합합니다. 여러 문장, 예외 처리, 의미 있는 이름이 필요한 규칙은 def로 분리하고, loop 안에서 늦게 평가되는 capture 값은 기본 인수 등으로 고정할지 의도적으로 결정합니다.
문법
기본형은 인수 없음, 단일 인수, 기본값, 가변 인수까지 함께 보면 됩니다.
lambda: value
lambda parameter: expression
lambda x, y=0: expression
lambda *args, **kwargs: expressionlambda는 문장이 아니라 값을 만드는 식입니다.
그래서 return, if 문, for 문처럼 여러 문장을 넣는 자리는 아니고, 계산 결과가 되는 표현식 하나만 둘 수 있습니다.
표현식 함수
lambda는 짧은 함수를 값으로 만드는 식이다
lambda는 함수 객체를 그 자리에서 바로 만들고 싶을 때 쓰는 문법입니다.
핵심은 "독립 개념으로 이름 붙일 정도는 아니지만, 지금 이 자리에는 작은 함수가 필요하다"는 신호를 주는 데 있습니다.
numbers = [1, 2, 3]
squares = map(lambda x: x * x, numbers)tick = lambda: "tick"
adder = lambda x, y=0: x + y간단한 기본값이나 인수 없는 함수도 만들 수 있지만, 길어질 조짐이 보이면 바로 def로 돌아가는 편이 좋습니다.
콜백 자리
key 함수나 짧은 콜백일 때 가장 자연스럽다
정렬, 그룹화, 필터링처럼 다른 함수에 동작을 넘겨야 할 때 lambda가 가장 자주 등장합니다.
ordered = sorted(users, key=lambda user: user["age"])
labels = list(map(lambda name: name.upper(), names))이런 자리는 함수 본문이 짧고, 이름을 따로 붙여도 얻는 정보가 크지 않아서 lambda가 자연스럽습니다.
pairs.sort(key=lambda item: (item[1], item[0]))특히 sorted(..., key=...), min(..., key=...), max(..., key=...)처럼 "무엇을 기준으로 비교할지"만 전달하면 되는 자리에 잘 맞습니다.
경계
로직이 길어지면 def로 돌아간다
lambda는 표현식 하나만 쓸 수 있습니다. 조건이 복잡하거나 여러 줄 설명이 필요하면 일반 def가 훨씬 읽기 쉽습니다.
# 더 읽기 쉬운 형태
def sort_key(user):
return (user["age"], user["name"].lower())
ordered = sorted(users, key=sort_key)짧다고 항상 좋은 것은 아닙니다. 재사용, 테스트, 브레이크포인트, 이름 있는 오류 메시지까지 생각하면 def가 더 나은 경우가 많습니다.
주의할 점
복잡한 로직을 lambda에 욱여넣으면 읽기도 디버깅도 어려워집니다.
# ❌ 지나치게 복잡한 lambda
key = lambda user: (user["age"], user["name"].strip().lower(), len(user["tags"]))
# ✅ 이름을 붙인 함수로 분리
def user_sort_key(user):
return (user["age"], user["name"].strip().lower(), len(user["tags"]))참고 링크
2 sources