函数是否可以用作python __init__
方法的参数?
我要做的是为感知器和逻辑回归学习算法编写一个类。由于它们的训练函数非常相似,并且只是用于预测的函数真的不同,所以能够在构造时指定这个函数函数会很好。
我希望之前没有问过这个问题(我搜索过,没找到任何东西;也许我正在寻找错误的主题)。一个例子就是很棒。我对lambda
并不熟悉,所以请为任何高级python功能提供一些理由。谢谢!
答案 0 :(得分:4)
是。函数是Python中的第一类对象,因此您可以将它们作为参数传递给您喜欢的任何函数,包括__init__
。
def a():
print("Hello!")
def b(fun):
print("running fun")
fun()
print("all done")
b(a) # prints "running fun", then "Hello!", then "all done".
您可以像其他任何变量一样将它们存储在类中:
class c(object):
def __init__(self, fun):
self.fun = fun
self.fun()
lambda
只是编写函数的另一种方式,无需将其存储在变量中。它可以用于动态定义函数,例如:
def d(fun, num):
return fun(num)
def e(x):
return x**2
d(lambda x: x**2, 7) # Returns 49
d(e) # Also returns 49
答案 1 :(得分:1)
是的,函数是第一类对象,可以作为参数传递。
简短演示:
>>> def foo(): print 'foo!'
...
>>> bar = foo
>>> bar()
foo!
>>> def ham(eggs):
... eggs()
...
>>> ham(bar)
foo!
注意我是如何将foo
分配给新名称bar
,然后从bar
调用它并将其传递给另一个函数,其中参数egg
被调用为一个功能。
Lambdas只是一种创建函数对象的简短表示法。从Python的角度来看,差别很小:
>>> baz = lambda: 'baz'
>>> baz()
'baz'
>>> baz
<function <lambda> at 0x10f15c7d0>
>>> foo
<function foo at 0x10f15c6e0>
baz
lambda和前面的foo
函数都是函数对象。