C언어 다룰 땐 이름만 들어봤던 lambda를 동아리 코테 준비하면서 직접 써봤다.
람다 표현식은 익명 함수를 만드는 것이다. 간단한 내용의 함수를 사용할 때는 함수를 정의하는 것이 오히려 더 귀찮을 수 있는데, 그럴 때 lambda 표현식을 사용하는 것 같다.
map, sort(ed) 함수를 사용할 때 lambda와 함께 자주 사용한다.
c++로 대입해서 생각해보자면 내림차순 정렬을 하기 위해 sort 함수에 인자를 하나 더 줘야되고 커스텀 정렬하려면 별도의 bool타입 함수를 만들어야 한다.
그런데 lambda를 사용하면 커스텀 함수 작업을 비교적 간단하게 생략할 수 있다.
일반 함수
def plus_ten(x):
return x+10
>>> plus_ten(1)
11
람다 표현식
plus_ten = lambda x: x+10
>>>plus_ten(1)
11
라인만 봐도 간결하다.
lambda (매개변수) : (반환값)
람다 표현식은 lambda에 매개변수를 지정하고 :
뒤에 반환값으로 사용할 식을 지정한다.
위의 예시처럼 변수에 할당하지 않고 람다 표현식 자체를 호출할 수도 있다.
>>> (lambda x:x+10)(1)
11
lambda 매개변수들: 식1 if 조건식 else 식2
a = [1,2,3,4,5,6,7,8,9,10]
b = list(map(lambda x: str(x) if x % 3 == 0 else "none", a))
>>> for i in range(10)
print(b[i])
none
none
3
none
none
6
none
none
0
none
람다 표현식 안에서 if를 사용할 때는 반드시 else도 함께 사용해야 한다. 사용하지 않으면 문법 오류!
람다 표현식 안에는 elif 사용할 수 없다
람다 표현식 안에서는 변수를 만들 수 없다
>>> (lambda x:y=10; x+y)(1)
SyntaxError: invalid syntax
그래서 반환값은 변수 없이 식 한 줄로 표현할 수 있어야 함. 반환값이 복잡하면 람다 표현식이 아니라 def로 함수 정의하는게 더 효율적이다.
대신 람다 표현식 밖에서 만든 변수는 사용할 수 있다
>>> y = 10
>>> (lambda x: x+y)(1)
11
일반 함수
>>> def plus_ten(x):
return x + 10
>>> list(map(plus_ten, [1,2,3]))
[11,12,13]
람다 표현식
>>> list(map(lambda x: x+10, [1,2,3]))
[11,12,13]
완전 짧아졌다.
람다 표현식은 함수를 다른 함수 안의 인수로 넣을 때 직관적으로 사용할 수 있다.
아직까진 약간 개념이 애매하지만 직관적인게 최대 장점인 것 같다.
람다식 공부하게 된 결정적인 이유... sort 함수 사용하기!
일반적인 정렬은 람다 표현식을 사용할 이유가 없지만 객체를 정렬할 때 원하는 속성으로 정렬하기 위해서는 람다식이 도움된다.
class Player:
def __init__(self, name, hp, damage, correct_alp):
self.name = name # 이름
self.hp = hp # 생명력
self.damage = damage # 데미지
self.correct_alp = 0 # 알파벳 맞춘 횟수
이 class로 객체를 여러 개 생성했다고 생각해보자!
player.append(Player("햄스터",100,35,0))
player.append(Player("다람쥐",100,40,0))
player.append(Player("강아지",100,25,0))
이 객체들을 이름 순으로 정렬하고 싶다면 어떻게 할까?
player.name.sort()
처음에는 진심으로 이렇게 하면 될 줄 알았다. 그런데 어떤 리스트에서 원하는 항목으로 정렬하고 싶을 때는 이런 식으로 접근하면 안 된다고 한다.
정렬을 목적으로 하는 함수를 값으로 넣는다. 이 때 lambda를 이용할 수 있다. key값을 기준으로 오름차순 정렬되는 것이 기본이다.
player.sort(key=len)
지금 이건 player를 길이 순으로 정렬한 식이다. 모든 객체의 길이가 같으니 사실 상 무의미하지만 key를 소개하기 위해 넣어봤다.
name을 기준으로 정렬하려면 name값을 반환하는 함수를 만들어야 한다. 그런데 lambda로 하면 더 직관적이고 쉽다. 굳이 원래 있는 값을 그대로 반환하려고 무의미한 함수를 만들지 않아도 된다.
player.sort(key=lambda x:x.name)
내림차순으로 정렬하고 싶으면 reverse를 사용하면 된다. 앞에서 사용한 식을 그대로 가져와 보겠다.
player.sort(key=lambda x:x.name)
key의 특성은 반환값을 기준으로 오름차순 정렬하는 것이다.
player.sort(key=lambda x:x.name, reverse=True)