1. 람다(lambda) 함수
람다(lambda)는 한 줄 if 문과 for 문처럼 한 줄로 나타낼 수 있는 함수이다. 프로그램을 한 줄로 짜게 되면 연산 속도로 빠르고 알고리즘이 짧아지기 때문에 매우 효율적이다. 특히 다음에 배우게 될 map(), filter(), reduce() 함수와 같이 사용하면 강력한 기능을 수행할 수 있다.
람다 함수는 def 함수와 다르게 함수명 없이 바로 실행문을 수행한다. 그러다 보니 지정된 함수명을 계속해서 불러와 사용할 수 있고 일시적으로 단 한 번 사용할 때 가장 적절하다. 람다함수는 lambda 매개변수 : 실행문으로 표현한다.
lambda 매개변수 : 실행문
함수를 필요할 때마다 불러오도록 정의하는 def 와 일시적인 사용을 위한 lambda 의 표현 방식은 함수명과 리턴(return) 값이 없다는 것이다. 일시적인 사용을 위한 것이기 때문에 함수명과 리턴 하지 않는다는 것은 상식적이라고 할 수있다. 하지만 매개변수를 투입하는 방식과 변수 저장 방식을 이용해 마치 def 함수처럼 사용할 수 있다.
1) lambda 함수 매개 입력값 방식과 함수 저장
람다 함수에서 매개변수를 입력하는 방식은 함수식에 직접 입력하는 방식, def 처럼 함수명을 만들어 입력하는 방식으로 구분할 수 있다.
먼저 lambda 함수에 바로 매개값을 입력하는 방식은 lambda 함수 옆에 매개변수 수만큼 값을 전달하면 된다.
# 매개변수가 한 개인 경우
(lambda x : x + 10)(10) # x에 10을 전달, 결과는 20
# 매개변수가 두 개인 경우
(lambda x, y : x + y)(10, 10) # x에 10을, y에 10을 전달해 결과는 20
람다 함수는 함수명이 없지만 함수 자체를 변수에 넣어서 저장하면 마치 def 함수명처럼 사용할 수 있다.
# 람다 함수를 이용해 더하기 함수 만들기
plus = lambda x, y : x + y
plus(10, 10) # 10+10 = 20
# 람다 함수를 이용해 제곱 함수 만들기
power = lambda x : x*x
power(3) # 3*3 = 9
또한 람다 함수식 안에 린턴 값이 없기 때문에 함수에 의해서 계산된 결과를 호출해서 사용할 수가 없다. 따라서 람다 함수에 의해 계산된 값을 사용하려면 따로 변수에 저장해 호출해야 한다.
plus = lambda x, y: x + y
add = plus(2, 3) # 람다 함수에 의해 계산된 값 저장
print(add) # 람다 함수에 의해 계산된 값 호출
2) 람다 함수에서 if 문 사용
람다 함수에 if 문을 추가해 조건을 부여한 함수를 구성할 수 있다. 하지만 여기서는 if 만 단독으로 사용할 수 없고 if, else 까지 함께 사용해야 한다. 그리고 중첩(다중) if 문을 사용할 때도 elif 대신 if 를 써야 한다.
# 단일 if 문과 람다 함수
score = lambda x: "Good" if x >= 50 else "Bad"
score(70) # 50 이상임으로 "Good" 반환
# 이중 if 문과 람다 함수
score = lambda x: "Good" if x >= 70 else ("Bad" if x < 40 else "SoSo")
score(60) # 70 미만 40 이상임으로 "SoSo" 반환
2. 맵(map) 함수
1) 맵( map) 함수 개요
맵(map) 함수는 for 문을 사용해 리스트나 튜플과 같은 컨테이너 자료에서 객체를 순서대로 하나씩 가져오는 것과 같은 역할을 수행한다. 그래서 map 함수는 항상 다른 함수를 동반해서 사용한다. 특히 한 줄 함수인 람다 함수에 매개변수로 리스트나 튜플 자료를 전달하고자 할 때 map을 사용한다.
하지만 for 문과는 다르게 객체를 하나씩 가져와 계산을 하지만 객체를 한꺼번에 통으로 집어넣는다는 개념이다. 그리고 map과 lambda 함수를 같이 썼을 때 함수 계산값이 스칼라이기 때문에 list()로 감싸줘야 에러가 발생하지 않는다.
그럼, for 문을 포함한 함수와 map과 lambda를 이용한 함수를 비교해보자. 리스트 num = [1, 2, 3, 4, 5]에서 100씩 곱하는 함수를 만들면 다음과 같다.
# for 반복문 이용
def new_num(num):
new_num = []
for i in num:
new_num.append(i*100) # 객체를 하나씩 리스트에 쌓음.
return new_num
# 단일 매개변수: map과 lambda를 이용한 함수
num = [1, 2, 3, 4, 5]
map_num = list(map(lambda i : i * 100, num)) # map 반환 값을 list로 변환
print(map_num)
2) 두 개 이상의 매개변수 사용
map은 반복할 수 있는 리스트나 튜플 등 컨테이너 자료를 동시에 여러 개를 전달할 수 있다. 이때는 투입되는 컨테이너 변수가 2개 이상이고 해당 변수에서 뽑을 반복객체 수도 투입 변수와 같아야만 한다. 예를 들어 lambda x, y: x * y 라면, x를 뽑을 컨테이너 변수, y를 뽑을 컨테이너 변수가 필요하다.
# 여러 매개변수: map과 lambda를 이용한 함수
num_1 = [1, 2, 3, 4, 5]
num_2 = [6, 7, 8, 9, 10]
sum_num = list(map(lambda i, j : i + j, num_1, num_2))
print(sum_num) # num_1과 num_2의 각 자리를 더한 [7, 9, 11, 13, 15]가 출력
3) if 문이 추가된 map 함수
리스트 사료를 처리할 때는 한 줄 for 문이 사용할 수 있다. 그리고 조건문 if 문 추가해 한 줄로 프로그래밍하는 방법도 배웠다.
위에서 람다 역시 if 문을 추가해 함수를 구성할 수 있다는 것을 확인하였다. map 함수에 if 문을 추가하면 if 문을 포함한 한 줄 for 문과 같은 역할을 수행한다. 하지만 위에서 잠깐 언급했듯이 map은 for문처럼 객체를 하나씩 가져와서 계산하지만, 데이터 자료를 통째로 사용하는 개념이기 때문에 요소를 줄일 수 없다.
예를 들어 num = [1, 2, 3, 4, 5]에서 for 문과 if 문을 이용해 짝수만 가져오는 함수를 만들면 [2, 4]의 결과를 반환한다. 하지만 map 함수는 5자리를 통으로 집어넣는 개념이기 때문에 짝수만 뽑아서 두 자리를 만들 수 없다. 이를 위해서는 다음 차례에서 배울 filter()라는 함수를 사용해야 한다.
그럼, 짝수만 추출하는 함수를 for 문과 map 이용해 그 차이를 확인해 보자
# if 문을 포함한 한줄 for 반복문 이용한 함수
def new_num(num):
num_even = [n for n in num if n%2 ==0] # if 문을 포함한 한줄 for 문
return num_even
num = [1, 2, 3, 4, 5]
num_even(num) # 리스트 [2, 4]를 출력
# if 문을 포함한 map과 lambda 함수
num = [1, 2, 3, 4, 5]
map_even = list(map(lambda x: "짝수" if x%2==0 else "홀수", num))
map_even # ['홀수', '짝수', '홀수', '짝수', '홀수'], map 함수는 객체수를 줄일 수 없음
'파이썬' 카테고리의 다른 글
[ 코랩과 파이썬 ] 14. python 정렬 sorted 함수 (itemgetter 함수 포함) (0) | 2023.01.25 |
---|---|
[ 코랩과 파이썬 ] 13. python 필터 filter 함수 (isinstance 함수 포함) (0) | 2023.01.25 |
[ 코랩과 파이썬 ] 11. python 함수 def 와 매개변수, 전역변수와 지역변수 (2) | 2023.01.13 |
[ 코랩과 파이썬 ] 10. python 표준 입출력 input, print (0) | 2023.01.12 |
[ 코랩과 파이썬 ] 9. python 반복문 제어 break, continue, pass (2) | 2023.01.12 |