본문 바로가기
Python & Django

Python 함수를 간략히 나타내는 lambda 형식

by softserve 2021. 5. 23.
반응형

 

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)

알파벳 abc 순으로 정렬된 것을 확인할 수 있다.

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)

 

반응형

댓글