在Python中使用函数传递/返回的大多数优雅算法

时间:2016-07-11 06:06:40

标签: python

在Python中,函数是第一类对象,这意味着可以将它们传递给其他函数或从其他函数返回它们。这是该语言的一个非常有趣的功能,我想知道是否有任何经典的例子,这是显着的使用?或者是否有任何算法使用此功能或使用此功能优雅地呈现?

3 个答案:

答案 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)的调用。