About/Python
[Python] Lambda & Map & Reduce
김징어
2020. 12. 20. 16:09
Lambda
- 함수 이름 없이, 함수처럼 쓸 수 있는 익명함수
- 수학의 람다 대수에서 유래함
- Python 3부터는 권장하지는 않으나, 여전히 많이 사용됨.
- 간단한 함수들을 선언해서 사용하면 좋을 것 같다.(ex 함수의 제곱, 덧셈 반환 등..)
Map function
- Sequence 자료형의 각 Element에 동일한 functon을 적용하는 함수
- map(function_name, list_data)
- 첫 번째 인자는 적용할 함수, 두 번째 인자는 적용할 데이터이다.
위의 예제에서 기존의 데이터 [1,2,3,4,5]에 각 요소들을 제곱하는 람다 함수를 적용하여 모든 요소가 제곱된 새로운 리스트가 반환되었다.
위와 같이 Map()와 Lambda를 같이 사용하면 편리하게 기존의 데이터를 수정하여 구성할 수 있다.
- Map()는 적용할 함수에 따라 두 개 이상의 List를 입력으로 사용 가능하다.
- if filter 또한 사용 가능하다.
위의 예제에서
f = lambda x : x **2 if x % 2 == 0 else x
if filter를 적용하여 x가 짝수인 경우에만 제곱을 하는 Lambda함수를 선언하였다.
(else가 없는 경우 문법 오류이므로 주의하자.)
위 Lambda 함수를 map에 적용시킨 후
데이터 중 짝수인 요소만 제곱된 것을 볼 수 있다.
Reduce function
- Map function과 달리 list에 똑같은 함수를 적용하여 통합하는 함수이다.
- functools에서 reduce를 import 하여야 사용할 수 있다.
from functools import reduce
- List에 똑같은 함수를 적용하여 통합한다는 것이 잘 이해가 안 될 수 있다.
- 예제를 살펴보자.
Lambda 함수는 x, y를 입력받아서 합을 반환하는 함수이다.
이 함수가 reduce에 적용이 되면 다음과 같은 절차로 데이터에 적용이 된다.
- 1,2 번째 데이터를 람다 함수에 입력 (반환되는 요소를 r1이라고 가정)
- r1과 3번째 데이터를 람다 함수에 입력 (반환되는 요소를 r2라고 가정)
- r2와 4번째 데이터를 람다 함수에 입력 .....(생략)
마치 재귀 함수가 실행되듯이 람다 함수의 결괏값을 다음 람다 함수의 입력으로 사용하여 Sequence 자료형을 통합한다.
위의 데이터로 절차를 살펴보자.
- 첫 두 데이터 (1,2)를 f에 적용 -> 3 반환
- 3과 3번째 데이터 (3,3)를 f에 적용 -> 6 반환
- 6과 4번째 데이터 (6,4)를 f에 적용 -> 10 반환
- 10과 5번째 데이터 (10,5)를 f에 적용 -> 15반환
따라서 결과는 15이다. (리스트 요소들의 총합과 같다.)
이렇듯 Lambda, map, reduce 함수는 모두 간단한 코드로서 다양한 기능을 제공한다.
하지만 코드의 직관성이 떨어져서 lambda나 reduce는 python3에서 사용을 권장하지 않는다.
그래도 Legacy Library나 다양한 머신러닝 코드에서 여전히 많이 사용 중이므로 알고 있다면 좋은 함수일 것이다.