본문 바로가기

Python

Python에서의 lambda(람다) Function의 사용

반응형

Python에서의 Lambda는 한시적으로 사용하는 함수의 정의를 의미합니다. 즉 일반적 함수로 def 선언을 해주는 것이 아니라 필요한 곳에서 사용하고 즉시 폐기되는 함수입니다.

 

Lambda는 명료하며 ML에서 자주 사용을 하게 되는데 무엇보다 매우 빠른 연산 처리에 능합니다. 하기 형식으로 표현이 됩니다. 잘 이용하면 Python의 Loop, for를 대체하며 속도를 높일 수 있습니다.

 

Lambda 인자리스트 : 표현식

 

아래의 형식을 확인하면 간단하게 이해할 수 있습니다. 람다 정의에서는 "return"문이 포함되어 있지 않습니다. 

g = lambda x:x**2
print(g(8))

f = lambda x,y:x+y
print(f(2,2))

 

만약 "return"문과 유사하게 반환 값을 만드는 표현식을 원하면 def(함수) 안에 넣어 이용하면 됩니다.

def inc(n):
    return lambda x: x + n

f = inc(2)
g = inc(4)
print(f(12))
print(g(12))
print(inc(2)(12))

 

보통 lambda는 map(), filter(), reduce()와 함께 이용되며 ML에서 강력하게 사용될 수 있는 조합이 됩니다.

map(lambda  function, iterable, iterable,....) 이런식으로 사용이 되며 iterable는 list, str, tuple과 같은 객체입니다.

a = [1,2,3,4]
b = [17,12,11,10]
print(list(map(lambda x, y:x+y, a,b)))

 

filter()는 map()과 유사하게 filter(lambda  function, iterable, iterable,....)와 같이 사용이 되며 각각의 요소에 대해 Boolean 값을 반환합니다. True를 반환하면 그 요소는 남게 되고, False를 반환하면 그 요소는 제거됩니다.

foo = [2, 18, 9, 22, 17, 24, 8, 12, 27]
print(list(filter(lambda x: x%3==0, foo)))

 

reduce()는 요소를 처음부터 순차적으로 순회하여 지정된 함수로 처리합니다. 

from functools import reduce
t = [47, 11, 42, 13]
result = reduce(lambda x, y : x + y, t)
print(result)

  

 

Lambda응용

한번 따라 해 보세요. 바로 이해할 수 있습니다.

a = [1, 6, 2, 5, 2, 7, 2, 8, 9, 11, 5, 26]
result = list(map(lambda x : x**2, a))  # 제곱시키기
print(result)
result2 = list(map(lambda x : str(x) if x % 2 == 0 else x, a))   # 짝수인 것은 string 타입으로 cast 아니면 단순히 반환
print(result2)

b = [12, 16, 24, 5, 20, 27, 12, 8, 9, 110, 51, 26]
result3 = list(map(lambda x, y : x + y, a, b))  # 리스트 자료형 두 개 받아서 연산
print(result3)

 

a = [8, 4, 2, 5, 2,7, 9, 11, 26, 13]
result = list(filter(lambda x : x > 7 and x < 15, a))
print(result)

 

Python Loop안에 있는 Lambda 식

def square(x):
    return lambda : x*x

listOfLambdas = [square(i) for i in [1,2,3,4,5]]
for f in listOfLambdas:
    print(f())

listOfLambdas = [lambda i=i: i*i for i in range(1, 6)]
for f in listOfLambdas:
   print(f())

 

텍스트의 응용

full_name = lambda first, last: f'Full name: {first.title()} {last.title()}'
>>> full_name('guido', 'van rossum')
반응형