[Python] lambda 함수, map 함수, filter 함수, reduce 함수 사용법¶
1. lambda 함수 사용법¶
lambda 함수
- lambda 매개변수 : 표현식
- 함수명 필요 없음
- 한줄로 표현 가능한 함수
- 일반적인 함수처럼 정의해두고 필요할때마다 가져와서 쓰는것이 아니라, 필요한 곳에서 즉시 사용하고 버리는 일시적인 함수
- filter(), map(), reduce()등과 함께 사용하면 많은 응용이 가능해진다.
일반적인 함수
In [5]:
def multiply(a, b):
return a*b
multiply(2, 3)
Out[5]:
함수 대신 lambda 사용
In [6]:
(lambda a,b : a*b)(2, 3)
Out[6]:
lambda를 변수에 넣어서 재사용하는 것도 가능하다.
In [7]:
m = lambda a,b: a*b
m(2, 3)
Out[7]:
lambda의 표현식 안에 조건문을 넣을 수 있다.
In [9]:
f = lambda a: "짝수이다." if a%2==0 else "홀수이다."
print("1", f(1))
print("2", f(2))
print("3", f(3))
print("4", f(4))
알고리즘 문제에서 정렬이 필요할 때, sort와 lambda를 이용할 떄가 많다.
특정 열(=col)에 대해서 혹은 어떤 조건에 따라 정렬을 해줘야 하기 떄문이다.
In [16]:
a = [
[1, 1],
[1, 3],
[2, 1],
[2, 2],
[3, 6],
[4, 4],
]
In [17]:
## 두번째 열에 대해서 오름차순으로 정렬해보자.
b = sorted(a, key = lambda x: x[1])
print(b)
In [18]:
## 먼저 첫번째 열에 대해서 큰 순서대로 정렬을 해주고, 그 다음에 두번째 열에 대해서 작은 순서대로 정렬을 해보자.
c = sorted(a, key = lambda x: (-x[0], x[1]))
print(c)
In [20]:
## sorted 대신 sort를 쓸 수도 있다.
## sort를 사용할 경우, 원래의 iterable 자료형이 수정된다.
## 첫번째 열에 대해서 작은 순서대로 정렬
a.sort(key = lambda x: x[0])
print(a)
2. map() 함수 사용법¶
map() 함수
- map(함수, iterable 자료형)
- 리스트, 튜플, 문자열과 같은 iterable 자료형에서 각 요소(=element)들을 지정된 함수로 처리해주는 함수이다.
- 원본은 그대로두고, 새로운 iterable 자료형을 만든다.
In [11]:
for i in map(int, "12345"):
print(i, type(i))
In [12]:
list(map(int, ['1', '2', '3', '4', '5']))
Out[12]:
함수 자리에 lambda를 넣어서 응용해보자.
2개 이상의 iterable 자료형을 입력값으로 받을 수 있다.
In [13]:
a = [1,2,3,4,5]
b = [5,4,3,2,1]
list(map(lambda x,y: x+y, a, b))
Out[13]:
알고리즘 문제 풀 때, 입력값을 받아야 하는 경우에 대해서 map() 함수를 사용하면 편리하다.
In [21]:
## '1 2 3' 과 같이 3개의 값을 입력받고 싶다.
q1, q2, q3 = map(int, input().split())
In [22]:
print(q1, q2, q3)
In [23]:
## 혹은 2차원 리스트를 입력받고 싶다.
## 임의로 4X4 크기의 리스트를 입력받아보자.
board = [list(map(int, input().split())) for _ in range(4)]
In [28]:
print(board, end='\n\n')
for i in board:
print(i)
3. filter() 함수 사용법¶
filter() 함수
- filter(함수, iterable 자료형)
- iterable 자료형의 요소(=element)들 중에서, 함수를 적용했을 때 True이면 남고, False이면 제거된다.
In [29]:
## 짝수만 뽑고 싶다.
a = [1,2,3,4,5,6,7,8,9,10]
list(filter(lambda x: x%2==0, a))
Out[29]:
4. reduce()함수 사용법¶
reduce() 함수
- from functools import reduce
- reduce(함수, iterable 자료형, initializer=None)
initializer은 선택사항
- 말로 설명하는 것보다는.. 직접 보는게 이해가 빠를 것 같다.
In [32]:
from functools import reduce
In [33]:
## 리스트 a안에 담겨있는 모든 요소(=element)들의 합을 구해보자.
a = [1, 2, 3, 4, 5]
reduce(lambda x,y: x+y, a)
Out[33]:
In [34]:
## 만약 초기값을 100으로 한다면?
reduce(lambda x,y: x+y, a, 100)
Out[34]:
In [37]:
## 이번엔 문자열을 더해보자.
b = "12345"
print('x+y :', reduce(lambda x,y: x+y, b))
print('y+x :', reduce(lambda x,y: y+x, b))
reduce(lambda x,y: y+x, b)을 보면
일단 초기값은 없는 상태이고
b = "12345"이다.
lambda x,y: 부분을 살펴보면 가장 처음에 x='1', y='2'를 가져온다.
y+x를 하면 '21'이 된다.
(가장 처음에 만약 초기값이 있었다면, x=초기값, y='1'이 되었을 것 같다. 하지만 초기값이 따로 존재하지 않기 떄문에 x='1', y='2'가 된 것 같다.)
다시 lambda x,y: y+x를 하게 되면, x='21', y='3'을 가져오고
y+x = '321'이 된다.
이를 반복하면 마지막 x='4321', y='5'이므로,
y+x = '54321'이 된다.
'Python > 내장함수&기타' 카테고리의 다른 글
[Python/내장함수] 클래스(=Class) 기본 사용 방법 (0) | 2020.05.15 |
---|---|
[Python/내장함수] zip함수와 *args, **kwargs 란? (0) | 2020.04.19 |
[Python/기타] 알고리즘(set을 이용한) 시간초과에 도움이 되는 팁 (0) | 2020.03.14 |
[Python/기타] 파이썬 시간 복잡도(Time Complexity) (0) | 2020.02.26 |
[Python/내장함수] 예외 처리하기 (try / except문) (0) | 2020.01.03 |