람다 표현식은 익명 함수라고도 불린다. 

 

람다는 함수의 기능을 수행한다. 람다를 처음 듣고 단어 자체의 생소함에서 오는 막막함이 있다면 걱정하지 않아도 된다. 람다는 함수의 일종이다.

 

파이썬에서는 코드의 재사용성을 높이기 위해 함수를 사용하게 되는데 함수는 선언과 정의, 호출을 해야 한다.

 

그에 비해 람다식은 간편하다. 간결한 코드는 더 나은 가독성과 생산성으로 이어진다.

 

아래 코드를 비교해보자. 하나는 함수이고 하나는 람다이다.

 

# 제곱을 구하는 함수

def square(x):
    return x*x

print(square(10))

# 람다 표현식

function = lambda x : x*x
print(function(10))

*결과 : 둘다 100

 

제급을 구하는 기능면에서는 똑같다. 매개변수 x와 실행코드인 x*x 도 동일하다. 단지 배치가 바뀌어 있을 뿐이다.

 

또한 람다 표현식의 경우 참조를 변수에 저장하고 매개변수를 넣어서 함수를 호출한다.

 

int square ( int x){ } 같은 C 스타일의 기본 함수만 사용해봤다면 마음에 들지 않을 수도 있다.

 

그렇지만 똑같은 구조다. 매개변수, 코드, 반환값도 다 있다. 명시적으로 보이지 않을 뿐이다.

 

함수에서 생략한 부분들을 찾아보면 람다식에도 다 있다.

 

참조를 넘겨주는 것도 마찬가지다. 변수에 함수의 참조를 넘겨주면 변수를 함수처럼 사용할 수 있다.

# 제곱을 구하는 함수

def square(x):
    return x*x

function1 = square
print(function1(10))

*결과: 100

 

람다 표현식을 괄호로 감싸고 함수처럼 매개변수를 넣어서 호출하는 것도 가능하다.

print((lambda  x : x*x)(5))

*결과: 25

 

한가지 주의할 점은 람다 표현식 안에는 변수를 만들 수 없다. 함수에서 처럼 지역변수를 사용할 수 없다는 것이다. 하긴 간결함이 특징인 람다 표현식에 변수까지 넣으면 그 취지가 무색해질 것이다. 대신 외부 변수를 사용가능하니 매개변수와 함께 사용한다.

y = 25
print((lambda  x : x*y)(5))

*결과: 125

 

*map 함수와 함께 사용하기

 

람다 표현식은 map함수와 리스트 자료형과 함께 사용하여 복잡한 작업을 할 수 있다.

 

코드가 간단하다고 해서 간단한 식만 사용하는게 아니다.

 

함수에서라면 긴 코드를 람다 표현식에 압축하려면 한줄의 코드에도 많은 것을 생각해야 한다.

 

아래 코드는 list1의 요소가 짝수면 2배 홀수면 0으로 바꾼다.

list1 = [1,2,3,4,5,6,7,8,9,10]
result = list(map(lambda x: x*2 if x % 2 == 0 else 0,list1))
print(result)

*결과 : [0, 4, 0, 8, 0, 12, 0, 16, 0, 20]

 

중간의 한줄은 제대로 읽지 않으면 혼란스럽다. 저렇게 복잡하게 생긴 코드는 우선 시작점을 먼저 찾는다. 호출스택을 사용하는 컴퓨터의 사고방식과 달리 인간의 사고력은 함수를 여러개 놓고 작업하기 힘들다. 우선 ( ) 괄호의 제일 안쪽으로 들어가본다. 제일 안쪽은 람다식이다. 람다식을 실행시키려면 매개변수를 찾아야 한다. 그런데 매개변수는 map 함수의 방식으로 제공되고 있다. list1 의 요소들을 하나씩 털어서 람다식에 대응시키는 것이다.

 

그러니가 여기서 실행되는 문장은 적어도 람다식이 10번이다. list1 에 요소가 10개 있기 때문에 매개변수가 열번 넘어가고 열개의 반환값이 나온다. 여기서 계산한 결과값은 다 결정된다. map객체로는 print 출력이 안되니까 list로 변경시킨다.

 

람다식 안에서 if와 else문을 사용하는데 바깥의 문법과 달리 if만 사용할수는 없다. elif도 사용불가하다. if else문만 사용가능하다. 여러번 사용하는 것도 가능한데 그렇게 되면 원래 취지인 간결함이 사라지고 오히려 함수보다 더 복잡해질 수 있으니 적당히 조절해서 사용한다.

 


람다식이 익명함수로 불리는 것은 함수 처럼 이름없이 사용할 수 있다는 것인데 그렇다고 재사용이 불가능하지는 않다. 변수에 참조를 할당하면 여러번 사용가능하다. 물론 람다 표현식 자체에는 이름이 없다. 참조 주소를 바탕으로 클래스 타입을 조사하면 function 이 나온다.

list1 = [1,2,3,4,5]
lfunction = lambda x : x + 10

for i in range(len(list1)):
    print(lfunction(list1[i]))

print(lfunction(99))
print(type(lfunction))

*결과값:

하지만 너무 남발하는 것은 오히려 전체 코드의 가독성을 떨어뜨릴수 있으니 주의한다.

 

파이썬이나 C++, 자바 등이 각자 다른 형식의 람다 형식과 내부 처리방식에 차이가 있다.

 

파이썬이 문법이 쉬우니까 잘 익혀두면 나중에 자바나 C++에서 배울때 도움이 될 것이다.

공유하기

facebook twitter kakaoTalk kakaostory naver band