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
Antwort
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)
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.
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)
.
- 1. Die meisten eleganten Kombinationen von Elementen in F #
- 2. Wie die meisten Krümmungspunkte eines Graphen in Python zu bestimmen
- 3. Funktion, die eine Funktion in Python definiert
- 4. Welche Algorithmen profitieren am meisten von fusioniertem Multiply Add?
- 5. Welche Algorithmen für die Bildverkleinerung?
- 6. Fang die meisten abgeleiteten Ausnahmen?
- 7. Warum werden die meisten Skriptsprachen falsch eingegeben?
- 8. Vergleichen Sie die Clustering-Algorithmen in R
- 9. Wann werden die meisten Bibliotheken Python 3-kompatibel sein?
- 10. Python - Finden längsten (die meisten Wörter) Schlüssel im Wörterbuch
- 11. Die meisten Debugging-Optionen in Eclipse ausgegraut
- 12. Schnelle Algorithmen für die Berechnung der Fakultät
- 13. Wie funktioniert die Funktion python difflib.get_close_matches()?
- 14. mysql - Wählen Sie die meisten Zeichen
- 15. Pivot-Tabelle Die meisten aktuellen Daten Excel
- 16. Wie profiliere ich die Speichernutzung in Python?
- 17. Python-Funktion, die nichts zurückgibt
- 18. Welche Datentypen für genetische Algorithmen in Python?
- 19. Was macht die slice() Funktion in Python?
- 20. Wie funktioniert die "alle" Funktion in Python?
- 21. Wie modelliert man die Ausführungszeit von Algorithmen?
- 22. Was sind die Algorithmen für Echtzeit-Suchmaschine?
- 23. Unterstützen die meisten E-Mail-Clients MHTML?
- 24. Die meisten aktiven Themen oder Spiele finden
- 25. Warum die meisten Beispiele verwenden Arraylist
- 26. Welches ist die meisten Speicherleck sicheren Ansatz
- 27. PyQt: So erhalten Sie die meisten QListWidget
- 28. Zähle die meisten Datensätze aus Tow-Spalten
- 29. Warum akzeptieren die meisten Programmiersprachen keine Kommas?
- 30. Die meisten Standard-Kalender-Austausch-Datenformat
eine Perspektive in Ihrer Seite? – Kruser
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 –