Ich habe immer gedacht, dass funktionale Programmierung in Python möglich ist. Daher war ich überrascht, dass Python in dieser Frage nicht viel erwähnt wurde , und als es erwähnt wurde, war es normalerweise nicht sehr positiv. Hierfür wurden jedoch nicht viele Gründe angegeben (fehlende Musterübereinstimmung und algebraische Datentypen wurden erwähnt). Meine Frage ist also: Warum ist Python nicht sehr gut für die funktionale Programmierung? Gibt es mehr Gründe als das Fehlen von Mustervergleich und algebraischen Datentypen? Oder sind diese Konzepte für die funktionale Programmierung so wichtig, dass eine Sprache, die sie nicht unterstützt, nur als zweitklassige funktionale Programmiersprache eingestuft werden kann? (Denken Sie daran, dass meine Erfahrung mit funktionaler Programmierung sehr begrenzt ist.)
quelle
Antworten:
Bei der Frage, auf die Sie sich beziehen, wird gefragt, welche Sprachen sowohl die OO- als auch die funktionale Programmierung fördern. Python fördert keine funktionale Programmierung, obwohl es ziemlich gut funktioniert .
Das beste Argument gegen die funktionale Programmierung in Python ist, dass imperative / OO-Anwendungsfälle von Guido sorgfältig geprüft werden, während dies bei funktionalen Programmieranwendungsfällen nicht der Fall ist. Wenn ich imperatives Python schreibe, ist es eine der schönsten Sprachen, die ich kenne. Wenn ich funktionales Python schreibe, wird es so hässlich und unangenehm wie Ihre durchschnittliche Sprache ohne BDFL .
Das heißt nicht, dass es schlecht ist, nur dass Sie härter arbeiten müssen als wenn Sie zu einer Sprache wechseln würden, die die funktionale Programmierung fördert, oder zum Schreiben von OO Python.
Hier sind die funktionalen Dinge, die ich in Python vermisse:
list
Umgebung verteilen müssen, wenn Sie Persistenz wünschen. (Iteratoren werden einmal verwendet)quelle
Guido hat eine gute Erklärung dafür hier . Hier ist der relevanteste Teil:
Ich ziehe zwei Dinge heraus:
quelle
Das Schema hat keine algebraischen Datentypen oder Mustervergleiche, aber es ist sicherlich eine funktionale Sprache. Ärgerliche Dinge über Python aus Sicht der funktionalen Programmierung:
Verkrüppelte Lambdas. Da Lambdas nur einen Ausdruck enthalten kann und Sie in einem Ausdruckskontext nicht alles so einfach ausführen können, sind die Funktionen, die Sie "on the fly" definieren können, begrenzt.
Ifs sind Anweisungen, keine Ausdrücke. Dies bedeutet unter anderem, dass Sie kein Lambda mit einem If darin haben können. (Dies wird durch Ternaries in Python 2.5 behoben, sieht aber hässlich aus.)
Guido droht Karte, Filter zu entfernen, und reduzieren jeder einmal in eine Weile
Auf der anderen Seite hat Python lexikalische Verschlüsse, Lambdas und Listenverständnisse (die wirklich ein "funktionales" Konzept sind, unabhängig davon, ob Guido es zugibt oder nicht). Ich programmiere viel in Python im "funktionalen Stil", aber ich würde kaum sagen, dass es ideal ist.
quelle
Ich würde Python niemals als "funktional" bezeichnen, aber wenn ich in Python programmiere, ist der Code immer fast rein funktional.
Zugegeben, das liegt hauptsächlich am sehr guten Listenverständnis. Daher würde ich Python nicht unbedingt als funktionale Programmiersprache vorschlagen, aber ich würde jedem, der Python verwendet, funktionale Programmierung vorschlagen.
quelle
Lassen Sie mich mit einem Code demonstrieren, der aus einer Antwort auf eine "funktionale" Python-Frage zu SO stammt
Python:
Haskell:
Der wesentliche Unterschied ist hier, dass Haskell Standard - Bibliothek nützliche Funktionen für funktionale Programmierung hat: in diesem Fall
iterate
,concat
und(!!)
quelle
grandKids()
body mit Generatorausdrücken :return reduce(lambda a, v: concat((x for x in kidsFunc(v)) for v in a), xrange(generation), [val])
.concat
:return reduce(lambda a, v: (x for v in a for x in kidsFunc(v)), xrange(generation), [val])
itertools.chain.from_iterable
Eine Sache, die für diese Frage (und die Antworten) wirklich wichtig ist, ist die folgende: Was zum Teufel ist funktionale Programmierung und was sind die wichtigsten Eigenschaften davon. Ich werde versuchen, meine Meinung dazu zu äußern:
Funktionale Programmierung ähnelt dem Schreiben von Mathematik auf einem Whiteboard. Wenn Sie Gleichungen auf ein Whiteboard schreiben, denken Sie nicht an eine Ausführungsreihenfolge. Es gibt (typischerweise) keine Mutation. Sie kommen am nächsten Tag nicht zurück und sehen es sich an, und wenn Sie die Berechnungen erneut durchführen, erhalten Sie ein anderes Ergebnis (oder Sie können, wenn Sie frischen Kaffee getrunken haben :)). Grundsätzlich ist das, was auf der Tafel steht, da, und die Antwort war bereits da, als Sie anfingen, Dinge aufzuschreiben. Sie haben einfach noch nicht bemerkt, was es ist.
Funktionale Programmierung ist sehr ähnlich; Sie ändern nichts, Sie bewerten nur die Gleichung (oder in diesem Fall "Programm") und finden heraus, wie die Antwort lautet. Das Programm ist immer noch da, unverändert. Das gleiche gilt für die Daten.
Ich würde Folgendes als die wichtigsten Merkmale der funktionalen Programmierung einstufen: a) referenzielle Transparenz - Wenn Sie dieselbe Aussage zu einem anderen Zeitpunkt und an einem anderen Ort bewerten, aber mit denselben variablen Werten, bedeutet dies immer noch dasselbe. b) Keine Nebenwirkung - egal wie lange Sie auf das Whiteboard starren, die Gleichung, die ein anderer Mann auf ein anderes Whiteboard schaut, ändert sich nicht versehentlich. c) Funktionen sind ebenfalls Werte. die herumgereicht und mit oder auf andere Variablen angewendet werden können. d) Funktionszusammensetzung, Sie können h = g · f ausführen und somit eine neue Funktion h (..) definieren, die dem Aufruf von g (f (..)) entspricht.
Diese Liste befindet sich in meiner priorisierten Reihenfolge, daher ist referenzielle Transparenz am wichtigsten, gefolgt von keinen Nebenwirkungen.
Wenn Sie nun Python durchgehen und prüfen, wie gut die Sprache und die Bibliotheken diese Aspekte unterstützen und garantieren, sind Sie auf dem besten Weg, Ihre eigene Frage zu beantworten.
quelle
Python ist fast eine funktionale Sprache. Es ist "funktionale Lite".
Es hat zusätzliche Funktionen, so dass es für einige nicht rein genug ist.
Es fehlen auch einige Funktionen, so dass es für einige nicht vollständig genug ist.
Die fehlenden Funktionen sind relativ einfach zu schreiben. Schauen Sie sich Beiträge wie diese auf FP in Python.
quelle
Ein weiterer Grund, der oben nicht erwähnt wurde, ist, dass viele integrierte Funktionen und Methoden von integrierten Typen ein Objekt ändern, das geänderte Objekt jedoch nicht zurückgeben. Wenn diese geänderten Objekte zurückgegeben würden, würde dies den Funktionscode sauberer und prägnanter machen. Wenn beispielsweise some_list.append (some_object) some_list mit angehängtem some_object zurückgegeben hat.
quelle
Neben anderen Antworten ist ein Grund dafür, dass Python und die meisten anderen Multi-Paradigmen-Sprachen für eine echte funktionale Programmierung nicht gut geeignet sind, dass ihre Compiler / virtuellen Maschinen / Laufzeiten keine funktionale Optimierung unterstützen. Diese Art der Optimierung wird erreicht, indem der Compiler die mathematischen Regeln versteht. Beispielsweise unterstützen viele Programmiersprachen a
map
Funktion oder Methode. Dies ist eine ziemlich Standardfunktion, die eine Funktion als ein Argument und eine iterable als zweites Argument verwendet und diese Funktion dann auf jedes Element in der iterable anwendet.Wie auch immer, es stellt sich heraus, dass
map( foo() , x ) * map( foo(), y )
es dasselbe ist wiemap( foo(), x * y )
. Der letztere Fall ist tatsächlich schneller als der erstere, da der erstere zwei Kopien ausführt, während der letztere eine ausführt.Bessere Funktionssprachen erkennen diese mathematisch basierten Beziehungen und führen die Optimierung automatisch durch. Sprachen, die nicht dem Funktionsparadigma gewidmet sind, werden wahrscheinlich nicht optimiert.
quelle
map( foo() , x ) * map( foo(), y ) == map( foo(), x * y )
gilt nicht für alle Funktionen. Betrachten Sie beispielsweise den Fall bei derfoo
Berechnung einer Ableitung.+
statt*
.