【问题标题】:Python Lambda FunctionsPython Lambda 函数
【发布时间】:2019-11-21 23:27:12
【问题描述】:

所以我这里有这个功能,谁能解释一下这里发生了什么? 我知道函数体中发生了什么,但不知道 lambda 函数是如何工作的 我是 lambda 函数的新手,所以我不确定函数返回的方式或内容。 t 和 c 到底是什么?

def get_gradient(self, A, b, x, beta):
    return (lambda t,c: (2*self.lambda_*x - A.T@(b*t)/c, sum(-b*t)/c))(1/(1+np.exp(b*(A@x+beta))), A.shape[0]

A 是矩阵,b 和 x 是列向量,beta 和 lambda_ 是标量

【问题讨论】:

  • 一个 lambda 表达式 只是一个创建函数的表达式。 lambda 函数与 def 语句创建的函数没有区别。

标签: python function lambda


【解决方案1】:

看起来你缺少最后一个右括号,所以我认为应该是:

def get_gradient(self, A, b, x, beta):
    return (lambda t,c: (2*self.lambda_*x - A.T@(b*t)/c, sum(-b*t)/c))(1/(1+np.exp(b*(A@x+beta))), A.shape[0])

这和做的一样:

def get_gradient(self, A, b, x, beta):
    def fn(t, c):
        return (2*self.lambda_*x - A.T@(b*t)/c, sum(-b*t)/c))
    return fn(1/(1+np.exp(b*(A@x+beta))), A.shape[0])

等同于:

def get_gradient(self, A, b, x, beta):
    t = 1/(1+np.exp(b*(A@x+beta)))
    c = A.shape[0]
    return (2*self.lambda_*x - A.T@(b*t)/c, sum(-b*t)/c))

【讨论】:

    【解决方案2】:

    这里,get_gradient(self, A, b, x, beta) 返回一个函数。换句话说,它是一个将定义另一个函数并将其作为输出返回的函数。如果您想根据不同类型的参数定义许多函数,这很有用。

    我将向您推荐this post,以了解有关lambda 函数及其典型用途的更多信息。

    但在您的情况下,一个更简单的示例可能会帮助您了解发生了什么!假设您有:

    def f(a):
        return lambda x: x**a
    

    这里,f 返回一个函数,该函数将 a 的幂应用于其输入。

    一旦你有了这个,你可以这样做:

    g = f(2)
    

    这与您所做的结果基本相同:

    def g(x):
        return x**2
    

    无论哪种情况,您现在都可以:

    g(5)
    
    # > 25
    

    【讨论】:

    • 在我的情况下,t 和 c 到底是什么?
    • @SharhadBashar,它们只是传递给返回函数的参数。就像这里的示例中的x
    • 确实如此。正如@Chris 所说,tc 是函数的参数,将由第一个函数get_gradient() 返回。换句话说,一旦你使用了get_gradient()返回的函数,它们就会开始使用并且需要指定。
    • 好的,我想我现在明白了 t = 1/(1+np.exp(b*(A@x+beta)) 和 c = A.shape[0]
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-11
    • 2013-05-13
    • 2018-05-12
    相关资源
    最近更新 更多