파이썬 람다(lambda) 함수 사용법, map(), reduce(), filter() 함수
파이썬에는 코드를 간결하게 표현해주기 위해 람다함수가 있다. 함수의 구조는 필요하지만 정의할 필요는 없을 때 코드를 간결하게 하기 위한 목적으로 주로 사용된다.
def add(x, y):
return x+y
print(add(1, 2))
# 출력: 3
위와 같은 함수 정의는 다음과 같이 일회용 람다함수 코드로 바꿔줄 수 있다.
print((lambda x, y: x + y)(1, 2))
# 출력: 3
위와 같이 최소 세줄이 필요한 함수 선언과 호출을 단 한줄에 쓸 수 있는 것이다.
하지만 이정도 예시만 가지고는 아직 람다함수를 왜 써야하는지 이해하기 어렵다.
파이썬의 람다함수는 map, reduce, filter등과 함께 사용할 때 그 진가를 발휘한다.
1. map(function, iterable)
map함수는 어떠한 함수와 이터레이블한 객체(리스트, 튜플 등)를 인자로 받아 이터레이블 객체내의 값들을 주어진 함수에 순서대로 넣는다.
print(list(map(lambda x: x**2, range(5))))
# 출력: [0, 1, 4, 9, 16]
lambda x: x**2 라는 함수의 인자로 [0, 1, 2, 3, 4, 5]의 값들을 순서대로 넣어줘 그 결과값들이 반환되었다. 이때 map 함수를 실제로 실행시키기 위해서는 list()함수를 통해 매핑된 결과들을 실제 객체로 만들어주어야 한다.
다음과 같이 사용할 수도 있다.
key = ['a', 'c']
dic = {'a': 1, 'b': 2, 'c': 3, 'd': 4}
print(list(map(lambda x: dic[x], key)))
# 출력: [1, 3]
dic의 키값으로 key리스트의 요소들을 하나씩 넣은 결과들이 리스트로 반환되었다.
2. reduce(function, sequence, initial=None)
reduce함수는 functools 모듈을 import 해주어야 사용할 수 있다.
from functools import reduce
print(reduce(lambda x, y: x+y, range(5)))
# 출력: 10
reduce함수는 이터레이터의 첫번째 값을 주어진 함수의 첫번째 인자에, 두번째 값을 두번째 인자에 전달해준다. 그리고 이렇게 주어진 함수의 결과를 또 다시 함수의 첫번째 인자에, 그리고 세번째 값을 두번째 인자에 전달한다. 이런식으로 반복하여 이터레이터의 모든 값들을 함수에 전달하고 나면 최종 값을 반환해준다.
여기서 initial 인자를 전달할 경우, 가장 먼저 함수의 첫번째 인자로 전달된다.
from functools import reduce
print(reduce(lambda x, y: y+x, 'abcde', 'z'))
# 출력: 'edcbaz'
위 코드를 예시로 설명하자면, 람다함수의 x에 inital인자인 'z'와 y에 문자열의 첫번째 요소인 'a'가 들어가 y+x값인 'az'가 반환된다. 그 다음 'az'는 다시 x에 들어가고, 'b'가 y에 들어가 'baz'가 반환된다. 이런식으로 문자열 끝까지 반복하면 위와 같은 결과가 출력된다.
전달하는 함수의 필요 인자가 여러개일 경우 그 갯수만큼 이터레이터에서 순서대로 입력된다.
functools 모듈에서는 reduce함수를 다음과 같이 간결한 예시를 들어 설명하고 있다.
For example, reduce(lambda x, y: x+y, [1, 2, 3, 4, 5]) calculates ((((1+2)+3)+4)+5).
3. filter(function=None, iterable)
이 정도까지 왔다면 람다함수의 사용방법을 어느정도 익혔을 것이다. filter함수는 말그대로 전달되는 함수에 전달했을 때 참이되는 요소들만 반환한다.
print(list(filter(lambda x: x < 5, range(10))))
# 출력: [0, 1, 2, 3, 4]