람다식 : lambda experssion
람다 표현식이라고 하며 이름이 없는 함수, 즉 익명 함수이다.
함수를 간편하게 작성할 수 있으며, 주로 다른 함수의 인수(파라미터)로 넘겨줄 때 많이 사용된다.
파라미터 x, y 를 더한 값을 리턴시켜주는 함수를 람다식으로 표현하면 아래와 같다.
# 일반 함수
def test_lambda(x, y):
return x + y
# 람다식
lambda x, y: x + y
# lambda : 키워드
# x, y : 람다식 안에서 사용될 파라미터
# x + y : 람다식 안의 처리 코드 (자동으로 리턴)
람다식 호출하기
람다식을 스크립트 안에서 바로 호출하려면 아래와 같이 2가지의 방식이 있다.
# 변수로 만들어서 호출하기
lam = lambda x, y: x + y
r = lam(1, 2)
print(r) # 3
# (lambda 매개변수들: 식)(인수들)
r = (lambda x, y: x + y)(1, 2)
print(r) # 3
lam 이라는 변수는 함수이며, 인자값 2개를 받는다.
1, 2 는 각각 람다식의 매개변수 x, y 이며, 그 값을 받아 x + y 의 식을 처리하여 리턴한다.
람다식에 파라미터를 전달하여 매개변수 x, y 로 사용하고 싶을 때는 ()를 사용한다.
(lambda x, y: x + 1)(param1, param2)
함수의 인자로 람다식 넣기
# 변수로 만들어서 인수로 넘기기
lam = lambda x, y: x + y
def print_xy(lam):
result = lam
print(result)
print_xy(lam(1, 2)) # 3
# 함수를 호출할 때 인자 값으로 람다식 넣기
def print_xy(func, hello):
print(func(1, 2))
print(hello)
print_xy((lambda x, y: x+y), "hello")
람다식의 대표적인 예는 map 내장 함수이다.
# 변수로 만들어서 인수로 넘기기
list(map(lambda x, y: x + y, [1, 2, 3]))
l = map(int, [i for i in range(1, 10)])
print(l)
map 의 API 문서를 보면 map(function, iterable, ...) 와 같이 되어있다.
즉, 인자값 첫번 째는 함수이고, 두번 째는 반복 가능한 객체이다.
첫번 째가 함수이기 때문에, 그 부분에 람다식을 넣을 수 있는 것이다. 마찬가지로 filter, reduce 에 유용하게 사용할 수 있다.
filter(function, iterable)
reduce(function, iterable) - 파이썬3? 이상 부터 내장 함수가 아니라서 import 시켜줘야 한다.
람다식 표현에 if 사용하기
lambda 매개변수들: 식1 if 조건식 else 식2
조건 식에 : 를 사용하지 않는다.
else 는 반드시 있어야 한다.
elif 는 사용할 수 없으며, 다중 조건을 걸기 위해서는 if else 를 다중으로 사용한다.
따라서, 다중 조건이 여러개 이상 필요한 경우 그냥 일반 함수를 작성하는 것이 더 낫다.
lambda 매개변수들: 식1 if 조건식1 else 식2 if 조건식2 else 식3
map 에 iter 인자 부분에 복수의 파라미터 전달하기
a = [1,2,3]
b = [4,5,6]
r = list(map(lambda x, y: x * y, a, b))
print(r) # [4, 10, 18]
일반 람다식으로 구현하면 아래와 같이 된다.
a = [1,2,3]
b = [4,5,6]
def test_multiple(func, a, b):
lst = []
for i in range(len(a)):
lst.append(func(a[i], b[i]))
return lst
l = test_multiple(lambda x, y: x * y, a, b)
print(l) # [4, 10, 18]
#정리
- 복잡한 연산이나 조건문을 사용해야 하는 경우에는, 되도록 람다식을 피한다.
- 람다식 안에서 새로운 변수를 생성할 수 없다.
- 리스트(딕셔너리, 세트) 표현식으로 처리할 수 있는 경우에는, 람다식 보다 각 자료형의 표현식을 사용한다. (가독성, 속도)
'python& Django' 카테고리의 다른 글
파이썬 : file input output (0) | 2020.10.15 |
---|---|
파이썬 : If 조건문 (0) | 2020.10.08 |
파이썬 : 자료형 (dictionary) -작성 중 (0) | 2020.10.08 |
파이썬 : 자료형 튜플(tuple) (0) | 2020.10.08 |
파이썬 : 자료형 (List) (0) | 2020.10.08 |