Unit 34. 람다 사용하기

지금까지 def로 함수를 정의해서 사용했습니다. 이번에는 람다(lambda)로 익명함수를 만드는 방법을 알아보겠습니다.

람다는 한 줄로 함수를 작성하는 방법인데 식 형태로 되어 있다고 해서 람다 표현식(lambda expression)이라고 부릅니다. 람다는 함수를 간편하게 작성할 수 있어서 다른 함수의 인수로 넣을 때 주로 사용합니다.

34.1 람다로 함수 만들기

람다를 사용하기 전에 먼저 map에 함수를 넣어서 리스트의 모든 요소에 10을 더해보겠습니다. 다음과 같이 숫자를 받은 뒤 10을 더해서 반환하는 함수 plus_ten을 작성합니다. 그리고 mapplus_ten 함수와 리스트 [1, 2, 3]을 넣습니다. 물론 map의 결과는 map 객체이므로 눈으로 확인할 수 있도록 list를 사용해서 리스트로 변환해줍니다.

>>> def plus_ten(x):
...     return x + 10
...
>>> list(map(plus_ten, [1, 2, 3]))
[11, 12, 13]

리스트 [1, 2, 3][11, 12, 13]으로 바뀌었습니다. 지금까지 map을 사용할 때 map(str, [1, 2, 3])와 같이 자료형 int, float, str 등을 넣었는데 plus_ten처럼 함수(클래스)를 직접 만들어서 넣어도 됩니다.

그럼 plus_ten 함수를 람다로 작성해보겠습니다. 람다는 다음과 같이 lambda에 매개변수를 지정하고 :(콜론) 뒤에 반환값을 지정하면 됩니다.

  1. lambda 매개변수1, 매개변수2: 반환값
>>> list(map(lambda x: x + 10, [1, 2, 3]))
[11, 12, 13]

plus_ten 함수 부분이 lambda x: x + 10으로 줄었습니다. 전체적으로 보면 코드가 세 줄에서 한 줄로 줄었죠? 이처럼 람다는 함수를 다른 함수의 인수로 넣을 때 매우 편리합니다.

이제 람다 표현식을 살펴보면 lambda x: x + 10은 매개변수 x 하나를 받고, x에 10을 더해서 반환한다는 뜻입니다. 즉, 매개변수, 연산자, 값 등을 조합해서 반환값을 만드는 방식입니다. 다음과 같이 def로 만든 함수와 비교해보면 쉽게 알 수 있습니다.

그림 34-1 함수와 람다 표현식
그림 34 1 함수와 람다 표현식

람다의 특징은 이름이 없는 함수라는 점입니다. 람다 표현식 자체가 함수로 동작할 뿐 이름이 없습니다. 그래서 람다를 익명 함수(anonymous function)로 부르기도 합니다. 만약 함수 이름이 필요하다면 다음과 같이 람다 표현식을 변수에 할당해주면 됩니다.

>>> f = lambda x: x + 10
>>> list(map(f, [1, 2, 3]))
[11, 12, 13]

람다 표현식 자체를 호출하려면 다음과 같이 람다 표현식을 ( )(괄호)로 묶은 뒤에 다시 ( )를 붙이고 인수를 넣어서 호출하면 됩니다.

  1. (lambda 매개변수1, 매개변수2: 반환값)(인수1, 인수2)
>>> (lambda x: x + 10)(1)
11

람다에서 주의할 점은 람다 표현식 안에서는 새 변수를 선언할 수 없다는 점입니다. 따라서 반환값 부분은 변수 없이 식 한 줄로 표현할 수 있어야 합니다. 변수가 필요한 복잡한 코드일 경우에는 def로 함수를 작성해야 합니다.

>>> (lambda x: y = 10; x + y)(1)
SyntaxError: invalid syntax

단, 람다 함수 바깥에 있는 변수는 사용할 수 있습니다. 다음은 매개변수 x와 람다 함수 바깥에 있는 변수 y를 더해서 반환합니다.

>>> y = 10
>>> (lambda x: x + y)(1)
11
참고 | 람다로 매개변수가 없는 함수 만들기

람다로 매개변수가 없는 함수를 만들 때는 lambda 뒤에 아무것도 지정하지 않고 :(콜론)을 붙입니다. 단, 콜론 뒤에는 반드시 반환할 값이 있어야 합니다.

>>> (lambda : 1)()
1
>>> x = 10
>>> (lambda : x)()
10
최근 수정: 2017년 9월 14일, 목요일, 오전 9:15