IT Study/코딩테스트 by Python

[Python] 고급함수 lambda, map, filter

짹짹체유 2023. 11. 17. 09:59

 

 

파이썬에서 고급함수 lambda, map, filter를 사용해서

코드를 더욱 간결하고 효율적으로 짤 수 있다.

 

lambda

lambda argument : expression

 

파이썬에서는 def로 함수를 정의한다. 만약 함수를 정의할 때 def 대신에 lambda를 사용한다면 보다 간결하게 정의할 수 있다.

 

  • def 함수
def add(x, y):
	return x + y
  • lambda 함수로 변경
lambda x, y: x + y

 

2줄의 코드를 lambda 함수를 사용해서 한 줄로 간결하게 정의할 수 있다.

모든 def 함수를 lambda로 변경해서 사용하는 것은 아니다. def의 함수가 길고 복잡한 형태라면 lambda 함수는 한 줄로 나열하기 때문에 오히려 가독성이 떨어지는 경우도 많다.

다소 간단한 함수의 경우에는 def보다는 lambda 함수를 사용해서 정의하는 것이 효율적이다.

 


 

예제

  • fashion 리스트에서 "옷"으로 끝나는 글자를 인덱스와 함께 출력하시오
fashion = ['치마', '잠옷', '바지', '양말', '새옷', '겨울옷', '목걸이']

# def 함수
cloths_def = []
def cloths(fashion):
	for idx, cloth in enumerate(fashion):
    		if cloth[-1] == "옷":
        		cloths_def.append(f'{idx}번째 옷은 {cloth}입니다')

# lambda 함수
cloths_lambda = [(lambda idx, cloth:f'{idx}번째 옷은 {cloth}입니다')(idx, cloth) for idx, cloth in enumerate([cloth for cloth in fashion if (cloth[-1] == "옷")])]

 

다만 위와 같은 예시에서 lambda 함수가 길어지면서 다소 가독성은 떨어진다. 그래도 5줄이나 되는 def 함수에 비해서는 간결하다.

 

 

sorted 함수와 함께 사용

sorted함수는 시퀀스(리스트, 튜플 등)의 요소들을 정렬한 결과를 반환하는 함수이다.

sorted(정렬할 시퀀스, key, reverse=False)
  • key 옵션: 어떤 키를 기준으로 정렬할지 설정하는 파라미터
  • reverse 옵션: 내림차순(True), 오름차순(False) 설정하는 파라미터
  • key와 reverse는 옵션 값으로 입력하지 않아도 된다.

 

예제

  • fashion 리스트의 각 단어 길이를 출력하시오
sorted(fashion, key = lambda x: len(x))

map

map(function, sequence)

 

map 함수의 결과는 map객체로 되어있기 때문에 다른 객체 타입으로의 변환이 필요하다.

 

 

 

예제1

  • 10이하의 정수의 제곱수들을 구하시오
list(map(lambda x:x**2, range(1, 11)))

lambda를 활용한 함수를 첫번째 인자로 넣고, 10이하의 정수이기 때문에 sequence에는 1부터 10까지의 리스트를 range 함수를 통해 생성해서 넣어주었다.

 

예제2

  • books 리스트에서 각 단어의 빈칸 개수를 출력하시오
books = ['위기의 역사', '돈의 속성', '역행자', '트렌드 코리아 2024', '더 해빙']

list(map((lambda x:x.count(" ")), books))

 

 


filter

filter(function, sequence)

 

filter함수는 map 함수와 유사하다.

 

 

예제

  • 100이하의 숫자들 중 6의 배수인 수들을 출력하시오
list(filter(lambda x: x % 6 == 0, range(101)))

100이하의 숫자이기 때문에 range를 101까지 해야한다.


실습문제

  • books_csv 파일에서 page가 250 이상인 책의 제목을 출력하시오
def get_titles_of_long_books(books_csv):
    with open(books_csv) as books:
        reader = csv.reader(books, delimiter=',')
        
        # page: row[3], title: row[0]
        is_long = lambda row: int(row[3]) > 250
        get_title = lambda row: row[0]
        
        long_books = filter(is_long, reader)
        long_book_titles = map(get_title, long_books)
        
        return list(long_book_titles)
# 내가 처음에 썼던 lambda 함수
is_long = (lambda row: row[3] if int(row[3]) > 250)
  • lambda 안에 if문을 쓰는 것은 가능하지만 else가 있어야 하며, else에 대한 값이 필요없는 경우에는 굳이 if문을 사용할 필요없을 것 같다.

 

 

 

반응형