손쉽게 함수를 사용할 수 있게 도와주는 lambda에 대해 정리합니다.
개요
- python의 주요 기능인 Lamda 함수의 개념과 활용방법에 대한 내용을 정리합니다.
Lambda 함수
-
단일문으로 표현되는 익명함수
-
익명함수란 이름이 없는 구현체만 존재하는 간단한 함수를 의미
-
코드 상에서 한번만 사용되는 기능이 있을 때, 굳이 함수로 만들지 않고 1회성으로 만들어서 쓸 때 사용.
-
lambda 함수를 쓰는 가장 큰 이유는 코드를 간결하고 깔끔하게 작성할 수 있기 때문이다.
-
lambda 파라미터(입력값) : 출력값 형태로 사용
-
파라미터 수는 필요한 만큼 쓸 수 있다.
-
return은 쓰지 않는다.
-
일반적으로 함수를 만들면 아래와 같이 생성 하여 사용
예시1
1
2
3
4
5
# 제곱함수 생성
def square2(x):
return x**2
square2(5)
25
- 하지만 이 square2 라는 제곱함수가 전체 코드에서 1번만 사용된다면 굳이 함수를 생성할 필요가 없다.
1
2
3
4
5
# 제곱 하는 함수를 한줄에 표현하고자 할때
square = lambda x:x**2
print(square(5))
print(type(square)) # type을 보면 function(함수)인 것을 알 수 있다.
25 <class 'function'>
예시2
1
2
3
4
def add(x, y):
return x + y
add (10,20)
30
1
2
add2 = lambda x,y:x+y
add2(10, 20)
30
1
2
3
4
def str_len(s):
return len(s)
str_len('goods')
5
-
예제에서는 단순한 함수들이기 때문에 lambda를 쓰는 것이 큰 이점이 없어 보일 수 있음
-
하지만 실제 코드를 활용한 다양한 데이터 분석, AI모델링, 전처리 등을 수행하다 보면 코드가 매우 길어질 수 밖에 없음
-
이 경우 1번의 사용을 위해 4~5줄 되는 함수를 생성하는 것보다는, lambda 함수를 사용해 간결하게 작성하는 것이 좋음
-
코드문이 간결할수록 유지보수에 유용하기 때문
자주 쓰이는 labmda 예시 top4
-
lambda가 유용하게 사용되는 4가지 대표적 함수 sort, filter, map, reduce
-
함수형 프로그래밍의 기본 요소
-
sort : 리스트내의 요소들을 특정 조건 (key=) 로 설정하여 정렬
-
filter : 특정 조건을 만족하는 요소만 남기고 필터링
-
map : 각 원소를 주어진 수식에 따라 변형하여 새로운 리스트를 반환
-
reduce : 리스트 내에서 차례대로 앞 2개의 원소를 가지고 연산하는 기능을 한다. 연산의 결과가 또 다음 연산의 입력으로 진행된다. 따라서 마지막까지 진행되면 최종 출력은 한개의 값만 남게 된다.
sort에서 labmda 사용하기
- sort : 리스트내의 요소들을 특정 조건 (key=) 로 설정하여 정렬
일반적인 sort 함수의 사용
1
2
3
4
5
strings = ['gabriel', 'Amy', 'covid19', 'Fridaynight']
strings.sort() #str형태의 리스트를 정렬 (default는 알파뱃순)
print(strings)
['Amy', 'Fridaynight', 'covid19', 'gabriel']
특정 기준을 통해 정렬하고 싶을때
- e.g) 문자열의 길이를 기준으로 한다면?
1
2
3
# 문자열 길이를 return하는 함수 생성
def str_len(s):
return len(s)
1
2
3
4
5
strings = ['gabriel', 'Amy', 'covid19', 'Friday']
strings.sort(key=str_len)
print(strings)
['Amy', 'Friday', 'gabriel', 'covid19']
함수 생성과정없이 lambda를 통해 사용하면 유용하다.
1
2
3
4
5
6
strings2 = ['gabriel', 'Amy', 'covid19', 'Friday']
# strings.sort(key=str_len) 과 동일. 단 함수 대신 lambda를 사용
strings2.sort(key=lambda s:len(s))
print(strings2)
['Amy', 'Friday', 'gabriel', 'covid19']
filter에서 lambda 사용하기
- filter : 특정 조건을 만족하는 요소만 남기고 필터링
1
2
3
filter(함수, 리스트) 형태로 사용
1
nums = [1, 2, 3, 6, 8, 9, 10, 11, 13, 15]
1
2
3
4
def even_filter(n):
return n % 2 == 0 # n이 짝수인 경우 -> true 출력 / 홀수인 경우 False 출력
even_filter(3)
False
1
2
3
4
5
# 위에서 만든 nums 라는 리스트를 정해진 함수의 규칙에 따라 필터링
# 즉, 짝수만 필터링
# filter 한 결과를 list로 보기위해 list() 사용
list(filter(even_filter, nums))
[2, 6, 8, 10]
lambda로 바꿔서 만든다면?
1
2
3
nums = [1, 2, 3, 6, 8, 9, 10, 11, 13, 15]
list(filter(lambda n:n%2==0, nums))
[2, 6, 8, 10]
map에서 lambda 사용하기
- map : 각 원소를 주어진 수식에 따라 변형하여 새로운 리스트를 반환
주어진 리스트가 있을때, 리스트의 제곱을한 숫자로 새로운 리스트를 만들고 싶을때
1
2
nums = [1, 2, 3, 6, 8, 9, 10, 11, 13, 15]
list(map(lambda n:n**2, nums))
[1, 4, 9, 36, 64, 81, 100, 121, 169, 225]
위에서 사용한 even_filter를 map에 적용시킨다면?
1
list(map(even_filter, nums))
[False, True, False, True, True, False, True, False, False, False]
even_filter 생성없이 lambda로 한다면?
1
list(map(lambda n:n%2==0, nums))
[False, True, False, True, True, False, True, False, False, False]
reduce에서 lambda 사용하기
-
reduce 함수는 다른 모듈(functools)에 포함되어 다른 내장함수 처럼 바로 사용은 되지 않는다.
-
즉 사용을 위해서는 import해줘야 한다.
-
reduce : 리스트 내에서 차례대로 앞 2개의 원소를 가지고 연산하는 기능을 한다. 연산의 결과가 또 다음 연산의 입력으로 진행된다. 따라서 마지막까지 진행되면 최종 출력은 한개의 값만 남게 된다.
1
2
3
4
5
6
7
import functools
# 1 부터 10까지의 합을 구하고 싶을때
a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
functools.reduce(lambda x,y : x+y, a)
55
댓글남기기