2016-07-11 5 views
0

Pythonでは、関数はファーストクラスのオブジェクトです。つまり、他の関数との間で関数を受け渡しすることができます。これは言語の非常に興味深い機能ですが、これが重要な意味で使用される古典的な例があるかどうか疑問に思っていましたか?または、この機能を使用する、またはエレガントに提示できるアルゴリズムがありますか?Pythonでの関数の受け渡しを使用する最も洗練されたアルゴリズム

+1

あなたの側の視点は? – Kruser

+0

ユースケースについては、[戦略パターン](http://stackoverflow.com/questions/963965/how-to-write-strategy-pattern-in-python-differently-than-example-in-wikipedia)を参照してください。 –

答えて

0

依存性注入は古典的です。 これは、以下のようなことができることを意味しています。これは、process_dataに一連の論理を持たせるのではなく、decision_rootを使用して意思決定ツリーをさらに上げる意思決定ロジックをプッシュできるようにします。これにより、コードの基本的な多形性をより簡単に明らかにすることができます。機能・パッシングの最も偉大な力の

def process_data(data,analysis_func): 
    prepped_data = prep_data(data) 
    ... 
    analyzed_data = analysis_func(prepped_data) 
1

一つは「クロージャ」です。クロージャは、コードに取り付けられたデータであり、その一般的な使用である:

オブジェクト指向

この実装一貫した機能シグネチャ

  • を提供するハードコーディングされた定数
  • Eleminatingグローバル
  • を交換
    • 本当にクールなものです。関数内の値に変数をバインドして渡すことができると想像してください。誰でもバインディングを完了すると、その機能が開始されます。あなたは、次の簡単な例を参照してください可能性があります

      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に基づいています。

  • 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に(与えられた場合、そうでなければなし残っていません)。この基底クラスで

    次のようにメソッドvalidate()があるかもしれません:あなたは_validation_callbackが継承クラスから供給された方法含めることができる属性を見るとわかるように

    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) 
    

    self._validation_callback(my_value)という電話番号は、実際にはCMyClass.validation_callback(my_value)への電話番号です。

    関連する問題