람다함수는 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}]