lambda란?
lambda란?
람다는 함수를 한 줄로 만들어 주는 역할을 합니다.
lambda 매개변수 : 표현식
위 와 같은 형태로 사용합니다.
예를 들어보겠습니다. 우선 두 수의 합을 출력하는 함수를 하나 만들어 주겠습니다.
def hap(x, y):
return x + y
>>> hap(60, 24)
84
이를 람다 형식으로 표현한다면,
(lambda x, y: x + y)(60+24)
이렇게 표현 할 수 있습니다.
lambda의 특징
-
람다는 N개의 매개변수를 가질 수 있지만, 하나의 expression만 허용합니다.
- 한번만 사용되거나 코드에서 아주 잠깐 동안 실행되는 코드에 주로 활용됩니다.
- map, filter, reduce 와 주로 같이 사용됩니다.
lambda의 장점
- 람다함수를 사용하는 경우는 코드가 간결하고, 메모리가 절약됩니다.
- 코드에서 lambda함수 다음 줄로 넘어가면 Heap 영역에서 증발합니다.
- 코드 가독성을 높여줍니다.
lambda 함수의 사용
-
함수 안에서 lambda를 사용하는 경우
def func(n): return lambda x: x**n num = func(3) print(num(3)) >>> 27
-
sequence를 custom하게 정렬하고 싶은 경우
#앞뒤 공백을 제외한 문자열의 길이로 정렬 target = ['cat', 'tiger', 'dog', 'bear'] print(sorted(target, key=lambda x: len(x.strip())))
#튜플의 두번째 값을 기준으로 정렬 target = [(2, 3), (4, 1), (5, 6)] print(sorted(target,key=lambda x: x[1]))
#절대값을 기준으로 정렬 target = [-5, -2, -4, 1, 2, 5, 4] print(sorted(target, key=lambda x: abs(X)))
lambda의 단점
- 디버깅시에 함수 콜스택 추적이 어려울 수 있습니다.
- 지나치게 남발하면 가독성이 떨어집니다.
map()
그렇다면 이런 람다의 성질을 활용해보겠습니다.
map
은 map(함수, 리스트)
형태로 리스트에서 모든 요소에 함수를 적용합니다. 이를 리스트 형태로 다시 담아내려면 list()함수
를 사용해서 한번 감싸줍니다.
예를 들어 [1, 2, 3]같은 정수인 요소로 이뤄진 리스트가 존재하는데, list(map(str, list))
하면 [‘1’, ‘2’, ‘3’]으로 바뀐다는 것입니다.
lambda
를 활용한 예를 보겠습니다.
list(map(lambda x: x**2, range(4)))
range(4)는 [0, 1, 2, 3]을 만들어주고 이 요소들을 2제곱해 새로운 리스트를 만들어줍니다.
[0, 1, 4, 9]
가 출력되는 겁니다.
reduce()
reduce(함수, 시퀸스)
함수로 살펴 보겠습니다.
reduce 함수는 반복 가능한 객체내에 요소를 연산하고 이전 연산 결과들과 누적해서 반환하는 함수 입니다. 즉, 여러개의 데이터를 대상으로 누적 집계를 내기 위해 사용되는 함수입니다.
from functools import reduce
파이썬3부터는 내장함수가 아니기 때문에 functools 모듈에서 reduce 함수를 불러와야 합니다.
reduce(집계 함수, 순회 가늫아 데이터)
집계 함수는 두 개의 인자를 받숩니다. 첫 번째 인자는 누적자(accumulator), 두 번째 인자는 현재값이 넘어오게 됩니다. 누적자는 함수 실행의 시작부터 끝까지 계속해서 재사용됩니다. 현재값은 루프를 돌면서 계속해서 바뀝니다.
예시를 살펴보겠습니다.
from functools import reduce
func = lambda x, y: x + y #lamba에서 매개변수를 두개 사용하는 것은 2개의 인자를 받는 함수임을 말합니다.
result = reduce(func, [1, 2, 3])
>>>print(result)
(((0+1)+2)+3)
처음에 누적자 0 현재 값 1, 그 다음 누적자 1 그리고 현재 값 2..
그래서 결구 6이 나옵니다.
result = reduce(func,[1, 2, 3], 100)
이런식으로 초기값을 설정해 줄 수 있습니다.
그렇다면 100 + (((0+1)+2)+3)
즉 , 106이 반환 됩니다.
최대값 구하기
누적값 말고도 최대 값을 구할 수 있습니다.
from functools import reduce
func = lambda x, y: a if (a >b) else b
result = reduce(func, [1, 100, 2, 5])
print(result)
filter()
filter는 filter(함수, 리스트)
의 형태입니다.
리스트에 들어있는 원소들을 함수에 적용시켜서 결과가 참인 값들로 새로우 리스트를 만들어줍니다.
0부터 7까지 담겨있는 리스트에서 3보다 큰 값들만 돌려주는 예제를 살펴보겠습니다.( •̀ ω •́ )✧
list(filter(lambda x: x > 3, range(8)))
>>> [4, 5, 6, 7]
이번에는 그러면 조건을 두개 넣어보겠습니다.
3보다 크면서 홀수인 수들만 출력해보겠습니다.
result = list(filter(lambda x: x > 3 and x % 2 == 1, range(10)))
print(result)
>>> [5, 7, 9]
여기서 더 줄일 수 있습니다. 바로
result = list(filter(lambda x: x > 3 and x % 2, range(10)))
이렇게 == 1을 지울 수 있습니다. 왜냐하면 filter는 참을 출력하는데 홀 수 는 나머지가 1이 나옵니다. 1은 참을 뜻하고 0을 거짓을 뜻하니 나머지가 1인 것들을 출력하는 것 입니다.
짝수를 출력하고 싶으면 ==0
을 통해서 이 조건이 참이게 만든 후 실행하면 짝수만 출력됩니다.
댓글남기기