74 votes

Quel est le problème avec reduction ()?

Il semble y avoir beaucoup de discussions animées sur le net concernant les modifications apportées à la fonction reduction () dans Python 3.0 et sur la manière de les supprimer. J'ai un peu de difficulté à comprendre pourquoi c'est le cas; Je trouve assez raisonnable de l’utiliser dans divers cas. Si le mépris était simplement subjectif, je ne peux pas imaginer qu'un si grand nombre de personnes s'en soucierait.

Qu'est-ce que je rate? Quel est le problème avec reduction ()?

76voto

DzinX Points 13452

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.

35voto

John Millikin Points 86775

reduce() n'est pas supprimé - il est simplement déplacé dans le module functools . Le raisonnement de Guido est le suivant: sauf dans des cas triviaux tels que la somme, le code écrit à l'aide de reduce() est généralement plus clair lorsqu'il est écrit sous forme de boucle d'accumulation.

8voto

Eli Bendersky Points 82298

Les gens s'inquiètent du fait que cela encourage un style de programmation obscurci, ce qui peut être réalisé avec des méthodes plus claires.

Je ne suis pas contre moi-même, je trouve aussi que c'est parfois un outil utile.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X