map() ช่วยให้เรานำฟังก์ชันใดฟังก์ชันหนึ่งมาใช้กับสมาชิกทุกตัวใน iterable ได้โดยไม่ต้องเขียนลูปยาว ๆ โค้ดจะดูสะอาด อ่านง่าย และทำงานได้รวดเร็ว โดยเฉพาะเมื่อทำงานกับข้อมูลขนาดใหญ่
map() คืออะไร?
map() เป็นฟังก์ชัน Built-in ใน Python ที่ใช้สำหรับ "ประยุกต์ใช้ (apply)" ฟังก์ชันที่ระบุลงบนสมาชิกแต่ละตัวของ Iterable (เช่น list, tuple, string, set) และส่งคืน Object ชนิด map ซึ่งเป็น Iterator ที่จะให้ผลลัพธ์ทีละตัวเมื่อถูกเรียกใช้
พูดง่ายๆ คือ ถ้าคุณมีรายการข้อมูล และต้องการให้แต่ละรายการผ่านกระบวนการเดียวกัน map() คือเครื่องมือที่เหมาะจะใช้ทำสิ่งนั้น
โครงสร้างการใช้งาน map()
โค้ด: เลือกทั้งหมด
map(function, iterable, ...)
iterable: คือ Object ที่สามารถวนซ้ำได้ (เช่น list, tuple) ที่คุณต้องการนำฟังก์ชันไปประยุกต์ใช้ คุณสามารถใส่ได้หลาย Iterable ถ้าฟังก์ชันของคุณรับ Argument หลายตัว
ทำไมถึงควรใช้ map()?
- โค้ดกระชับ (Concise Code): ช่วยลดจำนวนบรรทัดของโค้ดเมื่อเทียบกับการเขียนลูป for แบบปกติ
- อ่านง่าย (Readability): เมื่อคุณเข้าใจแนวคิดของ map() โค้ดจะอ่านง่ายขึ้นว่ากำลังทำอะไร (คือการ map ฟังก์ชันกับข้อมูล)
- ประสิทธิภาพ (Performance): โดยทั่วไป map() (โดยเฉพาะเมื่อเทียบกับ for loop ที่มีกระบวนการซับซ้อน) มักจะมีประสิทธิภาพดีกว่าเล็กน้อยสำหรับงานที่ต้องประมวลผลข้อมูลจำนวนมาก เนื่องจากมันถูก optimize มาจากระดับ C code
ตัวอย่างการใช้งาน map()
1. การประยุกต์ใช้ฟังก์ชันกับลิสต์ (พื้นฐานที่สุด)
เรามาลองสร้างลิสต์ของตัวเลข และใช้ map() เพื่อยกกำลังสองให้แต่ละตัวเลขกัน
โค้ด: เลือกทั้งหมด
# ฟังก์ชันสำหรับยกกำลังสอง
def square(number):
return number * number
numbers = [1, 2, 3, 4, 5]
# ใช้ map() เพื่อประยุกต์ใช้ฟังก์ชัน square กับทุกสมาชิกใน numbers
# map_object จะเป็น iterator
squared_numbers_map = map(square, numbers)
# หากต้องการเห็นผลลัพธ์เป็น list ต้องแปลงเป็น list ก่อน
squared_numbers_list = list(squared_numbers_map)
print(f"Original numbers: {numbers}")
print(f"Squared numbers: {squared_numbers_list}")
สำหรับฟังก์ชันง่ายๆ ที่ไม่จำเป็นต้องประกาศแยกต่างหาก เรานิยมใช้ lambda ฟังก์ชันร่วมกับ map() เพื่อให้โค้ดสั้นลงไปอีก
โค้ด: เลือกทั้งหมด
# แปลงชื่อในลิสต์ให้เป็นตัวพิมพ์ใหญ่ทั้งหมด
names = ["alice", "bob", "charlie"]
# ใช้ lambda เพื่อแปลง string เป็น uppercase
uppercase_names_map = map(lambda name: name.upper(), names)
uppercase_names_list = list(uppercase_names_map)
print(f"Original names: {names}")
print(f"Uppercase names: {uppercase_names_list}")
ฟังก์ชันที่คุณส่งให้ map() สามารถรับ Argument ได้มากกว่าหนึ่งตัว ซึ่งหมายความว่าคุณสามารถ "map" กับหลาย Iterables พร้อมกันได้
โค้ด: เลือกทั้งหมด
# รวมชื่อและคะแนนเข้าด้วยกัน
names = ["Alice", "Bob", "Charlie"]
scores = [85, 92, 78]
# ฟังก์ชันสำหรับสร้างข้อความแสดงผล
def format_score(name, score):
return f"{name}: {score} points"
# ใช้ map() กับสอง iterables
formatted_results_map = map(format_score, names, scores)
formatted_results_list = list(formatted_results_map)
print(f"Formatted results: {formatted_results_list}")
map() ยังมีประโยชน์ในการแปลงชนิดข้อมูลของสมาชิกใน Iterable ได้อย่างรวดเร็ว เช่น การแปลงสตริงที่เป็นตัวเลขให้เป็น int หรือ float
โค้ด: เลือกทั้งหมด
string_numbers = ["1", "2", "3", "4", "5"]
# แปลง string เป็น int
int_numbers_map = map(int, string_numbers)
int_numbers_list = list(int_numbers_map)
print(f"String numbers: {string_numbers}")
print(f"Integer numbers: {int_numbers_list}")
- เมื่อคุณมีฟังก์ชันที่ถูกประกาศไว้แล้วและต้องการนำไปประยุกต์ใช้กับ Iterable โดยไม่ต้องสร้างฟังก์ชัน lambda ที่ซับซ้อน
- เมื่อฟังก์ชันนั้นถูกนำไปใช้กับ Iterables หลายตัว (เช่นในตัวอย่าง format_score)
- เมื่อต้องการผลลัพธ์เป็น Iterator (เพื่อประหยัด Memory สำหรับชุดข้อมูลขนาดใหญ่ เพราะจะประมวลผลทีละตัว)
สรุป
map() เป็นฟังก์ชัน Built-in ที่มีประโยชน์อย่างยิ่งใน Python สำหรับการประยุกต์ใช้ฟังก์ชันกับสมาชิกทุกตัวใน Iterable ช่วยให้โค้ดของคุณกระชับ สะอาด และมีประสิทธิภาพ โดยเฉพาะอย่างยิ่งเมื่อทำงานกับฟังก์ชันที่ซับซ้อน หรือต้องจัดการกับ Iterables หลายตัวพร้อมกัน การเลือกใช้ map() หรือ List Comprehensions ขึ้นอยู่กับสถานการณ์และความชอบส่วนบุคคล แต่การทำความเข้าใจทั้งสองแบบจะช่วยให้คุณเขียนโค้ด Python ได้ยืดหยุ่นและมีประสิทธิภาพสูงสุด
ลิ้งค์อ้างอิง
- https://www.mindphp.com/คู่มือ/73-คืออะ ... ออะไร.html
- https://www.mindphp.com/บทเรียนออนไลน์/ ... mming.html
- viewtopic.php?t=45663
- viewtopic.php?t=90492
- viewtopic.php?t=115050
- viewtopic.php?f=144&t=107367