Profile picture

[Python] 예제로 알아보는 람다 표현식과 자주 쓰이는 함수

JaehyoJJAng2024년 05월 26일

개요

람다 표현식(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': '흠 ..'}]

Loading script...