Comme Guido dit dans son Le sort de réduire() en Python 3000 post:
Alors maintenant, réduire(). C'est en fait celui que j'ai toujours détesté le plus, parce que, en dehors de quelques exemples impliquant des + ou *, presque chaque fois que je vois un de réduire() avec un non-trivial argument de fonction, j'ai besoin de saisir stylo et du papier pour diagramme de ce fait d'être introduit dans cette fonction avant que je comprends ce que le réduire() est censé faire. Donc dans mon esprit, l'applicabilité de réduire() est assez limitée à des opérateurs associatifs, et dans tous les autres cas, il est préférable d'écrire l'accumulation de la boucle de manière explicite.
Il est un excellent exemple d'une confusion reduce
de la Programmation Fonctionnelle HOWTO article:
Rapide, quel est le code suivant en train de faire?
total = reduce(lambda a, b: (0, a[1] + b[1]), items)[1]
Vous pouvez comprendre, mais il faut du temps pour démêler l'expression de comprendre
ce qui se passe. À l'aide d'un court imbriquée def déclarations rend les choses un peu mieux:
def combine (a, b):
return 0, a[1] + b[1]
total = reduce(combine, items)[1]
Mais il serait le meilleur de tous, si j'avais simplement utilisé une boucle for:
total = 0
for a, b in items:
total += b
Ou de la somme() intégré et un générateur d'expression:
total = sum(b for a,b in items)
De nombreuses utilisations de réduire() sont plus claires lorsqu'il est écrit que pour les boucles.