2016-07-11 7 views
0

In Python sind Funktionen erstklassige Objekte, was bedeutet, dass man sie übergeben und von anderen Funktionen zurückgeben kann. Dies ist ein sehr interessantes Merkmal der Sprache, und ich frage mich, ob es klassische Beispiele gibt, wo dies in bedeutender Weise verwendet wird. Oder gibt es Algorithmen, die diese Funktion nutzen oder elegant darstellen können?Die meisten eleganten Algorithmen, die in Python Funktion übergeben/zurückgeben

+1

eine Perspektive in Ihrer Seite? – Kruser

+0

Siehe die [Strategie Muster] (http://stackoverflow.com/questions/963965/how-to-write-strategie-pattern-in-python-differently-than-example-in-wikipedia) für einen Anwendungsfall –

Antwort

0

Abhängigkeitsinjektion ist ein Klassiker. Dies bedeutet, dass ich Sachen wie unten tun kann, was Ihnen erlaubt, die Entscheidungslogik, für die analyse_func weiter oben im Entscheidungsbaum verwendet wird, zu drücken, anstatt eine Menge Logik in process_data zu haben. Dies kann es erleichtern, die zugrunde liegende polymorphe Natur des Codes aufzudecken.

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

Einer der größten Macht der Funktion Umgehen ist ‚Closures‘. Ein Verschluß ist, Daten an Code und die gemeinsame Nutzung dieser ist:

  • hart codiert Konstanten
  • Eleminating globals
  • Bereitstellung von konsistenten Funktionssignaturen
  • Implementieren Objektorientierung Ersetzen

Dieser ist ein wirklich cooles Zeug, stellen Sie sich vor, Sie können Variablen an Werte innerhalb einer Funktion binden und dann übergeben. Wer die Bindung vervollständigt, wird die Funktion initiieren. Sie können auf das folgende einfache Beispiel verweisen:

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 

Erklärung: Verschlüsse in Python werden durch Funktionsaufrufe erstellt. Hier erzeugt der Aufruf von makeInc eine Bindung für x, auf die in der Funktion inc verwiesen wird. Jeder Aufruf von makeInc erstellt eine neue Instanz dieser Funktion, aber jede Instanz hat eine Verknüpfung zu einer anderen Bindung von x.

Hinweis: Diese Antwort basiert auf dieser page.

0

Ein schönes Beispiel ist eine Methode validation_callback die in Validatoren für Wxpython UI Widgets nützlich ist.

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) 

Die Basisklasse:

CValidatorBase(object) : 
    def __init__(self, obj, attr_name, validation_callback=None) : 
     # .... 
     self._obj = obj 
     self._attr_name = attr_name 
     self._validation_callback = validation_callback 
     # .... 

Der Konstruktor der Basisklasse CValidatorBase speichert eine Referenz auf das Verfahren self._validation_callback() (falls gegeben, sonst bleibt sie None) in einem Attribut CValidatorBase._validation_callback.

In dieser Basisklasse könnte es ein Verfahren validate() so aussehen:

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) 

Wie Sie das Attribut sehen _validation_callback enthalten kann je nachdem, welche Methode von einer erbenden Klasse geliefert wird. Der Anruf self._validation_callback(my_value) ist in der Tat ein Anruf zu CMyClass.validation_callback(my_value).

Verwandte Themen