Python 의 람다 함수

PythonBeginner
지금 연습하기

소개

본 랩에서는 Python 에서 람다 함수 (lambda functions) 를 사용하는 방법을 배웁니다. 먼저 익명 함수 (anonymous functions) 의 개념과 lambda 키워드를 이해하고, 이를 전통적인 함수 정의와 비교해 볼 것입니다. 그런 다음 다양한 수의 매개변수를 가진 간단한 람다 함수를 생성하게 됩니다.

이 랩에서는 sorted와 같은 Python 내장 함수와 함께 람다 함수를 효과적으로 사용하는 방법을 더 깊이 탐구할 것입니다. 마지막으로, 코드를 읽기 쉽고 유지보수하기 쉽게 만들기 위한 람다 함수 사용 모범 사례에 대해 논의할 것입니다.

익명 함수와 람다 이해하기

이 단계에서는 Python 의 익명 함수 개념을 소개하고 lambda 키워드에 중점을 둘 것입니다. 익명 함수는 이름이 없는 함수로, 간단한 단일 표현식 함수를 정의하는 간결한 방법을 제공합니다.

Python 에서는 일반적으로 def 키워드를 사용하여 함수를 정의합니다. 예를 들어, 숫자를 두 배로 만드는 함수는 다음과 같습니다.

def double(x):
    return x * 2

print(double(10))

이와 같은 작은 함수에는 lambda가 더 간결한 구문을 제공합니다. 람다를 사용하여 동일한 함수를 만들어 보겠습니다.

왼쪽 WebIDE 파일 탐색기에서 ~/project/lambda_example1.py 파일을 찾아 엽니다. 다음 코드를 파일에 추가하십시오.

## Define a lambda function to double a number
double_lambda = lambda x: x * 2

## Call the lambda function and print the result
print(double_lambda(10))

구문은 lambda 인자: 표현식입니다. 인자(arguments)는 입력값이며, 표현식(expression)은 평가되어 반환되는 단일 연산입니다. return 키워드가 없다는 점에 유의하십시오. 반환은 암시적 (implicit) 입니다.

파일을 저장합니다. 스크립트를 실행하려면 WebIDE 에서 터미널을 열고 다음 명령을 실행하십시오.

python3 ~/project/lambda_example1.py

터미널에서 출력을 볼 수 있습니다.

20

이는 람다 함수가 변수에 할당되어 일반 함수처럼 호출될 수 있음을 보여줍니다.

다양한 매개변수를 가진 람다 함수 생성하기

람다 함수는 유연하며 인자 (parameter) 가 없거나 하나 또는 여러 개일 수 있도록 정의될 수 있습니다. 하지만 항상 단일 표현식 (single expression) 으로 제한됩니다. 이 단계에서는 다양한 수의 인자를 가진 람다를 생성하는 방법을 탐구할 것입니다.

먼저, 인자를 받지 않는 람다 함수를 만들어 보겠습니다. 이는 상수 (constant) 나 간단하고 반복 가능한 동작을 정의할 때 유용할 수 있습니다.

파일 탐색기에서 ~/project/lambda_example2.py 파일을 엽니다. 다음 코드를 추가하십시오.

## Define a lambda function with no arguments
get_greeting = lambda: "Hello, World!"

## Call the lambda function and print the result
print(get_greeting())

다음으로, 여러 인자를 받는 람다 함수를 만들어 보겠습니다. 두 숫자를 더하는 람다를 정의할 것입니다. 이 코드를 동일한 lambda_example2.py 파일에 추가하십시오.

## Define a lambda function that adds two numbers
add_numbers = lambda x, y: x + y

## Call the lambda function with two arguments and print the result
print(add_numbers(5, 3))

파일을 저장합니다. 이제 터미널에서 스크립트를 실행하여 두 출력 결과를 모두 확인하십시오.

python3 ~/project/lambda_example2.py

터미널에는 두 람다 함수의 결과가 표시됩니다.

Hello, World!
8

이는 람다 함수가 다양한 매개변수 구성을 처리할 수 있어 여러 간단한 작업에 다용도로 사용될 수 있음을 보여줍니다.

sorted() 함수와 람다 사용하기

람다 함수의 가장 일반적인 사용 사례 중 하나는 고차 함수 (higher-order functions, 다른 함수를 인수로 받는 함수) 를 위한 빠르고 인라인 (inline) 함수 역할을 하는 것입니다. 대표적인 예가 Python 의 내장 함수인 sorted() 함수인데, 이 함수는 key 인수를 받을 수 있습니다. key는 정렬 비교를 수행하기 전에 각 요소에 대해 호출될 함수를 지정합니다.

각 튜플 (tuple) 이 제품과 가격을 나타내는 튜플 리스트가 있다고 가정해 봅시다. 이 리스트를 가격을 기준으로 정렬하고 싶습니다.

편집기에서 ~/project/lambda_sorted.py 파일을 엽니다. 다음 코드를 추가하십시오.

## A list of tuples (product, price)
products = [('Laptop', 1200), ('Mouse', 25), ('Keyboard', 75)]

## Sort the list by price (the second element of each tuple) using a lambda function
sorted_products = sorted(products, key=lambda item: item[1])

## Print the sorted list
print(sorted_products)

이 코드에서 key=lambda item: item[1]sorted()에게 각 튜플의 두 번째 요소 (item[1], 즉 가격) 를 정렬 기준으로 사용하도록 지시합니다. 이는 def를 사용하여 별도의 함수를 정의하는 것보다 훨씬 간결합니다.

파일을 저장하고 터미널에서 실행하십시오.

python3 ~/project/lambda_sorted.py

제품 리스트가 오름차순으로 가격별로 정렬된 것을 볼 수 있습니다.

[('Mouse', 25), ('Keyboard', 75), ('Laptop', 1200)]

이 패턴은 복잡한 데이터 구조를 간단하고 읽기 쉬운 방식으로 정렬하는 데 매우 일반적이고 유용합니다.

고급 람다 기법

이 단계에서는 람다 함수의 기본 매개변수 값 설정 및 람다 함수 즉시 호출 (immediately invoking) 을 포함하여 람다 함수를 사용하는 약간 더 고급적인 방법들을 탐구할 것입니다.

일반 함수와 마찬가지로 람다 함수도 기본값이 있는 매개변수를 가질 수 있습니다. 이는 함수 호출 시 인수가 제공되지 않을 경우 대체 값 (fallback value) 을 제공합니다.

편집기에서 ~/project/lambda_advanced.py 파일을 엽니다. 다음 코드를 추가하십시오.

## Define a lambda function with a default parameter value
power = lambda base, exponent=2: base ** exponent

## Call the lambda function without the optional argument (uses default)
print(power(3))

## Call the lambda function with both arguments
print(power(3, 3))

또 다른 흥미로운 기법은 람다 함수를 정의하고 즉시 호출하는 것입니다. 이는 즉시 실행 함수 표현식 (Immediately Invoked Function Expression, IIFE) 으로 알려져 있습니다. 이는 네임스페이스 (namespace) 를 어지럽히지 않으면서 값을 계산하기 위해 임시적인 일회용 함수를 만드는 데 유용할 수 있습니다.

다음 코드를 lambda_advanced.py 파일에 추가하십시오.

## Define and immediately invoke a lambda function to calculate a discounted price
price = 100
discount_percentage = 20
final_price = (lambda p, d: p * (1 - d / 100))(price, discount_percentage)

print(final_price)

파일을 저장하고 터미널에서 실행하십시오.

python3 ~/project/lambda_advanced.py

출력에는 두 예제의 결과가 표시됩니다.

9
27
80.0

이러한 기법들은 람다의 유연성을 보여주지만, 가독성 (readability) 이 중요하다는 점을 기억해야 합니다. 로직이 복잡해지면 표준 def 함수가 더 나은 선택인 경우가 많습니다.

모범 사례 및 가독성

마지막 단계에서는 람다 함수 사용에 대한 모범 사례를 논의할 것입니다. 람다는 간결한 코드를 작성하는 강력한 도구이지만, 가독성과 유지보수성을 유지하기 위해 신중하게 사용해야 합니다.

람다를 사용해야 할 때:

  • 고차 함수의 인수로 사용될 때: 이것이 주요 사용 사례입니다. sorted(), map(), filter()와 같은 함수는 람다에 완벽하게 적합합니다.
  • 단순하고 짧은 연산: 로직이 한 줄에 편안하고 명확하게 들어간다면 람다가 좋은 선택입니다.

람다를 피해야 할 때:

  • 복잡한 로직: 여러 문 (statement), 복잡한 조건부 로직 또는 반복문이 필요한 경우, 항상 def 함수를 사용해야 합니다.
  • 가독성 문제: 람다 표현식이 한눈에 이해하기 어렵다면, 람다를 사용하는 목적을 상실하게 됩니다. 설명적인 이름이 있는 명명된 함수 (named function) 가 더 낫습니다.
  • 재사용성: 동일한 로직을 여러 곳에서 사용해야 한다면, 중복을 피하라 (Don't Repeat Yourself, DRY) 원칙을 따르기 위해 def로 한 번 정의해야 합니다.

모범 사례 사용 사례를 강화하는, 좋고 읽기 쉬운 예제를 살펴보겠습니다. ~/project/lambda_best_practice.py 파일을 열고 다음 코드를 추가하십시오.

## A list of dictionaries
students = [
    {'name': 'Alice', 'grade': 88},
    {'name': 'Bob', 'grade': 95},
    {'name': 'Charlie', 'grade': 72}
]

## A good use of lambda: sorting a list of dictionaries by a value
sorted_by_grade = sorted(students, key=lambda student: student['grade'])

print("Sorted by grade:", sorted_by_grade)

## For comparison, a more complex task is better with a named function.
## For example, if you needed to apply a curve and check for a minimum score,
## a 'def' function would be much clearer than a complex lambda.
def process_grade(student):
    curved_grade = student['grade'] * 1.05
    return max(curved_grade, 75) ## Ensure a minimum score

processed_grades = [process_grade(s) for s in students]
print("Processed grades:", processed_grades)

파일을 저장하고 실행하십시오.

python3 ~/project/lambda_best_practice.py

다음과 같은 출력을 보게 될 것입니다.

Sorted by grade: [{'name': 'Charlie', 'grade': 72}, {'name': 'Alice', 'grade': 88}, {'name': 'Bob', 'grade': 95}]
Processed grades: [92.4, 99.75, 75.60000000000001]

첫 번째 부분은 람다의 명확하고 적절한 사용을 보여줍니다. 두 번째 부분은 명명된 함수가 더 적합한 시나리오를 보여줍니다. 항상 자신과 다른 사람들이 읽고 이해하기 쉬운 코드를 작성하는 것을 우선시하십시오.

요약

본 랩 (lab) 에서는 Python 의 람다 함수 (lambda functions) 의 기본 사항을 배웠습니다. def로 정의된 표준 함수와 람다가 어떻게 다른지 이해하는 것부터 시작했습니다. 0 개, 1 개, 여러 개의 매개변수를 가진 람다를 생성하는 연습을 했고, 이들을 변수에 할당하고 호출하는 방법을 확인했습니다.

핵심적인 내용은 람다 함수를 고차 함수 (higher-order functions) 의 인수로 사용하는 실용적인 적용이었습니다. 특히 sorted() 함수와 함께 사용하여 사용자 정의 정렬 로직을 간결하게 정의하는 방법을 배웠습니다. 또한 기본 매개변수 및 즉시 실행 함수 표현식 (Immediately Invoked Function Expression, IIFE) 과 같은 고급 기법도 탐구했습니다. 마지막으로, 람다 사용에 대한 모범 사례를 검토했으며, 람다가 간단한 일회용 사례에는 강력하지만, 복잡한 로직에는 명명된 함수를 선호하여 가독성과 유지보수성을 항상 최우선으로 해야 함을 강조했습니다.