<개인공부>/[Python]

[python] 파이썬 람다(lambda) 함수 설명 및 예제

BlockDMask 2021. 5. 5. 00:30
반응형

안녕하세요. BlockDMask 입니다.
오늘은 파이썬에서 람다함수에 대해서 알아보겠습니다.
람다함수는 적절한 곳에 잘 쓰인다면 코드가 간결해 보이지만, 그렇지 않고 남용하게 된다면 코드가 매우 지저분해 보이는 효과가 있는 그런 함수 입니다.

<목차>
1. lambda 함수 설명
2. lambda 함수와 map
3. lambda 함수와 filter

 

1. 파이썬 람다 함수 설명


원래 함수라는게 복잡한 명령들을 편하게 반복해서 사용할 수 있도록 모아두는 역할을 하는데, def 를 이용해서 다른곳에 함수를 만들고 그걸 또 호출해서 부르기까지의 수고가 필요하지 않은 그런 "가벼운? 함수"들을 위해서 만들어진게 람다 함수 입니다.

> 람다함수 선언 방법

lambda 인자: 표현식

lambda 라는 키워드를 입력하고 뒤에는 매개변수(인자)를 입력하고 콜론(:)을 넣은다음에 그 매개변수(인자)를 이용한 동작들을 적으면 됩니다.
예를 들면 인자로 들어온 값에 2를 곱해서 반환한다고 하면 lambda x : x * 2  이런식으로 됩니다.
어떤가요? 간단하죠?

 

> 이해를 돕기위한 람다함수와 일반함수 비교

위에서 설명했듯이 람다함수는 일반함수를 가볍게 만든 함수이기 때문에 
짝수를 판별하는 함수를 만든다고 했을때 일반함수는
def is_even(x):
  return x % 2 == 0
이런식으로 표현을 할 수 있습니다.

이걸 람다로 표현하게 되면
is_even = lambda x : x % 2 == 0
이런식으로 표현할수 있습니다.

물론 일반함수, 람다함수 둘다 사용법은 같습니다.
이런식으로 호출을 하겠죠?
is_even(1) # False
is_even(2) # True

 

2. 파이썬 lambda 함수와 map


이미 아시는 분들은 아시겠지만
map함수는 리스트나 튜플에 어떤 특별한 처리를 할때 사용하는 함수입니다.

> map 함수의 모양과 사용법

map(함수, 리스트나 튜플)

첫번째 인자인 함수는 두번째 인자로 들어온 리스트나, 튜플에 특별한 가공 처리를 하는 함수이며, 사용자가 직접 함수를 정의해서 넣습니다.
두번째 인자인 리스트나 튜플은 바꾸고자 하는 데이터들을 집어 넣습니다.

예를들어 리스트의 모든값에 2씩 더해서 새로운 리스트를 만든다고 할때  map 함수는 아래와 같이 사용할 수 있습니다.
map 의 반환값을 리스트로 다시 변경할수 있는데요 이때는 list(map(~~~)) 이런식으로 list 로 형변환해주는 함수로 감싸주면 됩니다.

1
2
3
4
5
6
7
8
9
10
11
12
# 1. 일반 함수 버전
def plus_two(x):
    return x + 2
 
result1 = list(map(plus_two, [12345]))
print(result1)
 
 
# 2.  람다 함수 버전
result2 = list(map((lambda x: x + 2), [12345]))
print(result2)
 
cs

> 결과

이런식으로 def를 통해서 함수를 map의 인자로 전달해줘도 되지만,
map을 통해서 "리스트를 가공하는게 이번 한번 뿐이다" 라는 상황이라던지 lambda를 사용해서 간단하게 작업이 가능한 경우라면
람다 함수 사용을 고려해보는 것도 좋을듯 합니다.

여기서 이제 지난시간에 배웠던 range를 또 결합하면 
result3 = list(map((lambda x : x + 2), range(2, 6)) 이런식으로도 쓸 수 있습니다.
(파이썬 range 함수 [바로가기])

이렇게 람다 함수는 map 함수와 같이 사용자 정의 함수를 받을때 유용하게 작성할 수 있습니다.
아래 또다른 예제를 한번 볼까요?

 

3. python 람다 함수와 filter


filter 함수는 map 함수와 비슷하게  리스트나 튜플을 두번째인자로 받고 첫번쨰 인자로 함수를 받습니다.

> filter 함수 모양과 설명

filter(함수, 리스트나 튜플)

첫번째 인자에는 두번째 인자로 들어온 리스트나 튜플을 하나하나씩 받아서 필터링할 함수를 넣습니다.
두번쨰 인자에는 리스트나 튜플을 집어 넣습니다.

예를들어 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 까지의 리스트가 있을때 짝수들만 filter 함수를 이용해서 리스트를 다시 만든다고 했을때, filter 함수와 람다를 이용할 수 있습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
# 1. 일반 함수 버전
def is_even(x):
    return x % 2 == 0
 
 
result1 = list(filter(is_even, range(10)))  # [0 ~ 9]
print(result1)
 
 
# 2.  람다 함수 버전
result2 = list(filter((lambda x: x % 2 == 0), range(10)))  # [0 ~ 9]
print(result2)
 
cs

> 결과

이때 첫번째 인자인 함수를 일반함수와 lambda 함수로 나눠서 예시를 들어보았는데요.
결과 화면을 보앗듯 filter 함수의 첫번째 인자가 True 인 경우의 값만 가지고와서 리스트를 만들었습니다.
 filter 함수와 람다 함수를 결합하여 깔끔하게 filter가 가능합니다.

 

이런식으로 람다는 어떤 함수에서 간단한함수가 요청이 들어올때 사용하는것이 대부분(제가알기론?) 입니다.
이런경우 람다를 적절하게 사용해주면 됩니다.
일회성 함수를 위해서 "def 함수 ~~" 이런작업을 해주지 않아도 되는 장점이 있습니다.

반응형