상위 목록: 하위 목록: 작성 날짜: 읽는 데 21 분 소요

람다(lambda) 함수

람다(lambda) 함수는 사용자 정의 함수와 비슷한 역할을 합니다.

함수명을 정해 사용하는 사용자 정의 함수와 다르게 이름없이 사용하는 익명 함수입니다.

간단한 기능을 정의해 한 번만 사용하고 사라지게 됩니다.

람다 함수는 함수명 = lambda 변수명 : 수식의 형태로 사용합니다.

변수명x, y, z 등의 값을 사용하며, 수식은 변수명에서 사용된 값을 활용합니다.

lambda를 사용하여 한 줄로 되어있는 수학 함수를 생성하거나 특정 형태나 형식 등으로 변환할 수 있습니다.

간단한 수학함수가 필요한 경우 람다 함수를 호출하여 사용합니다.



함수 생성

f = lambda x, y: x + y

print(f(1, 2))
print(f([1, 2], [3, 4]))
print(f("YUN", "DAEHEE"))
결과
3
[1, 2, 3, 4]
YUNDAEHEE

함수명=lambda 매개변수1, 매개변수2, ... : 반환식을 사용하여 람다 함수를 선언할 수 있습니다.

함수명(인수1, 인수2 ...)를 사용하여 함수를 호출합니다.

  • Tip : 정수, List, 문자열 등을 사용 할 수 있습니다.



기본값 설정

f = lambda x, y=3: x + y

print(f(1))
print(f(3, 3))
결과
4
6

매개변수기본값을 할당할 수 있습니다.

기본값이 할당되면 함수를 호출할 때 매개변수를 채우지 않으면 기본값으로 사용합니다.



다중 입력

f = lambda *x: max(x) * 2

print(f(1, 3, 7))
결과
14

매개변수*를 입력할 경우 개수를 지정하지 않고 매개변수를 지정할 수 있습니다.

여러개의 매개변수들이 포함될 수 있습니다.

단, 반환값은 하나의 값만 반환할 수 있습니다.



다중 반환

f = [lambda x: x + 1, lambda x: x + 2, lambda x: x + 3]

print(f[0](1))
print(f[1](1))
print(f[2](1))
결과
2
3
4

List로 사용할 경우 대괄호([]) 를 사용하여 선택된 수식으로 반환됩니다.

List가 아닌, Dict로 사용할 경우, 원하는 Key 값을 통해 특정 람다 함수를 사용할 수도 있습니다.



최대/최소

L = [[9, 1], [8, 2], [7, 3], [6, 4]]

max1 = max(L, key=lambda x: x[0])
max2 = max(L, key=lambda x: x[1])
min1 = min(L, key=lambda x: x[0])
min2 = min(L, key=lambda x: x[1])

print(max1)
print(max2)
print(min1)
print(min2)
결과
[9, 1]
[6, 4]
[6, 4]
[9, 1]

최댓값 함수와 최솟값 함수에도 람다식을 적용하여 특정 최대/최소를 검출할 수 있습니다.

1차원 이상의 객체에서 특정 요소에 있는 값을 기준으로 찾으려 할 때, 어떤 요소의 값을 기준으로 찾을지 설정할 수 있습니다.

lambda x: x[0]라면 첫 번째 요소의 값으로 검색을 시작하며, lambda x: x[1]라면 두 번째 요소의 값으로 검색을 시작합니다.



정렬

L = ["가", "각", "감", "갂", "갃", "+", "/", "!", "간", "]", "[", "\\"]

L.sort(key=lambda x: x)

print(L)

print([ord(i) for i in L])
결과
[’!’, ‘+’, ‘/’, ‘[’, ‘\’, ‘]’, ‘가’, ‘각’, ‘갂’, ‘갃’, ‘간’, ‘감’]
[33, 43, 47, 91, 92, 93, 44032, 44033, 44034, 44035, 44036, 44048]

Python에서 사용되는 모든 문자열은 유니코드(Unicode)로 간주합니다.

그러므로, 문자열을 정렬할 때 각 문자들을 유니코드로 변경하고 인스턴스 끼리의 비교(<, >)를 진행하게 됩니다.

정렬에 사용되는 람다식의 x는 “가”, “각”, “감”, … “\“이 되며, 이 값들을 유니코드로 변경하여 대소 비교를 통해 정렬합니다.

만약, 정렬하려는 반복 가능한 객체(iterable)에 서로 다른 데이터 타입이 존재한다면, '<' not supported between instances of 'int' and 'str'등 의 오류가 발생합니다.

이럴 경우에는 명시적으로 요솟값을 str이나 int로 변경하여 정렬합니다.



복합 정렬

L = [[3, "d"], [5, "c"], [1, "a"], [0, "b"], [0, "a"]]
L1 = sorted(L, key=lambda x : -x[0])
L2 = sorted(L, key=lambda x : x[1]) 
L3 = sorted(L, key=lambda x : [x[0], x[1]])

print(L)
print(L1)
print(L2)
print(L3)
결과
[[3, ‘d’], [5, ‘c’], [1, ‘a’], [0, ‘b’], [0, ‘a’]]
[[5, ‘c’], [3, ‘d’], [1, ‘a’], [0, ‘b’], [0, ‘a’]]
[[1, ‘a’], [0, ‘a’], [0, ‘b’], [5, ‘c’], [3, ‘d’]]
[[0, ‘a’], [0, ‘b’], [1, ‘a’], [3, ‘d’], [5, ‘c’]]

정렬하려는 객체가 2차원 이상이라면, 비교하는 x에는 [3, “d”], [5, “c”], … [0, “a”]가 됩니다.

만약, 특정 원소를 지정하지 않고 key=lambda x : x처럼 사용한다면, 첫 번째 원소를 기준으로 정렬하게 됩니다.

특정한 원소를 기준으로 정렬한다면, 어떤 값을 기준으로 정렬할지 표기합니다.

여기서, 정렬 함수는 기본적으로 오름차순 형태로 정렬합니다.

그러므로, 비교하는 원소를 음수로 변경한다면 내림차순으로 변경할 수 있습니다.

여러가지 기준으로 정렬하려고 한다면, 객체로 감싸 정렬 우선순위를 할당할 수 있습니다.

예제의 L3의 경우 첫 번째 원소를 기준으로 정렬하면서, 두 번째 원소를 차선으로 정렬하게 됩니다.

즉, [0, "b"][0, "a"]를 비교할 때, 0이 동일하므로, 그 다음 조건으로 ab를 대상으로 다시 정렬하게 됩니다.

댓글 남기기