본문 바로가기
Python

파이썬 람다함수

by 승환파크 2023. 5. 9.

람다함수는 def 없이 사용하는 익명함수를 말한다.

보통 1회용 함수를 작성할 때 많이 사용한다.

람다함수는 함수를 간편하게 작성할 수 있기 때문에 다른 함수의 인수를 넣을 때 주로 사용하고, 람다는 식 형태로 되어 있기 때문에 람다 표현식(lambda expression)이라고도 부른다.

 

람다 표현 방식

  • lambda 매개변수들 : 식

 

람다식을  사용하지 않은 코드

def plus_ten(x):
    return x + 10

plus_ten(1)
# 결과값
# 11

 

람다식을 사용한 코드

lambda x : x + 10

 

 

람다함수 호출하기

plus_ten = lambda x : x + 10
plus_ten(1)
# 결과값
# 11

(lambda x : x + 10)(1)
# 결과값
# 11

사실 람다함수는 호출하려고 사용하는것이 아니기 때문에 이런식으로 호출하는것을 지양한다.

 

람다함수 주의점

람다함수 안에서는 변수를 만들 수 없다. 따라서 반환값은 변수 없이 한줄로 표현을 할 수 있어야 한다.

만약 변수가 필요한 코드라면 새로 def를 사용하는 함수를 작성해야 한다.

 

 

함수의 매개변수로 함수 전달하기

함수의 매개변수에 사용하는 함수를 콜백함수(callback function)라고 한다.

# 매개변수로 받은 함수를 10번 호출하는 함수
def call_10_times(func):
    for i in range(10):
        func()

def print_hello():
    print("안녕하세요")

call_10_times(print_hello)
# 결과값
# 안녕하세요
# 안녕하세요
# 안녕하세요
# 안녕하세요
# 안녕하세요
# 안녕하세요
# 안녕하세요
# 안녕하세요
# 안녕하세요
# 안녕하세요

 

map 함수

리스트의 요소를 함수에 넣고 리턴된 값으로 새로운 리스트를 구성해주는 함수이다.

표현 방식

map(함수, 리스트)

def power(item):
    return item * item

list_input_a = [1, 2, 3, 4, 5]

output_a = map(power, list_input_a)
print(output_a)
print(list(output_a))

# 결과값
# <map object at 0x7f84a98d4460>
# [1, 4, 9, 16, 25]
# power 함수를 람다함수로 변경
list_input_a = [1, 2, 3, 4, 5]

output_a = map(lambda x:x * x, list_input_a)
print(output_a)
print(list(output_a))

# 결과값
# <map object at 0x7f84a8f22860>
# [1, 4, 9, 16, 25]

 

filter 함수

리스트의 요소를 함수에 넣고 리턴된 값이 True인 것으로만 이루어진 새로운 리스트를 구성해주는 함수이다.

표현 방식

filter(함수, 리스트)

def under_3(item):
    return item < 3

list_input_a = [1, 2, 3, 4, 5]

output_b = filter(under_3, list_input_a)
print(output_b)
print(list(output_b))

# 결과값
# <filter object at 0x7f84a98d55a0>
# [1, 2]
# under_3 함수를 람다 함수로 변경
list_input_a = [1, 2, 3, 4, 5]

output_b = filter(lambda x : x < 3, list_input_a)
print(output_b)
print(list(output_b))

# 결과값
# <filter object at 0x7f84a98d7340>
# [1, 2]

 

map 함수와 filter 함수는 모두 첫 번째 매개변수에 함수, 두 번째 매개변수에 리스트를 넣는다.

매개변수로 함수를 전달하기 위해 함수를 작성하는 것이 번거롭고 코드 공간의 낭비가 심할 수 있다, 따라서 람다 함수를 이럴때 사용하는 것이 좋다.

 

람다함수를 인수로 사용하기

람다 함수를 사용하는 가장 큰 이유는 함수의 인수에서 간단하게 함수를 만들기 위함이다.

이처럼 람다를 사용하면 코드를 더 깔끔하게 작성할 수 있고, 매개변수로 넣어진 함수를 확인하기 위해 다시 찾지 않아도 된다.

 

람다함수와 map, filter 함수 응용

조건부 표현식

lambda 매개변수들 : 식1 if 조건식 else 식2

# 3의 배수이면 문자열로 변환하기
a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
list(map(lambda x : str(x) if x % 3 == 0 else x, a))
# 결과값
# [1, 2, '3', 4, 5, '6', 7, 8, '9', 10]

 

람다함수 안에서 if를 사용했다면 반드시 else를 사용해야 한다.

만약 if 만 사용하거나 elif 를 사용하면 에러가 발생한다.

하지만 elif 를 사용하고 싶다면

  • 식1 if 조건식1 else 식2 if 조건식2 else 식3

이러한 형식으로 사용해야 한다.

a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
# 1은 문자열로
# 2는 실수로
# 3이상은 10을 더하는 식
list(map(lambda x : str(x) if x == 1 else float(x) if x == 2 else x + 10, a))

# 결과값
# ['1', 2.0, 13, 14, 15, 16, 17, 18, 19, 20]

위와 같이 조건이 복잡해질 경우 람다 함수보다는 def 로 함수를 만들고 if , elif, else를 사용하기를 권장한다.

def f(x):
    if x == 1:
        return str(x)
    elif x == 2:
        return float(x)
    else:
        return x + 10

a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

list(map(f, a))
# 결과값
# ['1', 2.0, 13, 14, 15, 16, 17, 18, 19, 20]

 

 

map에 객체를 여러개 넣기

a = [1, 2, 3, 4, 5]
b = [2, 4, 6, 8, 10]
list(map(lambda x, y : x * y, a, b))

# 결과값
# [2, 8, 18, 32, 50]

 

 

filter 함수 응용

# 5보다 크면서 10보다 작은숫자 가져오기
a = [8, 3, 2, 10, 15, 7, 1, 9, 0, 11]
list(filter(lambda x : x > 5 and x < 10, a))

# 결과값
# [8, 7, 9]
# 위 표현식을 리스트 내포로도 구현 가능
[i for i in a if i > 5 and i < 10]
# 결과값
# [8, 7, 9]

 

 

리스트 함수의 key 키워드 매개변수

리스트에서 최솟값과 최댓값을 찾을 때는 min() 함수와 max() 함수를 사용한다.

a =[52, 273, 32, 103, 57]
print(min(a))
print(max(a))
# 결과값
# 32
# 273
# 딕셔너리로 책 데이터를 저장한 겨우 가격이 가장 저렵한 책과 가격이 가장 비싼 책을 갖고 싶다면
books = [{
    "제목" : "진짜 챗GPT 활용법",
    "가격" : 16200
}, {
    "제목" : "진짜 쓰는 실무엑셀",
    "가격" : 18900
}, {
    "제목" : "혼자 공부하는 컴퓨터 구조 + 운영체제",
    "가격" : 25200
}]

min() 함수와 max() 함수의 key 매개변수를 활용한다.

key : 어떤 값으로 비교할 것인지 지정

def get_price(book):
    # 딕셔너리에서 "가격" 값을 추출하는 함수 선언
    return book["가격"]

min(books, get_price)
# 결과값
# {'제목': '진짜 챗GPT 활용법', '가격': 16200}

max(books, get_price)
# 결과값
# {'제목': '혼자 공부하는 컴퓨터 구조 + 운영체제', '가격': 25200}

# 람다로 변경하기
min(books, key = lambda book : book["가격"])
# 결과값
# {'제목': '진짜 챗GPT 활용법', '가격': 16200}

max(books, key = lambda book : book["가격"])
# 결과값
# {'제목': '혼자 공부하는 컴퓨터 구조 + 운영체제', '가격': 25200}

 

 

리스트 요소를 정렬할 때에는 sort() 함수를 사용한다.

a = [52, 273, 32, 107, 57]
a.sort()
print(a)
# 결과값
# [32, 52, 57, 107, 273]

# 오름차순 정렬
a.sort(reverse = True)
print(a)
# 결과값
# [273, 107, 57, 52, 32]

 

 

딕셔너리 리스트를 정렬하는 방법

books = [{
    "제목" : "진짜 챗GPT 활용법",
    "가격" : 16200
}, {
    "제목" : "진짜 쓰는 실무엑셀",
    "가격" : 18900
}, {
    "제목" : "혼자 공부하는 컴퓨터 구조 + 운영체제",
    "가격" : 25200
}]

books.sort(key = lambda book : book["가격"], reverse = True)
print(books)
# 결과값
# [{'제목': '혼자 공부하는 컴퓨터 구조 + 운영체제', '가격': 25200},
#  {'제목': '진짜 쓰는 실무엑셀', '가격': 18900},
#  {'제목': '진짜 챗GPT 활용법', '가격': 16200}]

'Python' 카테고리의 다른 글

파이썬 데코레이터  (0) 2023.05.09
파이썬 제너레이터  (0) 2023.05.09
파이썬 재귀함수  (0) 2023.05.09
파이썬 이터레이터  (0) 2023.05.09
파이썬 예외처리  (0) 2023.05.09