여기서는 이름이 없다는 점보다 짧은 함수를 값으로 넘기는가, 이름 붙여 재사용해야 하는가를 먼저 봅니다.
정렬 키나 짧은 콜백처럼 바로 옆에서 잠깐 쓸 동작이면 lambda, 로직 설명과 재사용이 중요해지면 def가 더 잘 맞습니다.
숏컷 코드
users = [
{"name": "Mina", "age": 26},
{"name": "Jin", "age": 21},
]
ordered = sorted(users, key=lambda user: user["age"])
formatter = lambda name: name.strip().title()문법
기본형은 인수 없음, 단일 인수, 기본값, 가변 인수까지 함께 보면 됩니다.
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