2013-07-24 64 views
-1

嗯,我的确尝试了解Lambda函数,但没有通过任何链接解释关于它的流程以及python解释器处理方式的几个问题,或者我可能无法正确理解它。 我有几个问题,请有人为我澄清它们。 下面是代码:了解lambda函数

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语句没有编译。
  • 功能f1中的xn之间的关系是什么。
  • 我想f(5)将在15(10 + 5)
  • 请解释print f1(10)
  • 另外,请让我知道什么是lambda x:在这里表示,这是块是x的名字吗?请解释。

谢谢大家。

+0

在提出任何问题之前,请尝试先搜索。请参考此链接。 http://stackoverflow.com/questions/1085875/what-is-this-lambda-everyone-keeps-speaking-of/1086347#1086347 –

+0

@tailor_raj:恩,谢谢你的链接,但即使在阅读后,我仍然会问我有点问题,因为我正在寻找某些特定的解释(基于python),并且在发布这个问题之前我也搜索了!我非常期待像你这样的元素肯定会回应我的问题的完整性,几乎每一个问题中都有一个问题!所以我会说停止劝阻人们提问。 – ramd

+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的参数。

请解释打印F1(10)

f1()返回到lambda函数的参考。这就是它将要打印的内容。输出是一个类似于你在下面的代码片段获取:

>>> def func(): 
     return 5 

>>> func 
<function func at 0x021F0F30> 

除了func被替换为lambda,因为F1仅返回lambda函数。

我以为F(5)将在15(10 + 5)

你会得到了输出,曾在之前的声明中,你重新分配的f1返回值f。但是,由于您刚刚打印的值为f(10),因此f仍然绑定到 - lambda x: x + 100。所以你得到105

然后你打印的f1的类型,这是只有一个功能:

print type(f1) 
+0

很好的解释。我正在寻找这个答案。现在为lambda函数带来了很多的清晰度。再次感谢。只是一个快速的,所以在我的lambda体内,n就像是一个通过覆盖函数传递给lambda函数的变量(本例中为f1)。 – ramd

+1

@ramd。是的,你可以这么说。 –

1

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

您将实际的拉姆达返回至f,而不是整个功能f1。除此之外,当你返回它时,lambda不会被调用。这就是为什么当你拨打f(1)f(3)时,它实际上并不运行f1,但只有lambda。

还记得我说lambdas是如何功能?那么x是一个参数,而n是您在f1中定义的本地变量n

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

print f1(10)打印的lambda函数(因为这是什么被返回)。它不叫它,只是打印它。

1

一个lambda只是在一行写一个函数的方式。

最初你可能看不到它们的重点,但它们可以用于生成大量稍微不同的函数,或者用于指定可能只能使用一次的函数或所有其他各种实例。

要尝试理解好一点,想象下面的代码 - 从自己的略有不同:

def f2(n): 

    def g2(x): 
     return x + n 

    return g2 

这确实非常自己的代码做了什么,而是由第一功能中定义的函数,然后返回它。这基本上和你的代码一样。