Disons que je veux calculer le produit des racines carrées de chaque élément de la liste. La même chose peut être réalisée en Java comme
import java.util.ArrayList;
public class App {
public static void main(String[] args) {
ArrayList<Double> arrays = new ArrayList<>();
arrays.add(4.0);
arrays.add(9.0);
arrays.add(16.0);
double i = arrays.stream().reduce(1.0, (a, b) -> (a * Math.sqrt(b)),
(a, b) -> (a * b));
System.out.println(i);
};
}
Sortie:
24.0
Comment puis-je obtenir le même résultat en Python? Ci-dessous donne incorrect.
>>> reduce(lambda a,b: math.sqrt(a)*math.sqrt(b), [4,9,16])
9.797958971132712
Comme cela équivaut à
>>> math.sqrt(math.sqrt(4)*math.sqrt(9))*math.sqrt(16)
Cependant, la même syntaxe en Java donne un résultat différent. Comment ça calcule ça?
double i = arrays.stream().reduce(1.0, (a, b) -> (Math.sqrt(a) * Math.sqrt(b)));
Sortie:
8.23906857562847
Réponses:
3 pour la réponse № 1Vous devez fournir la valeur initiale pour implémenter la même logique qu'en Java, ici le premier paramètre X agit comme la valeur accumulée qui est initialisée par 1:
from functools import reduce
from math import sqrt
reduce(lambda x, y: x * sqrt(y), [4,9,16], 1)
# 24.0
Si vous ne fournissez pas la valeur initiale, elle commencera au premier élément de la séquence.
Avec la valeur initiale, cela devrait être équivalent à votre dernier exemple java:
reduce(lambda x, y: sqrt(x) * sqrt(y), [4,9,16], 1)
# 8.23906857562847