파이썬 람다 함수, 한 줄로 간결하게 쓰는 법
앞 글에서는 함수 안에서 만든 변수와 함수 밖의 변수가 어디까지 쓰이는지, 스코프를 살펴봤어요. 이번에는 그 함수 이야기를 조금 더 이어가 보겠습니다. 이름을 붙여 여러 줄로 정의하는 대신, 필요한 자리에서 한 줄로 쓰는 함수가 있거든요. 바로 람다 함수입니다.
처음 보면 “이게 함수라고?” 싶은 모양인데요. 음... 짧다고 아무 데나 쓰면 오히려 읽기 어려워집니다. 언제 쓰면 좋은지 같이 볼게요.
람다 함수는 어떤 함수일까?
일반 함수는 def와 이름을 쓰고, 실행할 내용을 들여쓰기해서 적습니다. 람다 함수는 lambda 뒤에 입력값을 적고, 콜론 다음에 결과로 돌려줄 식 하나를 씁니다.
def double(number):
return number * 2
# 같은 일을 람다로 표현
lambda number: number * 2
둘 다 숫자를 받아 두 배로 만드는 동작이에요. 다만 람다 식은 그 자체로 이름이 없어서, 보통은 다른 함수에 전달하거나 변수에 담아 사용합니다.
double = lambda number: number * 2
print(double(4)) # 8
여기서 number는 입력값이고, number * 2가 결과입니다. return을 따로 적지 않아도 식의 결과가 반환돼요. 앞에서 배운 함수의 반환값과 같은 역할이죠.
여러 입력값도 받을 수 있어요
람다 함수도 입력값을 여러 개 받을 수 있습니다. 예를 들어 가격과 수량을 받아 합계를 구할 수 있어요.
total = lambda price, count: price * count
print(total(3000, 2)) # 6000
입력값은 쉼표로 나누고, 결과 식은 하나로 씁니다. 여기서 중요한 건 한 줄에 쓸 수 있다는 말이 복잡한 일을 전부 욱여넣으라는 뜻은 아니라는 점이에요.
조건에 따라 값을 고르는 짧은 식도 가능합니다.
label = lambda score: "통과" if score >= 60 else "다시 도전"
print(label(75)) # 통과
조건식은 참일 때 값 if 조건 else 거짓일 때 값 순서입니다. 일반 if 문처럼 여러 줄의 작업을 이어서 쓰는 방식은 아니에요. 람다의 결과 자리에는 식 하나만 올 수 있습니다.
정렬 기준을 잠깐 건네기
람다 함수가 특히 편한 순간은 다른 함수에 짧은 동작을 잠깐 전달할 때입니다. 예를 들어 이름의 글자 수를 기준으로 정렬해 볼게요.
names = ["민수", "지혜", "하늘이"]
sorted_names = sorted(names, key=lambda name: len(name))
print(sorted_names) # ['민수', '지혜', '하늘이']
sorted()의 key에는 정렬할 때 참고할 기준을 알려줍니다. 여기서는 각 이름을 받아 글자 수를 돌려주는 람다를 넘겼어요. sorted()가 이름마다 그 함수를 적용해 정렬 기준을 정합니다.
숫자 쌍을 두 번째 값 기준으로 정렬하는 것도 같은 방식입니다.
scores = [("민수", 82), ("지혜", 95), ("하늘", 76)]
by_score = sorted(scores, key=lambda item: item[1])
item[1]은 각 튜플의 두 번째 값, 즉 점수예요. 이런 식으로 기준이 한눈에 보이면 람다가 꽤 깔끔합니다. 다만 item[1]이 뭘 뜻하는지 바로 안 떠오른다면, 변수 이름을 붙인 일반 함수가 더 친절할 수 있어요.
간결함보다 읽기 쉬움이 먼저
솔직히 말하면 람다는 코드를 짧게 만들려고 쓰기 시작했다가, 나중에 내가 쓴 코드를 못 읽는 일이 생길 수 있습니다. 저도 조건을 여러 겹 얹어 한 줄로 만들었다가 “이걸 왜 이렇게 썼지?” 하고 한참 들여다본 적이 있어요. 한 줄인데 읽는 데 열 줄 걸리면 좀 곤란하죠.
이렇게 나눠 생각하면 편합니다.
- 다른 함수에 넘길 짧고 간단한 기준이라면 람다를 써도 좋아요.
- 이름을 붙여 여러 곳에서 쓸 동작이라면
def로 함수를 정의하세요. - 계산이나 조건이 복잡해진다면 여러 줄로 풀어 쓰세요.
- 의미가 분명한 이름을 붙이면 다음에 읽을 때도 덜 헤맵니다.
def get_score(item):
return item[1]
by_score = sorted(scores, key=get_score)
위 코드는 람다보다 길지만, 기준에 이름이 붙어서 무슨 일을 하는지 더 또렷해요. 팀원이나 미래의 내가 읽을 코드라면 이 차이가 꽤 큽니다.
다음은 오류를 만났을 때
람다 함수는 한 줄짜리 작은 함수를 표현하는 도구입니다. lambda 입력값: 결과식 모양을 기억하고, 정렬 기준처럼 짧은 동작을 전달할 때 활용하면 돼요. 그리고 한 줄이라는 이유만으로 무조건 좋은 건 아니라는 점도요.
여기까지 함수와 코드 재사용 이야기를 마쳤습니다. 다음 글부터는 코드를 쓰다 보면 만나게 되는 오류의 종류를 살펴볼게요. 에러가 나도 당황해서 화면을 노려보기 전에, 어떤 종류인지부터 차근차근 알아봅시다. (화면은 보통 눈을 마주쳐도 먼저 사과하지 않더라고요.)
(html comment removed: aistudio:footer )