Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

Python 람다(Lambda) 함수 완벽 가이드: 익명 함수의 개념과 활용 방법

파이썬(Python)의 람다(lambda) 함수는 이름 없이 한 줄로 정의되는 익명 함수입니다. 리스트 필터링, 문자열 대소문자 변환, 숫자 곱셈처럼 간단한 작업을 처리할 때 유용하게 사용됩니다.


함수란 무엇일까요?

프로그래밍에서 함수는 특정 작업을 수행하는 코드 블록을 의미합니다. 비슷한 작업을 여러 번 반복해야 하는 프로그램을 작성할 때, 동일한 코드를 계속 복사해서 붙여넣는 것은 비효율적입니다. 코드베이스가 커질수록 수정해야 할 부분도 많아지고, 변경에 소요되는 시간도 그만큼 늘어나기 때문입니다.

바로 이럴 때 함수가 큰 힘을 발휘합니다. 하나의 과정을 함수로 묶어두면 프로그램 어디에서든 호출할 수 있고, 코드 중복을 크게 줄일 수 있습니다. 또한 해당 과정을 수정해야 할 때 함수 하나만 고치면 되므로 유지보수성도 크게 향상됩니다.

다음은 파이썬 함수의 기본적인 예시입니다:

def say_hello(name):
    print("Hello there, " + name)

say_hello("Arthur")

이 코드를 실행하면 "Hello there, Arthur"라는 결과가 출력됩니다.

이런 일반 함수는 매우 유용하지만, 예를 들어 문자열 리스트의 모든 요소를 소문자로 바꾸는 것처럼 아주 간단한 작업에는 다소 장황하게 느껴질 수 있습니다. 일반 함수는 반드시 새로운 이름을 지정해서 정의해야 하기 때문입니다. 바로 이 지점에서 람다 함수가 등장합니다.

람다(Lambda) 함수란?

람다 함수는 이름 없이 정의되는 함수로, '익명 함수(anonymous function)'라고도 불립니다. 앞서 살펴본 say_hello 함수가 'def' 키워드와 함께 이름을 붙여 정의된 것과 달리, 람다 함수는 'lambda' 키워드를 사용하며 이름이 필요 없습니다.

람다 함수의 가장 큰 장점은 단 한 줄로 작성할 수 있다는 점입니다. 따라서 간단한 작업을 여러 번 수행해야 할 때 특히 유용합니다. 람다 함수가 활용되기 좋은 대표적인 경우는 다음과 같습니다:

  • 숫자 곱셈 같은 간단한 산술 연산
  • 문자열의 대문자 또는 소문자 변환
  • 리스트 필터링

파이썬에서 람다 함수를 만드는 기본 문법은 다음과 같습니다:

name = lambda arguments: expression

람다 함수에 전달할 수 있는 인자의 개수에는 제한이 없습니다. 예를 들어 숫자를 7로 곱하는 기능을 구현한다고 가정해 보겠습니다. 일반 함수로 작성하면 다음과 같습니다:

def multiply_by_seven(number):
    return number * 7

print(multiply_by_seven(2))

실행 결과는 14입니다.

물론 이 코드도 정상적으로 동작하지만, 함수 이름과 인자를 정의하는 데 한 줄, 값을 계산하고 반환하는 데 또 한 줄이 필요합니다. 람다 함수를 사용하면 더 간결하게 만들 수 있습니다.

multiply_by_seven = lambda n: n * 7

print(multiply_by_seven(2))

실행 결과는 마찬가지로 14입니다. 출력 결과는 동일하지만, 일반 함수 대신 람다 함수를 사용했다는 점이 다릅니다. 이 코드에서 각 요소는 다음과 같은 역할을 합니다:

  • lambda: 람다 함수를 선언한다는 것을 나타내는 키워드
  • n: 함수의 인자(argument)
  • n * 7: 람다 함수가 실행할 단일 표현식(expression)

람다 함수는 언제 사용할까요?

람다 함수는 파이썬에서 폭넓게 활용됩니다. 앞선 예제에서는 두 수를 곱하는 데 람다 함수를 사용했지만, 실무에서는 더 다양한 용도로 쓰입니다.

특히 람다 함수는 reduce(), map(), filter() 같은 파이썬 내장 함수와 함께 자주 사용됩니다. 리스트 컴프리헨션(list comprehension)과 조합해 반복 작업을 처리하는 경우도 많습니다.

예를 들어, 우리가 빵집을 운영하면서 판매하는 모든 베이커리 목록 중에서 파이(pie)만 추려낸 목록을 만들고 싶다고 가정해 보겠습니다. 다음 코드로 구현할 수 있습니다:

baked_goods = ['Blondie', 'Chocolate Chip Cookie', 'Apple Pie', 'Pecan Pie', 'Blackberry Pie', 'Scone']

pies = filter(lambda pie: "Pie" in pie, baked_goods)

print(list(pies))

실행 결과는 다음과 같습니다:

['Apple Pie', 'Pecan Pie', 'Blackberry Pie']

코드가 어떻게 동작하는지 살펴보겠습니다. 첫 번째 줄에서는 베이커리 제품 목록을 선언했습니다. 그다음 filter() 함수를 사용해 이름에 "Pie"가 포함된 항목만 걸러냈습니다. filter() 함수는 "baked_goods" 리스트의 모든 항목을 순회하면서 주어진 조건을 충족하지 않는 요소들을 제거해 줍니다.

여기서 조건을 판단하는 역할을 하는 것이 바로 람다 함수입니다. 각 문자열에 "Pie"가 포함되어 있는지 검사하고, 포함된 경우에만 해당 문자열을 반환합니다. 이 예제에서 사용된 람다 함수는 다음과 같습니다:

lambda pie: "Pie" in pie

이 예제에서 알 수 있듯이, 파이썬 람다 함수는 이름 없이 코드 안에서 인라인(in-line)으로 존재할 수 있다는 점에서 일반 함수와 다릅니다. 항목이 조건을 충족하면 람다 표현식은 True를 반환하고, 그렇지 않으면 아무 값도 반환하지 않습니다.

마지막으로 list() 함수를 사용해 "pies" 변수를 리스트로 변환한 뒤 콘솔에 출력했습니다. filter() 함수는 커스텀 filter 객체를 반환하기 때문에, 실제 결과를 확인하려면 list()로 변환해야 하기 때문입니다.

마치며

람다 함수, 즉 익명 함수는 이름 없이 함수를 정의할 수 있게 해주는 강력한 도구입니다. 코드에서 동일한 간단한 작업을 여러 번 수행해야 할 때 특히 유용합니다.

예를 들어 숫자에 다른 숫자를 곱하거나, 리스트에서 특정 조건에 맞는 항목만 걸러낼 때 람다 함수를 활용할 수 있습니다. map(), filter(), reduce() 같은 내장 함수와 함께 사용하면 더욱 간결하고 가독성 높은 코드를 작성할 수 있습니다.