Каков наиболее идиоматический способ добиться в Haskell чего-то вроде следующего:
foldl (+) 0 [1,2,3,4,5]
--> 15
Или его эквивалент в Ruby:
[1,2,3,4,5].inject(0) {|m,x| m + x}
#> 15
Очевидно, Python предоставляет reduce
функцию, которая является реализацией fold, точно так же, как указано выше, однако мне сказали, что «питонический» способ программирования заключался в том, чтобы избегать lambda
терминов и функций более высокого порядка, предпочитая, где это возможно, понимание списков. Следовательно, существует ли предпочтительный способ сворачивания списка или структуры в виде списка в Python, который не является reduce
функцией, или это reduce
идиоматический способ достижения этого?
sum
, возможно, вы захотите привести несколько различных типов примеров.
sum()
фактически предоставляет ограниченную функциональность. sum([[a], [b, c, d], [e, f]], [])
возвращается [a, b, c, d, e, f]
например.
+
со списками - это операция с линейным временем как во времени, так и в памяти, что делает весь вызов квадратичным. Использование list(itertools.chain.from_iterable([a], [b,c,d],[e,f],[]])
в целом линейно - и если вам нужно выполнить итерацию только один раз, вы можете отказаться от вызова, list
чтобы сделать его постоянным с точки зрения памяти.
sum
недостаточно хорошо?