[Python] 한줄짜리 이름없는 함수 만들기(lambda)

·2025년 6월 30일

Python

목록 보기
29/33

람다 함수(lambda)의 필요성

이름 없이 한 줄로 정의할 수 있는 익명 함수로, 다음과 같은 상황에서 유용하게 사용

기본 문법

lambda 입력값: 출력값

✔️ 1. 간단한 연산을 수행할 때 코드 가독성 향상

굳이 함수로 만들기에는 너무 짧고 단순한 연산을 빠르게 처리할 수 있음

# 제곱 계산 - 람다함수 사용
square = lambda x: x ** 2
print(square(5))  # 25

# 함수 사용
def square(x):
    return x ** 2
print(square(5))

✔️ 2. map(), filter(), sorted() 등과 함께 사용하여 코드 간결화

🔸map() 함수와 함께 사용

리스트의 각 요소를 변환할 때, 불필요한 함수 정의 없이 사용 가능

numbers = [1, 2, 3, 4, 5]
squared_numbers = list(map(lambda x: x ** 2, numbers))    # map(함수, 리스트)

print(squared_numbers)  # [1, 4, 9, 16, 25]

map과 list는 짝꿍. 같이 써줘야 됨
여기서 map만 쓰면 메모리 주소 나옴

문제. 아래 numbers 리스트 값을 받아 각 요소에 100 더해서 출력

numbers = [1, 2, 3, 4, 5]
plus_numbers = list(map(lambda x: x + 100, numbers))

print(plus_numbers)	# [101, 102, 103, 104, 105]

문제1. 숫자를 문자열로 변환

아래의 리스트의 요소들을 모두 문자형으로 변환한 str_numbers 리스트를 생성

numbers = [1, 2, 3, 4, 5]
str_numbers = list(map(lambda x: str(x), numbers))

print(str_numbers)  # ['1', '2', '3', '4', '5']

🔸filter() 함수와 함께 사용

특정 조건을 만족하는 요소만 필터링할 때 활용

numbers = [1, 2, 3, 4, 5]
even_numbers = list(filter(lambda x: x % 2 == 0, numbers))

print(even_numbers)  # [2, 4]

문제2. 3의 배수 필터링

아래의 리스트에서 3의 배수만 필터링하여 리스트를 만드시오

numbers = [10, 12, 15, 17, 18, 20, 21, 24, 25, 30]
multiples_of_three = list(filter(lambda x: x % 3 == 0, numbers))

print(multiples_of_three)  # [12, 15, 18, 21, 24, 30]

✔️ 3. sorted() - 정렬 기준을 지정할 때 유용

sorted()에서 정렬 기준을 직접 지정할 수 있음

# 학생 리스트 생성
students = [("john", 90), ("jane", 85), ("Dave", 95)]

# 점수 낮은순으로 정렬
sorted(students, key=lambda x: x[1])
# [('jane', 85), ('john', 90), ('Dave', 95)]

# 점수 높은순으로 정렬
sorted(students, key=lambda x: x[1], reverse=True)
# [('Dave', 95), ('john', 90), ('jane', 85)]

문제3. 날짜 기준 정렬

아래의 학생 리스트에서 날짜를 기준으로 오름차순으로 정렬하는 코드를 작성하시오

students = [
    ("john", 90, "2024-03-10"),
    ("jane", 85, "2024-02-15"),
    ("Dave", 95, "2024-03-05"),
    ("Alice", 90, "2024-01-20"),
    ("Bob", 95, "2024-02-28"),
    ("Eve", 85, "2024-03-01")
]

result = sorted(students, key=lambda x: x[2])
print(result)

# [('Alice', 90, '2024-01-20'), ('jane', 85, '2024-02-15'), ('Bob', 95, '2024-02-28'), ('Eve', 85, '2024-03-01'), ('Dave', 95, '2024-03-05'), ('john', 90, '2024-03-10')]

✔️ 4. 일회성 함수로 사용하기 적합

굳이 별도로 정의할 필요 없이 즉석에서 정의하여 사용 가능

# 즉석에서 두 수의 합을 계산
print((lambda x, y: x + y)(3, 7))  # 10

✔️ 5. 함수형 프로그래밍 스타일에서 필수적

map, filter, reduce 같은 함수형 프로그래밍 패턴에서 빠르고 깔끔한 코드 작성가능

🔸reduce() 함수 활용

from functools import reduce

numbers = [1, 2, 3, 4, 5]

# 모든 요소의 합
sum_numbers = reduce(lambda x,y: x+y, numbers)

print(sum_numbers)  # 15

reduce는 반복문 없이 간결한 코드를 작성할 수 있어서 유용합니다. 누적 연산이 필요한 경우에 유용

문제4. 모든 요소의 곱

아래의 리스트의 요소들을 모두 곱한 결과를 출력하시오

from functools import reduce

numbers = [4, 2, 6, 2, 3, 2]
gob_numbers = reduce(lambda x,y: x*y, numbers)

print(gob_numbers)  # 576

주의할 점

  • 람다 함수는 간단한 경우에는 유용하지만,
    코드가 길어지면 일반 def 함수로 변환하는 것이 가독성에 좋음
  • 특히, 여러 개의 조건문이 포함될 경우 일반 함수가 더 적절할 수 있음

💡 람다 vs 일반 함수 비교

람다 함수 사용 (간단한 경우)

# 좋은 예: 간단한 연산
df['doubled'] = df['value'].apply(lambda x: x * 2)

일반 함수 사용 (복잡한 경우)

# 복잡한 로직은 일반 함수가 더 좋음
def complex_calculation(x):
    if x < 0:
        return 0
    elif x < 10:
        return x * 2
    elif x < 100:
        return x * 1.5
    else:
        return x

df['result'] = df['value'].apply(complex_calculation)

결론

  • 람다 함수
    • 짧고 간단한 연산을 빠르게 처리할 때, 일회성 함수가 필요할 때, 기존 함수(map, filter, sorted 등)와 함께 사용할 때 유용
    • 하지만 너무 복잡한 로직을 람다로 만들면 가독성이 떨어질 수 있으므로, 적절한 상황에서만 사용하는 것이 중요
    • 특히 데이터 분석에서는 Pandas와 함께 사용할 때 그 진가를 발휘하며, 코드를 간결하고 효율적으로 만들어주는 강력한 도구

0개의 댓글