Wie Guido in seinem Beitrag Das Schicksal von redu () in Python 3000 sagt :
Reduzieren Sie jetzt (). Dies ist eigentlich die, die ich immer am meisten gehasst habe, denn abgesehen von einigen Beispielen mit + oder * muss ich fast jedes Mal, wenn ich einen redu () - Aufruf mit einem nicht trivialen Funktionsargument sehe, Stift und Papier greifen Diagramm, was tatsächlich in diese Funktion eingespeist wird, bevor ich verstehe, was das redu () tun soll. Meiner Meinung nach ist die Anwendbarkeit von redu () weitgehend auf assoziative Operatoren beschränkt, und in allen anderen Fällen ist es besser, die Akkumulationsschleife explizit zu schreiben.
Es gibt ein hervorragendes Beispiel für eine Verwirrung reduce
im HOWTO- Artikel zur funktionalen Programmierung :
Schnell, was macht der folgende Code?
total = reduce(lambda a, b: (0, a[1] + b[1]), items)[1]
Sie können es herausfinden, aber es braucht Zeit, um den Ausdruck zu entwirren, um herauszufinden, was los ist. Die Verwendung einer kurzen verschachtelten def-Anweisung macht die Dinge ein bisschen besser:
def combine (a, b):
return 0, a[1] + b[1]
total = reduce(combine, items)[1]
Aber es wäre am besten, wenn ich einfach eine for-Schleife verwendet hätte:
total = 0
for a, b in items:
total += b
Oder die eingebaute Summe () und ein Generatorausdruck:
total = sum(b for a,b in items)
Viele Verwendungen von redu () sind klarer, wenn sie wie für Schleifen geschrieben werden.
total = reduce(lambda total, (a,b): total + b, items, 0)
reduce
weil damit unklarer Code geschrieben werden kann." Nun, so kann**
,+
und-
. Sollen wir sie umziehenfunctools
?reduce()
wird nicht entfernt - es wird einfach in dasfunctools
Modul verschoben . Guidos Argumentation ist, dass mit Ausnahme von trivialen Fällen wie Summierung der mit geschriebene Codereduce()
normalerweise klarer ist, wenn er als Akkumulationsschleife geschrieben wird.quelle
Die Leute befürchten, dass dies einen verschleierten Programmierstil fördert und etwas tut, das mit klareren Methoden erreicht werden kann.
Ich bin nicht dagegen, mich zu reduzieren, ich finde es manchmal auch ein nützliches Werkzeug.
quelle
Der Hauptgrund für die Existenz von Reduce besteht darin, das explizite Schreiben für Schleifen mit Akkumulatoren zu vermeiden. Obwohl Python über einige Funktionen zur Unterstützung des Funktionsstils verfügt, wird dies nicht empfohlen. Wenn Sie den "echten" und nicht den "pythonischen" Funktionsstil mögen, verwenden Sie stattdessen ein modernes Lisp (Clojure?) Oder Haskel.
quelle
Die Verwendung von reduzieren zur Berechnung des Werts eines Polynoms mit der Horner-Methode ist sowohl kompakt als auch ausdrucksstark.
Berechnen Sie den Polynomwert bei x. a ist ein Array von Koeffizienten für das Polynom
def poynomialValue(a,x): return reduce(lambda value, coef: value*x + coef, a)
quelle
reduce
ein Problem?" Antwort: "Hier ist ein Anwendungsfall fürreduce
".