익명 함수를 만들 때는 def 문 대신 람다 표현식을 이용한다. 람다 표현식은은 식 형태로 되어 있다고 해서 람다 표현식(lambda expression)이라고 부른다. 특히 람다 표현식은 함수를 간편하게 작성할 수 있어서 다른 함수의 인수로 넣을 때 주로 사용한다.
lambda 매개변수: 반환값
람다 식은 입력과 출력이 있는 간단한 한 행짜리 함수를 만들 때 사용한다. 예를 들어, 매개변수 x에 전달받은 수보다 1 큰 수를 반환하는 함수는 다음과 같이 정의할 수 있다.
>>> lambda x: x + 1
같은 함수를 def 문으로 정의할 때보다 간결하다. 같은 함수를 def 문으로 작성하려면 다음과 같이 해야 한다.
>>> def f(x):
... return x + 1
람다 식으로 정의한 함수는 변수에 대입해 두었다가 호출할 수도 있다. 이름이 없지만, 변수에 대입하면 이름을 붙일 수도 있다.
>>> 두_수의_곱 = lambda a, b: a * b
>>> 두_수의_곱(10, 8)
80
하지만 이렇게 람다 식으로 만든 함수를 변수에 대입해 사용하는 것은 파이썬 문화에서는 권장되지 않는다. 함수에 이름을 붙여야 한다면 def 문을 사용해 정식으로 정의하는 것이 올바른 방법이다.
먼저 람다 표현식에서 조건부 표현식을 사용하는 방법은 다음과 같다
lambda 매개변수들: 식1 if 조건식 else 식2
map(함수, 반복가능한객체)
다음 예시에서는 map과 조건부 표현식을 사용하여 리스트 a에서 3의 배수를 문자열로 변환한다.
>>> a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> list(map(lambda x: str(x) if x % 3 == 0 else x, a))
[1, 2, '3', 4, 5, '6', 7, 8, '9', 10]
map은 리스트 등의 반복 가능한 객체를 여러 개 넣을 수도 있다.
다음은 두 리스트의 요소를 곱해서 새 리스트를 만든다.
>>> a = [1, 2, 3, 4, 5]
>>> b = [2, 4, 6, 8, 10]
>>> list(map(lambda x, y: x * y, a, b))
[2, 8, 18, 32, 50]
filter는 반복 가능한 객체에서 특정 조건에 맞는 요소만 가져오는데, filter에 지정한 함수의 반환값이 True일 때만 해당 요소를 가져온다.
filter(함수, 반복가능한객체)
먼저 def로 함수를 만들어서 filter를 사용해보자. 다음은 리스트에서 5보다 크면서 10보다 작은 숫자를 가져온다.
>>> def f(x):
... return x > 5 and x < 10
...
>>> a = [8, 3, 2, 10, 15, 7, 1, 9, 0, 11]
>>> list(filter(f, a))
[8, 7, 9]
리스트 a에서 8, 7, 9를 가져왔다. 즉, filter는 x > 5 and x < 10의 결과가 참인 요소만 가져오고 거짓인 요소는 버린다
그럼 함수 f를 람다 표현식으로 만들어서 filter에 넣어보자.
>>> a = [8, 3, 2, 10, 15, 7, 1, 9, 0, 11]
>>> list(filter(lambda x: x > 5 and x < 10, a))
[8, 7, 9]
람다 표현식 lambda x: x > 5 and x < 10을 filter에 넣어서 5보다 크면서 10보다 작은 수를 가져오도록 만들었다.
reduce는 반복 가능한 객체의 각 요소를 지정된 함수로 처리한 뒤 이전 결과와 누적해서 반환하는 함수이다. (reduce는 파이썬 3부터 내장 함수가 아닙니다. 따라서 functools 모듈에서 reduce 함수를 가져와야 한다)
from functools import reduce
reduce(함수, 반복가능한객체)
다음은 리스트에 저장된 요소를 순서대로 더한 뒤 누적된 결과를 반환한다.
>>> def f(x, y):
... return x + y
...
>>> a = [1, 2, 3, 4, 5]
>>> from functools import reduce
>>> reduce(f, a)
15
이제 함수 f를 람다 표현식으로 만들어서 reduce에 넣어보자.
>>> def f(x, y):
... return x + y
...
>>> a = [1, 2, 3, 4, 5]
>>> from functools import reduce
>>> reduce(lambda x, y: x + y, a)
15
lambda x, y: x + y와 같이 매개변수 x, y를 지정한 뒤 x와 y를 더한 결과를 반환하도록 만들었다.
본 포스팅은 아래의 사이트를 참고하여 작성되었습니다.
연오의 파이썬 https://python.bakyeono.net/chapter-6.html
코딩도장 https://dojang.io/