【问题标题】:Understanding lambda functions了解 lambda 函数
【发布时间】:2013-07-24 11:51:53
【问题描述】:

好吧,我确实尝试阅读有关 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 语句。
  • 函数f1中的xn有什么关系。
  • 我以为f(5)会是15(10 + 5)
  • 请解释print f1(10)
  • 另外,请告诉我这里的lambda x: 是什么意思,x 是这个块的名称吗?请解释一下。

谢谢大家。

【问题讨论】:

  • 在提出任何问题之前先尝试搜索。参考这个链接。 stackoverflow.com/questions/1085875/…
  • @tailor_raj :谢谢你的链接,但即使在阅读之后我仍然会问我的一些问题,因为我正在寻找某些具体的解释(基于 python)并且我在发布这个之前做了搜索题!!!我非常期待像你这样的元素肯定会回喊我问题的完整性,几乎每个问题中都有一个!!!!所以我想说不要再劝阻人们提问了。
  • 这不是劝阻人们。因为如果你搜索,你肯定会得到比你要求的更多的东西。
  • “请告诉我什么是 lambda x: 在这里的意思”。从文档开始:docs.python.org/3/reference/expressions.html#lambda 并点击链接。

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


【解决方案1】:

首先你应该明白 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 函数的引用。这就是它将打印的内容。输出类似于您在以下 sn-p 中获得的输出:

>>> 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)

【讨论】:

  • 很好的解释。我正是在寻找这个答案。现在让 lambda 函数更加清晰。再次感谢。只是一个快速的,所以在我的 lambda 主体中,n 就像一个由覆盖函数(在本例中为 f1)传递给 lambda 函数的变量。
  • @ramd。是的,你可以这么说。
【解决方案2】:

lambda 几乎是另一个函数。要使用它,您也必须调用它。

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

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

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

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

【讨论】:

    【解决方案3】:

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

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

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

    def f2(n):
    
        def g2(x):
            return x + n
    
        return g2
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-08
      • 2019-10-28
      • 1970-01-01
      • 2016-07-23
      相关资源
      最近更新 更多