파이썬(Python)에서는 반복문(루프)과 리스트 컴프리헨션을 활용하여 여러 개의 람다(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())
출력 결과
위 코드를 실행하면 다음과 같은 결과가 출력됩니다.
1
4
9
16
25
이 방식은 외부 함수(square)가 람다를 감싸고 있어, 루프 변수 i의 값이 각 람다에 정확히 전달된다는 점이 특징입니다.
커링(Currying) 기법 활용
함수형 프로그래밍에서 사용되는 커링(currying) 기법을 이용하면 별도의 감싸는 함수 없이도 동일한 결과를 얻을 수 있습니다. 핵심은 람다에 기본 인자(default argument)를 지정하는 것입니다.
예제
listOfLambdas = [lambda i=i: i*i for i in range(1, 6)]
for f in listOfLambdas:
print(f())
출력 결과
1
4
9
16
25
왜 i=i가 필요할까요?
파이썬의 클로저는 늦은 바인딩(late binding) 방식으로 동작합니다. 따라서 lambda: i*i처럼 작성하면 모든 람다가 루프 종료 후의 최종 변수 값(5)만 참조하게 되어 전부 25를 출력합니다. 반면 lambda i=i: i*i처럼 기본 인자를 사용하면 람다가 생성되는 순간의 값이 각각 고정되므로, 의도한 대로 1, 4, 9, 16, 25가 순서대로 출력됩니다.