Wat is het probleem met reduce()?

Er lijkt veel verhitte discussie op het net te zijn over de wijzigingen aan de functie reduce() in python 3.0 en hoe deze moet worden verwijderd. Ik heb een beetje moeite om te begrijpen waarom dit het geval is; Ik vind het heel redelijk om het in verschillende gevallen te gebruiken. Als de minachting gewoon subjectief was, kan ik me niet voorstellen dat zo’n groot aantal mensen er iets om zou geven.

Wat mis ik? Wat is het probleem met reduce()?


Antwoord 1, autoriteit 100%

Zoals Guido zegt in zijn Het lot van reduce() in Python 3000bericht:

Dus nu reduce(). Dit is eigenlijk degene die ik altijd het meest heb gehaat, omdat, afgezien van een paar voorbeelden met + of *, bijna elke keer dat ik een reduce()-aanroep zie met een niet-triviaal functieargument, ik pen en papier moet pakken om diagram wat er daadwerkelijk in die functie wordt ingevoerd voordat ik begrijp wat de reduce() zou moeten doen. Dus naar mijn mening is de toepasbaarheid van reduce() vrijwel beperkt tot associatieve operators, en in alle andere gevallen is het beter om de accumulatielus expliciet uit te schrijven.

Er is een uitstekend voorbeeld van een verwarrende reducein de functioneel programmeren HOWTOartikel:

Snel, wat doet de volgende code?

total = reduce(lambda a, b: (0, a[1] + b[1]), items)[1]

Je kunt het uitzoeken, maar het kost tijd om de uitdrukking te ontwarren om erachter te komen
wat is er aan de hand. Het gebruik van korte geneste def-statements maakt de zaken een beetje beter:

def combine (a, b):
    return 0, a[1] + b[1]
total = reduce(combine, items)[1]

Maar het zou het beste zijn als ik gewoon een for-lus had gebruikt:

total = 0
for a, b in items:
    total += b

Of de ingebouwde sum() en een generator-expressie:

total = sum(b for a,b in items)

Veel gebruik van reduce() is duidelijker wanneer het wordt geschreven als for-lussen.


Antwoord 2, autoriteit 47%

reduce()wordt niet verwijderd — het wordt gewoon verplaatst naar de functools-module. Guido’s redenering is dat, behalve in triviale gevallen zoals sommatie, code die is geschreven met reduce()meestal duidelijker is als deze wordt geschreven als een accumulatielus.


Antwoord 3, autoriteit 12%

Mensen maken zich zorgen dat het een versluierde programmeerstijl aanmoedigt, iets dat met duidelijkere methoden kan worden bereikt.

Ik ben zelf niet tegen verminderen, ik vind het soms ook een handig hulpmiddel.


Antwoord 4, autoriteit 5%

De belangrijkste reden van het bestaan ​​van reduce is het vermijden van het schrijven van expliciete for-lussen met accumulatoren. Hoewel python enkele faciliteiten heeft om de functionele stijl te ondersteunen, wordt het niet aangemoedigd. Als je van de ‘echte’ en niet ‘pythonische’ functionele stijl houdt, gebruik dan een moderne Lisp (Clojure?) of Haskell.


Antwoord 5

Het gebruik van reduce om de waarde van een polynoom te berekenen met de methode van Horner is zowel compact als expressief.

Bereken de polynoomwaarde bij x.
a is een reeks coëfficiënten voor de polynoom

def poynomialValue(a,x):
   return reduce(lambda value, coef: value*x + coef, a)

Other episodes