อะไรคือวิธีที่เป็นสำนวนที่สุดในการบรรลุสิ่งต่อไปนี้ใน Haskell:
foldl (+) 0 [1,2,3,4,5]
--> 15
หรือเทียบเท่าใน Ruby:
[1,2,3,4,5].inject(0) {|m,x| m + x}
#> 15
เห็นได้ชัดว่า Python มีreduce
ฟังก์ชันซึ่งเป็นการใช้งานแบบพับตามที่กล่าวข้างต้นอย่างไรก็ตามฉันได้รับแจ้งว่าวิธีการเขียนโปรแกรมแบบ 'pythonic' คือการหลีกเลี่ยง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
ยังไม่ดีพอ?