[python] 람다 표현식 사용하기

람다 표현식으로 함수 만들기

# 지금까지는 def로 함수를 정의해서 사용했지만 이번에는 람다 표현식으로 익명 함수를 만들어보자.
# 람다 표현식은 식 형태로 되어 있다고 해서 람다 표현식 이라고 부른다.
# 특히 람다 표현식은 함수를 간편하게 작성할 수 있어서 다른 함수의 인수로 넣을 때 주로 사용한다.
# 람다 표현식은 다음과 같이 lambda에 매개변수를 지정하고 : 뒤에 반환값으로 사용할 식을 지정한다.

# 인자로 전달한 값에 10을 더한 값을 반환하는 함수를 람다 표현식으로 작성해 보자.
plus_ten = lambda x: x + 10
print(plus_ten(1))

# 람다 표현식은 변수에 할당하지 않고 람다 표현식 자체를 바로 호출할 수 있다.
# 다음가 같이 람다 표현식을 괄호로 묶고 다시 ()를 붙여 호출하면 된다.
print((lambda x: x + 10)(2))

# 람다 표현식에서 주의할 점은 람다 표현식 안에서는 새 변수를 만들 수 없다는 것이다.
# 따라서, 반환값 부분을 변수 없이 식 한 줄로 표현할 수 있어야 한다.
# 변수가 필요한 코드일 경우에는 def로 함수를 만들어주는것이 좋다.
# 단, 람다 표현식 밖에 있는 변수는 사용할 수 있다.
y = 10
print((lambda x: x + y)(3))


# 람다 표현식을 사용하는 이유는 함수의 인수 부분에서 간단하게 함수를 만들기 위해서이다.
# 이런 방식으로 사용하는 대표적인 예가 map이다.
# 람다 표현식을 사용하기에 앞서 def로 함수를 만들어서 먼저 map을 사용해보면,
def plus_one(x):
    return x + 1


print(list(map(plus_one, [1, 2, 3])))  # map의 결과는 map 객체이므로 눈으로 볼 수 있게 list로 변환

# 위와 같은 동작을 하는 것을 람다 표현식을 이용해 작성해보면,
print(list(map(lambda x: x + 1, [1, 2, 3])))

# 람다 표현식으로 매개변수가 없는 함수를 만들려면 lambda 뒤에 아무것도 지정하지 않고 : 을 붙인다.
# 단, 표현식은 값으로 평가되어야 하기 때문에 콜론 뒤에는 반드시 반환할 값이 있어야 한다.
print((lambda: 1)())

람다 표현식과 map, filter, reduce 함수 활용하기

from functools import reduce

# 람다 표현식에서 조건부 표현식을 사용하는 방법은 다음과 같다.
# lambda 매개변수들: 식1 if 조건식 else 식2
a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
print(list(map(lambda x: str(x) if x % 3 == 0 else x, a)))

# 람다 표현식 안에서는 elif를 사용할 수 없다.
# 따라서 조건부 표현식은 다음과 같이 작성해야 한다.
# 식1 if 조건식1 else 식2 if 조건식2 else 식3 와 같이 쓸 수는 있지만,
# 밑에서 보면 알겠지만 별로 복잡하지도 않은데 알아보기가 힘들다.
# 따라서, 이런 경우에는 억지로 람다 표현식을 쓰려고 하기보다는 def 로 그냥 함수를 만들어서 쓰는게 낫다.
print(list(map(lambda x: x + 1 if x == 1 else x + 2 if x == 2 else x * 3, a)))

# map은 리스트 등의 반복 가능한 객체를 여러 개 넣을 수도 있다.
# 다음은 두 리스트의 요소를 곱해서 새 리스트를 만드는 식이다.
a = [1, 2, 3, 4, 5]
b = [2, 4, 6, 8, 10]
print(list(map(lambda x, y: x * y, a, b)))


# filter는 반복 가능한 객체에서 특정 조건에 맞는 요소만 가져오는데, filter에 지정한 함수의 반환값이 True일 때만 해당 요소를 가져온다.
# filter(함수, 반복 가능한 객체)
def f(x):
    return 5 < x < 10


a = [8, 3, 2, 10, 15, 7, 1, 9, 0, 11]
print(list(filter(f, a)))
# 위와 같은 동작을 하는 것을 람다 표현식을 이용해 작성해 보면
print(list(filter(lambda x: 5 < x < 10, a)))


# reduce는 반복 가능한 객체의 각 요소를 지정된 함수로 처리한 뒤 이전 결과와 누적해서 반환하는 함수이다.
# from functionals import reduce
# reduce(함수, 반복가능한객체)
def f(x, y):
    return x + y


a = [1, 2, 3, 4, 5]
print(reduce(f, a))
print(reduce(lambda x, y: x + y, a))

# 리스트, 딕셔너리, 세트 표현식으로 처리할 수 있는 경우에는 map, filter, lambda 대신 표현식을 사용하는 게 더 좋다.
# 리스트 표현식이 좀 더 알아보기 쉽고 속도도 빠르다.
# 또한, for, while 반복문으로 처리할 수 있는 경우에도 reduce 대신 for, while을 사용하는 게 더 좋다.
# reduce는 가독성도 떨어지고, 속도도 느리기 때문이다.
# 이러한 이유로 reduce는 파이썬 3부터 내장 함수에서 사라지게 되었다.

Updated:

Leave a comment