익명함수 김람다씨

티스토리 테마 컬러를 Vue 로고껄로 바꿨음… 개인적으로 슬랙 테마도 뷰때깔인데 이쁩니다.


우리가 함수를 선언할 때는

function a() {
    이 안에... 로직 있다...? 
    }

이런 식으로 선언한다. 이런걸 보통 기명함수라고 하는데, 반대로 익명함수는 저 이름이 없는 함수다.

익명함수를 쓰면 코드가 간결해지고, 반복문 관련 코드에서 불필요한 부분을 뺄 수도 있고, 지연 연산으로 성능을 높일 수도 있다. 보통은 일회성으로 사용되는 부분에 대해서 람다식을 써서 표현하는데, 이 경우 굳이 함수를 저장하기 위해 메모리 할당을 할 필요가 없다. 마트에 갈 때 장바구니 들고가서 사거나, 종량제 봉투에 물건을 담아오지 없으면 옆구리에 끼고 온다 굳이 봉투값 내가면서 일회용 비닐봉지 가져오지는 않잖음? 생리대 말고는. (생리대는 밖에서 봤을 때 이게 생리대인지 뭔지 모르게 해야 한다) 

단점이 있는데, 이거 너무 남발하면 코드 보자마자 이게 뭔 소리여가 절로 나온다. 나도 To-Do list 코딩할 때 참고문헌에 람다식 써있어서 머리에 블루스크린 떴었음. 그리고 디버깅시 콜스택 추적도 어렵단다.


Python의 람다함수

lambda 인자:표현식 

Python에서 쓰는 람다함수의 기본형은 이거다.

def plus(a, b):
    c = a+b
    return c
print(plus(5,6))

입력받은 두 수를 더하는 함수를 파이썬에서는 이런 식으로 정의하는데 김람다씨를 쓰면

(lambda a,b:a+b)(5,6)

이거 한줄로 처리 가능하다.

map()

map(lambda,리스트)

기본 형식

list(map(lambda x: x**2, range(5)))
[0, 1, 4, 9, 16]

이거는 백준 풀이에서도 많이 나왔었는데, map(int, sys.stdin.readline().split())으로 많이 썼었다. 위 코드는 0부터 4까지 2제곱 하라는 얘기이고, 본문에 있는 코드는 입력받는거 나눠서 정수형으로 바꾸라는 얘기.

reduce()

reduce(lambda,시퀀스)

기본 형식

from functools import reduce
reduce(lambda x,y:x+y,a)
21

리듀스는 함수와 시퀀스를 인자로 받고, 함수를 시퀀스 인자에 누적 적용시킨다. 위 코드의 경우 a는 1부터 6까지 있는 리스트이고, reduce()를 이용해서 리스트 안에 있는걸 다 더한 것. Python 3부터는 저 모듈 데려와야 한다.

filter()

filter(lambda,리스트)

기본 형식

list(filter(lambda x: x % 3, range(30)))
[1, 2, 4, 5, 7, 8, 10, 11, 13, 14, 16, 17, 19, 20, 22, 23, 25, 26, 28, 29]
list(filter(lambda x:x % 3 == 0,range(30)))
[0, 3, 6, 9, 12, 15, 18, 21, 24, 27]

특정 조건을 만족하는 것들만 반환한다. 위는 3의 배수가 아닌 것, 아래는 3의 배수인 것을 반환하는 표현식.

Javascript의 람다식

function plus(a,b) {
    return a + b
}
// a + b

function hello() {
    console.log('Hello, World!')
}
//Hello, World!

자바스크립트에서 평범한 함수는 이렇게 생겼다.

function() {return a+b}
// a + b

const hello2 = function(){
    console.log('Hello, World!')
}
//Hello, World!(리터럴 방식)

근데 가끔 자바스크립트 코드 보면 이런 식으로 함수는 함수인데 이름이 없거나 알고보니 착한 사람만 보이는 const에 든 건 변수인데 왜 function이 거기서 나와요?가 되는 경우가 있는데, 이게 람다식이다. 

위에서 람다식은 ‘일회용인’ 함수를 사용할 때 쓴다고 했는데, 배달음식을 재사용 가능한 용기(예: 락X락)에 담아주는 건 기명함수고 일회용 용기에 담아주는 건 람다식이다. 배달음식을 먹을 때 수저는 집에 있는 쇠젓가락을 쓰면 기명함수고 일회용 수저를 쓰는 건 람다식이다. 이게 무슨 소리? 종량제 봉투는 물건 담을 때 쓰려고 가져와서 쓰레기봉투로 쓰잖음. 장바구니도 일회용이 아니라 계속 쓰는거지만 50원 주고 받아오는 봉지는 뭐 담거나(…) 쓰레기봉지 외에는 다시 쓸 일이 없다. 수저도 비슷한 맥락인데, 쇠젓가락은 설거지 해서 다음에 밥 먹을 때 쓰지만 일회용 수저는 한번 쓰고나면 버린다.

const hello2 = () => console.log('Hello')

이것도 일종의 람다식인데, 화살표 람다식이라고 부른다.