굳이 이름을 안 붙이는 함수
파이썬의 대부분 함수는 def로 정의되고, 이름이 있고, 재사용될 수 있는 파일 안에 살아요. lambda는 더 작은 이름 없는 대안이에요 — 정식 함수를 정의하는 게 배보다 배꼽이 큰 몇몇 경우에 유용합니다.
나란히 놓고 보면:
두 함수, 정확히 같은 일. lambda 버전이 한 줄에 들어가는 건 그게 본질적으로 그 역할이기 때문이에요: 일회용 순간을 위한 일회용 함수.
문법
lambda <매개변수>: <표현식>
<매개변수>는def와 같은 매개변수 목록이에요 — 기본값,*args,**kwargs모두 지원합니다.<표현식>은 단일 표현식 하나고, 그 값이 반환값이 돼요.
예:
return 키워드가 없어요. 표현식의 값이 암묵적으로 반환됩니다.
단 하나의 제약
lambda에는 표현식 하나만 들어갈 수 있어요. 문장은 넣을 수 없어요:
하지만 삼항 표현식은 쓸 수 있어요:
한 표현식 이상이 필요하다면, def로 넘어가라는 신호예요.
lambda가 진짜 일을 하는 자리
변수에 할당된 lambda는 거의 언제나 이름 있는 def보다 나쁜 선택이에요:
def double(x): return x * 2가 엄격하게 더 나아요 — 가독성은 같고, lambda 버전은 스택 트레이스에 <lambda>라는 쓸모없는 이름을 남겨서 디버깅에 도움이 안 되거든요.
lambda가 빛나는 자리는 딱 하나예요: 고차 함수에 인라인 인자로 넘길 때.
커스텀 정렬 키
고전적인 예:
sorted의 key 인자는 아이템을 받아 정렬 기준 값을 돌려주는 함수를 원해요. 한 줄짜리 lambda가 딱 맞아요 — 이 정도로 작은 일에 def를 쓰면 무거워 보이거든요.
튜플을 써서 여러 필드로 정렬할 수도 있어요:
min, max, filter, map
비슷한 이야기 — 모두 선택적인 함수 인자를 받아요:
map과 filter는 사실 리스트 컴프리헨션이 보통 더 명확해요:
대부분의 파이썬 사용자가 이 때문에 map/filter보다 컴프리헨션을 선호해요. lambda는 컴프리헨션으로 대체할 수 없는 sorted, min, max에서는 여전히 자연스러운 선택이에요.
lambda와 operator
lambda가 그냥 "키 꺼내기"나 "속성 꺼내기"에 불과하다면, 파이썬의 operator 모듈에 더 빠르고 명확한 대안이 있어요:
큰 차이는 아니지만, 이미 operator를 임포트하는 코드에서는 조금 더 선언적으로 읽혀요.
다시 def로 돌아갈 타이밍
다음 중 하나라도 해당되면 def를 쓰세요:
- 로직이 표현식 하나에 깔끔하게 안 들어갈 때.
- 가독성을 위해 함수에 이름을 붙이는 게 더 나을 때.
- 같은 로직을 두 군데 이상에서 쓸 때.
- 함수에 docstring이 필요할 때(lambda는 docstring을 못 가져요).
기억하세요: 파이썬은 줄 수로 점수를 매기지 않아요. 로직이 조금이라도 복잡해지면, 세 줄짜리 이름 있는 함수가 한 줄짜리 lambda보다 거의 언제나 더 잘 읽힙니다.
다음: 데코레이터
lambda는 함수를 값처럼 넘겨요. 데코레이터는 그 아이디어를 한 걸음 더 끌고 가서, 어떤 함수든 재사용 가능한 동작 — 로깅, 타이밍, 캐싱, 인증 — 으로 감쌀 수 있게 해줍니다. 위쪽 줄의 @ 하나로요. 다음 페이지에서 다뤄요.
자주 묻는 질문
파이썬의 lambda가 뭔가요?
lambda는 한 줄에 쓸 수 있는 짧은 익명 함수예요. lambda x: x * 2는 def double(x): return x * 2와 같은 일을 하는데 이름이 없어요. 다른 함수의 인자로 넘길 아주 작은 함수가 필요할 때 가장 쓸모가 있어요.
def 대신 lambda를 언제 써야 하나요?
sorted, max, filter 같은 함수에 바로 넘기는 일회성, 한 표현식짜리 함수라면 lambda를 쓰세요. 한 표현식보다 긴 본문이 필요하거나 — 이름을 붙일 만한 함수라면 — def를 쓰세요. 이름 있는 함수가 거의 언제나 더 명확해요.
lambda의 제약은 뭔가요?
lambda는 문장(statement)이 아니라 표현식 하나만 담을 수 있어요. 할당도 못 하고, if 블록도 못 넣어요(삼항 a if cond else b는 가능). 여러 줄 로직도 안 돼요. 이 제약과 싸우고 있다면 def로 바꿀 때예요.