지난 콘텐츠에서는 람다(Lambda)와 Map을 살짝 살펴봤어요. 람다와 맵은 같이 사용하는 경우가 많고, 또 다른 Reduce() 역시 람다, 맵 함수와 같이 많이 사용하게 됩니다. 우선 지난 시간에 했던 부분을 살짝 응용한 코드를 살펴보겠습니다.
#1부터 99까지 출력, 단 5의 배수는 '5의 배수'로 출력
#람다식에서 if문 사용 가능
print(list(map(lambda x: '5의 배수' if x % 5 == 0 else x, range(1,100))))
람다(Lambda) 함수 안에서, If문을 자주 사용하게 됩니다. 주의사항은 If문의 반환값은 맨 앞에, 마지막에 else 반환값을 넣습니다.
Reduce 함수
reduce 함수는 ‘연결, 누적’ 이 키워드를 머릿속에 기억하시면 됩니다. 시퀀스의 요소들의 연결 또는 누적이 필요할 때, reduce 함수를 사용하면 됩니다. 그리고 판다스에서는 정말 많이 사용하는 함수입니다. 우선 코드 예제를 살펴볼까요?
from functools import reduce #파이썬3에서는 해당 구문이 필요함
print(reduce(lambda x, y: x + y, range(1, 10)))
#결과는 직접 코딩해서 확인
위 코드는 reduce 함수를 사용해서 ‘1부터 9’까지의 합을 구할 수가 있어요. 각각의 요소들을 하나씩 누적해서 더하게 되는 구조입니다. 이것을 조금 더 응용해볼까요? 수학 시간에 배웠던 팩토리얼 기억하시나요? 예를들면 5! = 5*4*3*2*1이 됩니다. Reduce 함수를 포함한 다양한 방식으로 팩토리얼 값을 출력하는 프로그램을 만들어 보겠습니다!
#팩토리얼 구하기 - 반복문 활용
def fac_for(n):
a = 1
for i in range(1, n+1):
a *= i
return a
print(fac_for(9))
#팩토리얼 구하기 재귀함수 활용
def fac_rcs(n):
return n * fac_rcs(n-1) if n > 1 else 1
print(fac_rcs(9))
#팩토리얼 구하기 Reduce함수 활용
from functools import reduce
def fac(n):
return reduce(lambda x, y: x*y, range(1, n+1))
print(fac(9))
위 세 코드 모두 ‘누적, 연결, 반복’의 특징을 갖고 있습니다. 첫 번째 방식은 너무나 쉽고 직관적인 반복문 For을 활용했고, 두 번째는 낯선 분들도 있겠지만 ‘재귀함수’에요. 저는 개인적으로 재귀함수를 많이 사용하는 편입니다. 재귀함수는 나중에 또 설명드릴게요~ 우선 ‘재귀함수’는 종료 조건(탈출 조건)이 반드시 필요하다는 사실만 우선 Check! 그리고 마지막으로 Reduce와 람다(Lambda)를 활용해서 팩토리얼을 구해봤습니다. 앞에서 말씀드린 것처럼 Reduce 함수는 ‘누적’입니다. [1, 2, 3, 4, 5, 6, 7, 8, 9]에서 처음에는 첫 원소 1부터 차례대로 곱해나가며 마지막 원소인 9까지 곱한 하나의 값을 반환하게 됩니다. 조금 어렵나요? 해당 특성을 활용한 몇 가지 예제를 직접 만들어서 해보시는 것이 코딩 공부에서는 가장 좋습니다.