需要帮助重写Python函数而不使用lambda

时间:2014-04-29 13:56:26

标签: python lambda callback

基本上我只是想知道如果没有使用lambda这段代码会是什么样的。

bttn_0 = Button(calc, text = "0")

bttn_0["command"] = lambda: sum1.num_press(0)

bttn_0.grid(row = 4, column = 1, pady = 5) 

我知道它会开始作为def的东西,但我会在将要发生的事情上迷失方向。你可能想知道我为什么这么问。好吧,我试图弄清楚lambda的使用以及如何在编码中更有效地使用它,但我首先需要知道如何从没有lambda的原始def函数实现它。我希望这是有道理的。我知道lambda是最快的方法,但正如我所说的,我仍然对学习简化编码感兴趣,并且需要原始的方法才能做到这一点。

感谢您的帮助!

2 个答案:

答案 0 :(得分:2)

唯一有意义的其他选择是传递命名函数:

def command_handler():
    return sum1.num_press(0)  # or without the return

bttn_0["command"] = command_handler

但是没有区别,而且我认为lambda看起来好多了(虽然有些人喜欢因为风格或品味的原因而避免使用它们) - 你需要传递一个可调用的,并且是唯一的方法来定义一个callable是一个lambda或一个函数。

从技术上讲,第三个选项是一个带有__call__方法的对象,但到目前为止这是一个矫枉过正,所以我只是为了完整性而展示它:

class CmdHandler(object):
    def __call__(self):
        return sum1.num_press(0)

bttn_0["command"] = CmdHandler()

答案 1 :(得分:1)

考虑以下两个例子:

如果没有lambda表达式,如果要打印数字(例如),则每个Button需要不同的函数:

def number_0():
    print 0

def number_1():
    print 1

Button(calc, text='0 named function', command=number_0).pack()
Button(calc, text='1 named function', command=number_1).pack()

但是,使用lambda表达式,您可以从Button传递参数,并且可以大大减少代码中的行数:

def num_press(n):
    print n

Button(calc, text='0 with lambda', command=lambda: num_press(0)).pack()
Button(calc, text='1 with lambda', command=lambda: num_press(1)).pack()