1. map
- 위에서 정의한 pow 함수와 st1이 참조하는 리스트를 이용해서
st2 = [1, 4, 9]를 만들려고 한다.
- st1의 값들을 pow 함수에 넣어서 반환된 값들로 이뤄진 리스트이다.
- 어떻게 만들 수 있을까?
- 값을 일일이 넣어서 pow 함수를 호출함
- 그러나 매우 불편한 코드
- map은 st1의 값들을 전달하면서 pow 호출함
- 즉, st1에 저장된 값의 수 만큼 pow 함수가 호출되며, 그것이 pow 함수가 하는 일
- 단 이 때 map의 두 번째 전달 대상은 literable 객체여야만 함
- map 함수가 하는 일
- ir은 iterator 객체이므로 for 루프에 올 수 있음
- iterable 객체라면 무엇이든 전달 가능함
- st1과 st2에 있는 값들을 각각 더해서 다음 형태의 리스트를 만들고자 할 때
[4, 4, 4]
- 원래라면 리스트를 각각 지정해주고 return n1 + n2 함수를 써야 함
2. map과 람다
- 일반적인 슬라이싱 연산
- st[ : ] : 처음부터 끝까지 모든 값을 꺼내서 리스트 생성
- st[ : :1] : 처음부터 끝까지 한 칸씩 뛰면서 값을 꺼내 리스트 생성
- st[ : :2] : 처음부터 끝까지 두 칸씩 뛰면서 값을 꺼내 리스트 생성
- st[ : :3] : 처음부터 끝까지 세 칸씩 뛰면서 값을 꺼내 리스트 생성
- 그런데, 이 사실은 책에서 배운 적이 없음
" 슬라이싱 연산에서 세 번째 값이 음수이면 값을 꺼내는 방향이 달라진다. "
- 세 번째 값이 음수이면 저장 순서를 뒤집은 결과를 만들 수 있음
- 슬라이싱 연산을 문자열을 뒤집는데도 사용할 수 있음
- 이렇게 map을 통해 rev 함수를 정의하는 경우, 람다를 사용하면 더 간결하게 표현할 수 있음
- 이처럼 람다 함수를 사용하면 별도의 함수를 정의하지 않아도 됨
3. filter
- filter 함수
: map과 마찬가지로 함수를 인자로 전달받음
: 이 함수는 값을 걸러내는 기준이 됨
: 즉, filter 함수는 값을 걸러내는 기능을 제공하는 함수
- ost = list(filter(is_odd, st)) : is_odd를 기준으로 st에 저장된 값들 중 일부 걸러 냄
- 위의 문장에서 알 수 있듯이, filter 함수의 첫 번째 인자는 True 또는 False를 반환하는 함수여야 함
- 두 번째 인자는 리스트나 튜플과 같이 값을 저장하고 있는 iterable 객체여야 함
- 작용 기작
① filter는 st에 저장된 값들을 하나씩 꺼내서 is_odd에 전달함
② is_odd가 True를 반환하는 값들만 따로 모음
③ 이 값들을 얻을 수 있는 iterator 객체를 반환함
- 10 이하의 자연수 중에서 3의 배수만 리스트에 담는 예제
- range 객체도 iterable 객체이므로 filter의 두 번째 인자가 될 수 있음
- 1~10의 제곱을 리스트에 담되 3의 배수만 담은 예제
- 1 ~ 10의 제곱을 만들기 위해서 map이 사용됨
- 이 중에서 3의 배수만을 담기 위해 filter가 사용됨
- map(lambda n: n**2, st))) : map 함수를 호출하는 부분이 먼저 진행됨
- 이를 통해 리스트 st에 저장된 값들의 제곱해 해당하는 값들이 만들어짐
: [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
- 위의 값들을 하나씩 얻을 수 있는 iterator 객체가 반환되어 다음의 filter 함수 호출이 진행됨
: map이 반환한 iterator 객체를 아래에서 ir1이라 함
: fst = list(filter(lambda n: not(n % 3), ir1))
- 위의 filter 함수를 통해서 3의 배수만 통과되어 9, 36, 81만 남게 됨
- 위의 값들을 하나씩 얻을 수 있는 iterator 객체가 filter 함수 호출의 결과로 반환됨
: filter가 반환한 iterator 객체를 아래에서 ir2이라 함
: fst = list(ir2)
- 결국 9, 36, 81로 이뤄진 리스트가 생성되어 변수 fst에 저장됨
'윤성우의 열혈 파이썬 (중급)' 카테고리의 다른 글
Story 09. 제너레이터 함수 (0) | 2021.07.15 |
---|---|
Story 08. 두 함수를 대신하는 리스트 컴프리헨션 (0) | 2021.07.14 |
Story 04. 리스트 컴프리헨션 (0) | 2021.07.08 |
Story02. 수정 가능한 객체와 불가능한 객체 (0) | 2021.07.05 |
Story 01. 레퍼런스 카운트와 가비지 컬렉션 (0) | 2021.07.05 |