Cách thành ngữ nhất để đạt được điều gì đó như sau, trong Haskell:
foldl (+) 0 [1,2,3,4,5]
--> 15
Hoặc tương đương của nó trong Ruby:
[1,2,3,4,5].inject(0) {|m,x| m + x}
#> 15
Rõ ràng, Python cung cấp reducehàm, là một triển khai của gấp, chính xác như ở trên, tuy nhiên, tôi được biết rằng cách lập trình 'pythonic' là tránh lambdacác thuật ngữ và các hàm bậc cao hơn, ưu tiên danh sách hiểu rõ hơn nếu có thể. Do đó, có cách nào được ưu tiên để gấp một danh sách hoặc cấu trúc giống như danh sách trong Python mà không phải là reducehàm, hay là reducecách thành ngữ để đạt được điều này?
sum, bạn có thể muốn cung cấp một số loại ví dụ khác nhau.
sum()thực sự cung cấp chức năng hạn chế với điều này. sum([[a], [b, c, d], [e, f]], [])trả về [a, b, c, d, e, f]chẳng hạn.
+trên danh sách là một phép toán thời gian tuyến tính cả về thời gian và bộ nhớ, làm cho toàn bộ cuộc gọi là bậc hai. Việc sử dụng list(itertools.chain.from_iterable([a], [b,c,d],[e,f],[]])là tuyến tính tổng thể - và nếu bạn chỉ cần lặp lại nó một lần, bạn có thể bỏ lệnh gọi đến listđể làm cho nó không đổi về mặt bộ nhớ.
sumkhông đủ tốt?