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 reduce
funkcję, która jest implementacją fold, dokładnie tak, jak powyżej, jednak powiedziano mi, że „pythonowym” sposobem programowania jest unikanie lambda
terminó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 reduce
funkcją, czy też jest reduce
idiomatycznym 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, list
aby było stałe pod względem pamięci.
sum
nie jest wystarczająco dobry?