lambda函数中的“ _”是什么意思,为什么使用它?

时间:2019-07-25 07:59:54

标签: python lambda

我有一个匿名函数,其参数为“ _”,我不知道它的含义以及为什么在这里使用它。

和功能是:

Do you want to continue being notified...

f = lambda _: model.loss(X, y)[0]

model.loss:

grad_num = eval_numerical_gradient(f, model.params[name], verbose=False, h=1e-5)

和功能 eval_numerical_gradient:

def loss(self, X, y=None):


    # Unpack variables from the params dictionary
    W1, b1 = self.params['W1'], self.params['b1']
    W2, b2 = self.params['W2'], self.params['b2']

    h1, h1_cache = affine_relu_forward(X, W1, b1)
    scores, h2_cache = affine_forward(h1, W2, b2)


    # If y is None then we are in test mode so just return scores
    if y is None:
        return scores

    loss, grads = 0, {}


    loss, dscores = softmax_loss(scores, y)
    loss = loss + 0.5*self.reg*(np.sum(W2**2) + np.sum(W1**2))
    dh1, grads['W2'], grads['b2'] = affine_backward(dscores,h2_cache)
    dX, grads['W1'], grads['b1'] = affine_relu_backward(dh1,h1_cache)
    grads['W1'] += self.reg*W1
    grads['W2'] += self.reg*W2

    return loss, grads

丢失函数并不复杂,我想知道“ _”代表什么并在其中起作用。

2 个答案:

答案 0 :(得分:3)

Python中的惯例是对以后不再使用的变量使用_。没有涉及任何黑魔法,它是一个普通变量名,其行为与您期望的完全一样。

在这种情况下使用它是因为f作为回调传递,在被调用时将传递参数(fxph = f(x))。

如果将f实施为

f = lambda: model.loss(X, y)[0]

然后将引发TypeError: <lambda>() takes 0 positional arguments but 1 was given错误。

答案 1 :(得分:1)

在您的情况下,这是一个约定,告诉您未使用lambda参数(the answer from DeepSpace explain why)。

常规用途:

必须获取值但不使用它时,可以使用_。这是python约定,开发人员使用它来使其他开发人员更容易阅读其代码。使用_时,您说您知道未使用该变量。诸如PyCharm之类的IDE会警告您:

def test(s):
    print("foobar")


if __name__ == '__main__':
    test("barfoo")

例如在Pycharm中警告的结果:

warning

但不能使用_

def test(_):
    print("foobar")


if __name__ == '__main__':
    test("barfoo")

结果无警告:

no warning