쿼카러버의 기술 블로그
[Python Advanced] lambda 함수란? (쉬운 설명 & 다양한 예시)(map, filter, reduce) 본문
[Python Advanced] lambda 함수란? (쉬운 설명 & 다양한 예시)(map, filter, reduce)
quokkalover 2022. 2. 5. 15:39Lambda 함수란
파이썬에서 lambda는 런타임에서 생성해서 사용할 수 있는 익명 함수다. 자바스크립트에서의 람다 함수와는 조금은 다르다.
특징 :
- 람다는 N개의 매개변수를 가질 수 있지만, 하나의 expression만 허용한다. (아래 예시를 보면 이해가 될 것이다.)
lambda arguments: expression
- 한번만 사용되거나 코드에서 아주 잠깐 동안 실행되는 코드에 주로 활용한다.
- map, filter, reduce와 같은 built-in 함수에 주로 같이 사용된다.
람다 함수의 장점 :
- 람다함수를 사용하는 경우는 코드가 간결하고, 메모리가 절약된다.
- 코드에서 lambda함수 다음 줄로 넘어가면 Heap 영역에서 증발하게 된다.(단발성으로 사용할 때 유용) (모든 것이 객체로 관리되는 파이썬에서, reference count가 0이되면 GC가 동작함).
- 코드 가독성을 높여준다.
람다 함수의 단점 :
- 디버깅시 함수 콜스택 추적이 어려울 수 있다
- 지나치게 남발하면 가독성이 떨어진다
람다 함수의 선언
람다 함수의 선언과 일반 함수 선언의 차이는 아래와 같다.
# lambda 인수1, 인수2, ... : 인수를 이용한 표현식
# 인자로 받은 숫자에 +1을 해주는 함수
>>> lambda x : x + 1
>>> (lambda x : x+1)(3)
4
위와 같이 함수에 이름이 없고, 저장된 변수가 없을 경우 해당 코드 실행 후 바로 메모리가 증발한다.
하지만 아래처럼 사용할 경우에는 sum이라는 변수에 람다함수의 메모리가 저장되기 때문에 바로 증발되지 않을 수 있다.
# lambda 인수1, 인수2, ... : 인수를 이용한 표현식
sum = lambda a, b: a+b
result = sum(3,4)
print(result)
# 7
람다 함수 사용 예
1) 함수 안에서 lambda를 사용하는 경우
아래와 같이 제곱승, 세제곱승을 하는 함수를 여러개 만들어야 하는 경우에 활용될 수 있다.
def myfunc(n):
return lambda x: x ** n
squarer = myfunc(2)
print(squarer(6))
cuber = myfunc(3)
print(cuber(6))
2) sequence를 custom하게 정렬하고 싶을 때
- 아래와 같이 다른 기준으로 정렬하고 싶을 때 lambd함수를 사용할 수 있다.
#알파벳 순서가 아니라, 앞뒤 불필요한 공백을 제외한 문자의 길이로 정렬을 하고 싶다면,
target = ['cat', 'tiger', 'dog', 'snake']
print(sorted(target, key=lambda x : len(x.strip())))
#튜플의 두 번째 값을 기준으로 정렬하고 싶을 때
points2D = [(1, 9), (4, 1), (5, -3), (10, 2)]
sorted_by_y = sorted(points2D, key= lambda x: x[1])
print(sorted_by_y)
#[(5, -3), (4, 1), (10, 2), (1, 9)]
#절대값을 기준으로 정렬하고 싶을 때
mylist = [- 1, -4, -2, -3, 1, 2, 3, 4]
sorted_by_abs = sorted(mylist, key= lambda x: abs(x))
print(sorted_by_abs)
#[-1, 1, -2, 2, -3, 3, -4, 4]
3) map
함수와 함께 사용
map(func, seq)
함수는 seq
의 모든 element에 func
을 적용한다.
- map함수가 무엇인지에 대해서는 별도의 글에서 다루도록 하겠다.
- 물론 map과 lamba를 아래처럼 적용해서 사용할 수 있긴하지만, map에는 주로 이미 정의된 함수를 넣는 것을 추천한다.
a = [1, 2, 3, 4, 5, 6]
b = list(map(lambda x: x * 2 , a))
위와 같은 코드는 사실 map보다는 list comprehension으로 표현하는게 더 낫다.
c = [x*2 for x in a]
print(b)
4) filter
함수와 함께 사용
filter(func, seq)
는 seq의 element중에 func
(bool을 리턴해야함)을 통과한 element를 추려준다.
- filter함수에 대한 자세한 내용은 별도의 글에서 다루도록 하겠다.
a = [1, 2, 3, 4, 5, 6, 7, 8]
b = list(filter(lambda x: (x%2 == 0) , a))
근데 위 코드도 사실 list comprehension으로 표현하는게 더 좋다.
c = [x for x in a if x%2 == 0]
5) reduce
함수와 함께 사용
reduce(func, seq)
는 cumulative하게 seq
에 있는 element들에 func
을 적용하고 하나의 값을 리턴한다.
- reduce함수에 대한 자세한 내용은 별도의 글에서 다루도록 하겠다.
from functools import reduce
a = [1, 2, 3, 4]
product_a = reduce(lambda x, y: x*y, a)
print(product_a)
위 글에서는 map, filter, reduce를 lambda와 함께 활용하는 법에 대해 살펴보았다.
추가로 아래 글을 읽어보는 것을 추천한다.
파이썬에서 자주 사용되는 내장함수인 각 map, filter, reduce에 대해 글을 정리해두었는데, 필요하다면 참고하길 바란다.
[Python Advanced] map함수란? (쉬운 설명 & 다양한 예시)
[Python Advanced] filter 함수란? (쉬운 설명 & 다양한 예시)
[Python Advanced] reduce 함수란? (쉬운 설명 & 다양한 예시)
참고자료
https://www.python-engineer.com/courses/advancedpython/08-lambda/
'[Python]' 카테고리의 다른 글
[Python advanced] itertools.groupby() 쉬운 설명 및 다양한 예제 (0) | 2022.02.28 |
---|---|
[Jupyter Notebook & Git] Git에 커밋할 때 자동으로 Jupyter Notebook의 output을 지우는 법 (how to clear jupyter notebook outputs) (0) | 2022.02.05 |
[Python Advanced] reduce 함수란? (쉬운 설명 & 다양한 예시) (0) | 2022.02.05 |
[Python Advanced] filter 함수란? (쉬운 설명 & 다양한 예시) (0) | 2022.02.05 |
[Python Advanced] map함수란? (쉬운 설명 & 다양한 예시) (0) | 2022.02.05 |