Python 람다(lambda) 함수: 익명 함수를 간단하게 만드는 방법

Ad Placeholder

Python에서는 간단한 함수를 def 없이 한 줄로 만들 수 있습니다.

이때 사용하는 것이 람다(lambda) 함수입니다.

람다는 주로 짧은 함수를 일시적으로 만들어 다른 함수의 인자로 전달할 때 많이 사용합니다.

특히 앞에서 배운 것처럼 Python의 함수는 일급 객체이기 때문에 함수를 다른 함수에 전달할 수 있는데, 람다는 이런 상황에서 코드를 간결하게 작성할 수 있도록 도와줍니다.

람다 함수란?

람다 함수는 이름이 없는 작은 함수입니다.

일반적인 함수는 def를 사용합니다.

def add(a, b):
    return a + b

같은 기능을 람다로 작성하면 다음과 같습니다.

add = lambda a, b: a + b

두 코드는 모두 두 숫자를 더해서 반환합니다.

print(add(10, 20))

결과:

30

람다는 일반적인 함수보다 짧게 표현할 수 있다는 특징이 있습니다.

람다 함수의 기본 문법

기본적인 형태는 다음과 같습니다.

lambda 매개변수: 반환할_값

예를 들어 숫자를 제곱하는 함수는 다음과 같이 만들 수 있습니다.

square = lambda x: x ** 2

사용 방법은 일반 함수와 같습니다.

print(square(5))

결과:

25

람다에서 return을 직접 작성하지 않는다는 점도 중요한 특징입니다.

lambda x: x ** 2

여기서 x ** 2가 자동으로 반환됩니다.

일반 함수와 람다 비교

같은 기능을 일반 함수와 람다로 각각 작성해보겠습니다.

일반 함수:

def multiply(a, b):
    return a * b

람다 함수:

multiply = lambda a, b: a * b

사용 방법은 동일합니다.

print(multiply(3, 4))

결과:

12

차이는 주로 표현 방식과 사용 목적에 있습니다.

def는 여러 줄의 복잡한 로직을 작성하거나 재사용할 함수에 적합하고, lambda는 짧고 간단한 함수를 일시적으로 사용할 때 유용합니다.

람다는 여러 개의 매개변수를 사용할 수 있다

람다가 반드시 매개변수를 하나만 사용하는 것은 아닙니다.

여러 개의 매개변수를 사용할 수도 있습니다.

calculate = lambda a, b, c: a + b + c

print(calculate(10, 20, 30))

결과:

60

일반 함수로 작성하면 다음과 같습니다.

def calculate(a, b, c):
    return a + b + c

따라서 람다의 매개변수 개수에는 특별한 제한이 없습니다.

람다에서 조건식을 사용할 수도 있다

람다는 하나의 표현식으로 작성하기 때문에 조건식과 함께 사용할 수도 있습니다.

예를 들어 숫자가 짝수인지 확인하는 함수를 만들어보겠습니다.

check_even = lambda x: "짝수" if x % 2 == 0 else "홀수"

print(check_even(10))
print(check_even(7))

결과:

짝수
홀수

다만 람다에 복잡한 조건을 계속 넣으면 오히려 코드가 읽기 어려워질 수 있습니다.

람다는 짧고 명확한 표현에 사용하는 것이 좋습니다.

람다를 변수에 저장할 수 있다

앞에서 배운 일급 객체의 특징처럼 람다 함수 역시 변수에 저장할 수 있습니다.

square = lambda x: x ** 2

그리고 일반 함수처럼 호출할 수 있습니다.

print(square(4))

결과:

16

다만 이런 방식으로 람다를 변수에 계속 저장해야 한다면 def를 사용하는 것이 더 읽기 쉬운 경우가 많습니다.

예를 들어 다음과 같은 코드는 동작하지만,

calculate = lambda a, b: a * b

함수의 이름과 역할을 명확하게 표현하려면 다음과 같이 작성하는 편이 좋습니다.

def calculate(a, b):
    return a * b

람다는 특히 함수 자체를 다른 함수에 바로 전달할 때 장점이 큽니다.

sorted()와 함께 사용하기

람다가 자주 사용되는 대표적인 예가 sorted()입니다.

다음과 같은 데이터가 있다고 해보겠습니다.

students = [
    ("철수", 85),
    ("영희", 95),
    ("민수", 70)
]

점수를 기준으로 정렬하려면 sorted()의 key에 기준을 알려줘야 합니다.

result = sorted(students, key=lambda student: student[1])

print(result)

결과:

[('민수', 70), ('철수', 85), ('영희', 95)]

여기서

lambda student: student[1]

는 각 데이터에서 두 번째 값을 가져오는 함수입니다.

sorted()는 이 함수를 사용하여 정렬 기준을 결정합니다.

앞에서 배운 함수를 다른 함수에 인자로 전달하는 방식이 실제로 사용된 것입니다.

내림차순으로 정렬하기

sorted()의 reverse 옵션과 람다를 함께 사용할 수도 있습니다.

students = [
    ("철수", 85),
    ("영희", 95),
    ("민수", 70)
]

result = sorted(
    students,
    key=lambda student: student[1],
    reverse=True
)

print(result)

결과:

[('영희', 95), ('철수', 85), ('민수', 70)]

점수가 높은 순서대로 정렬되었습니다.

map()과 람다

람다는 map()과 함께 사용할 수도 있습니다.

map()은 여러 데이터에 같은 함수를 적용할 때 사용할 수 있습니다.

예를 들어 모든 숫자를 제곱해보겠습니다.

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

result = map(lambda x: x ** 2, numbers)

print(list(result))

결과:

[1, 4, 9, 16, 25]

여기서

lambda x: x ** 2

가 각 숫자에 적용되는 함수입니다.

map()은 결과를 map 객체로 반환하기 때문에 실제 값을 확인하려면 list()로 변환할 수 있습니다.

filter()와 람다

filter()에서도 람다를 활용할 수 있습니다.

예를 들어 짝수만 골라내보겠습니다.

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

result = filter(lambda x: x % 2 == 0, numbers)

print(list(result))

결과:

[2, 4, 6]

여기서 람다는 각 숫자가 짝수인지 확인합니다.

조건이 True인 값만 filter()의 결과에 포함됩니다.

1 → False
2 → True
3 → False
4 → True
5 → False
6 → True

따라서 최종적으로 [2, 4, 6]이 만들어집니다.

람다를 너무 많이 사용하면 안 되는 이유

람다는 짧은 코드를 작성할 때 편리하지만 모든 함수를 람다로 작성하는 것이 좋은 것은 아닙니다.

예를 들어 다음과 같이 복잡한 로직을 억지로 람다에 넣으면 코드를 이해하기 어려워질 수 있습니다.

result = lambda x: x * 2 if x > 10 else x + 5 if x > 5 else x - 1

실행 자체에는 문제가 없지만, 조건이 복잡해질수록 일반 함수로 작성하는 편이 읽기 쉽습니다.

def calculate(x):
    if x > 10:
        return x * 2
    elif x > 5:
        return x + 5
    else:
        return x - 1

따라서 람다는 짧고 한눈에 이해할 수 있는 함수에 사용하는 것이 좋습니다.

람다에서 사용할 수 있는 것은 하나의 표현식이다

람다의 중요한 특징 중 하나는 일반적인 함수처럼 여러 줄의 문장을 자유롭게 작성하는 용도가 아니라는 것입니다.

예를 들어 다음과 같은 형태가 기본적인 람다입니다.

lambda x: x + 10

콜론 : 뒤에 있는 표현식의 결과가 반환됩니다.

result = lambda x: x + 10

print(result(5))

결과:

15

반면 여러 단계의 처리나 복잡한 제어 흐름이 필요하다면 def로 일반 함수를 작성하는 것이 적절합니다.

람다와 일급 객체의 관계

앞에서 배운 일급 객체 개념과 연결해보면 람다가 왜 유용한지 더 쉽게 이해할 수 있습니다.

Python에서는 함수를 다른 함수에 전달할 수 있습니다.

def execute(func, value):
    return func(value)

여기에 일반 함수를 전달할 수도 있습니다.

def square(x):
    return x ** 2


print(execute(square, 5))

하지만 한 번만 사용할 간단한 함수라면 람다를 이용해 바로 전달할 수 있습니다.

print(execute(lambda x: x ** 2, 5))

결과는 동일합니다.

25

즉 람다는 일급 객체인 함수를 짧게 만들어 필요한 곳에 바로 전달할 수 있도록 해주는 방법이라고 이해하면 좋습니다.

람다를 사용할 때의 기준

람다를 사용할지 일반 함수로 작성할지 고민된다면 다음과 같이 생각하면 됩니다.

상황추천
한 줄로 간단하게 표현 가능lambda
sorted()의 key 지정lambda
map(), filter()에서 간단한 처리lambda
여러 줄의 로직이 필요함def
여러 곳에서 반복해서 사용함def
함수의 의미를 명확하게 설명해야 함def
복잡한 조건이나 예외 처리가 필요함def

람다는 코드의 양을 줄이는 것 자체가 목적이라기보다, 간단한 함수를 필요한 위치에서 간결하게 표현하는 것에 의미가 있습니다.

마무리

Python의 람다 함수는 이름을 붙이지 않은 작은 함수를 간단하게 표현하는 방법입니다.

기본 형태는 다음과 같습니다.

lambda 매개변수: 표현식

그리고 표현식의 결과가 자동으로 반환됩니다.

람다는 특히 다음과 같은 상황에서 유용합니다.

  • 짧은 함수를 일시적으로 사용할 때
  • sorted()의 정렬 기준을 지정할 때
  • map()으로 데이터를 변환할 때
  • filter()로 데이터를 걸러낼 때
  • 함수를 다른 함수에 간단하게 전달할 때

반대로 로직이 복잡하거나 여러 곳에서 반복해서 사용할 함수라면 def를 사용하는 것이 더 적절합니다.

결국 람다는 일반 함수를 완전히 대체하는 문법이라기보다, 간단한 함수를 필요한 곳에서 짧게 표현하기 위한 도구라고 이해하면 됩니다.

다음 글에서는 함수가 실행되는 위치와 변수의 유효 범위를 이해하기 위해 전역 변수와 지역 변수에 대해 알아보겠습니다.

jiji

AI, Python, 생활정보와 정부 정책 정보를 쉽게 설명하는 정보 블로그입니다.

Ad Placeholder
Scroll to Top