[python] lambda/map/filter
1. lambda
lambda parameters : expression
런타임에 생성해서 사용할 수 있는 익명 함수이다.
필자는 sorted에서 key 값으로 자주 사용하는데, 한 줄로 구현되는 간단한 함수에도 사용하면 편리할 거 같다.
사용법에 익숙해지자
# 인덱스 1의 데이터로 내림차순 정렬
result = sorted(result, key = lambda x : x[1], reverse = True)
# 제곱 기능을 하는 lambda 함수 square
square = lambda x : x * x
# string이 빈 문자열일 경우 빈 문자열을, 아니면 첫 번째 글자를 리턴 함수
first_letter = lambda string : string[0] if string else ''
2. map
map(function, iterable, ...) : " Return an iterator that applies function to every item of iterable "
iterable 한 모든 item에 함수를 적용하는데 iterator를 반환한다.
예를 들면 <map object at 0x7f717501b2b0> 이렇게 map object가 나오는데 list로 감싸주면 iterable 한 결과를 얻을 수 있다.
js에서 처음 배웠던 개념인데, python에서는 없는 줄 알았는 데 있어서 놀랬다.
for문의 업그레이드 버전 느낌이다.
# csv파일에서 책 제목을 얻는 함수
import csv
def get_titles(books_csv):
with open(books_csv) as books:
reader = csv.reader(books, delimiter=',')
# lambda를 사용하여 title 속성인 row[0]을 뽑아내는 익명함수 정의
get_title = lambda row: row[0]
# reader라는 책 데이터에서 title 익명함수를 map을 사용하여 적용
# 결과인 titles에는 책 제목이 있는 map object 반환
titles = map(get_title, reader)
# 리스트로 감싸주면 책 제목 결과 반환
return list(titles)
3. filter
map(function, iterable,...) : " Construct an iterator from those elements of iterable for which function returns true "
특정 함수에 ture인 iterable 한 모든 item으로부터 iterator를 구성한다.
map과 유사한데, 기존 map에서 조건식을 추가한 것이다.
for문(반복문)과 if문(조건식)을 섞인 느낌이다. lambda 식과 자주 사용된다.
# 위 map의 예시와 같고, filter를 추가하여 책 페이지 수 250 초과인 책의 제목을 얻는 함수이다.
import csv
def get_titles_of_long_books(books_csv):
with open(books_csv) as books:
reader = csv.reader(books, delimiter=',')
# lambda를 사용하여 250 초과 페이지 함수 작성
is_long = lambda row: int(row[3]) > 250
# 책 제목 추출하는 함수 작성
get_title = lambda row: row[0]
# reader 책 데이터에서 is_long인 페이지 수가 250 초과인 데이터만 뽑아서 long_books에 저장
long_books = filter(is_long, reader)
# 페이지 수가 250 초과인 데이터에서 책 제목만 추출해서 저장하면 map object 형태
long_book_titles = map(get_title, long_books)
# list로 감싸주면 원하는 결과 추출 가능
return list(long_book_titles)
익명 함수를 변수에 저장해서 넣어줘도 되고, filter나 map안에 lambda로 넣어줘도 됨
그럴 때는 list로 감싸줘야 원하는 결과 얻을 수 있다. 아니면 map onject만 반환
result = list(filter(lambda x : x[1] >= n, title_view))
result = sorted(result, key = lambda x : x[1], reverse=True)
* 평소 python을 사용할 때는 거의 사용하지 않은 개념들이라(for, if.. 만 사용) 익숙해지면 코드 가독성이 높아져서 클린 코드 작성에 용이할 거 같다.