Python - Lambda function 이해하기 (filter, reduce, map)

JS · 14 Jun 2020

Lambda function은 함수를 한 줄로 정의하는 문법입니다.

예를 들어, 기존에는 다음과 같이 함수를 정의하였습니다.

def square(n):
    return n * n

print(square(10))

위의 함수를 Lambda function으로 정의하면 다음과 같이 한 줄로 정의할 수 있습니다.

square = lambda n: n * n

print(square(10))

물론 모든 함수를 Lambda 함수로 정의할 수 있는 것은 아닙니다. 인자의 개수에는 제한이 없지만, 표현식(expression)은 1개만 있어야 합니다. 보통 한 줄로 구현되는 함수를 간결하게 표현하기 위해 Lambda를 사용합니다. 또는 한번 쓰고 버려질 함수나, 인자로 전달되는 함수를 inline으로 정의하기 위해 사용합니다.

Lambda 함수 정의

Lambda 함수의 문법은 다음과 같습니다. :의 왼쪽에 arguments를 정의하고 오른쪽에 expression을 정의합니다.

lambda arguments: expression

expression은 하나만 있어야 하지만, 인자의 개수는 제한이 없습니다.

다음과 같이 다양한 개수의 인자를 정의할 수 있습니다.

인자가 1개인 Lambda 함수

다음과 같이 인자가 1개인 Lambda 함수를 구현할 수 있습니다.

square = lambda n: n * n

다음과 같이 Lambda 함수를 호출할 할 수 있습니다.

print(square(10))
# Output : 100

인자가 3개인 Lambda 함수

다음과 같이 인자가 3개인 Lambda 함수를 구현할 수 있습니다.

abc = lambda a, b, c: a + b + c

다음과 같이 Lambda 함수를 호출할 할 수 있습니다.

print(abc(1, 2, 3))
# Output : 6

이 Lambda 함수를 일반 함수로 구현하면 다음과 같습니다.

def abc(a, b, c):
    return a + b + c

Lambda를 생성하는 함수

Lambda 함수를 사용하는 예제 중의 하나로, 매크로처럼 Lambda 함수를 생성하는 함수를 만들 수 있습니다.

printChar()는 인자 char를 출력해주는 lambda 함수를 정의하고 리턴해 줍니다.

def printChar(char):
    return lambda num: print(char * num)

다음과 같이 원하는 문자열을 출력해주는 lambda 함수를 만들고 그 함수를 사용할 수 있습니다.

printStar = printChar('*')
printSharp = printChar('#')

printStar(1)
printSharp(2)
printStar(3)
printSharp(4)

Output:

*
##
***
####

filter()

filter()는 리스트의 아이템들을 필터링하고 그 결과를 리턴해주는 함수입니다. Lambda 함수와 함께 사용할 수 있습니다.

filter()의 첫번째 인자로 Lambda 함수를 전달하고, 두번째 인자에 리스트를 전달합니다.

arr = [10, 4, 5, 2, 24, 1, 9, 12]
result = list(filter(lambda x: x < 10, arr))
print(result)

Lambda 함수에 정의한 조건으로 리스트의 아이템이 필터링되어, 10 이하의 숫자들만 리턴됩니다.

[4, 5, 2, 1, 9]

map()

map()은 리스트를 인자로 받고, 이 리스트의 아이템들을 다른 값으로 변경해주는 함수입니다. Lambda와 함께 사용할 수 있습니다.

map()의 첫번째 인자로 Lambda를 전달하고, 두번째 인자에 리스트를 전달합니다. 각각의 아이템에 대해서 Lambda 함수를 호출하고 그 결과 값들을 리턴해 줍니다.

arr = range(10)
result = list(map(lambda x: x * x, arr))
print(result)

Output:

[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

range(10)는 0부터 시작하는 10개의 숫자를 리스트로 리턴해줍니다. 즉, [0, 1, 2, ..., 9] 를 리턴합니다.

reduce()

reduce()은 리스트의 아이템들을 누적해서 하나의 값으로 리턴해주는 함수입니다. Lambda와 함께 사용할 수 있습니다.

reduce()의 첫번째 인자로 Lambda를 전달하고, 두번째 인자에 리스트를 전달합니다.

from functools import reduce
arr = range(10)
result = reduce(lambda x, y: x + y, arr)
print(result)

위의 연산 과정을 살펴보면, 처음에는 0 + 1이 수행되고, 그 결과를 다음 연산에 사용합니다. 그래서 그 다음에는 1 + 2이 수행되고, 3 + 3, 6 + 4... 순서로 진행되어 마지막 값이 리턴됩니다. 따라서 결과는 0에서 9까지 합한 숫자가 리턴됩니다.

Output:

45
댓글을 보거나 쓰려면 이 버튼을 눌러주세요.
codechachaCopyright ©2019 codechacha