day 6 람다 표현식으로 함수 만들기

3 minute read

람다 표현식 사용하기

람다 표현식 사용하기

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

위치 인수를 사용하는 함수를 만들고 호출하기

>>> plus_ten = lambda x: x + 10
>>> plus_ten(1)
11

image

람다 표현식 자체를 호출하기

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

>>> (lambda x: x + 10)(1)
11

람다 표현식 안에서는 변수를 만들 수 없다

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

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

>>> y = 10
>>> (lambda x: x + y)(1)
11

람다 표현식을 인수로 사용하기

다 표현식을 사용하는 이유는 함수의 인수 부분에서 간단하게 함수를 만들기 위해서 입니다. 이런 방식으로 사용하는 대표적인 예가 map입니다.

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

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

참고 | 람다 표현식으로 매개변수가 없는 함수 만들기

람다 표현식으로 매개변수가 없는 함수를 만들 때는 lambda 뒤에 아무것도 지정하지 않고 :(콜론)을 붙입니다. 단, 콜론 뒤에는 반드시 반환할 값이 있어야 합니다. 왜냐하면 표현식(expression)은 반드시 값으로 평가되어야 하기 때문입니다.

>>> (lambda : 1)()
1
>>> x = 10
>>> (lambda : x)()
10

람다 표현식에 조건부 표현식 사용하기

>>> 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]

>>> a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> list(map(lambda x: str(x) if x == 1 else float(x) if x == 2 else x + 10, a))
['1', 2.0, 13, 14, 15, 16, 17, 18, 19, 20]

별로 복잡하지 않은 조건인데도 알아보기가 힘듭니다. 이런 경우에는 억지로 람다 표현식을 사용하기 보다는 그냥 def로 함수를 만들고 if, elif, else를 사용하는 것을 권장합니다.

>>> def f(x):
...     if x == 1:
...         return str(x)
...     elif x == 2:
...         return float(x)
...     else:
...         return x + 10
...
>>> a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> list(map(f, a))
['1', 2.0, 13, 14, 15, 16, 17, 18, 19, 20]

복잡하고 어렵게 코드를 작성하면 나중에 시간이 지나서 자기가 만든 코드인데도 못 알아보는 경우가 생깁니다. 코드는 길이가 조금 길어지더라도 알아보기 쉽게 작성하는 것이 좋습니다.

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 사용하기

>>> 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]

reduce 사용하기

reduce의 반환값이 15가 나왔습니다. 함수 f에서 x + y를 반환하도록 만들었으므로 reduce는 그림과 같이 요소 두 개를 계속 더하면서 결과를 누적합니다.

>>> def f(x, y):
...     return x + y
...
>>> a = [1, 2, 3, 4, 5]
>>> from functools import reduce
>>> reduce(f, a)
15

>>> a = [1, 2, 3, 4, 5]
>>> from functools import reduce
>>> reduce(lambda x, y: x + y, a)
15

참고 | map, filter, reduce와 리스트 표현식

리스트(딕셔너리, 세트) 표현식으로 처리할 수 있는 경우에는 map, filter와 람다 표현식 대신 리스트 표현식을 사용하는 것이 좋습니다. list(filter(lambda x: x > 5 and x < 10, a))는 다음과 같이 리스트 표현식으로도 만들 수 있습니다.

>>> a = [8, 3, 2, 10, 15, 7, 1, 9, 0, 11]
>>> [i for i in a if i > 5 and i < 10]
[8, 7, 9]

리스트 표현식이 좀 더 알아보기 쉽고 속도도 더 빠릅니다.

또한, for, while 반복문으로 처리할 수 있는 경우에도 reduce 대신 for, while을 사용하는 것이 좋습니다. 왜냐하면 reduce는 코드가 조금만 복잡해져도 의미하는 바를 한 눈에 알아보기가 힘들기 때문입니다. 이러한 이유로 파이썬 3부터는 reduce가 내장 함수에서 제외되었습니다.

reduce(lambda x, y: x + y, a)는 다음과 같이 for 반복문으로 표현할 수 있습니다.

>>> a = [1, 2, 3, 4, 5]
>>> x = a[0]
>>> for i in range(len(a) - 1):
...     x = x + a[i + 1]
...
>>> x
15

Leave a comment