람다 (lambda)

포도·2021년 7월 10일
0
post-thumbnail

이번주에 람다 표현식에 대해서 배운걸 정리하려 한다.

1. 람다 표현식은 무엇인가?

람다 표현식은 anonymous function. 즉, 익명의 (이름 없는) 함수이다.

람다표현식의 예는 다음과 같다.

lambda x: x + 1

2. 람다 표현식은 왜 쓰는가?

람다 표현식은 다른 함수의 표현식에 비해 훨씬 간결하다. 위의 표현식은 아래와 같은 함수로 풀어쓸수 있다.

def plus_one(x): 
	return x + 1

람다 표현식보다 좀 장황하게 느껴진다. 코딩을 하다 보면 함수 안에 함수를 연결해야 돼서 문장을 좀 더 간결하게 쓰고 싶을 때가 있다.

3. 람다 쉽게 읽기, 쓰기

람다를 이해해 보자. 위의 예를 다시 가져오자.

lambda x: x + 1

lambda x: 람다 표현식 쓰면서 x를 변수로 할거야.
x + 1 : 결과값은 변수에 + 1 해주자.

람다 표현식이 많이 쓰이는 map, filter, reduce 함수를 하나씩 살펴보자.

3.1 map

map example 1. 심플 map

함수

def plus_one(x):
	return x + 1
    
list(map(plus_one, [1, 2]))

람다
list(map(lambda x: x + 1, [1, 2]))

결과값은: [2, 3]

람다표현식이 훨씬 간결하쥬?!

Step 1. map(x, y) 이해하기: y의 값들을 x의 함수에 집어넣자! [1,2] 에 있는 값들이 룰루랄라 순서대로 x + 1 로 들어간다.

Step 2. list() 이해하기: map으로 만들어진 결과값이 list의 형태로 저장된다.

아.. 뭔가 너무 쉬운것 같은데. 그럼 if 와 같은 조건식도 람다 표현식에 붙여줄수 있나요? 라는 궁금증이 들 수 있다.

Yes!

map example 2. if/else 와 같이

numbers = [1, 2, 3, 4, 5]
new_numbers = list(map(lambda x: '짝' if x % 2 == 0 else x, numbers))

결과값은: [1, '짝', 3, '짝', 5]

좀 많이 복잡해진 느낌이 든다. 하나 하나 풀어서 살펴보자.

Step 1. '짝' if x % 2 ==0: x 가 2로 나눴을때 나머지가 0이면 (즉 짝수이면), '짝'을 써주자.

Step 2. else x: Step 1의 조건식을 만족하지 않으면 x 를 그대로 써줘.

Step 3: numbers 안에 있는 변수들을 하나씩 꺼내서 람다 공식에 넣어주고 결과값을 리스트에 넣어줘.

map example 3. 객체 많이요.

앞에서는 람다 변수가 x 하나만 있었다. 그럼 변수 여러개 쓰는게 가능할까?

Yes!

n = [1, 2, 3]
m = [10, 100, 1000]
list(map(lambda x, y: x * y, n, m))

결과값은: [10, 200, 3000]

Step 1. lambda x, y: x * y 람다를 써주면서 변수 x, y 두개가 올거야!라고 말해주는거다. 그리고 : 뒤에 함수가 온다.

Step 2. n, m: Step 1에서 람다식을 통해서 변수가 두개임을 선언했다. 그렇다면 map 뒤에 변수는 몇개? 두개. 그러므로 n 리스트와 m 리스트에서 요소들이 하나씩 나와서 람다 함수로 들어간다. 1*10, 2*100, 3*1000 요렇게 계산이 돼서 리스트로 쏙 들어간다.

주의 사항

  • 람다 안에서 if 쓸때 : 콜론 NO! 안 쓴다!
  • 람다에 if 조건문을 쓸 때는 else 는 반드시 같이 써줘야 함.
  • 람다에 elif 는 사용해 줄 수 없다. 조건을 여러개 설정해야 하면 if 를 여러개 써주자. example 2 코드를 살짝 바꿨다.
    lambda x: '짝' if x % 2 == 0 else '홀' if x % 2 == 1 else x'

    if 식을 두개만 써줬을 뿐인데 길고 읽기 힘들어졌다. 이럴거면 그냥 if/elif/else 함수로 풀어서 써주는게 나을듯하다. 가독성이 더 중요하니깐!

3.2 Filter

조건에 맞는 요소만 거르고 싶을때 filter 함수를 써준다.

num = [1, 2, 3, 4, 5]
list(filter(lambda x: x == 3, num))

결과값은: [3]

Step 1. filter (x, y): filter 의 형식은 map 과 비슷하다. y 에 있는 요소들을 x 함수에 넣어줘.
Step 2. num 에 있는 요소들 중에서 람다 함수를 (x 는 3) 만족 시키는 것만 리스트에 담는다.

3.3 Reduce

요소를 하나씩 함수로 처리한 다음 이전 계산 결과와 누적시켜 하나의 최종 결과를 반환한다. 다음의 예제를 살펴보자.

from functools import reduce     
num = [1, 2, 3, 4, 5]
reduce(lambda x, y: x + y, num)

결과값은: 15

Step 1. 먼저 functools 모듈에서 reduce 의 함수를 가져온다.
Step 2. reduce (x, y): map, filter 의 형식과 비슷하게 reduce는 (함수, 요소)로 구성되어 있다. num 에 있는 요소들을 하나씩 x + y 의 함수에 넣어준다.
Step 3. 그럼 다음과 같이 작동된다.

1 + 2 = 3
3 + 3 = 6
6 + 4 = 10
10 + 5 = 15

profile
문과로 한평생 살다가 현재 펜실베니아 주립대 (University of Pennsylvania) 에서 Computer and Information Technology 공부하고 있습니다.

0개의 댓글