Python 의 람다 함수

PythonBeginner
지금 연습하기

소개

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

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

이것은 가이드 실험입니다. 학습과 실습을 돕기 위한 단계별 지침을 제공합니다.각 단계를 완료하고 실무 경험을 쌓기 위해 지침을 주의 깊게 따르세요. 과거 데이터에 따르면, 이것은 초급 레벨의 실험이며 완료율은 95%입니다.학습자들로부터 100%의 긍정적인 리뷰율을 받았습니다.

익명 함수와 람다 이해하기

이 단계에서는 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) 과 같은 고급 기법도 탐구했습니다. 마지막으로, 람다 사용에 대한 모범 사례를 검토했으며, 람다가 간단한 일회용 사례에는 강력하지만, 복잡한 로직에는 명명된 함수를 선호하여 가독성과 유지보수성을 항상 최우선으로 해야 함을 강조했습니다.