Python

[Python] 람다 표현식

orin602 2025. 3. 2. 16:37

람다(Lambda) 표현식 : 한 줄로 간결하게 함수를 정의하는 방법

- 일반적인 함수 def 키워드의 함수보다 짧고 즉시 실행할 수 있다.

 

1. 람다 기본 문법

lambda 매개변수 : 표현식

# 일반적인 def 키워드로 함수 만들기
def add(a, b):
    return a + b

print('def 함수 add :', add(1, 9))

# 람다 표현식으로 함수 만들기
# lambda 매개변수 : 식
add2 = lambda a, b : a + b
print('lambda 표현식 add2 :', add2(1, 9))

실행 결과

  • add2 = lambda a, b : a + b
    • 람다 표현식은 이름이 없는 함수를 만들기 때문에(익명 함수) add2라는 변수에 할당해서 사용해야 함.
  • def 키워드 함수의 매개변수 a,b = lambda의 매개변수 a,b
  • def 키워드 함수의 return 값 = lambda의 표현식
# 람다 표현식 자체 호출
# 람다 표현식은 'add2 = lambda a, b : a + b'처럼 변수에 할당하지 않고
# 람다 표현식 자체를 호출할 수 있음.

# (lambda 매개변수 : 표현식)(인수들)
(lambda a,b : a + b)(2, 8)

 

# 람다 표현식에 변수 사용하기
(lambda x : y = 10; x + y)(10)

  • 위의 결과처럼 람다 표현식 안에서는 변수를 만들 수 없다.
    • 반환값 부분인 표현식에는 변수 없이 표현해야 함.
    • 변수가 필요한 코드일 경우 def 키워드 함수를 사용하는 것이 좋음
# 람다 표현식에 변수 사용하기_2
y = 19
(lambda x : x + y)(1)

위 처럼 람다 표현식 바깥에 있는 변수는 사용할 수 있다.


2. map(), filter(), reduce() 함수 활용하기

 

2-1. map() 함수를 사용하여 리스트의 각 요소에 특정 연산을 적용하기

  • map(함수, 반복 가능 객체)
    • 첫 번째 인자 : 각 요소에 적용할 함수
    • 두 번째 인자 : 반복 가능한 객체
    • 반환값은 맵 객체 : list()를 사용해서 변환해야 결과 확인이 가능
# 람다 표현식을 인수로 사용하기
def plus_999(a):
    return a + 999

print('def 함수에 map 사용 :', list(map(plus_999, [1, 0, -1])))

print('람다 표현식에 map 사용 :', list(map(lambda x : x + 999, [-1, 0, 1])))

결과

비교 def 키워드 함수 lambda 함수
함수  def plus_999(a):
    return a + 999
lambda x : x + 999, [-1, 0, 1]
map() 적용 map(plus_999, [1, 0, -1]) map(lambda x : x + 999, [-1, 0, 1])
코드 길이 길고 명확 짧고 간결
사용 목적 여러 줄 함수 간단한 표현식(1줄)

 

둘 다 map()과 함께 사용이 가능하지만 lambda는 빠르게 간단한 연산을 적용할 때 더 깔끔한 코드로 작성이 가능

>>> lambda는 map()처럼 즉시 적용하는 경우에 유용하며, 간단한 함수라면 def를 쓰지 않고 바로 사용할 수 있음!

 

# map() 리스트의 모든 요소에 함수 적용
# 두 리스트의 요소를 곱해서 새 리스트 만들기
x = [1, 2, 4, 5, 10]
y = [10, 5, 2.5, 2, 1]

list(map(lambda x,y : x* y, x, y))

# 제곱값 구하기
a = [2, 3, 4, 5]
print('제곱값 :', list(map(lambda x : x ** 2, a)))

# 조건부 표현식 사용하기
# lambda 매개변수들 : 식1 if 조건식 else 식2

a = list(range(1, 11)) # 1 ~ 10까지
print('짝수만 문자열로 바꾸기 \n', list(map(lambda x : str(x) if x % 2 == 0 else x, a)))

  • str(x) if x % 2 == 0 else x
    • 람다 표현식 안에서 조건부 표현식 if, else를 사용할 때는 " : "을 붙이지 않는다.
    • 조건부 표현식은 식1 if 조건식 else 식2 형식으로 사용하며 식1은 조건식이 참일 때,
      식2는 조건식이 거짓일 때 사용할 식
    • 람다 표현식 안에서는 elif를 사용할 수 없다.
      • 식 1 if 조건식1 else 식2 if 조건식2 else 식3 if 조건식n else ... 식n+1 처럼 if를 연속으로 사용해야 한다
      • def 함수를 만들고 if, elif, else를 사용하는 것을 권장

 

2-2. filter() :  반복 가능한 객체에서 특정 조건에 맞는 요소만 가져온다.

# lambda 함수에 filter() 사용하기
# filter(함수, 반복가능한객체)

def f(x):
    return x % 2 != 0 and x % 5 == 0 # x는 홀수이고, 5의 배수면 반환
a = list(range(1, 33))

print('def 함수 :', list(filter(f, a)))

# x는 짝수이고, 5의 배수면 반환
print('lambda 함수 :', list(filter(lambda x : x % 2 == 0 and x % 5 == 0, a)))

 

2-3. reduce() : 이전 결과와 누적해서 반환하는 함수

- functools 필

# reduce() 사용하기
# reduce(함수, 반복가능한객체)
from functools import reduce

a = [10, 20, 30, 40]

def f(x, y):
    return x + y

print('def 함수 :', reduce(f, a))

print('lambda 함수 :', reduce(lambda x, y : x + y, a))


마무리

람다(lambda) 표현식은 간결한 형태로 익명 함수를 정의하는 방법으로

lmabda 매개변수 : 표현식 형태로 작성하고, 짧은 함수를 만들 때 유용하게 사용된다.

  • 익명함수 : def를 사용해 이름을 붙이지 않고, 즉석에서 함수를 정의할 수 있음
  • 한 줄 표현식 : return 키워드 없이 결과를 바로 반환(한 줄만 작성 가능)
  • 다른 함수의 인수로 전달 가능 : map(), filter(), reduce(), sort() 같은 함수
    • map(함수, 리스트) : 리스트의 모든 요소에 함수를 적용해 변환된 결과를 반환
    • filter(함수, 리스트) : 조건이 True인 값들만 반환
    • reduce(함수, 리스트) : 리스트 요소들을 왼쪽부터 차례로 누적 연산
    • sorted(리스트, key=기준함수, reverse=True / False) : 특정 기준으로 정렬
  • 주의할 점
    • 한 줄만 작성 가능(여러 줄의 코드가 필요하면 def 함수 권장)
    • 가독성이 떨어짐(복잡한 로직을 람다로 쓰면 이해하기 어려움)
    • 디버깅이 어려움(익명 함수여서 오류 발생 시 함수명을 출력할 수 없음)

'Python' 카테고리의 다른 글

[Python] 머신러닝 (1)  (0) 2025.03.05
[Python] 클래스(Class)  (0) 2025.03.04
[Python] 추천 시스템(2)  (0) 2025.03.01
[Python] 추천 시스템(1)  (0) 2025.03.01
[Python] 함수 사용하기  (0) 2025.02.22