손쉽게 함수를 사용할 수 있게 도와주는 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

댓글남기기