reduce() คืออะไร
reduce() เป็นฟังก์ชันที่ใช้สำหรับ "ลด" หรือ "ยุบรวม" (aggregate) ลำดับของข้อมูล (เช่น ลิสต์, ทูเพิล) ให้เหลือเพียงค่าเดียว โดยการใช้ฟังก์ชันที่กำหนดซ้ำๆ กับคู่ขององค์ประกอบต่างๆ ฟังก์ชันนี้จะทำงานแบบสะสม (cumulative) คือ จะนำผลลัพธ์ของการประมวลผลคู่แรก ไปใช้ร่วมกับองค์ประกอบถัดไปเรื่อยๆ จนกว่าจะหมดลำดับ
ต้องนำเข้า reduce จากโมดูล functools ก่อนใช้งาน:
โค้ด: เลือกทั้งหมด
from functools import reduce
โค้ด: เลือกทั้งหมด
reduce(function, iterable[, initializer])
- iterable: คือชุดข้อมูลที่เราต้องการลด (เช่น ลิสต์, ทูเพิล, เซ็ต)
- initializer (optional): ค่าเริ่มต้นสำหรับการดำเนินการ หากมี จะถูกวางไว้ก่อนองค์ประกอบแรกใน iterable
reduce() ทำงานอย่างไร
ลองจินตนาการว่าเราต้องการหาผลรวมของตัวเลขในลิสต์ [1, 2, 3, 4] โดยใช้ reduce()
โค้ด: เลือกทั้งหมด
from functools import reduce
# ฟังก์ชันสำหรับบวกตัวเลขสองตัว
def add(x, y):
print(f"{x} + {y} = {x + y}")
return x + y
numbers = [1, 2, 3, 4]
total = reduce(add, numbers)
print(f"ผลลัพธ์ : {total}")
โค้ด: เลือกทั้งหมด
from functools import reduce
numbers = [1, 2, 3, 4, 5]
product = reduce(lambda x, y: x * y, numbers)
print(f"Product: {product}")
- รอบแรก 1 * 2 = 2
- รอบสอง 2 * 3 = 6
- รอบสาม 6 * 4 = 24
- รอบสี่ 24 * 5 = 120
ผลลัพธ์ การใช้ initializer:
หากเราต้องการให้มีค่าเริ่มต้นในการคำนวณ เช่น ต้องการผลรวมที่เริ่มจาก 100:
โค้ด: เลือกทั้งหมด
from functools import reduce
numbers = [1, 2, 3, 4]
total_with_initial = reduce(lambda x, y: x + y, numbers, 100)
print(f"Total with initial value: {total_with_initial}")
- รอบสอง 101 + 2 = 103
- รอบสาม 103 + 3 = 106
- รอบสี่ 106 + 4 = 110
ผลลัพธ์ การเชื่อมสตริงเข้าด้วยกัน:
โค้ด: เลือกทั้งหมด
from functools import reduce
words = ["Hello", " ", "World", "!"]
sentence = reduce(lambda x, y: x + y, words)
print(f"Sentence: {sentence}")
โค้ด: เลือกทั้งหมด
from functools import reduce
numbers = [5, 12, 3, 8, 20, 7]
max_value = reduce(lambda x, y: x if x > y else y, numbers)
print(f"Max value: {max_value}")
แม้ว่า reduce() จะทรงพลัง แต่ก็ไม่ได้เป็นฟังก์ชันที่ใช้บ่อยเท่า map() หรือ filter() เหตุผลหลักคือ ความสามารถในการอ่านโค้ด บางครั้งการใช้ลูป for หรือฟังก์ชันในตัวอื่นๆ อาจจะทำให้โค้ดเข้าใจง่ายกว่า
คุณควรพิจารณาใช้ reduce() เมื่อ:
- ปัญหาของคุณมีลักษณะของการรวมข้อมูลแบบสะสม: เช่น การหาผลรวม, ผลคูณ, การรวมสตริง, การเปรียบเทียบหาค่าสูงสุด/ต่ำสุดในลักษณะทีละคู่
- โค้ดที่ได้จากการใช้ reduce() สั้นและอ่านง่ายกว่า: โดยเฉพาะเมื่อใช้ร่วมกับ lambda function สำหรับการดำเนินการที่ไม่ซับซ้อน
สรุป
reduce() เป็นฟังก์ชันที่ทรงพลังใน Python ที่ช่วยให้คุณสามารถ "ลด" ลำดับของข้อมูลให้เหลือค่าเดียว โดยการใช้ฟังก์ชันสะสมซ้ำๆ แม้ว่ามันอาจไม่ได้ถูกใช้งานบ่อยเท่า map() หรือ filter() แต่ reduce() ก็ยังคงเป็นเครื่องมือที่ยอดเยี่ยมสำหรับปัญหาที่มีลักษณะเฉพาะของการรวมข้อมูลทีละคู่ คุณได้เรียนรู้ไวยากรณ์, การทำงานทีละขั้นตอน, และได้เห็นตัวอย่างการนำไปใช้ในสถานการณ์ต่างๆ รวมถึงข้อควรพิจารณาในการเลือกว่าจะใช้ reduce() หรือทางเลือกอื่นๆ การทำความเข้าใจ reduce() จะทำให้มีทางเลือกในการใช้ function ในการใช้งานเช่น ใช้เพื่อให้โค้ดกระชับและมีประสิทธิภาพ: สำหรับบางสถานการณ์ reduce() สามารถทำให้โค้ดของคุณสั้นลงและเข้าใจง่ายขึ้น โดยเฉพาะเมื่อใช้ร่วมกับ lambda function
อ้างอิง
- https://www.mindphp.com/คู่มือ/73-คืออะ ... ออะไร.html
- https://www.mindphp.com/บทเรียนออนไลน์/ ... ction.html
- https://www.mindphp.com/developer/tips- ... ython.html
- viewtopic.php?t=104258
- viewtopic.php?t=116403