Оператор lambda это анонимная, или несвязанная функция, при этом довольно ограниченная. Давайте взглянем на несколько базовых примеров, и взглянем, можем ли мы найти применение данной функции. Обычно в таких примерах показывают унылые операции с дублированием. Чтобы сделать обучение интереснее, в нашем примере мы рассмотрим, как найти квадратный корень используя модуль math. Для начала, мы покажем обычную функцию, потом аналогичный с лямбдой-функцией:
1 2 3 4 5 6 7 8 9 |
import math def sqroot(x): """ Находим квадратный корень. """ return math.sqrt(x) square_rt = lambda x: math.sqrt(x) |
Если вы используете каждую из этих функцию, вы закончите с запятой. Вот еще несколько примеров:
1 2 |
print(sqroot(49)) # 7.0 print(square_rt(64)) # 8.0 |
Довольно прозрачно. Но где найти применение лямбде в реальной жизни? Может в программе калькуляторе? Это будет работать, но это будет достаточно ограниченным приложением как для Python. Основную часть возможностей Python, которые демонстрирует лямбда можно увидеть в обратных вызовах Tkinter. Tkinter – это включенный в Python набор инструментов, для создания графических интерфейсов.
Tkinter + lambda
Мы начнем с Tkinter, так как он включен в стандартный пакет Python. Рассмотрим достаточно простой скрипт с тремя кнопками, две из которых связаны с обработчиком событий с использованием лямбды:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
import Tkinter as tk class App: """""" def __init__(self, parent): """Конструктор""" frame = tk.Frame(parent) frame.pack() btn22 = tk.Button( frame, text="22", command=lambda: self.printNum(22) ) btn22.pack(side=tk.LEFT) btn44 = tk.Button( frame, text="44", command=lambda: self.printNum(44) ) btn44.pack(side=tk.LEFT) quitBtn = tk.Button(frame, text="QUIT", fg="red", command=frame.quit) quitBtn.pack(side=tk.LEFT) def printNum(self, num): print("Вы нажали кнопку: %s" % num) if __name__ == "__main__": root = tk.Tk() app = App(root) root.mainloop() |
Есть вопросы по Python?
На нашем форуме вы можете задать любой вопрос и получить ответ от всего нашего сообщества!
Паблик VK
Одно из самых больших сообществ по Python в социальной сети ВК. Видео уроки и книги для вас!
Обратите внимание на переменные btn22 и btn44. Именно здесь происходят события. Мы создали экземпляр tk.Button и связываемся с нашим методом printNum одним махом. Наша лямбда присваивается параметру команды кнопки. Это значит, что мы создаем одноразовую функцию для команды, по аналогии с кнопкой выхода, где мы вызываем метод выхода из фрейма. Разница в том, что отдельная лямбда – это метод, который вызывает другой метод и передает ему целое число. В методе printNum, мы пишем в stdout о том, какая кнопка была нажата, пользуясь информацией, которая была передана функцией lambda. Улавливаете? Если да, то мы продолжим. Если нет – перечитайте данный параграф столько раз, сколько нужно для того, чтобы эта информация усвоилась, или пока не сойдете с ума, в любом случае, что-то должно произойти первым.
Подведем итоги
Оператор lambda, в том числе, используется во всех других проектах и операциях. Если вы загуглите фразу «Python lambda«, вам выдаст великое множество различных кодов. Например, если вы поищете «Django lambda», вы заметите, что в Django содержит набор моделей, которые используют лямбду. Плагин Elixir для SqlAlchemy также использует лямбду. Если вы будете обращать на это внимание, как часто вы будете натыкаться на этот маленький создатель функций.
Являюсь администратором нескольких порталов по обучению языков программирования Python, Golang и Kotlin. В составе небольшой команды единомышленников, мы занимаемся популяризацией языков программирования на русскоязычную аудиторию. Большая часть статей была адаптирована нами на русский язык и распространяется бесплатно.
E-mail: vasile.buldumac@ati.utm.md
Образование
Universitatea Tehnică a Moldovei (utm.md)
- 2014 — 2018 Технический Университет Молдовы, ИТ-Инженер. Тема дипломной работы «Автоматизация покупки и продажи криптовалюты используя технический анализ»
- 2018 — 2020 Технический Университет Молдовы, Магистр, Магистерская диссертация «Идентификация человека в киберпространстве по фотографии лица»