일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- async
- docker
- TypeScript
- flask
- Vue
- react
- merge
- NeXT
- SSA
- Class
- MongoDB
- AWS
- EC2
- wetube
- 카톡
- 채팅
- SAA
- socket io
- S3
- RDS
- lambda
- crud
- git
- Props
- pandas
- 튜플
- dict
- 파이썬
- node
- 중급파이썬
- Today
- Total
초보 개발자
7강 map & filter 본문
[map]
def pow(n):
return n ** 2 # n의 제곱 값을 계산해서 반환
str1 = [1,2,3]
우리는 [1,4,9]와 같이 st1에 있는 요소들을 제곱한 결과를 가지고 있는 리스트를 가지고싶다.
이럴경우에 저 pow함수를 활용하여 번거롭게 만들 수 있는 방법이 있다.
st2 = [pow(st1[0]), pow(st1[1]), pow(st1[2])]
리스트의 길이가 길기도하고, 이렇게 일일이 함수를 호출하는 것도 번거롭다.
이 때 MAP함수가 이 번거로움을 대신해준다.
def pow(n):
return n ** 2 # n의 제곱 값을 계산해서 반환
st1 = [1,2,3]
st2 = list(map(pow,st1)) # map은 st1의 값들을 전달하면서 pow를 호출!
st2
[1,4,9]
st1(리스트)에있는 값을 하나씩 pow에 전달을 한다 pow는 제곱을 반환한다. 그리고 map은 저장소를 하나 따로만들어 두고 반환되는 값을 저장소에 저장을 한다. 그리고 값을 다 모으면 그 값들을 꺼낼 수 있는 iterator객체가 반환이 된다.
따라서 list()에 iteratro객체가 들어가는 것이고 이 결과로 리스트가 생성이 되는 것이다.
list()는 인자에 iterator 객체가 들어오면 그 iterator객체의 next함수를 호출을 하면서 값을 하나씩 얻어오면서 리스트 객체를 생성하는 역할을 한다.
다시말하면 map 함수는 st1에 저장된 값들을 하나씩 전달하면서 pow함수를 호출해준다. 즉 st1에 저장된 값의 수만큼 pow 함수가 호출되며 그것이 map 함수가 하는 일이다. 단 이때 map의 두 번째 전달 대상은 iterable 객체여야 한다.
map은 반환 값들을 모으고 그 값을 호출할 수 있는 iterator객체를 만들어서 반환한다.
st [1,2,3]
ir = map(pow, st) # map은 iterator객체를 반환
for i in ir # ir은 iterator 객체이므로 for 루프에 올 수 있음
print(i, end=' ')
1 4 9
우리는 iterator객체를 만드는 것이 목적이 아니라 리스트를 만드는 것이 목적이므로 list()를 사용하여 리스트로 만들어 주었다. map에 iterable객체인 리스트, 튜플, 문자열 등 iterable객체라면 뭐든지 전달 가능하다.
st1 = [1,2,3]
st2 = [3,2,1]
def sum(n1, n2):
return n1 + n2
st3 = list(map(sum,st1,st2))
st3
[4, 4, 4]
sum함수는 인자를 2개 받아야 한다. 따라서 st1리스트와 st2리스트를 인자로 넣고 map은 그 0번째 인덱스 부터 차례로 하나씩 sum함수에 집어 넣는다. 따라서 1+3, 2+2, 3+1 로 4 4 4의 리스트 결과값을 같는다.
[map과 람다]
def rev(s)
return s[::-1]
st1 = ['one', 'two', 'three']
ref = list(map(rev,st1))
ref
['eno', 'owt', 'eerht']
이걸 람다를 활용해보면
st1 = ['one', 'two', 'three']
ref = list(map(lambda s : s[::-1], st1))
ref
['eno', 'owt', 'eerht']
이렇게 간결해 질 수도있고 lambda의 레퍼런스 카운트또한 식이 돌아갈 때만 1일뿐 끝나면 자동으로 소멸이 되므로 성능적인 면에서도 더 좋아졌다.
[filter]
filter는 말그대로 값을 걸러내는 기능을 제공하는 함수이다.
def is_odd(n):
return n % 2 # 홀수이면 True반환
st = [1,2,3,4,5]
ost = list(filter(is_odd,st))
ost
[1,3,5]
filter의 첫번째 인자에는 True or False를 반환하는 함수가 들어와야 한다.
두번째 인자로 들어온 저장소에서 값을 하나씩 꺼내온 다음 첫번째 인자의 함수로 전달을 한다. ( map과 동일 )
만약 그 반환값이 True인 경우(False이면 저장안함)에 그 값을 따로 저장소에 모아둔다. 그리고 이 저장소에 있는 값을 얻기 위한 iterator 객체를 생성하여 반환을 한다.
'Python > 윤성우 열혈 파이썬' 카테고리의 다른 글
9강 제너레이터 함수 (0) | 2021.12.16 |
---|---|
8강 map과 filter를 대신하는 리스트 컴프리헨션 (0) | 2021.12.16 |
6강 객체처럼 다뤄지는 함수 그리고 람다 (0) | 2021.12.16 |
5강 lterable 객체와 lterator 객체 (0) | 2021.12.16 |
4강 리스트 컴프리헨션 (0) | 2021.12.15 |