break, continue, pass ใน Python: ควบคุมการทำงานของลูป
บทเรียนนี้แปลจากต้นฉบับภาษาอังกฤษRead in EnglishLeer en españolЧитать на русскомLer em portuguêsแจ้งข้อผิดพลาดในการแปล
สมมติว่าคุณกำลังไล่หาเบอร์โทรของเพื่อนในสมุดรายชื่อ พอเจอแล้ว คุณยังจะพลิกดูทุกหน้าที่เหลือต่อไหม ไม่แน่นอน คุณหยุดหา หรือลองนึกถึงตอนไล่อ่านรายการอีเมล คุณข้ามอีเมลขยะแล้วอ่านเฉพาะฉบับจริง นี่คือตัวอย่างในชีวิตประจำวันของการควบคุมการทำงานของลูป
Python มีคำสั่ง 3 คำสั่งสำหรับควบคุมสิ่งที่เกิดขึ้นในลูป ได้แก่ break (หยุดลูปทั้งหมด) continue (ข้ามไปรอบถัดไป) และ pass (ไม่ทำอะไรเลย แค่จองที่ไว้) บทเรียนนี้สอนทั้งสามคำสั่ง รวมถึงรูปแบบ for-else ที่มีเฉพาะใน Python
เมื่อเรียนจบ คุณจะรู้ชัดเจนว่าควรใช้แต่ละคำสั่งเมื่อไร และคำสั่งเหล่านี้เปลี่ยนการทำงานของลูปอย่างไร
break ใน Python ทำงานอย่างไร
คำสั่ง break ออกจากลูปที่มันอยู่ทันที Python จะกระโดดไปยังบรรทัดแรกของโค้ดหลังลูป ไม่มีรอบถัดไป ไม่มีการตรวจเงื่อนไขอีก ลูปจบลงแค่นั้น
ให้คิดว่า break เป็นทางออกฉุกเฉิน ลูปมีทางออกปกติอยู่แล้ว (เงื่อนไขกลายเป็น False หรือข้อมูลหมด) แต่ break ช่วยให้คุณออกได้ก่อนเมื่อเจอสิ่งที่ต้องการแล้ว
Checking Alice... Checking Bob... Checking Charlie... Found Charlie! Search complete.
ถ้าไม่มี break ลูปจะตรวจ Diana และ Eve ด้วย ซึ่งเสียแรงเปล่าเพราะเราเจอ Charlie แล้ว คำสั่ง break ช่วยประหยัดเวลาด้วยการหยุดทันทีที่งานเสร็จ
First even number: 8
ลูปหยุดที่ 8 เพราะเป็นเลขคู่ตัวแรก แม้ 2 จะเป็นเลขคู่เหมือนกัน แต่ลูปไปไม่ถึงตัวนั้นเลย รูปแบบ "หาตัวแรกที่ตรงเงื่อนไขแล้วหยุด" นี้เป็นการใช้ break ที่พบบ่อยที่สุดแบบหนึ่ง
continue ใน Python ทำงานอย่างไร
คำสั่ง continue ข้ามส่วนที่เหลือของรอบปัจจุบัน แล้วกระโดดกลับไปที่ต้นลูป ตัวลูปยังทำงานต่อ เพียงแต่ไปยังข้อมูลตัวถัดไป (หรือตรวจเงื่อนไขอีกครั้ง ในกรณีของลูป while)
ถ้า break คือทางออกฉุกเฉิน continue ก็เหมือนปุ่ม "ข้ามอันนี้" คุณยังวนลูปต่อไป แค่ไม่ต้องการประมวลผลข้อมูลตัวนี้
1 3 5 7 9
เมื่อ num เป็นเลขคู่ (2, 4, 6, 8, 10) continue จะข้าม print() แล้วไปรอบถัดไป เมื่อ num เป็นเลขคี่ continue จะไม่ทำงาน print() จึงทำงานตามปกติ
for num in range(1, 11):
if num % 2 != 0:
print(num)for num in range(1, 11):
if num % 2 == 0:
continue
print(num)ทั้งสองแบบให้ผลลัพธ์เหมือนกัน สำหรับตัวอย่างง่าย ๆ แบบนี้ ใช้ if ก็ได้ แต่ continue จะเห็นประโยชน์ชัดเมื่อมีโค้ดหลายบรรทัดหลังเงื่อนไขที่ใช้ข้าม เพราะช่วยให้โค้ดไม่ต้องเยื้องลึกหลายชั้น
Recorded: 85 Skipping invalid score: -1 Recorded: 92 Skipping invalid score: 150 Recorded: 73 Recorded: 88 Skipping invalid score: -5 Recorded: 100 Average of 5 valid scores: 87.6
ในตัวอย่างนี้ continue ทำหน้าที่เป็นตัวกรอง คะแนนที่ไม่ถูกต้อง (ติดลบหรือเกิน 100) จะถูกข้าม บรรทัดคำนวณจึงไม่ทำงานกับคะแนนเหล่านั้น มีเพียงคะแนนที่ถูกต้องเท่านั้นที่ถูกนำไปรวม วิธีนี้อ่านง่ายกว่าการครอบโค้ดประมวลผลทั้งหมดไว้ในบล็อก if ใหญ่ ๆ
pass ใน Python ทำอะไร
คำสั่ง pass ไม่ทำอะไรเลยแม้แต่น้อย เป็นตัวยึดตำแหน่ง (placeholder) ที่บอกว่า "รู้ว่าตรงนี้ต้องมีโค้ด แต่ยังไม่ได้เขียน" Python กำหนดว่าทุกบล็อกต้องมีคำสั่งอย่างน้อยหนึ่งคำสั่ง (หลัง if, for, while, การนิยามฟังก์ชัน ฯลฯ) และ pass ช่วยให้ครบตามข้อกำหนดนั้น
ให้คิดว่า pass เป็นป้าย "TODO" ในไซต์ก่อสร้าง อาคารยังสร้างไม่เสร็จ แต่โครงสร้างตั้งอยู่แล้ว มันบอกทั้ง Python และโปรแกรมเมอร์คนอื่นว่าตรงนี้ตั้งใจเว้นว่างไว้
Loop finished (nothing happened yet)
ถ้าไม่มี pass Python จะแจ้ง IndentationError เพราะต้องการบล็อกที่เยื้องเข้าไปหลังเครื่องหมายโคลอนทุกตัว คำสั่ง pass ทำให้ครบตามข้อกำหนดนี้โดยไม่ทำอะไรเลย
HelloWorld
ในตัวอย่างนี้ pass ทำให้เห็นชัดว่าเราตั้งใจละเว้นอักขระที่ไม่ใช่ตัวอักษร คุณจะตัด else: pass ทิ้งไปทั้งหมดก็ได้ และโปรแกรมจะทำงานเหมือนเดิม แต่การใส่ไว้ช่วยสื่อเจตนาให้คนอื่นที่อ่านโค้ดเข้าใจ
รูปแบบ for-else ใน Python คืออะไร
Python มีความสามารถพิเศษที่ภาษาอื่นส่วนใหญ่ไม่มี คือคุณผูกบล็อก else เข้ากับลูป for หรือ while ได้ บล็อก else จะทำงานก็ต่อเมื่อลูปทำงานจนจบตามปกติ หมายความว่าลูปไม่ได้ถูกขัดจังหวะด้วย break
ตอนแรกอาจงง เพราะปกติ else หมายถึง "ถ้าเงื่อนไขเป็น False" แต่สำหรับลูป ให้คิดว่าเป็น "ถ้าไม่มี break เกิดขึ้น" ถ้าลูปวนครบทุกรอบโดยไม่เจอ break บล็อก else จะทำงาน
Found 9!
ลูปเจอ 9 คำสั่ง break จึงทำงาน และบล็อก else ถูกข้ามไป บล็อก else จะทำงานเฉพาะเมื่อลูปจบโดยไม่มีการ break เท่านั้น
6 was not found.
คราวนี้ลูปตรวจทุกตัวและไม่เจอ 6 เลย เพราะ break ไม่เคยทำงาน บล็อก else จึงทำงาน วิธีนี้ใช้แทนรูปแบบที่พบบ่อยอย่างการใช้ตัวแปรธงชนิดบูลีน เช่น found = False
found = False
for num in numbers:
if num == target:
print(f"Found {target}!")
found = True
break
if not found:
print(f"{target} not found.")for num in numbers:
if num == target:
print(f"Found {target}!")
break
else:
print(f"{target} not found.")เวอร์ชัน for-else ไม่ต้องใช้ตัวแปรธง found เป็นวิธีแบบ Python (Pythonic) มากกว่าสำหรับงานแบบ "ค้นหาแล้วรายงานผล"
ตัวอย่างการใช้ break, continue และ pass ในงานจริง
มาดูว่า break และ continue ทำงานร่วมกันอย่างไรในตัวอย่างที่ใกล้เคียงงานจริงมากขึ้น โค้ดนี้ประมวลผลคำสั่งซื้อชุดหนึ่งและจัดการกับสถานการณ์ต่าง ๆ
Processing order #1: Laptop Processing order #4: Monitor System halt received. Stopping.
คำสั่งซื้อ #1 (Laptop) รอดำเนินการ จึงถูกประมวลผล คำสั่งซื้อ #2 (Mouse) จัดส่งแล้ว continue จึงข้ามไป คำสั่งซื้อ #3 (Keyboard) ถูกยกเลิก จึงถูกข้ามเช่นกัน คำสั่งซื้อ #4 (Monitor) รอดำเนินการ จึงถูกประมวลผล คำสั่งซื้อ #5 เป็นคำสั่ง STOP break จึงหยุดลูปทั้งหมด ลูปไปไม่ถึงคำสั่งซื้อ #6 เลย
นี่คือรูปแบบที่ใช้กันทั่วไป: ใช้ break กับเงื่อนไขแบบ "หยุดทุกอย่าง" ใช้ continue กับเงื่อนไขแบบ "ข้ามตัวนี้" และใช้ส่วนที่เหลือของตัวลูปประมวลผลตามปกติ
แบบฝึกหัด
ได้เวลาฝึกควบคุมการทำงานของลูปแล้ว แบบฝึกหัดเหล่านี้จะทดสอบว่าคุณเข้าใจหรือไม่ว่าควรใช้ break, continue และรูปแบบ for-else เมื่อไร
อ่านโจทย์แต่ละข้อให้ดี การใช้ break ในที่ที่ต้องใช้ continue (หรือกลับกัน) เป็นข้อผิดพลาดที่พบบ่อย
ใช้ลูป for ร่วมกับ break เพื่อหาและแสดงจำนวนลบตัวแรกในลิสต์ ให้แสดง "Found: " ตามด้วยตัวเลขนั้น
ผลลัพธ์ที่คาดหวัง:
Found: -3ใช้ลูป for ร่วมกับ continue เพื่อแสดงทุกตัวอักษรในสตริง "beautiful" แต่ข้ามสระ (a, e, i, o, u) ให้แสดงพยัญชนะแต่ละตัวต่อกันในบรรทัดเดียวโดยใช้ end=""
ผลลัพธ์ที่คาดหวัง:
btflเก็บ print() ที่อยู่ท้ายโค้ดเริ่มต้นไว้: บรรทัดนี้ช่วยขึ้นบรรทัดใหม่ให้เรียบร้อย
ทายให้ตรงว่าโค้ดจะแสดงอะไรโดยไม่ต้องรัน ไล่ดูทีละรอบและคิดว่า continue กับ break จะทำงานเมื่อไร
จากนั้นรันโค้ดเพื่อตรวจคำตอบ
โค้ดนี้ควรบวกตัวเลขในลิสต์ไปเรื่อย ๆ จนกว่าจะเจอจำนวนลบ แล้วหยุด แต่มีคนใช้ continue แทน break ให้แก้บั๊กเพื่อให้แสดงผลเป็น
Sum before negative: 15ห้ามแก้อะไรนอกจากคีย์เวิร์ดตัวเดียวที่ผิด
ใช้รูปแบบ for-else ตรวจว่ารหัสผ่านมีตัวเลขอย่างน้อยหนึ่งตัวหรือไม่ วนลูปผ่านแต่ละตัวอักษรในรหัสผ่าน ถ้าเจอตัวเลข ให้แสดง "Password accepted" แล้ว break ถ้าลูปจบโดยไม่เจอตัวเลขเลย ให้แสดง "Password must contain a number"
ผลลัพธ์ที่คาดหวังสำหรับรหัสผ่านที่กำหนดให้:
Password acceptedสรุป: break, continue, pass
สรุปสั้น ๆ ของคำสั่งควบคุมลูปทั้งสามแบบ
| คำสั่ง | ทำอะไร | ใช้เมื่อไร |
|---|---|---|
break | ออกจากลูปทันที | เจอสิ่งที่หาแล้ว หรือเจอเงื่อนไขให้หยุด |
continue | ข้ามไปรอบถัดไป | ข้อมูลตัวปัจจุบันไม่ต้องประมวลผล |
pass | ไม่ทำอะไรเลย (ตัวยึดตำแหน่ง) | บล็อกว่างที่จะเขียนเพิ่มทีหลัง |
for-else | else ทำงานถ้าไม่มี break เกิดขึ้น | งานค้นหา: "เจอแล้ว" กับ "ไม่เจอ" |
กฎสำคัญที่ควรจำ:
break หยุดลูปทั้งหมด ไม่ใช่แค่รอบเดียวcontinue ข้ามแค่รอบปัจจุบัน ลูปยังทำงานต่อpass เป็นแค่ตัวยึดตำแหน่ง ไม่ทำอะไรเลยbreak ออกจากลูปในสุดเท่านั้นelse ใน for-else ทำงานเมื่อลูปจบโดยไม่มี breakcontinue (ข้ามหนึ่งรอบ) กับ break (หยุดทั้งหมด)เรียนอะไรต่อ
ตอนนี้คุณรู้วิธีควบคุมการทำงานของลูปอย่างแม่นยำแล้ว บทต่อไปคือ ลูปซ้อนใน Python ซึ่งสอนการใส่ลูปไว้ในลูปเพื่อทำงานกับตาราง การจับคู่แบบต่าง ๆ และข้อมูลหลายมิติ ลูปซ้อนเมื่อใช้ร่วมกับ break และ continue จะเปิดทางสู่รูปแบบที่ทรงพลัง