Heim > Artikel > Backend-Entwicklung > Lassen Sie uns gemeinsam die funktionale Python-Programmierung analysieren
Dieser Artikel vermittelt Ihnen relevantes Wissen über Python, das hauptsächlich Probleme im Zusammenhang mit der funktionalen Programmierung einführt, das heißt, im Imperativparadigma werden Aufgaben erledigt, indem dem Computer eine Reihe von Anweisungen bereitgestellt und diese dann ausgeführt werden. Ich hoffe, es hilft allen .
Empfohlenes Lernen: Python-Lerntutorial
In diesem Artikel erfahren Sie, was ein funktionales Paradigma ist und wie Sie Python für die funktionale Programmierung verwenden. Sie erfahren auch etwas über Listenverständnis und andere Formen des Verständnisses.
Im imperativen Paradigma wird eine Aufgabe erfüllt, indem dem Computer eine Folge von Anweisungen gegeben und diese dann ausgeführt werden. Beim Ausführen dieser Anweisungen können bestimmte Zustände geändert werden. Angenommen, Sie setzen A zunächst auf 5 und ändern dann den Wert von A. Zu diesem Zeitpunkt ändern Sie den Zustand von A im Sinne des internen Werts der Variablen.
Im funktionalen Paradigma sagen Sie dem Computer nicht, was er tun soll, sondern sagen ihm, was es ist. Was ist zum Beispiel der größte gemeinsame Teiler von Zahlen, was ist das Produkt von 1 bis n usw.
Daher können sich Variablen nicht ändern. Sobald Sie eine Variable festgelegt haben, bleibt dies für immer so (beachten Sie, dass es sich in rein funktionalen Sprachen nicht um Variablen handelt). Daher hat die funktionale Programmierung keine Nebenwirkungen. Ein Nebeneffekt ist, wenn eine Funktion etwas anderes als sich selbst ändert. Schauen wir uns einige Beispiele für typischen Python-Code an:
Die Ausgabe dieses Codes ist 5. Im funktionalen Paradigma ist das Mutieren von Variablen ein großes Tabu, und Funktionen, die Dinge außerhalb ihres Geltungsbereichs beeinflussen, sind ebenfalls ein großes Tabu. Das Einzige, was eine Funktion tun kann, ist etwas zu berechnen und als Ergebnis zurückzugeben.
Jetzt denken Sie vielleicht: „Keine Variablen, keine Nebenwirkungen? Warum ist das gut?“ Ich bin sicher, die meisten Leute sind darüber verwirrt.
Wenn eine Funktion zweimal mit denselben Parametern aufgerufen wird, liefert sie garantiert das gleiche Ergebnis. Wenn Sie mathematische Funktionen studiert haben, kennen Sie den Nutzen. Dies wird als referenzielle Transparenz bezeichnet. Da Funktionen keine Nebenwirkungen haben, können Sie das Programm beschleunigen, wenn Sie ein Programm erstellen, das etwas berechnet. Wenn func(2) bei jedem Aufruf 3 zurückgibt, können wir ihn in einer Tabelle speichern, was verhindert, dass das Programm dieselbe Funktion wiederholt ausführt.
Normalerweise verwenden wir in der funktionalen Programmierung keine Schleifen. Wir verwenden Rekursion. Rekursion ist ein mathematisches Konzept, das normalerweise „sich selbst aufrufen“ bedeutet. Verwenden Sie eine rekursive Funktion, die sich selbst wiederholt als Unterfunktion aufruft. Hier ist ein gutes Beispiel für rekursive Funktionen in Python:
Einige Programmiersprachen sind auch faul. Das bedeutet, dass sie erst in der letzten Sekunde rechnen oder etwas unternehmen. Wenn Sie Code schreiben, um 2 + 2 auszuführen, berechnet das Funktionsprogramm ihn nur dann, wenn Sie das Ergebnis tatsächlich verwenden müssen. Wir werden uns bald mit der Faulheit in Python befassen.
Um es zu verstehen, schauen wir uns zunächst an, was Iteration ist. Typischerweise sind Objekte, über die iteriert werden kann, Listen oder Arrays, aber Python verfügt über viele verschiedene Typen, über die iteriert werden kann. Sie können sogar Ihre eigenen Objekte erstellen, die durch die Implementierung magischer Methoden iteriert werden können. Magische Methoden sind wie eine API, die Ihren Objekten hilft, pythonischer zu werden. Sie müssen zwei magische Methoden implementieren, um ein Objekt iterierbar zu machen:
Die erste magische Methode „__iter__“ (Hinweis: doppelter Unterstrich hier) gibt das iterierbare Objekt zurück. Dies wird normalerweise am Anfang einer Schleife verwendet. „__next__“ gibt das nächste Objekt zurück.
Geben wir schnell ein Terminal ein und rufen den obigen Code auf:
Running wird ausgedruckt
In Python ist ein Iterator ein Objekt mit nur der magischen Methode __iter__. Dies bedeutet, dass Sie auf Standorte innerhalb eines Objekts zugreifen, das Objekt jedoch nicht durchqueren können. Einige Objekte verfügen über die magische Methode __next__ anstelle der magischen Methode __iter__, z. B. Sammlungen (wird später in diesem Artikel besprochen). Für diesen Artikel gehen wir davon aus, dass alles, was wir berühren, ein iterierbares Objekt ist.
Da wir nun wissen, was ein iterierbares Objekt ist, kehren wir zur Kartenfunktion zurück. Mit der Map-Funktion können wir auf jedes Element im Iterable eine Funktion anwenden. Map erfordert zwei Eingaben: die anzuwendende Funktion und das iterierbare Objekt.
Angenommen, wir haben eine Liste mit Zahlen wie diese:
Wir wollen jede Zahl quadrieren, wir können den folgenden Code schreiben:
Funktionale Funktionen in Python sind faul. Wenn wir „list“ nicht verwenden, speichert die Funktion die Definition von iterable anstelle der Liste selbst. Wir müssen Python explizit anweisen, „dies in eine Liste umzuwandeln“, damit wir sie verwenden können.
Es ist etwas seltsam, in Python plötzlich von der nicht-faulen zur faulen Auswertung zu wechseln. Wenn Sie eher in einer funktionalen Denkweise als in einer zwingenden Denkweise denken, werden Sie sich irgendwann daran gewöhnen.
Eine normale Funktion wie „square(num)“ zu schreiben ist nett, aber nicht richtig. Müssen wir eine vollständige Funktion definieren, um sie in der Karte verwenden zu können? Nun, wir können eine Funktion in der Karte mithilfe der Lambda-Funktion (anonym) definieren.
Ein Lambda-Ausdruck ist eine Funktion mit nur einer Zeile. Dieser Lambda-Ausdruck quadriert beispielsweise eine gegebene Zahl:
Lassen Sie es uns ausführen:
Sieht das nicht wie eine Funktion aus?
Nun, es ist etwas verwirrend, aber verständlich. Wir weisen der Variablen „Quadrat“ etwas zu. Was ist mit diesem:
teilt Python mit, dass es sich um eine Lambda-Funktion handelt und die Eingabe x heißt. Alles nach dem Doppelpunkt ist das, was Sie mit der Eingabe machen, und das Ergebnis wird automatisch zurückgegeben.
Um unser quadratisches Programm auf nur eine Codezeile zu vereinfachen, können wir Folgendes tun:
Im Lambda-Ausdruck befinden sich also alle Parameter auf der linken Seite und die Dinge, die Sie mit ihnen machen möchten, auf der rechten Seite . Es ist ein bisschen chaotisch. Aber die Wahrheit ist, dass es einen gewissen Spaß macht, Code zu schreiben, den nur andere funktionale Programmierer lesen können. Außerdem ist es ziemlich cool, eine Funktion in eine Codezeile umzuwandeln.
Reduce ist eine Funktion, die Iteration in eine Sache verwandelt. Normalerweise verwenden Sie die Funktion „Reduzieren“ für eine Liste, um Berechnungen durchzuführen und diese auf eine Zahl zu reduzieren. Reduzieren sieht so aus:
Wir verwenden oft Lambda-Ausdrücke als Funktionen.
Das Produkt einer Liste ist die Multiplikation jeder einzelnen Zahl. Dazu würden Sie Code wie diesen schreiben:
Aber mit Reduce können Sie so schreiben:
Erhalten Sie die gleiche Funktionalität, der Code ist kürzer und im Falle der Verwendung funktionaler Programmierung ist er übersichtlicher. (Hinweis: Die Reduzierungsfunktion ist keine integrierte Funktion mehr in Python3 und muss aus dem Functools-Modul importiert werden.)
Die Filterfunktion verwendet eine iterierbare Methode und filtert alles heraus, was Sie nicht benötigen das Iterierbare.
Normalerweise erfordert ein Filter eine Funktion und eine Liste. Es wendet eine Funktion auf jedes Element in der Liste an und führt nichts aus, wenn die Funktion „True“ zurückgibt. Wenn False zurückgegeben wird, wird das Element aus der Liste entfernt.
Die Syntax ist wie folgt:
Schauen wir uns ein kleines Beispiel an. Ohne Filter würden wir schreiben:
Mit Filter können wir so schreiben:
Python ist eine Sprache das sich ständig weiterentwickelt und populär macht, wird immer noch aktualisiert. Beim Lernen wird empfohlen, einige Studienpartner zu finden, um gemeinsam zu studieren und zu diskutieren, um bessere Ergebnisse zu erzielen. Wenn Sie Python lernen möchten, können Sie sich gerne der Python-Lernaustauschgruppe (627012464) anschließen, um gemeinsam zu betreuen und zu lernen. Es enthält Entwicklungstools, viele nützliche Informationen und technische Informationen zum Teilen!
Funktionen höherer Ordnung können Funktionen als Parameter annehmen und Funktionen zurückgeben. Ein sehr einfaches Beispiel ist wie folgt:
Das zweite Beispiel für die Rückgabe einer Funktion:
Ich habe am Anfang gesagt, dass reine funktionale Programmiersprachen keine Variablen haben. Funktionen höherer Ordnung machen dies einfacher.
Alle Funktionen in Python sind erstklassige Bürger. Ein First-Class-Bürger ist so definiert, dass er eines oder mehrere der folgenden Merkmale aufweist:
Zur Laufzeit erstellt
Zuweisung einer Variablen oder eines Elements in einer Datenstruktur
Als Argument an eine Funktion übergeben
Wird als Ergebnis einer Funktion zurückgegeben
Alle Funktionen in Python können als Funktionen höherer Ordnung verwendet werden.
Teilweise Anwendung (auch Schließung genannt) ist etwas seltsam, aber sehr cool. Sie können eine Funktion aufrufen, ohne alle erforderlichen Parameter anzugeben. Sehen wir uns das an einem Beispiel an. Wir möchten eine Funktion erstellen, die zwei Argumente benötigt, eine Basis und einen Exponenten, und die Basis wie folgt potenziert zurückgibt:
Jetzt möchten wir eine spezielle Quadratfunktion, die mithilfe der Potenzfunktion das Quadrieren einer Zahl berechnet:
Das funktioniert, aber was ist, wenn wir eine Würfelfunktion wollen? Oder wie wäre es, die Funktion der vierten Potenz herauszufinden? Können wir weiter darüber schreiben? Nun, das können Sie. Aber Programmierer sind faul. Wenn Sie dasselbe immer und immer wieder wiederholen, ist das ein Zeichen dafür, dass es einen schnelleren Weg gibt, Dinge zu beschleunigen, die Sie davon abhalten, es zu wiederholen. Wir können hier Verschlüsse verwenden. Schauen wir uns ein Beispiel für die Quadratfunktion mit Verschlüssen an:
Ist das nicht cool! Wir können eine Funktion, die zwei Parameter erfordert, mit nur einem Parameter aufrufen.
Wir können auch eine Schleife verwenden, um eine Potenzfunktion zu generieren, die Potenzen vom Würfel bis hin zu 1000 implementiert.
Sie haben vielleicht bemerkt, dass sich viele Dinge, die wir in der funktionalen Programmierung tun möchten, um Listen drehen. Mit Ausnahme von Reduzierfunktionen und Schließungen generieren alle angezeigten Funktionen Listen. Guido (der Vater von Python) mochte funktionale Ausdrücke in Python nicht, da Python bereits über eine eigene Methode zum Generieren von Listen verfügte.
Wenn Sie „dies importieren“ in die interaktive Umgebung von Python schreiben, erhalten Sie:
Das ist das Zen von Python. Dies ist ein Gedicht darüber, was es bedeutet, Pythonisch zu sein. Der Teil, den wir abdecken möchten, ist:
Es sollte einen – und vorzugsweise nur einen – offensichtlichen Weg geben, dies zu tun (sollte versuchen, eine, vorzugsweise nur eine offensichtliche Lösung zu finden)
In Python können Karte und Filter dies tun Dieselben Operationen wie Listenverständnisse (unten besprochen). Dies verstößt gegen eine der Regeln des Zen von Python, sodass diese Teile der funktionalen Programmierung nicht als „pythonisch“ gelten.
Ein weiteres Thema ist Lambda. In Python ist eine Lambda-Funktion eine normale Funktion. Lambda ist syntaktischer Zucker. Diese beiden Aussagen sind gleichwertig.
Eine normale Funktion kann alles, was eine Lambda-Funktion kann, aber umgekehrt kann sie nicht funktionieren. Lambda-Funktionen können nicht alles tun, was normale Funktionen können.
Dies ist ein kurzes Argument, warum funktionale Programmierung nicht gut in das gesamte Python-Ökosystem passt. Sie haben vielleicht bemerkt, dass ich das Listenverständnis bereits erwähnt habe und wir werden es jetzt besprechen.
Zuvor habe ich erwähnt, dass Sie Listenverständnisse für alles verwenden können, was Sie mit Karten oder Filtern tun können. Listenverständnis ist eine Möglichkeit, Listen in Python zu generieren. Die Syntax lautet:
Quadrieren wir jede Zahl in der Liste, zum Beispiel:
Wir können sehen, wie die Funktion auf jedes Element in der Liste angewendet wird. Wie wenden wir Filter an? Schauen Sie sich den vorherigen Code an:
Wir können ihn wie folgt in ein Listenverständnis umwandeln:
Listet Unterstützungsanweisungen wie if auf. Sie müssen nicht mehr eine Million Funktionen auf etwas anwenden, um das zu bekommen, was Sie wollen. Wenn Sie versuchen möchten, eine Art Liste zu erstellen, erscheint es tatsächlich sauberer und einfacher, ein Listenverständnis zu verwenden. Was wäre, wenn wir jede Zahl unter 0 in der Liste quadrieren wollten? Mit Lambda, Karte und Filter würden Sie schreiben:
Das scheint sehr lang und kompliziert zu sein. Bei Listenverständnissen gilt nur:
Listenverständnisse funktionieren nur mit Listen. Karte und Filter eignen sich für jedes iterierbare Objekt. Was nützt das also? Sie können jeden Abzug auf jedes iterierbare Objekt anwenden, auf das Sie stoßen.
Sie können eine Ableitung für jedes iterierbare Objekt erstellen.
Jedes iterierbare Objekt kann mithilfe der Ableitung generiert werden. Ab Python 2.7 können Sie sogar Wörterbücher (Hashmaps) generieren.
Wenn es iterierbar ist, können Sie es generieren. Schauen wir uns die letzten Beispiele an.
set ist eine Liste von Elementen, in der kein Element zweimal wiederholt wird.
Die Elemente im Set haben keine Reihenfolge.
Möglicherweise fällt Ihnen auf, dass set die gleichen geschweiften Klammern hat wie dict. Python ist sehr schlau. Je nachdem, ob Sie einen Wert für das Diktat angeben, weiß es, ob Sie einen Diktatabzug oder einen Satzabzug schreiben.
Empfohlenes Lernen: Python-Tutorial
Das obige ist der detaillierte Inhalt vonLassen Sie uns gemeinsam die funktionale Python-Programmierung analysieren. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!