Функции Lambda в Python

PythonBeginner
Практиковаться сейчас

Введение

В этой лабораторной работе вы научитесь использовать лямбда-функции (lambda functions) в Python. Мы начнем с понимания концепции анонимных функций и ключевого слова lambda, сравнивая их с традиционными определениями функций. Затем вы создадите простые лямбда-функции с разным количеством параметров.

Далее в работе мы рассмотрим, как эффективно использовать лямбда-функции с встроенными функциями Python, такими как sorted. Наконец, мы обсудим лучшие практики использования лямбда-функций для обеспечения читаемости и поддерживаемости вашего кода.

Понимание анонимных функций и Lambda

На этом шаге мы познакомимся с концепцией анонимных функций в Python, сосредоточившись на ключевом слове lambda. Анонимные функции — это функции без имени, которые предоставляют краткий способ определения простых функций, состоящих из одного выражения.

В Python мы обычно определяем функции с помощью ключевого слова def. Например, функция, которая удваивает число, выглядит следующим образом:

def double(x):
    return x * 2

print(double(10))

Для таких небольших функций, как эта, lambda предлагает более компактный синтаксис. Давайте создадим ту же функцию, используя 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 аргументы: выражение (lambda arguments: expression). аргументы — это входные данные, а выражение — это одна операция, которая вычисляется и возвращается. Обратите внимание, что ключевое слово return отсутствует; возврат значения происходит неявно.

Сохраните файл. Чтобы запустить скрипт, откройте терминал в WebIDE и выполните следующую команду:

python3 ~/project/lambda_example1.py

Вы должны увидеть вывод в терминале.

20

Это демонстрирует, как лямбда-функцию можно присвоить переменной и вызывать ее точно так же, как и обычную функцию.

Создание функций Lambda с различными параметрами

Лямбда-функции гибки и могут быть определены с нулевым, одним или несколькими параметрами. Однако они всегда ограничены одним выражением. На этом шаге мы рассмотрим создание лямбд с разным количеством параметров.

Сначала создадим лямбда-функцию, которая не принимает аргументов. Это может быть полезно для определения константы или простого повторяющегося действия.

Откройте файл ~/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

Это показывает, что лямбда-функции могут обрабатывать различные конфигурации параметров, что делает их универсальными для различных простых задач.

Использование Lambda с функцией sorted()

Одним из наиболее распространенных сценариев использования лямбда-функций является их применение в качестве быстрой встроенной функции для функций высшего порядка (функций, которые принимают другие функции в качестве аргументов). Ярким примером является встроенная функция Python sorted(), которая может принимать аргумент key. Аргумент key указывает функцию, которая будет вызываться для каждого элемента перед сравнением при сортировке.

Представьте, что у вас есть список кортежей, где каждый кортеж представляет продукт и его цену. Вы хотите отсортировать этот список по цене.

Откройте файл ~/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)]

Этот шаблон чрезвычайно распространен и полезен для простой и читаемой сортировки сложных структур данных.

Продвинутые методы Lambda

На этом шаге мы рассмотрим несколько более продвинутых способов использования лямбда-функций, включая установку значений параметров по умолчанию и немедленный вызов лямбда-функции.

Как и обычные функции, лямбда-функции могут иметь параметры со значениями по умолчанию. Это предоставляет резервное значение, если аргумент не был передан при вызове функции.

Откройте файл ~/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). Это может быть полезно для создания временной одноразовой функции для вычисления значения без засорения пространства имен.

Добавьте следующий код в файл 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

Хотя эти методы демонстрируют гибкость лямбд, помните, что читаемость имеет первостепенное значение. Если логика становится сложной, стандартная функция, определенная через def, часто является лучшим выбором.

Рекомендации и читаемость кода

На этом заключительном шаге мы обсудим лучшие практики использования лямбда-функций. Хотя лямбды являются мощным инструментом для написания лаконичного кода, их следует использовать обдуманно, чтобы поддерживать читаемость и удобство сопровождения кода.

Когда следует использовать lambda:

  • В качестве аргументов для функций высшего порядка: Это основной сценарий использования. Такие функции, как sorted(), map() и filter(), идеально подходят для лямбд.
  • Простые, короткие операции: Если логика комфортно и ясно умещается в одной строке, лямбда — хороший выбор.

Когда следует избегать lambda:

  • Сложная логика: Если вам требуется несколько операторов, сложная условная логика или циклы, всегда используйте функцию, определенную через def.
  • Проблемы с читаемостью: Если лямбда-выражение трудно понять с первого взгляда, оно теряет свою цель. Именованная функция с описательным именем будет лучше.
  • Повторное использование: Если вам нужна одна и та же логика в нескольких местах, определите ее один раз с помощью def, чтобы следовать принципу DRY (Don't Repeat Yourself — Не повторяйся).

Рассмотрим хороший, читаемый пример, который подкрепляет использование лямбд в соответствии с лучшими практиками. Откройте файл ~/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]

Первая часть демонстрирует ясное и уместное использование лямбды. Вторая часть иллюстрирует сценарий, где именованная функция подходит лучше. Всегда отдавайте приоритет написанию кода, который легко читать и понимать вам и другим.

Резюме

В этой лабораторной работе вы изучили основы лямбда-функций в Python. Вы начали с понимания их синтаксиса и того, как они отличаются от стандартных функций, определенных с помощью def. Вы практиковались в создании лямбд с нулевым, одним и несколькими параметрами, а также видели, как их можно присваивать переменным и вызывать.

Ключевым моментом стало практическое применение лямбда-функций в качестве аргументов для функций высшего порядка, особенно с sorted(), для краткого определения пользовательской логики сортировки. Мы также рассмотрели продвинутые техники, такие как параметры по умолчанию и немедленно вызываемые функциональные выражения (IIFE). Наконец, вы рассмотрели лучшие практики использования лямбд, подчеркнув, что, хотя они мощны для простых, одноразовых случаев, приоритетом всегда должны быть читаемость и удобство сопровождения, при этом для более сложной логики предпочтительнее использовать именованные функции.