Est-ce que quelqu'un ici a un code utile qui utilise la fonction reduce() en python ? Y a-t-il du code autre que les habituels + et * que l'on voit dans les exemples ?
Voir Le sort de reduce() dans Python 3000 par GvR
Est-ce que quelqu'un ici a un code utile qui utilise la fonction reduce() en python ? Y a-t-il du code autre que les habituels + et * que l'on voit dans les exemples ?
Voir Le sort de reduce() dans Python 3000 par GvR
Les autres utilisations que j'ai trouvées en dehors de + et * étaient avec et et ou, mais maintenant nous avons any
et all
pour remplacer ces cas.
foldl
et foldr
reviennent souvent dans Scheme...
Voici quelques utilisations mignonnes :
Aplatir une liste
Objectif : tourner [[1, 2, 3], [4, 5], [6, 7, 8]]
en [1, 2, 3, 4, 5, 6, 7, 8]
.
reduce(list.__add__, [[1, 2, 3], [4, 5], [6, 7, 8]], [])
Liste des chiffres d'un numéro
Objectif : tourner [1, 2, 3, 4, 5, 6, 7, 8]
en 12345678
.
C'est laid et lent :
int("".join(map(str, [1,2,3,4,5,6,7,8])))
Pretty reduce
manière :
reduce(lambda a,d: 10*a+d, [1,2,3,4,5,6,7,8], 0)
reduce()
peut être utilisé pour trouver Le plus petit commun multiple pour 3 nombres ou plus :
#!/usr/bin/env python
from fractions import gcd
from functools import reduce
def lcm(*args):
return reduce(lambda a,b: a * b // gcd(a, b), args)
Ejemplo:
>>> lcm(100, 23, 98)
112700
>>> lcm(*range(1, 20))
232792560
L'utilisation de reduce
que j'ai trouvé dans mon code concernait la situation où j'avais une structure de classe pour l'expression logique et j'avais besoin de convertir une liste de ces objets d'expression en une conjonction d'expressions. J'avais déjà une fonction make_and
pour créer une conjonction à partir de deux expressions, j'ai donc écrit reduce(make_and,l)
. (Je savais que la liste n'était pas vide, sinon cela aurait été quelque chose comme reduce(make_and,l,make_true)
.)
C'est exactement la raison pour laquelle (certains) programmeurs fonctionnels comme reduce
(ou pliage comme on appelle généralement ces fonctions). Il existe souvent déjà de nombreuses fonctions binaires comme +
, *
, min
, max
la concaténation et, dans mon cas, make_and
et make_or
. Avoir un reduce
rend trivial le passage de ces opérations à des listes (ou des arbres ou tout ce que vous avez, pour les fonctions de pliage en général).
Bien sûr, si certaines instanciations (comme les sum
) sont souvent utilisés, alors vous ne voulez pas continuer à écrire reduce
. Cependant, au lieu de définir le sum
avec un for-loop, vous puede tout aussi facilement le définir avec reduce
.
La lisibilité, comme l'ont mentionné d'autres personnes, est effectivement un problème. On pourrait cependant affirmer que la seule raison pour laquelle les gens trouvent reduce
moins "claire", c'est parce qu'il ne s'agit pas d'une fonction que beaucoup de gens connaissent et/ou utilisent.
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.