비전공자 파이썬 람다 함수 배우는 법, def랑 뭐가 다른가요
파이썬으로 데이터를 다루다 보면 lambda x: x + 1 같은 낯선 코드를 자주 마주치게 됩니다. 특히 정렬이나 필터링 코드를 검색해서 따라 하다 보면 거의 매번 등장하는데, 이게 왜 필요한지 설명 없이 그냥 쓰라고만 하는 경우가 많습니다. 비전공자 파이썬 람다 함수 배우는 법을 실무 관점에서, def 함수와 비교하며 정리해보겠습니다.
결론부터 말씀드리면 람다 함수는 이름 없이 딱 한 줄로 만드는 임시 함수입니다. def로 함수를 만들고 이름 붙이고 호출하는 과정이 번거로울 만큼 간단한 계산을, 한 번 쓰고 버릴 목적으로 만들 때 사용합니다. 정렬 기준을 정하거나, 리스트 안의 값을 하나씩 바꿀 때처럼 “함수 하나가 필요한데 이름까지 붙이기는 아까운” 순간에 쓰인다고 생각하시면 됩니다.
def 함수와 람다 함수, 뭐가 다른가요
가장 큰 차이는 이름이 있느냐 없느냐입니다. def 함수는 이름을 붙여서 여러 번 재사용하기 위한 것이고, 람다 함수는 이름 없이 그 자리에서 한 번 쓰고 사라지는 것입니다. 기능적으로는 둘 다 값을 받아서 결과를 돌려주는 함수라는 점이 같습니다.
일반적인 def 함수는 이렇게 작성합니다.
def add_one(x):
return x + 1
print(add_one(5)) # 6
같은 기능을 람다로 쓰면 이렇게 됩니다.
add_one = lambda x: x + 1
print(add_one(5)) # 6
문법 구조를 보면 lambda 매개변수: 반환값 형태입니다. def처럼 return을 따로 쓰지 않아도 콜론 뒤의 계산 결과가 자동으로 반환됩니다. 다만 이렇게 변수에 저장해서 쓰는 방식은 사실 람다의 본래 쓰임새가 아닙니다. 람다는 대부분 다른 함수의 인자로 즉석에서 넘겨줄 때 진가를 발휘합니다. 비전공자를 위한 파이썬 함수 입문에서 def 함수의 기본을 먼저 확인하시면 이해가 훨씬 쉽습니다.
정렬할 때 람다가 왜 필요한가요
실무에서 람다를 가장 많이 만나는 곳이 정렬입니다. 리스트를 정렬할 때 “무엇을 기준으로 정렬할지”를 람다로 지정하기 때문입니다.
예를 들어 부서별 매출 데이터가 딕셔너리 리스트로 있다고 해보겠습니다.
sales = [
{"부서": "영업1팀", "매출": 3200},
{"부서": "영업2팀", "매출": 5100},
{"부서": "영업3팀", "매출": 2800},
]
# 매출 기준 내림차순 정렬
sales_sorted = sorted(sales, key=lambda x: x["매출"], reverse=True)
for item in sales_sorted:
print(item["부서"], item["매출"])
여기서 key=lambda x: x["매출"]이 하는 역할은 “정렬할 때 각 항목에서 매출 값을 꺼내서 비교해라”는 지시입니다. 이 기준을 def로 따로 만들면 이렇게 됩니다.
def get_sales(item):
return item["매출"]
sales_sorted = sorted(sales, key=get_sales, reverse=True)
기능은 완전히 같지만, get_sales라는 함수를 딱 이 정렬 한 번을 위해 이름까지 붙여 만드는 건 번거롭습니다. 이런 상황에서 람다가 코드를 훨씬 간결하게 만들어줍니다. 비전공자 파이썬 정렬 함수 배우는 법에서 sort와 sorted의 차이와 key 옵션을 더 자세히 다뤘으니 함께 보시면 좋습니다.

필터링과 매핑에서도 람다를 씁니다
정렬 외에 자주 보는 곳이 filter와 map입니다. 리스트에서 조건에 맞는 값만 골라내거나, 리스트의 모든 값을 한 번에 변형할 때 사용합니다.
scores = [55, 78, 92, 43, 88, 67]
# 70점 이상만 걸러내기
passed = list(filter(lambda x: x >= 70, scores))
print(passed) # [78, 92, 88]
# 모든 점수에 5점 가산
adjusted = list(map(lambda x: x + 5, scores))
print(adjusted) # [60, 83, 97, 48, 93, 72]
같은 작업을 리스트 컴프리헨션으로도 표현할 수 있습니다.
passed = [x for x in scores if x >= 70]
adjusted = [x + 5 for x in scores]
실무에서는 리스트 컴프리헨션 쪽이 가독성이 더 좋다는 평가를 받는 경우가 많아서, filter와 map보다 이 방식을 선호하는 사람도 많습니다. 비전공자 파이썬 리스트 컴프리헨션을 함께 참고하시면 두 방식을 비교해서 상황에 맞게 고를 수 있습니다.
람다는 언제 쓰고 언제 피해야 하나요
람다가 편리하다고 해서 아무 곳에나 쓰는 것은 오히려 코드를 읽기 어렵게 만듭니다. 판단 기준은 명확합니다. 로직이 한 줄로 끝나는 간단한 계산이고, 딱 한 번만 쓰고 버릴 것이라면 람다가 적합합니다. 반대로 조건문이 여러 개 들어가거나, 같은 로직을 여러 곳에서 재사용해야 한다면 이름 있는 def 함수로 만드는 것이 맞습니다.
다음과 같은 코드는 람다로 억지로 욱여넣지 않는 것이 좋습니다.
# 이런 건 람다로 쓰지 않는 것이 좋습니다
def classify_grade(score):
if score >= 90:
return "A"
elif score >= 80:
return "B"
elif score >= 70:
return "C"
else:
return "D"
람다는 문법상 조건문(if-elif-else)을 여러 줄로 풀어 쓸 수 없기 때문에, 억지로 삼항 연산자를 중첩해서 쓰면 오히려 코드가 더 복잡해집니다. 이런 경우는 처음부터 def로 작성하는 것이 정답입니다. 엑셀에서 SUMIF나 IFS 함수를 중첩해서 쓰다가 너무 길어지면 VBA로 넘어가는 것과 비슷한 판단 기준이라고 보시면 됩니다. VBA와 파이썬 사이의 경계가 궁금하시다면 엑셀 함수만으로 안 될 때, VBA 매크로부터 배워야 할까요 글도 참고가 됩니다.
실무에서 자주 쓰는 패턴 정리
지금까지 살펴본 내용을 실무 코드 패턴으로 정리하면 다음과 같습니다.
employees = [
{"이름": "김민수", "부서": "총무팀", "근속연수": 3},
{"이름": "이영희", "부서": "영업팀", "근속연수": 7},
{"이름": "박지훈", "부서": "총무팀", "근속연수": 1},
]
# 근속연수 오름차순 정렬
by_tenure = sorted(employees, key=lambda e: e["근속연수"])
# 총무팀만 필터링
gen_affairs = list(filter(lambda e: e["부서"] == "총무팀", employees))
# 이름만 뽑아서 리스트로 만들기
names = list(map(lambda e: e["이름"], employees))
print(names) # ['김민수', '이영희', '박지훈']
여러 부서, 여러 담당자로 흩어진 데이터를 이런 식으로 정리하는 작업은 엑셀에서 정렬과 필터를 반복하는 것보다 코드 몇 줄로 훨씬 빠르게 끝낼 수 있습니다. 비슷한 데이터 정리 자동화가 궁금하시다면 엑셀 반복 업무, 파이썬으로 10분 만에 끝내기도 함께 보시면 실무 감각을 잡는 데 도움이 됩니다.
정리하며
람다 함수는 새로운 개념이라기보다 이미 알고 있는 def 함수를 짧게 줄인 표현이라고 이해하시면 부담이 줄어듭니다. 처음에는 굳이 람다를 쓰지 않고 def로 풀어서 작성해도 괜찮습니다. 코드가 익숙해지고 나면 정렬이나 필터링처럼 짧고 반복적인 상황에서 자연스럽게 람다를 손이 먼저 찾게 되는 순간이 옵니다.
픽셀앤코드는 비전공 실무자를 위한 코딩·자동화 교육을 진행하면서, 이런 문법 하나하나를 실제 업무 데이터에 적용해보는 실습 중심 커리큘럼을 운영하고 있습니다. 사내 데이터로 직접 정렬하고 필터링하는 과정을 거치면 람다 함수 같은 개념도 훨씬 빠르게 체화됩니다.