АНОНИМНЫЕ ФУНКЦИИ И LAMBDA

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

This tutorial is from open-source community. Access the source code

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

Анонимные функции в Python называются lambda функциями. Это способ создать функции без имени. Они полезны для создания коротких функций, которые используются только один раз.

Сортировка списков, revisited

Списки можно сортировать на месте. С использованием метода sort.

s = [10,1,7,3]
s.sort() ## s = [1,3,7,10]

Можно сортировать в обратном порядке.

s = [10,1,7,3]
s.sort(reverse=True) ## s = [10,7,3,1]

Похоже, все достаточно просто. Однако, как отсортировать список словарей?

[{'name': 'AA', 'price': 32.2,'shares': 100},
{'name': 'IBM', 'price': 91.1,'shares': 50},
{'name': 'CAT', 'price': 83.44,'shares': 150},
{'name': 'MSFT', 'price': 51.23,'shares': 200},
{'name': 'GE', 'price': 40.37,'shares': 95},
{'name': 'MSFT', 'price': 65.1,'shares': 50},
{'name': 'IBM', 'price': 70.44,'shares': 100}]

По какому критерию?

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

portfolio = [
    {'name': 'AA', 'price': 32.2,'shares': 100},
    {'name': 'IBM', 'price': 91.1,'shares': 50},
    {'name': 'CAT', 'price': 83.44,'shares': 150},
    {'name': 'MSFT', 'price': 51.23,'shares': 200},
    {'name': 'GE', 'price': 40.37,'shares': 95},
    {'name': 'MSFT', 'price': 65.1,'shares': 50},
    {'name': 'IBM', 'price': 70.44,'shares': 100}
]

def stock_name(s):
    return s['name']

portfolio.sort(key=stock_name)

Вот результат.

## Проверить, как словари отсортированы по ключу `name`
[
  {'name': 'AA', 'price': 32.2,'shares': 100},
  {'name': 'CAT', 'price': 83.44,'shares': 150},
  {'name': 'GE', 'price': 40.37,'shares': 95},
  {'name': 'IBM', 'price': 91.1,'shares': 50},
  {'name': 'IBM', 'price': 70.44,'shares': 100},
  {'name': 'MSFT', 'price': 51.23,'shares': 200},
  {'name': 'MSFT', 'price': 65.1,'shares': 50}
]

Функции обратного вызова

В вышеприведенном примере функция-ключ является примером функции обратного вызова. Метод sort() "обратно вызывает" функцию, которую вы предоставляете. Функции обратного вызова часто представляют собой короткие однострочные функции, которые используются только для этой одной операции. Программисты часто просят предоставить способ сокращения для указания этой дополнительной обработки.

Lambda:анонимные функции

Используйте lambda вместо создания функции. В нашем предыдущем примере сортировки.

portfolio.sort(key=lambda s: s['name'])

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

def stock_name(s):
    return s['name']

portfolio.sort(key=stock_name)

## по сравнению с lambda
portfolio.sort(key=lambda s: s['name'])

Использование lambda

  • lambda имеет серьезные ограничения.
  • Разрешается только одно выражение.
  • Нет инструкций типа if, while и т.д.
  • Наиболее распространенное использование — с функциями, такими как sort().

Прочитайте некоторые данные портфеля акций и преобразуйте их в список:

>>> import report
>>> portfolio = list(report.read_portfolio('portfolio.csv'))
>>> for s in portfolio:
        print(s)

Stock('AA', 100, 32.2)
Stock('IBM', 50, 91.1)
Stock('CAT', 150, 83.44)
Stock('MSFT', 200, 51.23)
Stock('GE', 95, 40.37)
Stock('MSFT', 50, 65.1)
Stock('IBM', 100, 70.44)
>>>

Упражнение 7.5: Сортировка по полю

Попробуйте следующие инструкции, которые сортируют данные портфеля по алфавиту по названию акции.

>>> def stock_name(s):
       return s.name

>>> portfolio.sort(key=stock_name)
>>> for s in portfolio:
           print(s)

... inspect the result...
>>>

В этом разделе функция stock_name() извлекает название акции из одной записи в списке portfolio. sort() использует результат этой функции для сравнения.

Упражнение 7.6: Сортировка по полю с использованием lambda

Попробуйте отсортировать портфель по количеству акций с использованием выражения lambda:

>>> portfolio.sort(key=lambda s: s.shares)
>>> for s in portfolio:
        print(s)

... inspect the result...
>>>

Попробуйте отсортировать портфель по цене каждой акции

>>> portfolio.sort(key=lambda s: s.price)
>>> for s in portfolio:
        print(s)

... inspect the result...
>>>

Примечание: lambda представляет собой полезный способ сокращения, так как позволяет определить функцию специальной обработки непосредственно в вызове sort(), в отличие от того, чтобы сначала определить отдельную функцию.

Резюме

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