Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 什么是_&引用;lambda函数中的平均值及其使用原因?_Python_Lambda - Fatal编程技术网

Python 什么是_&引用;lambda函数中的平均值及其使用原因?

Python 什么是_&引用;lambda函数中的平均值及其使用原因?,python,lambda,Python,Lambda,我有一个匿名函数,参数是“u”,我不知道它是什么意思,也不知道为什么在这里使用它 其功能是: f=lambda\ux:model.loss(X,y)[0] grad_num=eval_numeric_gradient(f,model.params[name],verbose=False,h=1e-5) 模型.损失: def丢失(自身、X、y=无): #从params字典中解包变量 W1,b1=self.params['W1'],self.params['b1'] W2,b2=self.param

我有一个匿名函数,参数是“u”,我不知道它是什么意思,也不知道为什么在这里使用它

其功能是:

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

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

模型.损失:

def丢失(自身、X、y=无):
#从params字典中解包变量
W1,b1=self.params['W1'],self.params['b1']
W2,b2=self.params['W2'],self.params['b2']
h1,h1_缓存=仿射(X,W1,b1)
分数,h2\u缓存=仿射向前(h1、W2、b2)
#如果y为无,则我们处于测试模式,因此只需返回分数
如果y为无:
返回分数
损失,梯度=0,{}
损耗,dscores=软最大损耗(分数,y)
损失=损失+0.5*自我调节*(np.和(W2**2)+np.和(W1**2))
dh1,梯度['W2',梯度['b2']=仿射向后(dscores,h2_缓存)
dX,grads['W1',grads['b1']=仿射向后(dh1,h1\u缓存)
年级['W1']+=self.reg*W1
年级['W2']+=self.reg*W2
返回损失,梯度
以及功能 评估数值梯度:

def eval\u数值梯度(f,x,verbose=True,h=0.00001):
fx=f(x)#在原点计算函数值
梯度=np.类零(x)
#迭代x中的所有索引
it=np.nditer(x,标志=['multi_index'],op_标志=['readwrite']))
虽然没有完成,但是:
#在x+h处计算函数
ix=it.multi_索引
oldval=x[ix]
x[ix]=oldval+h#增加h
fxph=f(x)#计算f(x+h)
x[ix]=oldval-h
fxmh=f(x)#计算f(x-h)
x[ix]=旧值#还原
#用中心公式计算偏导数
梯度[ix]=(fxph-fxmh)/(2*h)#斜率
如果冗长:
打印(ix,梯度[ix])
it.iternext()#进入下一个维度
返回梯度

Loss函数并不复杂,我想知道“”代表了什么以及其中的函数。

Python中的惯例是对以后不使用的变量使用
。这里没有黑魔法,它是一个普通的变量名,其行为完全符合您的预期

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

如果
f
将作为

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

然后,
TypeError:()接受0个位置参数,但给出了1个。
将引发错误。

在您的情况下,这是一种约定,告诉您不使用lambda参数()

一般用途:

当您必须获取一个值但不使用它时,可以使用。这是一种python约定,开发人员使用它使他们的代码对其他开发人员更具可读性。使用
,表示您知道变量未被使用。某些IDE(如PyCharm)会在您不这样做时警告您:

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


if __name__ == '__main__':
    test("barfoo")
将导致Pycharm中的警告,例如:

但不适用于

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


if __name__ == '__main__':
    test("barfoo")
结果无警告:


这通常用于匿名变量,这些变量是必需的,但对代码没有任何用处。未使用
\uu
,未使用的参数。您案例的可能重复项在接受的答案中为#3。@Chillie它肯定相关,但我不会将其标记为重复项,因为我在回答中描述了特定的用例。如果没有上下文,OP中的lambda可以实现为
lambda:model.loss(X,y)[0]
,但它不能,因为回调将传递argument@AndriyMakukha他不能这样做,因为
f
被用作将被传递参数的回调。看我的answer@ZhengfangXin是的,但是没有关系。如果lambda没有接受
,则调用
fxph=f(x)
将失败,错误显示在我的answer@AzatIbrakov它不是复制品,更不用说“明显的”复制品了。没有一个答案可以解释为什么在这个问题所涉及的非常具体的用例中使用它shows@ZhengfangXinIDE和解释器并不关心。他们确实关心
f
是否接受参数。他们不关心
f
如何在内部调用该参数,或者它是否使用该参数。@ZhengfangXin在本文中,
\u
的名称没有什么特别之处。这与
f=lambda被忽略\u参数:x+y
@ZhengfangXin相同<代码>没有什么特别的意思
u=1
x=1
完全相同。由于定义了一个函数,该函数只接受一个参数,但传递了两个参数,因此出现了一个错误。为什么不能调用
def test():print('foobar')
!当然可以,这只是一个演示IDE行为的示例。一个更好的例子可能是for循环:
for uuu范围内(10):print('hello')
,但这需要更多的行来完成,我希望答案简洁。我没有否决,但不是说你用
告诉你的IDE一些事情<代码>.是一种python约定,开发人员使用它使他们的代码对其他开发人员更具可读性,IDE已经调整以帮助他们使用此约定。好的,不完全正确,但仍然不是错误。如果IDE警告您,这是因为它是python约定,开发人员使用它等等。谢谢,我将编辑答案以使其更清楚。