Application/Python

[Python] 파이썬 람다와 map filter, 한 줄 함수로 코드 짧게 쓰는 법

devsalix 2026. 5. 14. 09:08
728x90

파이썬 람다와 map filter, 한 줄 함수로 코드 짧게 쓰는 법

컴프리헨션을 익히고 나면 코드가 한결 짧아지는 맛을 보게 되는데요. 그러다 보면 또 다른 욕심이 생기실 거예요.

"숫자 하나 두 배로 만드는 함수 하나 쓰려고 def 다섯 줄을 또 쓰는 게 너무 귀찮은데..."

이럴 때 쓰는 게 바로 람다(lambda) 입니다. 그리고 람다랑 거의 짝꿍처럼 따라다니는 친구가 map이랑 filter예요. 오늘은 이 셋을 같이 묶어서 풀어볼게요.


파이썬 람다(python lambda)가 뭔가요

람다는 한마디로 이름 없는 한 줄짜리 함수예요. "익명 함수"라고도 부르고요.

비유하자면 포스트잇 같은 거예요. 포스트잇에 "전화 다시 걸기"라고 쓱 적어두고 일 끝나면 떼서 버리잖아요. 람다도 그래요. 한 번만 쓰고 버릴 함수에 굳이 이름표(def 이름)까지 붙일 필요는 없거든요.

문법은 이렇게 생겼어요.

# lambda 매개변수: 표현식
double = lambda x: x * 2  # x를 받아서 두 배로 돌려주는 함수

print(double(5))  # 10

 

return을 따로 안 써요. : 뒤에 있는 게 그대로 반환값이 되거든요. 그리고 본문에 표현식 딱 하나만 들어갈 수 있어요. iffor를 여러 줄로 쓰는 건 안 됩니다.

매개변수가 두 개여도 괜찮아요.

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에 람다를 넘겼잖아요.

이게 가능하다면, 함수를 받아서 더 멋지게 꾸며주는 함수도 만들 수 있겠죠? 그게 다음에 다룰 데코레이터 입니다. 이름은 좀 거창한데, 알고 보면 오늘 배운 것의 자연스러운 확장이에요.


 


제 글이 도움이 되셨다면 댓글 & 공감 부탁드려요 😀

 

 
728x90