了解lambda函数

时间:2013-07-24 11:51:54

标签: python python-2.7 python-3.x lambda

我确实试过阅读有关Lambda函数的内容,但没有遇到任何链接,这些链接解释了关于它的流程以及python解释器处理它的方式的几个问题,或者可能是我无法正确理解它。 我有几个问题,请有人为我澄清一下。 这是代码:

def f1(n):
    print 'in f1, value is : ', n
    return lambda x: x+n

if __name__ == '__main__':
    f= f1(100)
    print f(1)
    print f(3)
    print f1(10)
    print f(5)
    print type(f1)

输出为:

in f1, value is :  100
101
103
in f1, value is :  10
<function <lambda> at 0x019C66B0>
105
<type 'function'>

我的问题是:

  • 对于f(1)f(3),为什么没有调用print语句以及何时调用 我们调用f1(100)为什么没有编译lambda语句。
  • 函数xnf1之间的关系是什么。
  • 我认为f(5)将是15(10 + 5)
  • 请解释print f1(10)
  • 另外,请告诉我lambda x:这里的含义是什么,这个块的x名称是什么?请解释。

谢谢大家。

3 个答案:

答案 0 :(得分:2)

首先,您应该了解Python中的所有内容都是对象。并且函数确实存在。

从您的函数f1(),您实际上正在返回对lambda函数的引用。您可以在任何变量中分配。

例如:

>>> f = lambda x: x   # Assign reference to lambda function to f.
# Now you can call lambda function using `f`  
>>> f(1)
1

现在,让我们继续你的例子吧。您在if内的第一个陈述是:

f = f1(100)

此作业相当于:

f = lambda x: x + 100  # Replace `n` with `100` in return statment in `f1`.

所以,接下来的两个电话非常简单:

print f(1)  # returns `1 + 100` = 101 (Replace `x` with `1`.
print f(3)  # returns `3 + 100` = 103

所以,现在你得到了xn之间的关系。 'x'被f的参数替换,'n'被f1的参数替换。

  

请解释print f1(10)

f1()返回对lambda函数的引用。这就是它的印刷品。输出类似于下面代码段中的输出:

>>> def func():
        return 5

>>> func
<function func at 0x021F0F30>

除了funclambda替换之外,因为f1仅返回lambda函数。

  

我认为f(5)将是15(10 + 5)

如果您在前一个语句中将f1的返回值重新分配给f,那么您将获得该输出。但是,由于您刚刚打印了f(10)的值,f仍然绑定到 - lambda x: x + 100。所以你得到105

然后打印f1的类型,这只是一个函数:

print type(f1)

答案 1 :(得分:1)

lambda几乎是另一个功能。要使用它,你也必须调用它。

您将实际的lambda返回到f,而不是整个函数f1。除此之外,返回时不会调用lambda。这就是为什么当你致电f(1)f(3)时,它实际上并不运行f1,而只运行lambda。

还记得我怎么说lambdas就像函数一样?好x是一个参数,而n是您在n中定义的局部变量f1

f(5) != 15,因为您实际上并未在任何地方使用f1(10)。你只打印它。如果您执行了f = f(10),那么它将是15

print f1(10)打印lambda函数(因为这是返回的内容)。它不会调用它,只是打印它。

答案 2 :(得分:1)

lambda只是在一行上编写函数的一种方式。

最初你可能看不到它们中的重点,但是它们可以用于生成许多略有不同的函数,或用于指定只能使用一次的函数或所有其他各种实例。

为了更好地理解,请想象以下代码 - 与您自己的代码略有不同:

def f2(n):

    def g2(x):
        return x + n

    return g2

这非常符合您自己的代码所做的,但是通过在第一个函数中定义一个函数然后返回它。这基本上与您的代码完全相同。