개요
람다 표현식(Lambda Expression
)은 익명 함수로, 함수 이름 없이 간단하게 함수를 정의할 수 있는 방법이다.
특히 람다의 경우 map()
, filter()
, reduce()
와 같은 함수와 결합하여 코드의 간결성을 극대화할 수 있다.
예제를 통해 람다 표현식을 사용해보자.
람다 표현식
람다 표현식은 다음과 같은 형태로 작성된다.
lambda 인수1, 인수2, ...: 표현식
여기서 인수1
, 인수2
...는 함수에 입력으로 들어가는 값들을 의미한다. 표현식의 경우 반환될 값을 정의한다.
예시를 통해 알아보자.
다음 예시는 더하기 함수를 작성하고 그것을 람다 함수와 비교해보는 코드이다.
# 일반 더하기 함수
def add(x: int, y: int) -> int:
return x + y
# 람다 표현식
add_lambda :int = lambda x, y: x +y
result1 :int = add(x=1, y=2)
result2 :int = add_lambda(x=1, y=2)
print(result1)
print(result2)
# 출력
3
3
람다를 사용하는 이유
람다 표현식은 코드를 매우 간결하게 표현할 수 있다.
특히 단순 연산이나 변환을 수행할 때는, 람다 표현식을 사용하면 일회성으로 사용할 함수를 따로 정의하지 않아도 된다.
자주 쓰이는 함수
- lambda 표현식과 자주 쓰이는 함수에 대해서 알아보자.
1. map()
예시 1
map()
함수는 입력받은 iterable의 각 요소에 함수를 적용한 결과를 반환한다.
# 일반 함수를 사용하는 경우
def list_mul(x: int) -> int:
return x * 2
result = list(map(list_mul, [1,2,3]))
print(result) # [2,4,6]
# 람다 표현식을 사용하는 경우
result = list(map(lambda x: x * 2, [1,2,3]))
print(result) # [2,4,6]
자주 사용하는 이유
map()
함수는 데이터 변환 작업에 유용하다.
예를 들어, 대규모 데이터셋의 각 항목에 동일한 변환을 적용해야 할 때, map()
을 사용하면 반복문을 사용하는 것보다 더 간결하게 표현이 가능하다.
예시 2: 사전 데이터에서 특정 값 추출
# 사용자 정보를 담고있는 사전 데이터에서 나이만 추출
user_infos :dict = [
{'name': 'user1', 'age': 10},
{'name': 'user2', 'age': 25}
]
ages = list(map(lambda user: user['age'], user_infos))
print(ages) # [10,25]
2. filter()
filter()
함수는 iterable의 각 요소에 함수를 적용하여 반환 값이 True인 요소들만 모아 새로운 iterable을 생성한다.
예시 1: 리스트에서 짝수만 필터링
numbers :list[int] = [10,15,23,25,33,40,80,110,130,135,141]
# 일반 함수를 사용하는 경우
def is_even(n: int) -> bool:
return n % 2 == 0
result :list = list(filter(is_even,numbers))
print(result) # [10, 40, 80, 110, 130]
# 람다 표현식을 사용하는 경우
result :list = list(filter(lambda n: n % 2 == 0, numbers))
print(result) # [10, 40, 80, 110, 130]
실생활 예제
- 실생활에서 쓰일 법한 예제로 람다 표현식을 연습해보자.
1. 오름차순, 내림차순 정렬
일반 함수를 사용하는 경우
아래 예제는 문자열의 길이 순으로 내림차순 정렬하는 예제이다.
key
값을 사용하면 특정 조건을 기준으로 정렬할 수 있다.
word_list :list[str] = ['맛', '빨간', '차차는']
sorted_word_list :list[str] = sorted(word_list, key=len, reverse=True) # 문자열의 길이순으로 내림차순 정렬
print(sorted_word_list)
# 출력
['차차는', '빨간', '맛']
람다 표현식을 사용하는 경우
sort()
나 sorted()
를 사용하여 정렬할 때 key
옵션에 lambda
표현식을 병행하여 정렬하면 특정 조건을 만들어 줄 수도 있다.
word_list :list[dict] = [{"name": f"user{i}", "age": i + 10} for i in range(1,10)]
# 딕셔너리의 name 키 값을 기준으로 내림차순 정렬
sorted_word_list :list[dict] = sorted(word_list, key=lambda x:x['name'], reverse=True)
print(sorted_word_list)
# 출력
[{'name': 'user9', 'age': 19}, {'name': 'user8', 'age': 18}, {'name': 'user7', 'age': 17}, {'name': 'user6', 'age': 16}, {'name': 'user5', 'age': 15}, {'name': 'user4', 'age': 14}, {'name': 'user3', 'age': 13}, {'name': 'user2', 'age': 12}, {'name': 'user1', 'age': 11}]
특정 키의 값을 기준으로 정렬하는 경우
key
옵션에 특정 값을 기준으로 정렬을 시킬 수도 있다.
save_datas = [
{'user': 'user1', 'rating': 5, 'review_content': '맛있어요!'},
{'user': 'user2', 'rating': 2, 'review_content': '맛 없음;'},
{'user': 'user3', 'rating': 3, 'review_content': '맛 대가리 없어요'},
{'user': 'user4', 'rating': 1, 'review_content': '진짜 맛이 없음'},
{'user': 'user5', 'rating': 3, 'review_content': '등록된 리뷰내용이 없습니다'},
{'user': 'user6', 'rating': 4, 'review_content': '먹을만 하네요'},
{'user': 'user7', 'rating': 4, 'review_content': '등록된 리뷰내용이 없습니다'},
{'user': 'user8', 'rating': 2, 'review_content': '흠 ..'},
]
sorted_datas = sorted(save_datas, key=lambda x:x['review_content'] == '등록된 리뷰내용이 없습니다', reverse=True)
print(sorted_datas)
# 출력
[{'user': 'user5', 'rating': 3, 'review_content': '등록된 리뷰내용이 없습니다'}, {'user': 'user7', 'rating': 4, 'review_content': '등록된 리뷰내용이 없습니다'}, {'user': 'user1', 'rating': 5, 'review_content': '맛있어요!'}, {'user': 'user2', 'rating': 2, 'review_content': '맛 없음;'}, {'user': 'user3', 'rating': 3, 'review_content': '맛 대가리 없어요'}, {'user': 'user4', 'rating': 1, 'review_content': '진짜 맛이 없음'}, {'user': 'user6', 'rating': 4, 'review_content': '먹을만 하네요'}, {'user': 'user8', 'rating': 2, 'review_content': '흠 ..'}]