-1

好吧,我确实尝试阅读有关 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'>

我的问题是:

  • Forf(1)f(3)whyprint语句没有被调用,以及当我们调用f1(100)了为什么 lambda 语句没有被编译。
  • xn在功能上是什么关系f1
  • 我以为f(5)会 15 ( 10 + 5)
  • 请解释print f1(10)
  • 另外,请让我知道lambda x:这里是什么意思,是这个块的 x 名称吗?请解释。

谢谢大家。

4

3 回答 3

2

首先你应该明白 Python 中的一切都是对象。功能确实无处不在。

从您的 functionf1()中,您实际上是在返回对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

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

请解释打印 f1(10)

f1()返回对 lambda 函数的引用。这就是它将打印的内容。输出类似于您在以下代码段中获得的输出:

>>> def func():
        return 5

>>> func
<function func at 0x021F0F30>

除了func替换为lambda,因为 f1 只返回一个 lambda 函数。

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

如果您在前面的语句中重新分配了f1to的返回值,您就会得到该输出。f但是,由于您刚刚打印了 , 的值f(10)f仍然绑定到 - lambda x: x + 100。所以你得到105.

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

print type(f1)
于 2013-07-24T12:06:20.397 回答
1

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

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

还记得我说过 lambda 就像函数吗?Wellx是一个参数,while是您在 中定义n的局部变量。nf1

f(5) != 15因为你实际上并没有在f1(10)任何地方使用。你只打印了它。如果你这样做了f = f(10),那就是15

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

于 2013-07-24T11:56:04.667 回答
1

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

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

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

def f2(n):

    def g2(x):
        return x + n

    return g2

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

于 2013-07-24T12:10:03.570 回答