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부터 내장 함수에서 사라지게 되었다.
Leave a comment