1 Vorwort
Das erste Mal, dass ich mit funktionaler Programmierung in Kontakt kam, war, als ich verteiltes Rechnen lernte. Damals wusste ich nicht viel über Map/Reduce und verstand nicht viel davon die Prinzipien. Funktionale Programmierung in Python kann auch als vorläufiges Verständnis von Map/Reduce angesehen werden. Die sogenannte funktionale Programmierung lässt sich im Wesentlichen der prozessorientierten Programmierung zuordnen, ihre Ideen stehen jedoch mathematischen Berechnungen sehr nahe. Es ist abstrakter als das allgemeine Programmierparadigma und in rein funktionalen Programmiersprachen geschriebene Funktionen haben keine Variablen. Solange die Eingabe bestimmt ist, wird die Ausgabe bestimmt. Ein weiteres Merkmal besteht darin, dass die Funktion selbst als Parameter an eine andere Funktion übergeben wird, sodass eine Funktion zurückgegeben werden kann.
2 Funktion höherer Ordnung
In Python ist der Funktionsname im Wesentlichen eine Variable. Wir können einer Variablen einen Funktionsnamen zuweisen und dann die Funktion über diese Variable aufrufen. In der prozessorientierten Programmierung mit Python ist eine Funktion mit Variablen ein sehr verbreitetes Design, aber wenn die Variable eine Funktion ist, dann wird diese Funktion mit Variablen als Funktion höherer Ordnung bezeichnet.
Ein einfaches Beispiel für eine Funktion höherer Ordnung:
def fun(n):
return n+1
def highorder(x, y, f) :
return f(x)+f(y)
Die oben definierte höhere Ordnung ist eine Funktion höherer Ordnung, also eine Funktion, die in ihren Parametern andere Funktionen empfangen kann.
Drei Map/Reduce
Mit der oben genannten Funktionsgrundlage höherer Ordnung ist Map/Reduce jetzt leicht zu verstehen. Die Map-Funktion empfängt zwei Parameter, einer ist eine Funktion und der andere ist ein Iterable. Map wendet die Funktion nacheinander auf jedes Element des Iterables an und gibt das Ergebnis als neuen Iterator zurück.
Sehen Sie sich das folgende Beispiel an:
def fun(n):
return n*2
m=map(fun, [1,2,3, 4 ,5])PRint(m)
E:Studypython>python hello_python.py
[2, 4, 6, 8, 10]
Map setzt die Funktionen Spaß in der Reihenfolge Wenn Sie auf jedes Element der Liste reagieren, erhalten Sie [2,4,6,8,10].
Wenn Sie Schwierigkeiten haben, eine unterhaltsame Funktion zu definieren, können Sie sie wie folgt mit Lambda vereinfachen:
m=map(lambda n:n*2, [1,2, 3,4, 5])
Schauen wir uns die Verwendung von Reduzieren an. Wie Map wendet auch Reduce eine Funktion nacheinander auf eine Sequenz an, erfordert jedoch, dass diese Funktion zwei Funktionen empfängt. Reduce wendet die Funktion dann auf das Ergebnis der ersten beiden Parameter und das nächste Element der Sequenz an.
Verwenden wir Reduzieren, um eine Sequenzsummenoperation zu implementieren, siehe folgendes Beispiel:
def add(x,y):
return x+y
r = Reduce(add, [1,2,3,4,5])
print(r)
E:Studypython>python hello_python.py
15
Seine Lambda-Version ist:
r=reduce(lambda x,y:x+y, [1,2,3,4,5])
Vier Rückgabefunktionen
Es wurde bereits erwähnt, dass eine Funktion einer Variablen zugewiesen werden kann. Da die Funktion also eine Variable zurückgeben kann, kann sie natürlich auch eine Funktion zurückgeben. Obwohl es keinen großen Unterschied zwischen der Rückgabe von Variablen und der Rückgabe von Funktionen gibt, spielt dieser Mechanismus zur Rückgabe von Funktionen in Anwendungen eine große Rolle.
Schauen wir uns das folgende Beispiel an:
def wrapper(*param):
def calc():
sum=0
for x in param:
sum = sum+x
>
e: studypython & gt; python hello_python.py
15
Definieren Sie einen Wrapper -Funktionsumschlag, der eine unbestimmte Anzahl von Parametern empfängt. Nach dem Aufruf dieser Funktion gibt sie eine intern definierte Funktion zurück, die beim tatsächlichen Aufruf ausgeführt wird. Beachten Sie auch, dass die Daten, auf die in der Funktion calc zugegriffen wird, vom Wrapper eingebracht werden und diese Parameter zusammen mit calc gespeichert werden, was wir „Abschluss“ nennen.
5 Schließung (Closure)
Als ich zum ersten Mal mit Schließung in Berührung kam, verstand ich es nicht ganz. Ich verwende immer noch den Code in Teil 4 als Beispiel.
Der Wrapper ist eine Funktion, die eine unbegrenzte Anzahl von Parametern param enthält. Das Besondere ist, dass in diesem Funktionskörper auch eine neue Funktion calc definiert ist. Der Funktionskörper dieser neuen Funktion bezieht sich auf die Parameter eines externen Funktionswrappers. Mit anderen Worten, die von der externen Funktion übergebenen Parameter wurden an diesen gebunden calc-Funktion. Zusammen wird eine neue Funktion gebildet. Wir können uns param als Konfigurationsinformationen dieser neuen Funktion vorstellen. Wenn die Konfigurationsinformationen unterschiedlich sind, ist die Ausgabe der Funktion natürlich unterschiedlich.
Um Abschlüsse besser zu verstehen, schauen Sie sich die folgenden Codebeispiele an:
def wrapper(conf):
def calc(n):return conf+n
return calcf1=wrapper(1)f2=wrapper(2)
print(f1(100))
print(f2(100))
E:Studypython>python hello_python.py
101
102
Bei der Analyse des obigen Codes wird beim Aufruf von Wrapper (1) eine Funktion zurückgegeben, und die Konfigurationsinformationen dieser Funktion lauten, dass der Wert von conf 1 ist. Wenn Wrapper (2) erneut aufgerufen wird, wird eine andere Funktion zurückgegeben. Die Konfigurationsinformationen dieser Funktion lauten, dass der Wert von conf 2 ist. Wenn wir also später 100 Parameter zum Aufrufen von f1 und f2 übergeben, erhalten wir die Ergebnisse 101 und 102. Der Hauptgrund dafür ist, dass die Konfigurationsinformationen der beiden Funktionen unterschiedlich sind.
Es ist zu beachten, dass nicht alle Informationen der externen Funktion von der internen Funktion als Konfigurationsinformationen verwendet werden. Nur die Parameter der externen Funktion werden von der internen Funktion als Konfigurationsinformationen verwendet. Die lokalen Variablen externer Funktionen werden nicht als Konfigurationsinformationen verwendet.
Sechs Decorators
Die ursprüngliche Absicht der Erfindung von Decorator bestand darin, vor und nach Funktionsaufrufen weitere Funktionen hinzuzufügen, ohne den ursprünglichen Funktionscode zu ändern. Zum Beispiel das Drucken von Protokollen usw . Decorator ist im Wesentlichen eine Funktion höherer Ordnung, die eine Funktion zurückgibt, die Protokolle ausgibt. Der Code lautet wie folgt:
def decorator(func):
def wrapper():
print ("Vorher aufgerufen:")
>
f = Dekorateur (Func)
f ()
E :
Funktion aufgerufen:
Nach dem Aufruf :
Der obige Code definiert einen Dekorator für func. Wenn dieser Dekorator aufgerufen wird, wird dieser Funktion der erforderliche Code zurückgegeben dann rufe func auf. Hier gibt es jedoch ein Problem: func könnte direkt aufgerufen werden, aber jetzt wird f aufgerufen. Dieses Problem lässt sich leicht lösen, da in Python einer Variablen eine Funktion zugewiesen werden kann. Ändern Sie dazu einfach f in func. Wie unten gezeigt:
func=decorator(func)
func()
def wrapper():
print("Before invoked:")
func()
Return Wrapper
@decorator
def func():
print("Func invoked:")
func()
Darüber hinaus erfahren Sie, wie Sie Parameter zum Dekorator hinzufügen und das Attribut __name__ des Wrappers in func ändern, was hier nicht beschrieben wird.
7 Teilfunktion
print(int8('12345'))
Acht Zusammenfassung
In diesem Artikel stellen wir hauptsächlich einige grundlegende Konzepte der funktionalen Programmierung vor. Ich persönlich habe das Gefühl, dass Decorator am schwierigsten zu verstehen ist, insbesondere die sogenannten Konfigurationsinformationen. Sollten Fehler auftreten, hinterlassen Sie bitte eine Nachricht! ! !