쿼카러버의 기술 블로그

[Python Advanced] lambda 함수란? (쉬운 설명 & 다양한 예시)(map, filter, reduce) 본문

[Python]

[Python Advanced] lambda 함수란? (쉬운 설명 & 다양한 예시)(map, filter, reduce)

quokkalover 2022. 2. 5. 15:39

Lambda 함수란

파이썬에서 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/

https://dinfree.com/lecture/language/112_java_9.html

https://wikidocs.net/22804

Comments