Рубрики
Без рубрики

Python Lambda

Получите практические, реальные навыки Python на наших ресурсах и пути

Автор оригинала: Mike Driscoll.

Когда я впервые начал изучать Python, один из самых запутанных концепций, чтобы принять голову, был заявление о ЛАМБДА. Я уверен, что другие новые программисты запутаются, а некоторые из вас, вероятно, задаются вопросом, о чем я говорю. Итак, в духе образования давайте поп-викторину:

В. Что такое лямбда?

A. 11-я буква греческого алфавита B. Крэниометрическая точка на соединении сагиттальных и ламбуиных швов черепа C. Водитель в подчиненной мехе, позволяющий менять мысли пользователя в реальность D. Имя Серия японской ракеты E. Анонимные (несвязанные) функции

Если вы догадались, F – все вышеперечисленное Вы поняли это правильно! Конечно, в контексте этой статьи «E» действительно правильный ответ. Заявление Python Lambda – это анонимная или несвязанная функция и довольно ограниченная функция. Давайте посмотрим на несколько типичных примеров и посмотрим, сможем ли мы найти корпус на использование для него.

Типичные примеры, которые обычно считают для обучения лямбда, – это какой-то скучная функция удвоения. Просто чтобы быть напротив, наш простой пример покажет, как найти квадратный корень. Сначала мы покажем нормальную функцию, а затем лямбда эквивалент:

import math

#----------------------------------------------------------------------
def sqroot(x):
    """
    Finds the square root of the number passed in
    """
    return math.sqrt(x)

square_rt = lambda x: math.sqrt(x)

Если вы попробуете каждую из этих функций, вы получите поплавок. Вот пара примеров:

>>> SQRT (49) 7.0 >>> Square_rt (64) 8.0

Довольно Slick, верно? Но где бы мы на самом деле использовали лямбда в реальной жизни? Может быть, программа калькулятора? Ну, это будет работать, но это довольно ограниченное приложение для встроенного питона! Одним из основных кусочков Python, которые применяются лямбда, применяются для регулярных обратблений TKinter. Мы посмотрим на это, но мы также возьмем эту информацию и попробую его с WXPYPHON, чтобы увидеть, как работает так же хорошо.

Tkinter + лямбда

Мы начнем с TKinter, поскольку он включен в стандартный пакет Python. Вот действительно простой скрипт с тремя кнопками, два из которых связаны с их обработчиком событий с помощью лямбда:

import Tkinter as tk

########################################################################
class App:
    """"""

    #----------------------------------------------------------------------
    def __init__(self, parent):
        """Constructor"""
        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 "You pressed the %s button" % num
        
if __name__ == "__main__":
    root = tk.Tk()
    app = App(root)
    root.mainloop()

Обратите внимание на переменные BTN22 и BTN44. Это где действие. Мы создаем TK.Button экземпляр здесь и связываться с нашей printnum Метод в одном упал. Лямбда назначается на кнопку команда параметр. Что это значит, что мы создаем одноквартирую функцию для команды, очень похоже на кнопку Quit, где мы называем метод Quit Carry. Разница вот в том, что этот конкретный лямбда представляет собой метод, который вызывает еще один метод и передает последнее целое число. В printnum Метод, мы печатаем на STDOUT, какую кнопку была нажата с помощью информации, которая была передана ему из функции Lambda. Вы следили за всем этим? Если это так, мы можем продолжить … Если нет, повторно прочитайте этот абзац столько раз, сколько необходимо, пока информация не погрузится, или вы не сходите с ума, в зависимости от того, что наступит первым.

wxpython + лямбда

Наш пример WXPYPHON довольно похож на Tkinter One, только немного более многолетнего:

import wx

########################################################################
class DemoFrame(wx.Frame):
    """
    Frame that holds all other widgets
    """

    #----------------------------------------------------------------------
    def __init__(self):
        """Constructor"""        
        wx.Frame.__init__(self, None, wx.ID_ANY, 
                          "wx lambda tutorial",
                          size=(600,400)
                          )
        panel = wx.Panel(self)
        
        button8 = wx.Button(panel, label="8")
        button8.Bind(wx.EVT_BUTTON, lambda evt, name=button8.GetLabel(): self.onButton(evt, name))
        button10 = wx.Button(panel, label="10")
        button10.Bind(wx.EVT_BUTTON, lambda evt, name=button10.GetLabel(): self.onButton(evt, name))
        
        sizer = wx.BoxSizer(wx.HORIZONTAL)
        sizer.Add(button8, 0, wx.ALL, 5)
        sizer.Add(button10, 0, wx.ALL, 5)
        panel.SetSizer(sizer)
        
    #----------------------------------------------------------------------
    def onButton(self, event, buttonLabel):
        """"""
        print "You pressed the %s button!" % buttonLabel

# Run the program
if __name__ == "__main__":
    app = wx.App(False)
    frame = DemoFrame().Show()
    app.MainLoop()

В этом случае мы создаем двухпараметрическую анонимную функцию с помощью лямбда. Первый параметр – EVT А второй – ярлык кнопки. Они передаются на onbutton Обработчик событий, который называется, когда пользователь нажимает на одну из двух кнопок. Этот пример также печатает метку кнопки на STDOUT.

Обертывание

Заявление о лямбдах также используется во всех видах других проектов. Если вы Google Python Project и Lambda, вы можете найти много живого кода. Например, если вы ищете «Django Lambda», вы узнаете, что имеет фабрику Django, который использует лямбдас. Плагин Elixir для SQLalchemy также использует лямбдас. Держите глаза открытыми глазами, и вы будете удивлены, сколько раз вы будете наткнуться на эту удобную маленькую производитель функции.

Дальнейшее чтение