第26章-lambda

python lambda语句是一个匿名或未绑定的函数,在这个函数上是一个相当有限的函数。让我们看看几个典型的例子,看看我们是否能找到它的用例。人们通常看到的教lambda的典型例子是一些无聊的加倍函数。恰恰相反,我们的简单示例将展示如何找到平方根。首先我们将显示一个正态函数,然后是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)

如果您尝试这些函数中的每一个,最终都会得到一个浮点。以下是几个例子:

>>> sqroot(49)
7.0
>>> square_rt(64)
8.0

相当圆滑,对吧?但在现实生活中,我们在哪里使用lambda呢?也许是计算器程序?好吧,这是可行的,但对于内置的Python来说,这是一个相当有限的应用程序!定期应用lambda示例的Python的主要部分之一是tkinter回调。Tkinter是一个用于构建包含在Python中的GUI的工具包。

t金特+lambda

我们将从Tkinter开始,因为它包含在标准的python包中。下面是一个非常简单的脚本,其中有三个按钮,其中两个按钮使用lambda绑定到它们的事件处理程序:

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方法。lambda被分配给按钮的命令参数。这意味着我们正在为命令创建一个一次性函数,就像在quit按钮中我们调用帧的quit方法一样。这里的区别在于,这个特定的lambda是一个调用另一个方法并将后者传递为整数的方法。在printnum方法中,我们使用lambda函数传递给它的信息将哪个按钮打印到stdout。你跟踪了吗?如果是这样的话,我们可以继续;如果不是这样的话,尽可能多地重读这段话,直到信息被吸收或者你疯了为止,以先读的为准。

总结

lambda语句也用于所有类型的其他项目。如果你用谷歌搜索一个python项目名和lambda,你可以在那里找到很多实时代码。例如,如果搜索“django lambda”,就会发现django有一个 模型表单集 使用兰姆达斯的工厂。用于SQLAlchemy的elixir插件也使用lambda。睁大你的眼睛,你会惊讶地发现有多少次你会碰到这个方便的小功能制造者。