Python 함수를 간략히 나타내는 lambda 형식
python에서는 매개변수로 함수를 주고 받을 수 있다.
이 때 인자로 주고받을 함수를 별도로 작성하지 않고
<lambda 매개변수 : 반환값 > 과 같은 한 문장으로 간략히 표현할 수 있는데, 이를 lambda 형식이라고 한다.
java의 무명클래스와 유사한 개념이다.
이하에서 함수를 인자로 받는 기본 라이브러리의 함수 몇 가지를 통해 lambda의 사용법을 살펴본다.
1. list.sort()
다음과 같은 dictionary의 리스트를 정렬하고자 한다.
p = [
{"name": "Choi", "club":"Seoul"}, # p[0]
{"name": "Akinfeev", "club": "Moscow"}, # p[1]
{"name": "Bale", "club":"Madrid"} # p[2]
]
p.sort()를 그대로 실행할 경우 '<' 와 같은 비교연산자로 dict 타입 요소들의 대소를 판단할 수 없기 때문에 TypeError 가 발생한다.
따라서 아래와 같이 sort() 의 인자로 비교기준을 알려주는 함수( f )를 넣어주어야 한다.
def f(person):
return person["name"] # dictionary 에서 key가 "name"인 항목의 값을 반환한다
p.sort(key=f) # 정렬시 비교 기준이 되는 key는 f함수에 의해서 정해진다
이를 lambda를 이용하면 아래와 같이 간략하게 표시할 수 있다
p.sort(key=lambda person: person["name"]) # 함수 f를 lambda 형식으로 나타내었다
print(p)
2. map()
map(function, list)은 list의 각 요소들을 주어진 function에 입력한 뒤, 그 반환값을 다시 새로운 리스트에 저장하는 함수이다.
즉 함수를 매개로 하여 리스트를 새로운 리스트와 맵핑시켜준다.
p_name = list(map(lambda person:person["name"], p)) # list p 를 함수 f를 이용해 맵핑하며, 그 결과를 리스트로 p_name에 저장한다.
print(p_name)
3. functools.reduce()
reduce()를 사용하기 위해서는 "from functools import reduce" 문장을 추가해주어야 한다.
그리고 function은 매개변수 2개를 받는 함수이어야 한다.
reduce(function, list) 는 list의 각 요소를 function의 입력값으로 하되,
그 반환값을 다시 입력값으로 하여 입력리스트의 길이를 점차 줄여나가는 함수이다.
즉 reduce(g, p)는 g( g( g(p[0], p[1]), p[2] ), p[3] ) 와 같다.
r1 = g(p[0], p[1])
r2 = g(r1, p[2])
...
r5 = g(r4, p[5])
마지막에 r5를 반환한다
from functools import reduce
p_name = ["Akinfeev", "Bale", "Choi", "Dele", "Eriksen", "Fernandes"]
print(reduce(lambda str1,str2:str1+str2, p_name)) # list의 모든 요소를 합친 하나의 문자열을 출력한다.
4. filter()
filter() 는 리스트 요소 중 일정한 조건을 만족하는 것만 새 리스트에 저장하는 함수이다
short_name = list(filter(lambda x:len(x) < 5, p_name))
"""
길이가 5보다 작은 요소를 short_name 리스트에 저장하는 위 문장은
def h(x):
if len(x) < 5:
return True
short_name = list(filter(h, p_name))
와 같다.
"""
print(short_name)