180 votes

Ce qui est le ' Pythonique ' équivalente à la ' pli ' fonction de programmation fonctionnelle ?

Ce qui est le plus idiomatique moyen de parvenir à quelque chose comme ce qui suit, en Haskell:

foldl (+) 0 [1,2,3,4,5]
--> 15

Ou son équivalent en Ruby:

[1,2,3,4,5].inject(0) {|m,x| m + x}
#> 15

Évidemment, Python fournit l' reduce de la fonction, qui est une implémentation de fois, exactement comme ci-dessus, cependant, on m'a dit que le " pythonic le mode de programmation est pour éviter lambda termes et fonctions d'ordre supérieur, préférant la liste des compréhensions lorsque cela est possible. Donc, est-il un moyen privilégié de pliage, une liste, de liste ou de structure en Python qui n'est pas l' reduce de la fonction, ou est - reduce le idiomatiques moyen d'y parvenir?

161voto

larsmans Points 167484

Le Pythonic façon de conclure un tableau est sum. Pour d'autres fins, vous pouvez parfois utiliser une combinaison de reduce et de la operator module, par exemple

def product(xs):
    return reduce(operator.mul, xs, 1)

Sachez que reduce est en fait un foldl, en Haskell termes. Il n'y a pas de syntaxe particulière pour effectuer des plis, il n'y a pas builtin foldr, et en fait à l'aide de reduce avec les opérateurs associatifs est considérée comme un mauvais style.

À l'aide de fonctions d'ordre supérieur est tout à fait pythonic, il en fait bon usage de Python du principe que tout est un objet, y compris les fonctions et les classes. Vous avez raison, les lambdas sont désapprouvées par les Pythoneux, mais surtout parce qu'ils ont tendance à ne pas être très lisible quand ils deviennent complexes.

8voto

Zenobe Points 41

Vous pouvez réinventer la roue ainsi :

1voto

JBernardo Points 14772

La réponse réelle à cette (réduire) il s’agit : il suffit d’utiliser une boucle !

Ce sera plus rapide qu’a réduire et choses comme Pypy peut optmize boucles comme ça.

BTW, le devrait être résolu avec le fonction

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