이번주에 람다 표현식에 대해서 배운걸 정리하려 한다.
람다 표현식은 anonymous function. 즉, 익명의 (이름 없는) 함수이다.
람다표현식의 예는 다음과 같다.
lambda x: x + 1
람다 표현식은 다른 함수의 표현식에 비해 훨씬 간결하다. 위의 표현식은 아래와 같은 함수로 풀어쓸수 있다.
def plus_one(x):
return x + 1
람다 표현식보다 좀 장황하게 느껴진다. 코딩을 하다 보면 함수 안에 함수를 연결해야 돼서 문장을 좀 더 간결하게 쓰고 싶을 때가 있다.
람다를 이해해 보자. 위의 예를 다시 가져오자.
lambda x: x + 1
lambda x: 람다 표현식 쓰면서 x를 변수로 할거야.
x + 1 : 결과값은 변수에 + 1 해주자.
람다 표현식이 많이 쓰이는 map, filter, reduce 함수를 하나씩 살펴보자.
함수
def plus_one(x):
return x + 1
list(map(plus_one, [1, 2]))
람다
list(map(lambda x: x + 1, [1, 2]))
결과값은: [2, 3]
람다표현식이 훨씬 간결하쥬?!
Step 1. map(x, y) 이해하기: y의 값들을 x의 함수에 집어넣자! [1,2] 에 있는 값들이 룰루랄라 순서대로 x + 1 로 들어간다.
Step 2. list() 이해하기: map으로 만들어진 결과값이 list의 형태로 저장된다.
아.. 뭔가 너무 쉬운것 같은데. 그럼 if 와 같은 조건식도 람다 표현식에 붙여줄수 있나요? 라는 궁금증이 들 수 있다.
Yes!
numbers = [1, 2, 3, 4, 5]
new_numbers = list(map(lambda x: '짝' if x % 2 == 0 else x, numbers))
결과값은: [1, '짝', 3, '짝', 5]
좀 많이 복잡해진 느낌이 든다. 하나 하나 풀어서 살펴보자.
Step 1. '짝' if x % 2 ==0: x 가 2로 나눴을때 나머지가 0이면 (즉 짝수이면), '짝'을 써주자.
Step 2. else x: Step 1의 조건식을 만족하지 않으면 x 를 그대로 써줘.
Step 3: numbers 안에 있는 변수들을 하나씩 꺼내서 람다 공식에 넣어주고 결과값을 리스트에 넣어줘.
앞에서는 람다 변수가 x 하나만 있었다. 그럼 변수 여러개 쓰는게 가능할까?
Yes!
n = [1, 2, 3]
m = [10, 100, 1000]
list(map(lambda x, y: x * y, n, m))
결과값은: [10, 200, 3000]
Step 1. lambda x, y: x * y 람다를 써주면서 변수 x, y 두개가 올거야!라고 말해주는거다. 그리고 : 뒤에 함수가 온다.
Step 2. n, m: Step 1에서 람다식을 통해서 변수가 두개임을 선언했다. 그렇다면 map 뒤에 변수는 몇개? 두개. 그러므로 n 리스트와 m 리스트에서 요소들이 하나씩 나와서 람다 함수로 들어간다.
1*10, 2*100, 3*1000
요렇게 계산이 돼서 리스트로 쏙 들어간다.
lambda x: '짝' if x % 2 == 0 else '홀' if x % 2 == 1 else x'
if 식을 두개만 써줬을 뿐인데 길고 읽기 힘들어졌다. 이럴거면 그냥 if/elif/else 함수로 풀어서 써주는게 나을듯하다. 가독성이 더 중요하니깐!
조건에 맞는 요소만 거르고 싶을때 filter 함수를 써준다.
num = [1, 2, 3, 4, 5]
list(filter(lambda x: x == 3, num))
결과값은: [3]
Step 1. filter (x, y): filter 의 형식은 map 과 비슷하다. y 에 있는 요소들을 x 함수에 넣어줘.
Step 2. num 에 있는 요소들 중에서 람다 함수를 (x 는 3) 만족 시키는 것만 리스트에 담는다.
요소를 하나씩 함수로 처리한 다음 이전 계산 결과와 누적시켜 하나의 최종 결과를 반환한다. 다음의 예제를 살펴보자.
from functools import reduce
num = [1, 2, 3, 4, 5]
reduce(lambda x, y: x + y, num)
결과값은: 15
Step 1. 먼저 functools 모듈에서 reduce 의 함수를 가져온다.
Step 2. reduce (x, y): map, filter 의 형식과 비슷하게 reduce는 (함수, 요소)로 구성되어 있다. num 에 있는 요소들을 하나씩 x + y 의 함수에 넣어준다.
Step 3. 그럼 다음과 같이 작동된다.1 + 2 = 3
3 + 3 = 6
6 + 4 = 10
10 + 5 = 15