python中的静态lambdas

时间:2015-10-23 16:14:05

标签: python lambda static-methods

我像这样在python中上课

 import numpy as np
 class BackPropogationNetwork:
        # Static lambdas
        sigmoid = lambda x : 1/(1+np.exp(-x))
        sigmoid_prime = lambda sigmoid: sigmoid(1-sigmoid)

这是构造函数

 def __init__(self):
    self.some_attr = self.sigmoid(2) 

我收到此错误

TypeError: <lambda>() takes exactly 1 argument (2 given)

如果我这样打电话

self.some_attr = ClassName.sigmoid()

我收到此错误

TypeError: unbound method <lambda>() must be called with BackPropogationNetwork instance as first argument (got int instance instead)

3 个答案:

答案 0 :(得分:5)

你需要将lambdas包装在staticmethod objects

class BackPropogationNetwork:
    sigmoid = staticmethod(lambda x : 1/(1+np.exp(-x)))
    sigmoid_prime = staticmethod(lambda sigmoid: sigmoid(1-sigmoid))

lambda表达式仍然使用不同的(有限的)语法生成函数对象。同样的规则适用于在类中定义函数;如果你想要它是一个静态方法,那么你仍然需要包装它们。

答案 1 :(得分:2)

所以你的sigmoid函数有点独立于类,将它保持在外面是有意义的,除非:

  • 您希望不污染模块的命名空间
  • 您希望增加功能的可发现性
  • 你希望这个方法给我覆盖。 让我们假设你已经下定决心,没有任何东西可以改变它,那么在这种情况下你可以做到这一点。 当你调用类似self.method()的方法时,python将第一个参数传递给实例self的函数,所以你可以像这样使你成为lambda:sigmoid = lambda self, x : 1/(1+np.exp(-x)) 或者你可以做别人建议做的事情,比如把它变成静态方法,因为staticmethod是一个装饰器,(带函数的函数)它可以这样调用

    In [1]: class A:
       ...:     s = staticmethod(lambda x: x)
       ...:     def a(self):
       ...:         print self.s(10)
       ...:
    
    In [2]: f = A()
    
    In [3]: f.a()
    10
    

答案 2 :(得分:0)

你的两个sigmoid不是类方法。这意味着当你调用它们时,它们会将Class视为隐含的第一个参数。

此错误

TypeError: <lambda>() takes exactly 1 argument (2 given)

发生此呼叫

self.some_attr = self.sigmoid(2) 

因为类实例对象与int 2一起被隐式传递。但是你的sigmoid被定义为只接受一个参数。

我认为你不会得到这个错误

TypeError: unbound method <lambda>() must be called with BackPropogationNetwork instance as first argument (got int instance instead)

通过此次通话

self.some_attr = ClassName.sigmoid()

你应该得到的错误应该是这样的。

TypeError: unsupported operand type(s) for ** or pow(): 'int' and 'type'

在输入问题时,您可能会犯了一个复制粘贴错误。