[python] lambda, sort

ppparkta·2022년 12월 1일
2

Problem solving

목록 보기
50/65

lambda

C언어 다룰 땐 이름만 들어봤던 lambda를 동아리 코테 준비하면서 직접 써봤다.

람다 표현식은 익명 함수를 만드는 것이다. 간단한 내용의 함수를 사용할 때는 함수를 정의하는 것이 오히려 더 귀찮을 수 있는데, 그럴 때 lambda 표현식을 사용하는 것 같다.

lambda 사용 이유

map, sort(ed) 함수를 사용할 때 lambda와 함께 자주 사용한다.

c++로 대입해서 생각해보자면 내림차순 정렬을 하기 위해 sort 함수에 인자를 하나 더 줘야되고 커스텀 정렬하려면 별도의 bool타입 함수를 만들어야 한다.

그런데 lambda를 사용하면 커스텀 함수 작업을 비교적 간단하게 생략할 수 있다.

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 조건부 표현식

lambda 매개변수들:1 if 조건식 else2
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

lambda (map)

일반 함수

>>> 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

람다식 공부하게 된 결정적인 이유... 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()

처음에는 진심으로 이렇게 하면 될 줄 알았다. 그런데 어떤 리스트에서 원하는 항목으로 정렬하고 싶을 때는 이런 식으로 접근하면 안 된다고 한다.

key

정렬을 목적으로 하는 함수를 값으로 넣는다. 이 때 lambda를 이용할 수 있다. key값을 기준으로 오름차순 정렬되는 것이 기본이다.

player.sort(key=len)

지금 이건 player를 길이 순으로 정렬한 식이다. 모든 객체의 길이가 같으니 사실 상 무의미하지만 key를 소개하기 위해 넣어봤다.

name을 기준으로 정렬하려면 name값을 반환하는 함수를 만들어야 한다. 그런데 lambda로 하면 더 직관적이고 쉽다. 굳이 원래 있는 값을 그대로 반환하려고 무의미한 함수를 만들지 않아도 된다.

player.sort(key=lambda x:x.name)

reverse

내림차순으로 정렬하고 싶으면 reverse를 사용하면 된다. 앞에서 사용한 식을 그대로 가져와 보겠다.

player.sort(key=lambda x:x.name)

key의 특성은 반환값을 기준으로 오름차순 정렬하는 것이다.

player.sort(key=lambda x:x.name, reverse=True)
profile
겉촉속촉

0개의 댓글