람다(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 |