람다 표현식으로 익명 함수를 만드는 방법을 알아보겠습니다.

람다 표현식은 식 형태로 되어 있다고 해서 람다 표현식(lambda expression)이라고 부릅니다.

특히 람다 표현식은 함수를 간편하게 작성할 수 있어서 다른 함수의 인수로 넣을 때 주로 사용합니다.

특히 map, filter, reduce와 같이 매개변수로 함수가 필요한 곳에 유용하게 사용됩니다.

 

 

사용시 기본 형식

lambda 인자:표현식

 

 

ex) 두 수를 더하는 함수

def hap(x, y)
    return x + y

hap(10, 20)

>>> 30

 

 

위를 람다식으로 표현하면

(lambda x,y:x+y)(10,20)

>>> 30

몇가지 함수를 더 배워보며 람다가 어떻게 이용되는지 알아보겠습니다.

 

 

 

 

람다를 변수에 할당하여 재사용 할 수도 있습니다.

lambdaAdd = lambda n,m: n + m

print(lambdaAdd(2, 3))
# 5

print(lambdaAdd(4, 5))
# 9

 

 

 

람다를 반환하는 함수를 작성해보기

def inc(n):
    return lambda x: x + n

f = inc(2)
g = inc(4)
print(f(12))
print(g(12))
print(inc(2)(12))

# 출력결과 : 
14
16
14

 

 

람다식 안에서 조건문도 사용 가능합니다.

ex) 매개변수로 주어진 값중 n이 짝수이면 n을 아니면 m을 반환하는 함수

print((lambda n, m: n if n%2==0 else m)(1, 3))
# 3

print((lambda n, m: n if n%2==0 else m)(2, 3))
# 2

 

 

람다 표현식에서 조건식 사용 시 기본 형식

lambda n, m: n if n%2==0 else m)(2, 3)

lambda 변수1, 변수2 : '참일때 반환할 값' if 구문 else '거짓일시 반환할 값'(변수1, 변수2)

 

 

 

 

 

 

 

 

매개변수로 함수가 필요한 함수 중 대표적으로 map(), filter(), reduce()를 람다와 함께 사용해보겠습니다.

 

map()

 

먼저 map함수입니다.

map(함수, 리스트)

이 함수는 함수와 리스트를 인자로 받습니다.

그리고, 리스트로부터 원소를 하나씩 꺼내서 함수를 적용시킨 다음, 그 결과를 새로운 리스트에 담아줍니다.

 

 

map(lambda x: x ** 2, range(5))      # 파이썬 2
[0, 1, 4, 9, 16]

list(map(lambda x: x**2, range(5)))  # 파이썬2 및 파이썬3
[0, 1, 4, 9, 16]

위의 map 함수가 인자로 받은 함수는 lambda x:x**2구요,

리스트로는 range(5)를 받습니다. range(5)는 [0, 1, 2, 3, 4]라는 리스트를 돌려줍니다.

그리고 x**2라는 것은 x값을 제곱하라는 연산자 입니다.

결국 위 예제에서는 [0, 1, 2, 3, 4]에서 각 원소를 제곱시킨 리스트를 반환하게됩니다!

 

 

 

reduce()

 

리스트의 값을 순서대로 누적시켜가며 람다식을 적용한다.

이번엔 reduce 함수를 살펴봅시다.

reduce(함수, 순서형 자료)

형식은 위와 같구요, 순서형 자료(문자열, 리스트, 튜플)의 원소들을 함수를 적용시켜 누적시킵니다.

 

 

from functools import reduce

reduce(lambda x, y: x + y, [0, 1, 2, 3, 4])
>>>10

위의 예제에서는 먼저 0과 1을 더하고, 그 결과에 2를 더하고, 거기에 3을더하고, 또 4를 더한 값을 돌려줍니다.

한 마디로 전부 다 더하라는 겁니다. 생각보다 쉽죠?

 

 

reduce(lambda x, y: y + x, 'abcde')
>>>'edcba'

y+x 구문이 동작하므로 

1. b+a

2. c+ba

... 'edcba'가 반환됩니다!

 

 

 

filter()

지정한 조건을 만족시키는 값들로만 리스트를 구성하여 반환

filter(함수, 리스트)

필터함수는 이렇게 생겼는데요.

리스트에 들어있는 원소들을 함수에 적용시켜서 결과가 참인 값들로 새로운 리스트를 만들어 줍니다

 

 

다음은 0부터 9까지의 리스트 중에서 5보다 작은 것만 돌려주는 예제입니다.

filter(lambda x: x < 5, range(10))    #파이썬2
>>> [0, 1, 2, 3, 4]

list(filter(lambda x: x < 5, range(10))) # 파이썬2, 3
>>> [0, 1, 2, 3, 4]

5미만인 값만 살려서 리스트로 반환한다!

x < 5 가 참이면 값을 살리는 구문!

 

 

홀수로만 이루어진 리스트를 반환하는 필터를 만들어보겠습니다

filter(lambda x : x % 2, range(10)) #파이썬 2
[1, 3, 5, 7, 9]

list(filter(lambda x : x % 2, range(10))) # 파이썬 2,3
[1, 3, 5, 7, 9]

1은 참 0은 거짓!

이므로

x%2가 1이면 리스트에 추가

0이면 걸러낸다고 생각하시면 됩니다!

 

 

마지막으로 한번더 map, reduce, filter를 람다함수를 이용하여 작성해보겠습니다.

from functools import reduce


l = list(range(1, 11))
print(l)
# [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

m = list(map(lambda n:n*n, l))
print(m)
# [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

r = reduce(lambda n,m:n*m, l)
print(r)
# 362880

f = list(filter(lambda n:n%2==0, l))
print(f)
# [2, 4, 6, 8, 10]

 

람다함수는 특히 map, filter, reduce와 같이 매개변수로 함수가 필요한 곳에 유용하게 쓰입니다!

 

 

 

 

 

참조:

https://dpdpwl.tistory.com/87

https://offbyone.tistory.com/73

https://dojang.io/mod/page/view.php?id=2359

https://wikidocs.net/64

반응형

'python' 카테고리의 다른 글

[python] 가변 인자(*args, **kwargs)  (0) 2021.02.22
[python] 이터레이터와 제너레이터  (0) 2021.02.20
[python] Decorator(데코레이터)  (0) 2021.02.18
[python] Closure(클로저 )  (0) 2021.02.17
[python] class, instance, Method  (0) 2021.02.11

+ Recent posts