หลักสูตรการพัฒนาด้วย Python ขั้นสูง
บทที่
>
ระดับ
รายการขั้นสูง
แมป, ฟิลเตอร์, รีดิวซ์
วัตถุประสงค์
ทำการผสมและผลิตไอศกรีมโดยใช้ Maps, Filter และ Reduce ให้เสร็จสิ้น
บางรสชาติของไอศกรีมมีจำนวนไม่เพียงพอหรือหมดไป แต่เรามีวัสดุเพียงพอที่จะชดเชยและรวมกันทำไอศกรีมให้มากขึ้น ในการนี้คุณต้องใช้ Map ซึ่งเป็นเครื่องมือที่ทรงพลังที่ช่วยลดปริมาณโค้ดที่คุณต้องเขียนโดยการบีบอัดลูปและโค้ดการตัดสินใจ ฟังก์ชัน Filter และ Reduce เป็นส่วนเสริมที่ช่วยให้การใช้งาน Map มีความยืดหยุ่นที่จำเป็นสำหรับการเขียนโปรแกรมของคุณ
เริ่มต้นคุณต้องนำเข้า Reduce จากไลบรารี functools เพื่อใช้งานฟังก์ชัน โดยเพิ่มโค้ดนี้ที่ส่วนต้นของโปรแกรมของคุณ: from functools import reduce. ส่วนฟังก์ชัน Map และ Filter ได้ถูกสร้างไว้ในตัวของ Python แล้วและไม่จำเป็นต้องนำเข้า
ขั้นแรกคุณต้องหยิบวัตถุดิบบางอย่างจากตู้แช่แบบเดินเข้าได้ จากนั้นเดินไปยังจุดเครื่องหมาย X สีทอง หันหน้าไปทางประตูและเปิดมันโดยใช้ฟังก์ชัน open(). หยิบขวด "cream" ทั้งหมดในตู้แช่ แล้วเดินไปยังจุดเครื่องหมาย X ที่มีแสงเหนือพรมสีเขียว
มีค่าคงที่ในรูปแบบของลิสต์ทั้งหมด 3 ชุดในฟิลด์ที่ชื่อว่า: vanilla, strawberry และ chocolate โดยที่แต่ละค่าคงที่มีการรวมตัวของวัตถุดิบที่ประกอบเป็นรสชาติของไอศกรีม ณ จุดเครื่องหมาย X สีเขียว ให้ตรวจสอบเนื้อหาของลิสต์ค่าคงที่ strawberry โดยเริ่มจากใช้ฟังก์ชัน place() เพื่อวาง "cream" ที่คุณหยิบมาก่อนหน้านี้ และใช้ฟังก์ชัน speak() เพื่อตรวจสอบเนื้อหาของลิสต์ strawberry
เมื่อยืนยันแล้ว ถึงเวลาที่จะใช้ฟังก์ชัน Map กับลิสต์ค่าคงที่ strawberry ซึ่งเนื้อหาของลิสต์เป็นเลขทศนิยมทั้งหมด โดยการใช้ฟังก์ชัน map() คุณสามารถปัดเศษองค์ประกอบทุกตัวในลิสต์ได้ โดยไม่จำเป็นต้องวนลูปแต่ละองค์ประกอบทีละตัวเพื่อปัดเศษ ในการนี้ให้สร้างลิสต์ชื่อ map1 และใช้ฟังก์ชัน map() ร่วมกับลิสต์ strawberry และฟังก์ชัน round() ดังนี้: map1 = list(map(round, strawberry)) เมื่อเสร็จแล้วให้ใช้ฟังก์ชัน speak() กับ map1 เพื่อตรวจสอบผลลัพธ์
เมื่อทำเสร็จแล้ว เราจะย้ายไปยัง Filter ซึ่งทำงานในลักษณะเดียวกับ Map แต่ต้องการฟังก์ชันร่วมด้วย ที่ด้านบนของตัวแก้ไข (editor) คุณจะเห็นฟังก์ชันที่ตั้งค่าล่วงหน้า (preset function) ชื่อ main_ingredients ซึ่งใช้สำหรับตรวจสอบว่าเลขนั้นมีค่ามากกว่า 25 หรือไม่
def main_ingredients(value):
return value > 25
แทนที่จะวนลูป คุณสามารถใช้ฟังก์ชันนี้ร่วมกับฟังก์ชัน filter() เพื่อสร้างลิสต์ใหม่ที่มีรายการที่มีค่ามากกว่า 25 ซึ่งเป็นวัตถุดิบหลัก ให้สร้างลิสต์ใหม่ชื่อ filter1 และใช้ฟังก์ชัน filter() ร่วมกับ main_ingredients และ map1 เพื่อกรองหาวัตถุดิบหลักทั้งหมดในลิสต์ที่สร้างจาก Map ดังนี้: filter1 = list(filter(main_ingredients, value)) เมื่อเสร็จแล้วให้ใช้ฟังก์ชัน speak() กับ filter1 เพื่อตรวจสอบผลลัพธ์
ต่อไปเราจะย้ายไปที่ Reduce ซึ่งใช้งานในลักษณะเดียวกับ Filter แต่สามารถใช้ในการยุบหรือรวมลิสต์ให้เป็นหน่วยเดียว คล้ายกับ Filter มันใช้ฟังก์ชันที่เขียนขึ้นเอง โดยในครั้งนี้ฟังก์ชันชื่อ custom_sum ซึ่งทำการบวกเลขสองจำนวนเข้าด้วยกันแบบไดนามิก
def custom_sum(first, second):
return first + second
สร้างตัวแปรชื่อ reduce1 และใช้ฟังก์ชัน reduce() ร่วมกับฟังก์ชัน custom_sum และลิสต์ filter1 เพื่อรวมรายการทั้งหมดให้เป็นหน่วยเดียว ดังนี้: reduce1 = reduce(custom_sum, filter1) เมื่อเสร็จแล้วให้ใช้ฟังก์ชัน speak() กับ reduce1 เพื่อตรวจสอบผลลัพธ์
ตอนนี้เมื่อคุณได้ทำวงจร Map, Filter, Reduce เสร็จแล้ว ให้ทำซ้ำวงจรเดียวกันนี้ที่จุดเครื่องหมาย X ที่มีแสงบนพรมสีแดงและพรมสีน้ำเงิน บนพรมสีแดงให้ใช้ลิสต์ค่าคงที่ vanilla และสร้าง map2, filter2 และ reduce2. บนพรมสีน้ำเงินให้ใช้ลิสต์ค่าคงที่ chocolate และสร้าง map3, filter3 และ reduce3
เดินไปยังจุดเครื่องหมาย X สุดท้ายที่มีแสงเหนือพรมสีม่วง รวม reduce1, reduce2 และ reduce3 เข้าด้วยกันเพื่อรวมวัตถุดิบหลักของ vanilla, strawberry และ chocolate ให้สร้างตัวแปรชื่อ neapolitan และบวกผลลัพธ์จาก Reduce ทั้งหมดดังนี้: neapolitan = reduce1+reduce2+reduce3 ใช้ฟังก์ชัน speak() กับผลลัพธ์ที่รวมกันเพื่อตรวจสอบ และใช้ฟังก์ชัน place() พร้อมกับผลลัพธ์นั้นเพื่อสร้างไอศกรีม Neapolitan และทำให้ระดับนี้สำเร็จ