在Python中,函数是第一类对象,这意味着可以将它们传递给其他函数或从其他函数返回它们。这是该语言的一个非常有趣的功能,我想知道是否有任何经典的例子,这是显着的使用?或者是否有任何算法使用此功能或使用此功能优雅地呈现?
答案 0 :(得分:1)
功能传递的最大优势之一是闭包'。闭包是附加到代码的数据,其常见用途是:
这是一个非常酷的东西,想象你可以将变量绑定到函数中的值然后传递它。谁将完成绑定将启动该功能。您可以参考以下简单示例:
def makeInc(x):
def inc(y):
# x is "attached" in the definition of inc
return y + x
return inc
incOne = makeInc(1)
incFive = makeInc(5)
incOne (5) # returns 6
incFive(5) # returns 10
<强>解释强>: python中的闭包是由函数调用创建的。这里,对makeInc的调用会为函数inc中引用的x创建一个绑定。每次调用makeInc都会创建此函数的新实例,但每个实例都有一个指向x的不同绑定的链接。
注意:此答案基于此page。
答案 1 :(得分:0)
依赖注入是一种经典。 这意味着我可以执行类似下面的操作,这可以让您推动决策制定逻辑,其中analyze_func可以进一步使用决策树,而不是在process_data中使用一堆逻辑。这可以更容易地揭示代码的底层多态性。
def process_data(data,analysis_func):
prepped_data = prep_data(data)
...
analyzed_data = analysis_func(prepped_data)
答案 2 :(得分:0)
一个很好的例子是方法validation_callback
,它在wxpython的UI小部件的验证器中很有用。
class CMyClass( object ) :
# An object attribute
self._my_attr = a_value
# Define a validator for the widget self.textCtrl which is responsible for self._my_attr
self.textCtrl.SetValidator \
( CMyValidator \
( obj = self
, attr_name = '_my_attr'
, validation_callback = self.validation_callback
)
)
# Define a validation callback method for validations which are specific for this class
def validation_callback( self, value ) :
# Do some validations specific to this class, e. g.
if not self._pattern.match( value ) :
# Does not match the reqular expression stored in self._pattern
raise ValueError( myErrorValues )
基类:
CValidatorBase( object ) :
def __init__( self, obj, attr_name, validation_callback=None ) :
# ....
self._obj = obj
self._attr_name = attr_name
self._validation_callback = validation_callback
# ....
基类CValidatorBase
的构造函数在属性self._validation_callback()
中存储对方法CValidatorBase._validation_callback
的引用(如果给定,则保持为None)。
在这个基类中,可能有一个方法validate()
,如下所示:
def validate( self, obj ) :
# obj: the UI widget, get its value
my_value = self.get_my_value_form_obj( obj )
# First do some general validations
# e. g. if the value is required it must not be an empty string etc.
# then
if self._validation_callback : # is there a validation callback defined?
try :
#----------------------------------------
self._validation_callback( my_value ) # this call is the answer of your question
#----------------------------------------
except ValueError, err:
# The validation_callback() should throw a ValueError-Exception (or another
# appropriate exception) in case of a validation error
# my_error_handler( obj, err )
如您所见,属性_validation_callback可以包含继承类提供的任何方法。来电self._validation_callback(my_value)
实际上是对CMyClass.validation_callback(my_value)
的调用。