332 Stimmen

Warum eignet sich Python nicht besonders gut für die funktionale Programmierung?

Ich habe immer gedacht, dass funktionale Programmierung in Python möglich ist. Daher war ich erstaunt, dass Python in den folgenden Artikeln nicht besonders erwähnt wurde este Frage, und wenn es erwähnt wurde, war es normalerweise nicht sehr positiv. Allerdings wurden nicht viele Gründe dafür genannt (fehlende Mustererkennung und algebraische Datentypen wurden erwähnt). Meine Frage lautet also: Warum ist Python nicht sehr gut für die funktionale Programmierung geeignet? Gibt es mehr Gründe als das Fehlen von Mustererkennung und algebraischen Datentypen? Oder sind diese Konzepte so wichtig für die funktionale Programmierung, dass eine Sprache, die sie nicht unterstützt, nur als zweitklassige funktionale Programmiersprache eingestuft werden kann? (Bedenken Sie, dass meine Erfahrung mit funktionaler Programmierung recht begrenzt ist).

403voto

Nathan Shively-Sanders Punkte 17999

In der Frage, auf die Sie sich beziehen, wird gefragt, welche Sprachen sowohl OO als auch funktionale Programmierung unterstützen. Python tut das nicht fördern. funktionale Programmierung, auch wenn sie Werke ziemlich gut.

Das beste Argument gegen funktionale Programmierung in Python ist, dass imperative/OO-Anwendungsfälle von Guido sorgfältig berücksichtigt werden, während Anwendungsfälle der funktionalen Programmierung nicht berücksichtigt werden. Wenn ich imperatives Python schreibe, ist es eine der hübschesten Sprachen, die ich kenne. Wenn ich funktionales Python schreibe, wird es so hässlich und unangenehm wie eine durchschnittliche Sprache, die keine BDFL .

Das soll nicht heißen, dass es schlecht ist, sondern nur, dass man sich mehr anstrengen muss, als wenn man zu einer Sprache wechselt, die funktionale Programmierung fördert, oder wenn man zu OO-Python wechselt.

Hier sind die funktionalen Dinge, die ich in Python vermisse:


  • Kein Musterabgleich und keine Schwanzrekursion bedeuten, dass Ihre grundlegenden Algorithmen zwingend geschrieben werden müssen. Rekursion ist in Python hässlich und langsam.
  • Eine kleine Listenbibliothek und keine funktionalen Wörterbücher bedeuten, dass man vieles selbst schreiben muss.
  • Da es keine Syntax für Currying oder Komposition gibt, ist der punktfreie Stil ungefähr so voll von Interpunktionen wie die explizite Übergabe von Argumenten.
  • Iteratoren anstelle von Lazy Lists bedeutet, dass Sie wissen müssen, ob Sie Effizienz oder Persistenz wünschen, und dass Sie die Aufrufe an list wenn Sie Persistenz wünschen. (Iteratoren werden nur einmal verwendet)
  • Pythons einfache imperative Syntax und sein einfacher LL1-Parser bedeuten, dass eine bessere Syntax für if-Ausdrücke und Lambda-Ausdrücke im Grunde unmöglich ist. Guido mag es so, und ich denke, er hat Recht.

108voto

Jason Baker Punkte 180981

Guido hat eine gute Erklärung dafür aquí . Hier ist der wichtigste Teil:

Ich habe Python nie als stark von stark beeinflusst von funktionaler Sprachen beeinflusst, egal was die Leute sagen oder denken. Ich war viel mehr vertraut mit imperativen Sprachen wie C und Algol 68 vertraut, und obwohl ich die Funktionen zu Objekten erster Klasse machte, sah ich sah ich Python nicht als eine funktionale Programmiersprache. [ ] war es klar, dass die Benutzer viel mehr mit Listen und Funktionen machen wollten.

...

Es ist auch erwähnenswert, dass ich nicht beneidet habe [ ] von Schließungen bei der Entwicklung Entwicklung von vielen anderen fortgeschrittenen Programmierfunktionen. Zum Beispiel, bestimmte Aspekte der New-Style-Klassen, Dekorateure und andere moderne Funktionen sind auf diese Fähigkeit angewiesen.

Und schließlich, auch wenn eine Reihe von Funktionen der funktionalen Programmierung im Laufe der Jahre eingeführt wurden, ist Python immer noch bestimmte Funktionen, die in "echten" funktionalen Sprachen. Zum Beispiel kann Python nicht bestimmte Arten von Optimierungen durch (z. B. Schwanzrekursion). Im Allgemeinen ist Python aufgrund seiner extremen dynamischen Natur von Python ist es unmöglich, die die Art von Kompilierzeit-Optimierung die man von funktionalen Sprachen wie Haskell oder ML kennen. Und das ist auch gut so.

Ich ziehe daraus zwei Schlüsse:

  1. Der Schöpfer der Sprache betrachtet Python nicht wirklich als eine funktionale Sprache. Daher ist es möglich, "funktional-ähnliche" Funktionen zu sehen, aber es ist unwahrscheinlich, dass Sie etwas sehen, das definitiv funktional ist.
  2. Die dynamische Natur von Python verhindert einige der Optimierungen, die man in anderen funktionalen Sprachen sieht. Zugegeben, Lisp ist genauso dynamisch (wenn nicht noch dynamischer) wie Python, daher ist dies nur eine teilweise Erklärung.

54voto

Jacob B Punkte 1937

Scheme hat keine algebraischen Datentypen oder Mustervergleiche, aber es ist sicherlich eine funktionale Sprache. Ärgerliche Dinge über Python aus Sicht der funktionalen Programmierung:

  1. Verkrüppelte Lambdas. Da Lambdas nur einen Ausdruck enthalten können und man nicht alles so einfach in einem Ausdruckskontext tun kann, bedeutet dies, dass die Funktionen, die Sie "on the fly" definieren können, begrenzt sind.

  2. Ifs sind Aussagen, keine Ausdrücke. Das bedeutet unter anderem, dass Sie kein Lambda mit einem If darin haben können. (Dies wurde in Python 2.5 durch Ternaries behoben, aber es sieht hässlich aus.)

  3. Guido droht Karte entfernen, filtern und reduzieren von Zeit zu Zeit

Auf der anderen Seite hat Python lexikalische Schließungen, Lambdas und Listenauffassungen (die wirklich ein "funktionales" Konzept sind, ob Guido es zugibt oder nicht). Ich programmiere viel im "funktionalen Stil" in Python, aber ich würde kaum sagen, dass es ideal ist.

24voto

Konrad Rudolph Punkte 503837

Ich würde Python nie als "funktional" bezeichnen, aber wann immer ich in Python programmiere, ist der Code am Ende fast immer rein funktional.

Zugegeben, das liegt vor allem an der sehr schönen Listenauffassung. Ich würde Python also nicht unbedingt als funktionale Programmiersprache empfehlen, aber ich würde jedem, der Python benutzt, funktionale Programmierung empfehlen.

18voto

yairchu Punkte 21749

Lassen Sie mich das anhand eines Stücks Code demonstrieren, das aus einer Antwort auf eine "funktionale" Frage stammt Python-Frage zu SO

Python:

def grandKids(generation, kidsFunc, val):
  layer = [val]
  for i in xrange(generation):
    layer = itertools.chain.from_iterable(itertools.imap(kidsFunc, layer))
  return layer

Haskell:

grandKids generation kidsFunc val =
  iterate (concatMap kidsFunc) [val] !! generation

Der Hauptunterschied besteht darin, dass die Standardbibliothek von Haskell nützliche Funktionen für die funktionale Programmierung enthält: in diesem Fall iterate , concat y (!!)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X