본문 바로가기
개발/Python

[python] Lambda 함수: 간결한 함수 정의와 활용

by on_master 2024. 1. 21.

lambda란?

 

lambda 함수는 간결한 함수 정의와 활용에 유용한 기능 중 하나입니다.

이 글에서는 lambda 함수가 무엇이고 어떻게 활용할 수 있는지 자세히 알아보겠습니다.

 

 

목차

 

1. lambda 함수란 무엇인가요?
   - lambda 함수의 정의
   - lambda 함수와 일반 함수의 차이점

2. lambda 함수의 기본 문법
   - lambda 함수의 형태
   - 인자와 반환값

3. lambda 함수의 활용 예시
   - 간단한 수학 연산
   - map()과 filter()와 함께 사용하기
   - 정렬 기준 지정에 활용하기

4. lambda 함수의 장점과 한계
   - 간결성과 가독성
   - 복잡한 로직에는 어울리지 않을 때

5. 실제 예시와 함께 알아보기
   - 리스트 조작 예시
   - 정렬 및 필터링 예시
   - 데이터 처리 예시


 


1. lambda 함수란 무엇인가요?

 

lambda 함수는 파이썬에서 익명 함수를 정의하는 방법 중 하나입니다.

 

일반적인 함수와 비슷하지만, 한 줄로 간단하게 정의되며 이름이 없습니다. 

 

lambda 함수는 주로 간단한 작업에 사용되며, 다른 함수의 인자로 전달하거나 필요한 곳에서 바로 사용할 수 있습니다.

 

2. lambda 함수의 기본 문법

 

lambda 함수의 기본 문법은 다음과 같습니다.

lambda 인자: 표현식

 

여기서 "인자"는 함수의 입력 값이고, "표현식"은 입력 값을 가지고 연산한 결과를 나타냅니다.

 

예를 들어, 두 개의 숫자를 더하는 lambda 함수는 다음과 같이 정의할 수 있습니다.

add = lambda x, y: x + y

 

 

3. lambda 함수의 활용 예시

 

간단한 수학 연산

add = lambda x, y: x + y
result = add(3, 5)  # 결과: 8

 

 

map( )과 filter( )와 함께 사용하기

numbers = [1, 2, 3, 4, 5]
squared = list(map(lambda x: x**2, numbers))  # [1, 4, 9, 16, 25]
even_numbers = list(filter(lambda x: x % 2 == 0, numbers))  # [2, 4]



정렬 기준 지정에 활용하기

points = [(1, 3), (2, 1), (0, 5), (4, 2)]
sorted_points = sorted(points, key=lambda point: point[1])  # [(2, 1), (4, 2), (1, 3), (0, 5)]



4. lambda 함수의 장점과 한계

 

간결성과 가독성

 

lambda 함수는 간결한 함수 정의를 가능하게 합니다.

이것은 코드를 더 간결하게 만들 수 있는데, 특히 간단한 연산이나 단일 표현식을 갖는 함수를 작성할 때 유용합니다.

 

아래는 간결성과 가독성에 관한 예시입니다.

# 일반 함수 정의
def add(x, y):
    return x + y

# 일반 함수를 사용하여 두 숫자 더하기
result = add(3, 5)
print(result)  # 출력: 8




# lambda 함수 사용
add_lambda = lambda x, y: x + y

# lambda 함수를 사용하여 두 숫자 더하기
result_lambda = add_lambda(3, 5)
print(result_lambda)  # 출력: 8

 

위의 코드에서 복잡한 조건을 갖는 lambda 함순느 가독성이 낮아집니다. 이런 경우에는 일반 함수정의를 사용하여 코드의 가독성을 높일 수 있습니다.

 

따라서, lambda 함수의 활용은 간단하고 직관적인 작업에 적합하며, 복잡한 로직을 다루기 위해서는 일반 함수를 사용하는 것이 바람직 합니다.

 

복잡한 로직에는 어울리지 않을 때

# 복잡한 조건을 갖는 lambda 함수
is_valid = lambda x, y: (x > 0 and y > 0) or (x < 0 and y < 0)

# 위의 lambda 함수를 이해하기 어려운 경우
# 일반 함수 정의를 사용하여 가독성 향상
def is_valid(x, y):
    return (x > 0 and y > 0) or (x < 0 and y < 0)

 

 

5. 실제 예시와 함께 알아보기

 

리스트 조작 예시


리스트 조작에서 lambda 함수는 리스트의 요소를 변형하거나 특정 조건에 따라 요소를 선택하는 데 유용하게 사용될 수 있습니다. 아래는 몇 가지 리스트 조작 예시입니다.

1. 요소 변형

 

map() 함수와 함께 lambda 함수를 사용하여 리스트의 모든 요소를 변형할 수 있습니다.

 

예를 들어, 다음과 같이 숫자 리스트의 각 요소를 제곱하는 코드를 작성할 수 있습니다

numbers = [1, 2, 3, 4, 5]
squared = list(map(lambda x: x**2, numbers))
print(squared)  # 출력: [1, 4, 9, 16, 25]

 



2. 리스트의 최댓값/최솟값 찾기

 

max()와 min() 함수를 사용하여 lambda 함수를 통해 리스트에서 최댓값과 최솟값을 찾을 수 있습니다.

예를 들어, 다음 코드는 리스트에서 최댓값을 찾는데 lambda 함수를 사용합니다.

numbers = [10, 3, 8, 1, 7]
max_value = max(numbers, key=lambda x: x)
print(max_value)  # 출력: 10

 

 

 

 

정렬 및 필터링 예시


1. 정렬 기준 지정

sorted() 함수를 사용하여 lambda 함수를 통해 리스트를 특정 기준으로 정렬할 수 있습니다.

예를 들어, 아래 코드는 리스트를 문자열 길이에 따라 정렬합니다

fruits = ["apple", "banana", "cherry", "date", "elderberry"]
sorted_fruits = sorted(fruits, key=lambda x: len(x))
print(sorted_fruits)  # 출력: ['date', 'apple', 'banana', 'cherry', 'elderberry']

 

 

 

 

 

lambda 함수를 사용한 다양한 정렬 예제를 설명해보겠습니다

 

 

 

lambda 함수를 활용하여 원하는 정렬 순서로 데이터를 정렬할 수 있습니다.

 

아래 예제에서는 리스트를 정렬하는 데 key 매개변수에 lambda 함수를 활용하는 방법을 다룹니다.


1) 튜플 리스트의 특정 요소를 기준으로 정렬

student_grades = [("Alice", 90), ("Bob", 75), ("Charlie", 85)]
# 성적에 따라 내림차순 정렬
sorted_grades = sorted(student_grades, key=lambda x: x[1], reverse=True)
print(sorted_grades)
# 출력: [('Alice', 90), ('Charlie', 85), ('Bob', 75)]


이 예제에서는 학생 이름과 점수로 이루어진 튜플 리스트를 점수에 따라 내림차순으로 정렬하고 있습니다.

 

key 매개변수에 전달된 lambda 함수는 각 튜플의 두 번째 요소(점수)를 반환하고,

 

reverse=True를 사용하여 내림차순으로 정렬합니다.

 

2) 사용자 정의 객체의 속성을 기준으로 정렬

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

people = [Person("Alice", 30), Person("Bob", 25), Person("Charlie", 35)]
# 나이에 따라 오름차순 정렬
sorted_people = sorted(people, key=lambda person: person.age)
for person in sorted_people:
    print(person.name, person.age)
# 출력:
# Bob 25
# Alice 30
# Charlie 35


이 예제에서는 Person 클래스의 인스턴스를 나이에 따라 오름차순으로 정렬하고 있습니다.

 

key 매개변수에 전달된 lambda 함수는 각 객체의 age 속성을 반환하고, 이를 기준으로 정렬합니다.

 

 

3) 여러 기준을 사용한 복합 정렬(1)

# 방 정보가 담긴 리스트 rooms
rooms = [(101, 150), (102, 120), (103, 150), (104, 110), (105, 130)]

# 방 정보를 정렬: 가격(x[1])을 오름차순으로 정렬하고, 가격이 같으면 방 번호(x[0])를 오름차순으로 정렬
rooms.sort(key=lambda x: (x[1], x[0]))

# 정렬된 방 정보 출력
for room in rooms:
    print(f"방 번호: {room[0]}, 가격: {room[1]}")
    
```
방 번호: 104, 가격: 110
방 번호: 102, 가격: 120
방 번호: 105, 가격: 130
방 번호: 101, 가격: 150
방 번호: 103, 가격: 150
```

 

 

이 코드는 방 정보가 담긴 리스트인 rooms 를 정렬합니다.

 

정렬은 먼저 두 번째 요소(x[1], 방의 가격)를 기준으로 오름차순으로 정렬하고,

 

가격이 같은 경우에는 첫 번째 요소(x[0], 방의 번호)를 기준으로 정렬합니다.

 

위의 결과에서 볼 수 있듯이, rooms 리스트는 가격을 오름차순으로 정렬하고,

 

가격이 같은 경우에는 방 번호를 오름차순으로 정렬하여 출력됩니다.

 

이렇게 lambda 함수를 사용하여 복수의 기준으로 리스트를 정렬할 수 있습니다.

 

 

 

4) 여러 기준을 사용한 복합 정렬(2)

employees = [
    {"name": "Alice", "salary": 60000, "experience": 3},
    {"name": "Bob", "salary": 75000, "experience": 5},
    {"name": "Charlie", "salary": 55000, "experience": 4}
]
# 경력 높은 순으로 정렬하고, 같은 경력이면 연봉 높은 순으로 정렬
sorted_employees = sorted(employees, key=lambda x: (-x["experience"], -x["salary"]))
for employee in sorted_employees:
    print(employee)
# 출력:
# {'name': 'Bob', 'salary': 75000, 'experience': 5}
# {'name': 'Charlie', 'salary': 55000, 'experience': 4}
# {'name': 'Alice', 'salary': 60000, 'experience': 3}


이 예제에서는 여러 기준을 사용한 복합 정렬을 수행하고 있습니다.

먼저 경력(experience)을 내림차순으로 정렬하고, 경력이 같은 경우에는 연봉(salary)을 내림차순으로 정렬합니다.

lambda 함수에서 `-`를 사용하여 내림차순 정렬을 표현하였습니다.

이러한 예제를 통해 lambda 함수를 활용하여 다양한 정렬 상황에서 원하는 정렬 순서를 지정할 수 있음을 알 수 있습니다.

 

 


2. 조건에 맞는 요소 필터링

 

filter() 함수와 lambda 함수를 함께 사용하여 리스트에서 조건에 맞는 요소만 필터링할 수 있습니다.

예를 들어, 다음 코드는 리스트에서 짝수만 필터링합니다

numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9]
even_numbers = list(filter(lambda x: x % 2 == 0, numbers))
print(even_numbers)  # 출력: [2, 4, 6, 8]

 



3. 데이터 처리 예시

 

lambda 함수는 데이터 처리 작업에서도 유용하게 사용될 수 있습니다.

예를 들어, CSV 파일을 읽어오고 각 행을 처리하는 작업을 `lambda` 함수를 통해 수행할 수 있습니다.

데이터 처리 작업에 대한 예시는 다소 복잡할 수 있으므로 이 부분에서는 더 구체적인 예시를 들지는 않겠습니다.