프로그래밍 지식/Python

람다 표현식,lambda expression [파이썬]

게임이 더 좋아 2021. 3. 11. 03:44
반응형
728x170

 

파이썬으로 코테를 진행하다보면 정말로 많이 쓰게 되는 것 중 하나이다.

그래서.. 맨날 찾아보는 것은 좀 그래서

각잡고 공부하려고 한다.

 

 


 

람다는 함수를 빨리 만드는 방법 중 하나다.

def로 정의할 필요 없이 빨리 정의 된다.

 

def func(x):
	return x + 100

func(1)
->101

 

100을 더하는 함수를 만드려면 저렇게 써야 한다.

뭐 나쁘진 않다.

 

만약 람다로 바꿔버리면???

 

lambda x: x + 100

 

1줄로 끝난다.

2줄이 1줄이 된다.

 


 

하지만 람다는 저렇게 쓰는 것이 아니다.

사실 일회용 함수의 색이 좀 짙다.

여러 번 재사용할 메서드가 아니라 잠시 동안만 쓸 메서드에 적용되는 성향이 좀 있다.

 

이것을 람다 호출이라고 말하는데.. 뭐 용어야 아무래도 좋다. 어떻게 쓰이는지 보자

(lambda x: x + 100)(1)
-> 101

 

음...? def로 정의 내린 함수와 마찬가지로 () 괄호 안에 인수가 들어간다. 그리고 역할을 제대로 수행한다.

 

그래 그건 그런데 꼭 람다 안써도 되잖아?

꼭 써야 하나??

 

뭐 굳이 안써도 된다..하지만 람다는 그 혼자 쓰일 때 보다

다른 것과 같이 쓰일 때 빛난다.

 

바로 map, filter 함수이다.

 

map에선 if + else 문과 같이 쓰일 수 있는데 정말 효과적이다.

 

예를 들어서 짝수를 찾는 프로그램이라고 하자.

 

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

list(map(lambda x: x*0 if x % 2 == 0 else x, a))
-> [1, 0, 3, 0, 5, 0, 7, 0, 9, 0]

 

형식은

lambda x : (if문이 참일 때 x에 적용하고 싶은 효과) if ...  else (거짓일 때 적용하고 싶은 효과) , iterable 객체

 

**람다표현식 안에서의 조건문은 : 콜론을 붙이지 않는다.

**람다표현식 안에서의 조건문에서는 else문을 써주어야 에러가 안난다.

(이 점이 우리가 평소에 쓰는 조건문과는 조금 다른 점이다)

**람다 표현식 안에서는 elif 를 쓸 수 없다. (솔직히 elif 쓸거면 간단한 메서드가 아닐 것이다. def쓰자 그냥)

 

정말 쉬워진다.

정말 간단해진다.

논리적이어진다.

 

map에는 iterable 객체를 여러개 넣을 수 있다. 따라서.. 람다 표현식도 그것이 가능해진다.

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

내가 보기엔 얘가 조금 더 실용적이다.

filter는 반복 가능한 객체에서 특정 조건에 맞는 요소만 가져오는 메서드다.

즉, filter에 지정한 함수의 반환값이 True일 때만 해당 요소를 가져온다.

 

**여기서 지정한 함수가 람다가 될 수 있다는 말이다.

 

형식은

filter( lambda x: filter하고 싶은 조건 , iterable 객체)

 

짝수만 필터가 되게 해볼까?

def f(x):
	return x%2 == 0

a = [8, 3, 2, 10, 15, 7, 1, 9, 0, 11]
list(filter(f, a))
[8, 2, 10, 0]

 

**함수가 boolean 값을 return 해야한다.

 

나쁘지 않다. 만약 람다를 쓴다면??

 

a = [8, 3, 2, 10, 15, 7, 1, 9, 0, 11]
list(filter(lambda x: x%2 == 0, a))
[8, 2, 10, 0]

 

더 짧아졌다. 람다표현식을 아는 사람에겐 더 직관적이기도 하다.

 

 

번외로

sorted에서도 key로써 많이 쓴다.

아래 문제는

의 문자열 정렬 문제다.

key를 람다표현식으로 썼다.

def solution(strings, n):
    # strings의 n 번째 항목을 조사해서 정렬하기
    # key 정렬과 lamda를 활용해서 정렬 

    strings = sorted(strings) # 사전적으로 미리 정리해야 입출력 예2와 같음
    answer = sorted(strings, key=lambda x: x[n])
    
    return answer

 

 

 

 

반응형
그리드형