1. บทนำ

Python นั้นเป็นที่นิยมของโปรแกรมเมอร์จำนวนมากด้วยความเรียบง่ายและไวยากรณ์ที่เข้าใจได้โดยสัญชาตญาณ แต่หลายคนอาจจะแปลกใจที่ไม่มีโครงสร้าง “switch-case” แบบที่มีในภาษาอื่น ดังนั้นใน Python จึงต้องใช้ “if-elif-else” หรือ “ดิกชันนารี (dictionary)” เพื่อให้ได้การทำงานในลักษณะเดียวกัน ในบทความนี้ เราจะอธิบายอย่างเป็นลำดับเกี่ยวกับวิธีการทำเงื่อนไขแบบดั้งเดิมใน Python ทางเลือกที่ใช้ดิกชันนารี และคำสั่ง “match-case” แบบใหม่ที่ถูกเพิ่มเข้ามาใน Python 3.10 ซึ่งจะช่วยให้คุณเรียนรู้วิธีทำเงื่อนไขใน Python อย่างมีประสิทธิภาพและนำไปใช้กับการเขียนโค้ดจริงได้

2. เหตุผลที่ Python ไม่มีคำสั่ง switch

เหตุผลที่ Python ไม่ได้นำคำสั่ง switch-case มาใช้ มาจากความเรียบง่ายและความอ่านง่ายของภาษา ผู้ออกแบบ Python มุ่งทำให้ภาษากระชับที่สุด และตัดทอนไวยากรณ์ที่ซ้ำซ้อนหรือยืดเยื้อออกไป แม้คำสั่ง switch จะมีประโยชน์ในภาษาอื่น แต่ใน Python สามารถทำสิ่งเดียวกันได้ด้วยคำสั่ง “if-elif-else” หรือการใช้ชนิดข้อมูลพจนานุกรม จึงถือว่าไม่จำเป็นต้องเพิ่ม switch เข้ามา ในความเป็นจริง เอกสารอย่างเป็นทางการของ Python ก็ระบุว่าสามารถครอบคลุมความสามารถของ switch ได้ด้วยคำสั่ง if-elif-else โค้ดด้านล่างคือตัวอย่างของคำสั่ง switch ในภาษา C
switch (value) {
  case 1:
    printf("Value is 1");
    break;
  case 2:
    printf("Value is 2");
    break;
  default:
    printf("Other value");
}
ใน Python สามารถเขียนใหม่ได้ดังนี้
value = 1
if value == 1:
    print("Value is 1")
elif value == 2:
    print("Value is 2")
else:
    print("Other value")
ด้วยวิธีนี้ Python ก็สามารถตรวจสอบเงื่อนไขได้อย่างง่ายดายโดยไม่ต้องใช้คำสั่ง switch
RUNTEQ(ランテック)|超実戦型エンジニア育成スクール

3. ตัวอย่างการใช้ if-elif-else

วิธีที่พื้นฐานที่สุดในการทำการแตกแขนงเงื่อนไขใน Python คือคำสั่ง “if-elif-else” วิธีนี้มีประสิทธิภาพมากเมื่อจะดำเนินการที่แตกต่างกันตามหลายเงื่อนไข ต่อไปนี้คือตัวอย่างการใช้งานทั่วไป
value = 100
if value < 50:
    print("เป็นค่าขนาดเล็ก")
elif value < 100:
    print("เป็นค่าขนาดกลาง")
else:
    print("เป็นค่าขนาดใหญ่")
ในโค้ดนี้จะแสดงข้อความที่แตกต่างกันตามค่าของตัวแปร value คำสั่ง if-elif-else ช่วยให้สามารถทำการแตกแขนงเงื่อนไขที่เรียบง่ายและเข้าใจง่ายได้

ปัญหาเมื่อจำนวนเงื่อนไขเพิ่มขึ้น

อย่างไรก็ตาม เมื่อโครงสร้าง if-elif-else มีการซ้อนหลายชั้น โค้ดอาจอ่านได้ยาก โดยเฉพาะเมื่อจัดการกับเงื่อนไขที่ซับซ้อน วิธีที่ใช้「ชนิดข้อมูลแบบพจนานุกรม」ซึ่งจะแนะนำต่อไปนั้นมีประสิทธิผล

4. การทำเงื่อนไขแบบเลือกทางด้วยพจนานุกรม(dictionary)

การใช้พจนานุกรมของ Python จะช่วยให้คุณสามารถใช้งานเงื่อนไขที่คล้ายกับ switch-case ได้ พจนานุกรมเป็นโครงสร้างข้อมูลที่เก็บคู่คีย์และค่า ทำให้สามารถแสดงเงื่อนไขหลายแบบได้อย่างกระชับ ในตัวอย่างต่อไปนี้ จะแสดงผลลัพธ์ตามตัวเลขที่ผู้ใช้ป้อน
numbers = {1: "หนึ่ง", 2: "สอง", 3: "สาม"}
value = int(input("กรุณาป้อนตัวเลขตั้งแต่ 1 ถึง 3: "))

if value in numbers:
    print(f"ตัวเลขที่เลือก: {numbers[value]}")
else:
    print("กรุณาป้อนตัวเลขตั้งแต่ 1 ถึง 3")
ดังที่เห็น การใช้พจนานุกรมช่วยให้โค้ดสั้นและอ่านง่าย แม้จะมีเงื่อนไขจำนวนมาก

ข้อดีของพจนานุกรม

การทำเงื่อนไขด้วยพจนานุกรมมีข้อดีสำคัญคือ แม้จำนวนเงื่อนไขเพิ่มขึ้น โค้ดยังคงอ่านง่ายและบำรุงรักษาได้สะดวก โดยเฉพาะเมื่อมีการประมวลผลตามค่าหลายกรณี จะมีประสิทธิภาพกว่าการใช้คำสั่ง if-elif-else
侍エンジニア塾

5. ฟีเจอร์ใหม่ใน Python 3.10: การเพิ่มคำสั่ง match-case

คำสั่ง match-case ที่ถูกเพิ่มเข้ามาใน Python 3.10 มีไวยากรณ์ที่ใกล้เคียงกับ switch-case มาก และช่วยให้เขียนเงื่อนไขหลายข้อได้อย่างกระชับ ฟีเจอร์ใหม่นี้โดดเด่นเป็นพิเศษด้านการทำ pattern matching และเมื่อเทียบกับการใช้ if-elif-else แบบเดิมหรือวิธีที่ใช้ดิกชันนารีแล้ว จะช่วยเพิ่มความอ่านง่ายและความสามารถในการบำรุงรักษาของโค้ดอย่างมาก

ไวยากรณ์พื้นฐานของ match-case

ด้านล่างคือตัวอย่างการใช้งานพื้นฐานของคำสั่ง match-case
def check_value(value):
    match value:
        case 1:
            print("เลือก 1 แล้ว")
        case 2:
            print("เลือก 2 แล้ว")
        case _:
            print("มีการเลือกค่าที่ไม่ใช่ 1 หรือ 2")
ในโค้ดนี้ จะดำเนินการต่างกันตามค่าของตัวแปร value ส่วน case _ เป็นการประมวลผลแบบค่าเริ่มต้นที่จะทำงานเมื่อไม่ตรงกับเงื่อนไขใดๆ

6. ตัวอย่างการประยุกต์ใช้ match-case

คำสั่ง match-case เหมาะสำหรับการแยกเงื่อนไขที่ซับซ้อนมากขึ้นและการจับคู่แพตเทิร์นด้วยเช่นกัน ตัวอย่างเช่น สามารถประมวลผลตามจำนวนองค์ประกอบของลิสต์หรือชนิดข้อมูลได้

match-case ที่รองรับหลายเงื่อนไข

def process_data(data):
    match data:
        case [x, y]:
            print(f"ลิสต์มีองค์ประกอบ 2 ตัว: {x}, {y}")
        case [x, y, z]:
            print(f"ลิสต์มีองค์ประกอบ 3 ตัว: {x}, {y}, {z}")
        case _:
            print("จำนวนองค์ประกอบของลิสต์แตกต่างกัน")
ในตัวอย่างนี้ จะดำเนินการต่างกันตามจำนวนองค์ประกอบของลิสต์ จุดเด่นของคำสั่ง match-case คือสามารถเขียนหลายเงื่อนไขและแพตเทิร์นได้อย่างเรียบง่ายเช่นนี้

7. การเปรียบเทียบ if-elif-else, ชนิดพจนานุกรม, และ match-case

วิธีการแตกแขนงเงื่อนไขแต่ละแบบมีข้อดีข้อเสียเฉพาะตัว ต่อไปนี้คือตารางเปรียบเทียบ
วิธีการข้อดีข้อเสีย
if-elif-elseเรียบง่ายและเข้าใจได้ทันทีเมื่อมีเงื่อนไขมาก โค้ดจะซับซ้อนขึ้น
ชนิดพจนานุกรม(dictionary)อ่านง่าย และมีประสิทธิภาพเมื่อมีเงื่อนไขมากไม่ใช่ทุกเงื่อนไขจะใส่ไว้ในพจนานุกรมได้
match-caseมีประสิทธิภาพสำหรับการแตกแขนงหลายเงื่อนไขและการจับคู่รูปแบบใช้ได้เฉพาะตั้งแต่ Python 3.10 ขึ้นไปเท่านั้น
ตารางเปรียบเทียบนี้ช่วยให้เลือกวิธีการแตกแขนงเงื่อนไขที่เหมาะสมได้ง่ายขึ้น โดยเฉพาะคำสั่ง match-case เหมาะอย่างยิ่งสำหรับการจับคู่รูปแบบที่ซับซ้อน และโดดเด่นตรงที่ช่วยหลีกเลี่ยงความซ้ำซ้อนของคำสั่ง if-elif-else

8. สรุป

แม้ว่าใน Python จะไม่มีคำสั่ง switch-case แต่สามารถทำการแตกแขนงเงื่อนไขได้อย่างมีประสิทธิภาพด้วยการใช้ if-elif-else, ชนิดข้อมูลแบบพจนานุกรม (dictionary) และ match-case ของ Python 3.10 โดยเฉพาะ match-case นั้นโดดเด่นด้านการทำแพทเทิร์นแมตชิ่ง ทำให้เขียนการแตกแขนงเงื่อนไขที่ซับซ้อนได้อย่างเรียบง่าย และน่าจะเป็นเครื่องมือที่มีประโยชน์ต่อการพัฒนาในอนาคตด้วย การเลือกใช้วิธีเหล่านี้ให้เหมาะสมกับเงื่อนไข จะช่วยให้คุณเขียนโค้ดที่มีประสิทธิภาพและอ่านง่ายมากขึ้น ดังนั้น หากทำความเข้าใจแต่ละวิธีให้ลึกซึ้งยิ่งขึ้น คุณก็จะสามารถเลือกแนวทางที่เหมาะสมที่สุดให้สอดคล้องกับโปรเจ็กต์จริงได้