- 람다 표현식
>>> def multiply_ten(x):
return x * 10
>>> multiply_ten(10)
100
multiply_ten 함수를 람다표현식으로 표현해보겠습니다.
>>> lambda x: x * 10
<function <lambda> at 0x03D7D070>
>>> lambda 매개변수: 식
람다 표현식은 이름이 없는 함수를 만들기 때문에 익명함수(anonymous function)이라고도 부릅니다. 그래서 lamda 함수는 변수에 할당해주어야 호출할 수 있습니다.
>>> multiply_ten = lambda x: x * 10
>>> multiply_ten(10)
100
>>> 변수 = lambda 매개변수: 식
>>> (lambda x: x * 10)(10)
100
>>> (람다 표현식)(인수)
변수에 할당하지 않고 괄호를 이용해 람다 표현식을 호출할 수도 있습니다.
y = 10
>>> (lambda x: x * y)(10)
100
>>> (lambda x: y = 10; x * y)(10)
SyntaxError: invalid syntax
람다 표현식에서 식 바깥에서 만들어진 변수는 사용할 수 있지만 식 안에서 변수를 만들수는 없습니다.
- 람다 표현식 인수로 사용하기
>>> def multiply_ten(x):
return x * 10
>>> list(map(multiply_ten, [10, 20, 30, 40]))
[100, 200, 300, 400]
인수에 map 안에 함수를 넣어 리스트에 함수를 적용 시킨 후 list로 다시 나타내면 함수가 리스트에 적용되게 됩니다.
이것을 람다 표현식으로 사용하면 긴 코드를 한 줄로 줄일 수 있습니다.
>>> list(map(lambda x:x * 10, [10, 20, 30, 40]))
[100, 200, 300, 400]
짠! 한 줄로 줄었네요
- 조건부 표현식 사용
>>> a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> list(map(lambda x: str(x) if x % 2 == 0 else x, a))
[1, '2', 3, '4', 5, '6', 7, '8', 9, '10']
위의 식은 조건으로 2의 배수일때 x를 문자열로 반환하고 아닐때는 그냥 x를 반환하도록 했습니다.
>>> 식1 if 조건식 else 식2
조건식이 참일때 식1이 실행되고 거짓일때 식2가 실행됩니다. 람다 표현식에서 조건부 표현식을 사용할때는 if, else를 사용할때 : (클론) 을 붙이지 않습니다.
>>> list(map(lambda x: str(x) if x % 2 == 0, a))
SyntaxError: invalid syntax
람다 표현식에서 조건부 표현식을 사용할 때에는 if와 else를 둘 다 사용해야 합니다. 만약 else를 사용하지 않고 if만 사용한다면 에러가 발생합니다.
>>> def f(x):
if x == 3:
return str(x)
elif x == 2:
return float(x)
else:
return x
>>> a = [1, 2, 3, 4, 5, 6, 7, 8 ,9, 10]
>>> list(map(f, a))
[1, 2.0, '3', 4, 5, 6, 7, 8, 9, 10]
이런 함수를 람다 표현식으로 표현하려면 어떻게 해야 할까요.
>>> list(map(lambda x: str(x) if x == 3 else float(x) if x == 2 else x, a))
[1, 2.0, '3', 4, 5, 6, 7, 8, 9, 10]
>>> 식1 if 조건문1 else 식2 if 조건식2 else 식3 if 조건식 3 else 식4
람다 표현식에서는 elif를 사용할 수 없으므로 if, else를 반복해서 사용해야 합니다. 하지만 간단한 식인데도 복잡하게 보이므로 이 경우에는 def로 함수를 만드는 것을 추천합니다.
- map을 사용해 객체 여러개 넣기
>>> a = [1, 2, 3, 4]
>>> b = [5, 6, 7, 8]
>>> list(map(lambda x, y: x * y, a, b))
[5, 12, 21, 32]
- filter
>>> def f(x):
return x < 5 and x > 1
>>> a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> list(filter(f, a))
[2, 3, 4]
filter을 사용하면 함수의 조건에 맞는 요소만 반환합니다.
>>> a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> list(filter(lambda x: x < 5 and x > 1, a))
[2, 3, 4]
위 식을 람다 함수로 표현해 보았습니다.
- reduce
>>> def f(x,y):
return x * y
>>> a = [1, 2, 3, 4, 5, 6]
>>> from functools import reduce
>>> reduce(f, a)
720
from functools import reduce를 입력하여 reduce 함수를 가져옵니다. reduce 함수는 각 요소를 함수로 처리하고 이전 결과와 누적하여 반환합니다.
a = [1, 2, 3, 4, 5, 6]
from functools import reduce
>>> reduce(lambda x, y: x * y, a)
720
위 식을 람다 표현식으로 바꿔보았습니다.
'Python' 카테고리의 다른 글
[Python] 포매팅을 이용해 숫자 자리 개수 맞추기 (0) | 2021.05.03 |
---|---|
[Python] 문자열 포매팅, % (0) | 2021.05.03 |
[Python] 매개 변수, 가변 매개 변수, 기본 매개 변수 (0) | 2021.04.18 |
[Python] 함수 선언 (0) | 2021.04.17 |
[Python] 딕셔너리 (0) | 2021.04.13 |