Jaki jest najbardziej idiomatyczny sposób osiągnięcia czegoś takiego w Haskellu:
foldl (+) 0 [1,2,3,4,5]
--> 15
Lub jego odpowiednik w Rubim:
[1,2,3,4,5].inject(0) {|m,x| m + x}
#> 15
Oczywiście Python udostępnia reducefunkcję, która jest implementacją fold, dokładnie tak, jak powyżej, jednak powiedziano mi, że „pythonowym” sposobem programowania jest unikanie lambdaterminów i funkcji wyższego rzędu, preferowanie wyrażeń listowych tam, gdzie to możliwe. W związku z tym, czy istnieje preferowany sposób zwinięcia listy lub struktury podobnej do listy w Pythonie, która nie jest reducefunkcją, czy też jest reduceidiomatycznym sposobem osiągnięcia tego?
sum, możesz podać kilka różnych typów przykładów.
sum()rzeczywistości zapewnia ograniczoną funkcjonalność w tym. sum([[a], [b, c, d], [e, f]], [])zwraca [a, b, c, d, e, f]na przykład.
+na listach jest liniowa operacja czasowa zarówno w czasie, jak i w pamięci, dzięki czemu całe wywołanie jest kwadratowe. Używanie list(itertools.chain.from_iterable([a], [b,c,d],[e,f],[]])jest ogólnie liniowe - i jeśli potrzebujesz powtórzyć to tylko raz, możesz porzucić wywołanie, listaby było stałe pod względem pamięci.
sumnie jest wystarczająco dobry?