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 reduceim 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.