본문 바로가기

Programming/Python

[Python] 헷갈리는 문법 정리2 - 람다(lambda) 함수(map(), filter(), reduce())

lambda 인자: 표현식

'lambda'는 런타임에 생성해 사용 가능한 익명 함수.

'lambda'는 쓰고 버리는 일시적인 함수로 일반적인 함수와 같이 정의해두고 쓰는 것이 아닌, 필요한 곳에서 즉시 사용하고 버릴 수 있다.

f = lambda x: 2*x
print(f(10))

g = lambda x, y: x + y
print(g(5, 5))
20
10
def func(n):
    return lambda x: x+n

f = func(2)
g = func(4)
print(f(10))  # func(2)(10)
print(g(20))
12
24

 

map()

map()은 두 개의 인수를 가지는 함수로, map(function, iterable, ...) 의 구조.

첫 번째 인자 function: 함수, 두 번째 인자 iterable: 한 번에 하나의 멤버를 반환할 수 있는 객채(list, str, tuple 등)

map()함수는 function을 iterable의 모든 요소에 대해 적용하고, 변경된 iterator를 반환.

 

a = [1, 2, 3, 4]
b = [5, 6, 7, 8]
lst = list(map(lambda x, y: x+y, a, b))
print(lst)
[6, 8, 10, 12]

 

여기서, ' a, b' 가 뭔가 따로 노는 것 같아 (a, b) 로 묶어줬는데 y에 대한 인자가 없다는 결과를 보임. 아무 생각없이 했는데 생각해보니까,, 멍청한 생각이었다,, 진짜 파이썬 기초적인 문법을 놓고 살았구나 싶다,,(이번 학기 안에 복구한다 진짜. 사실 복구할 수준 조차도 없었지,,)

 

filter()

filter()도 두 개의 인자를 가지는 함수로, filter(function, iterable) 의 구조.

filter()에 인자로 사용되는 function이 처리되는 각각의 요소에 대해 Boolean 값을 반환하는데,

이때  Ture값을 반환하면 해당 요소는 남게 되고, False를 반환하면 그 요소는 제거됨.

 

a = [1, 3, 5, 11, 14, 18, 20, 21, 24]
lst = list(filter(lambda x: x % 3 == 0, a))
print(lst)
[3, 18, 21, 24]

 

reduce()

reduce()는 두 개의 필수 인자와 하나의 옵션 인자를 가지는 함수로, functools.reduce(function, iterable[, initializer])의 구조.

function을 사용해서 iterable을 하나의 값으로 줄임.

즉, 아래의 reduce(lambda x, y: x + y, a) -> reduce(lambda x, y: x + y, [1, 2, 3, 4, 5]) -> reduce(lambda x, y: x + y, [3, 3, 4, 5]) 이런 식으로 하나의 요소가 줄어들면서, 하나의 요소만 남을 때까지 함수에 해당하는 결과를 반복하는 것.

initializer가 있을 때, 첫 번째 인자로 추가됨.

from functools import reduce
a = [1, 2, 3, 4, 5]
ans = reduce(lambda x, y: x + y, a)
print(ans)
15

참고로, reduce() 함수는 파이썬의 내장함수가 아니라서 from functools import reduce로 불러와서 써야한다!