파이썬 람다와 map filter, 한 줄 함수로 코드 짧게 쓰는 법
컴프리헨션을 익히고 나면 코드가 한결 짧아지는 맛을 보게 되는데요. 그러다 보면 또 다른 욕심이 생기실 거예요.
"숫자 하나 두 배로 만드는 함수 하나 쓰려고 def 다섯 줄을 또 쓰는 게 너무 귀찮은데..."
이럴 때 쓰는 게 바로 람다(lambda) 입니다. 그리고 람다랑 거의 짝꿍처럼 따라다니는 친구가 map이랑 filter예요. 오늘은 이 셋을 같이 묶어서 풀어볼게요.
파이썬 람다(python lambda)가 뭔가요
람다는 한마디로 이름 없는 한 줄짜리 함수예요. "익명 함수"라고도 부르고요.
비유하자면 포스트잇 같은 거예요. 포스트잇에 "전화 다시 걸기"라고 쓱 적어두고 일 끝나면 떼서 버리잖아요. 람다도 그래요. 한 번만 쓰고 버릴 함수에 굳이 이름표(def 이름)까지 붙일 필요는 없거든요.
문법은 이렇게 생겼어요.
# lambda 매개변수: 표현식
double = lambda x: x * 2 # x를 받아서 두 배로 돌려주는 함수
print(double(5)) # 10
return을 따로 안 써요. : 뒤에 있는 게 그대로 반환값이 되거든요. 그리고 본문에 표현식 딱 하나만 들어갈 수 있어요. if나 for를 여러 줄로 쓰는 건 안 됩니다.
매개변수가 두 개여도 괜찮아요.
add = lambda a, b: a + b # 두 수를 받아 더하는 함수
print(add(3, 4)) # 7
def랑 lambda, 언제 뭘 써야 하나요
처음 람다를 보면 "어? 그럼 def 자리에 다 람다 쓰면 되는 거 아냐?"라는 생각이 드실 텐데요. 사실 위처럼 람다를 변수에 담아서 쓸 거면 그냥 def가 더 낫습니다. 파이썬 공식 스타일 가이드도 그렇게 권하고요.
| 구분 | def | lambda |
|---|---|---|
| 본문 길이 | 여러 줄 OK | 표현식 한 줄 |
| 사용처 | 재사용, 복잡한 로직 | 일회용, 짧은 콜백 |
기준은 단순해요. 줄 수가 늘어날 것 같다 싶으면 무조건 def 로 가시면 돼요. 람다의 진짜 매력은 따로 있는데, 그건 조금 있다가 보여드릴게요.
파이썬 map filter로 리스트를 한 방에 처리하기
map이랑 filter는 람다랑 정말 잘 어울리는 함수예요.
map은 리스트의 모든 요소에 함수를 똑같이 적용해줘요. 자판기 줄에 동전을 하나씩 넣으면 음료가 줄줄이 나오는 느낌이라고 보시면 돼요.
nums = [1, 2, 3, 4, 5]
squares = list(map(lambda x: x**2, nums)) # 모든 요소를 제곱
print(squares) # [1, 4, 9, 16, 25]
filter는 조건에 맞는 요소만 골라내요. 클럽 입구에서 신분증 확인하는 거랑 비슷해요. 통과한 사람만 들여보내는 거죠.
nums = [1, 2, 3, 4, 5, 6]
evens = list(filter(lambda x: x % 2 == 0, nums)) # 짝수만 남김
print(evens) # [2, 4, 6]
처음에 다들 당황하는 부분
여기서 잠깐. 처음 이거 쓰다가 거의 모든 분들이 "어? 이게 뭐야?" 하는 순간이 있어요.
result = map(lambda x: x*2, [1, 2, 3])
print(result) # <map object at 0x000001E3A...>
분명히 결과를 출력했는데 <map object at 0x...> 이런 외계어가 튀어나와요. 저도 처음엔 "내가 뭘 잘못한 건가" 싶어서 한참 코드를 쳐다봤거든요.
이게 에러는 아니에요. map이랑 filter는 결과를 바로 만들지 않고 "필요할 때 하나씩 꺼내쓸 수 있는 상자"만 돌려주거든요. 눈으로 결과를 확인하려면 list()로 한 번 감싸주셔야 해요.
print(list(map(lambda x: x*2, [1, 2, 3]))) # [2, 4, 6]
그리고 이 상자는 한 번 다 꺼내면 비어요. 두 번째로 list()로 감싸면 빈 리스트가 나오니까 주의하세요.
sorted의 key, 여기서 파이썬 람다가 진짜 빛나요
자, 이제 람다가 진짜 빛나는 순간이에요. sorted 함수의 key 인자에 람다를 넣을 때.
sorted는 그냥 쓰면 알파벳순/숫자순으로 정렬하잖아요. 근데 "이 기준으로 정렬해줘"라고 알려주고 싶을 때가 많거든요. 그때 key=에 함수를 넣으면 돼요.
words = ["banana", "kiwi", "apple", "grape"]
result = sorted(words, key=lambda w: len(w)) # 단어 길이 기준으로 정렬
print(result) # ['kiwi', 'apple', 'grape', 'banana']
이거 def로 쓰려면 함수 따로 만들고 이름 붙이고 호출해야 하는데, 람다 한 줄로 끝나잖아요. 이런 게 바로 람다가 필요한 자리예요.
딕셔너리 리스트를 정렬할 때는 더 빛나요.
students = [
{"name": "수민", "score": 88},
{"name": "지훈", "score": 95},
{"name": "예린", "score": 72},
]
# 점수 높은 순으로 정렬
top = sorted(students, key=lambda s: s["score"], reverse=True)
for s in top:
print(s["name"], s["score"])
# 지훈 95
# 수민 88
# 예린 72
실무에서 데이터 다루다 보면 이런 정렬 진짜 자주 써요. 외워두시면 두고두고 쓰입니다.
파이썬 map filter, 컴프리헨션과 뭐가 다를까
여기서 솔직하게 말씀드려야 할 게 있어요. 요즘 파이썬 스타일은 컴프리헨션을 더 권장해요.
nums = [1, 2, 3, 4, 5]
# map + lambda
a = list(map(lambda x: x*2, nums))
# 컴프리헨션
b = [x*2 for x in nums]
# filter + lambda
c = list(filter(lambda x: x > 2, nums))
# 컴프리헨션
d = [x for x in nums if x > 2]
읽어보시면 컴프리헨션 쪽이 훨씬 한국말 어순에 가깝죠. "리스트의 각 x에 대해 두 배" 이렇게 술술 읽혀요.
그래도 map/filter를 알아둬야 하는 이유는, 다른 사람 코드 읽을 때 무조건 마주치기 때문이에요. 그리고 람다는 sorted(key=...), max(key=...) 같은 곳에서는 컴프리헨션으로 대체가 안 되거든요. 거기서는 람다가 정답이에요.
실전 예제: 합격자만 골라서 점수순 정렬
지금까지 배운 걸 다 합쳐볼게요. 60점 이상만 합격으로 거르고, 합격자를 점수 높은 순으로 정렬하는 코드예요.
students = [
{"name": "수민", "score": 55},
{"name": "지훈", "score": 82},
{"name": "예린", "score": 91},
{"name": "도현", "score": 47},
]
# 60점 이상만 남기기
passed = list(filter(lambda s: s["score"] >= 60, students))
# 점수 높은 순으로 정렬
ranked = sorted(passed, key=lambda s: s["score"], reverse=True)
for s in ranked:
print(f"{s['name']}: {s['score']}점")
# 예린: 91점
# 지훈: 82점
filter로 거르고 sorted로 줄 세우고. 이런 식의 데이터 가공이 실무에서 정말 흔합니다.
직접 해보세요
단어 리스트가 있을 때 길이가 5 이상인 단어만 골라서 대문자로 바꿔보세요.
words = ["apple", "go", "banana", "cat", "python"]
# 결과는 ['APPLE', 'BANANA', 'PYTHON']이 나와야 해요
힌트는 filter로 길이를 거르고, map으로 .upper()를 적용하는 거예요. 컴프리헨션으로도 한 줄에 됩니다. 둘 다 짜보시고 어느 쪽이 더 읽기 편한지 직접 느껴보시면 좋아요.
람다, 생각보다 무서운 친구는 아니죠? 그리고 오늘 자연스럽게 알게 된 사실이 하나 있어요. 함수도 다른 함수에 인자로 넘길 수 있다는 거. map이랑 sorted에 람다를 넘겼잖아요.
이게 가능하다면, 함수를 받아서 더 멋지게 꾸며주는 함수도 만들 수 있겠죠? 그게 다음에 다룰 데코레이터 입니다. 이름은 좀 거창한데, 알고 보면 오늘 배운 것의 자연스러운 확장이에요.
제 글이 도움이 되셨다면 댓글 & 공감 부탁드려요 😀
'Application > Python' 카테고리의 다른 글
| [Python] 파이썬 데코레이터: 함수를 꾸며주는 마법 (@ 기호의 정체) (0) | 2026.05.15 |
|---|---|
| [Python] 파이썬 리스트 컴프리헨션, 코드 한 줄로 줄이는 마법 (0) | 2026.05.13 |
| [Python] 파이썬 상속과 오버라이딩, 클래스를 또 만들지 마세요 (1) | 2026.05.12 |
| [Python] 파이썬 생성자(__init__) 쉽게 이해하기 (0) | 2026.05.11 |
| [Python] 파이썬 클래스, 객체지향이란 무엇일까 (0) | 2026.05.08 |