ข้ามไปยังเนื้อหาหลัก
Editor

break, continue, pass ใน Python: ควบคุมการทำงานของลูป

เริ่มต้น20 นาที5 แบบฝึกหัด65 XP

บทเรียนนี้แปลจากต้นฉบับภาษาอังกฤษRead in EnglishLeer en españolЧитать на русскомLer em portuguêsแจ้งข้อผิดพลาดในการแปล

0/5 แบบฝึกหัด

สมมติว่าคุณกำลังไล่หาเบอร์โทรของเพื่อนในสมุดรายชื่อ พอเจอแล้ว คุณยังจะพลิกดูทุกหน้าที่เหลือต่อไหม ไม่แน่นอน คุณหยุดหา หรือลองนึกถึงตอนไล่อ่านรายการอีเมล คุณข้ามอีเมลขยะแล้วอ่านเฉพาะฉบับจริง นี่คือตัวอย่างในชีวิตประจำวันของการควบคุมการทำงานของลูป

Python มีคำสั่ง 3 คำสั่งสำหรับควบคุมสิ่งที่เกิดขึ้นในลูป ได้แก่ break (หยุดลูปทั้งหมด) continue (ข้ามไปรอบถัดไป) และ pass (ไม่ทำอะไรเลย แค่จองที่ไว้) บทเรียนนี้สอนทั้งสามคำสั่ง รวมถึงรูปแบบ for-else ที่มีเฉพาะใน Python

เมื่อเรียนจบ คุณจะรู้ชัดเจนว่าควรใช้แต่ละคำสั่งเมื่อไร และคำสั่งเหล่านี้เปลี่ยนการทำงานของลูปอย่างไร

break ใน Python ทำงานอย่างไร

คำสั่ง break ออกจากลูปที่มันอยู่ทันที Python จะกระโดดไปยังบรรทัดแรกของโค้ดหลังลูป ไม่มีรอบถัดไป ไม่มีการตรวจเงื่อนไขอีก ลูปจบลงแค่นั้น

ให้คิดว่า break เป็นทางออกฉุกเฉิน ลูปมีทางออกปกติอยู่แล้ว (เงื่อนไขกลายเป็น False หรือข้อมูลหมด) แต่ break ช่วยให้คุณออกได้ก่อนเมื่อเจอสิ่งที่ต้องการแล้ว

ใช้ break เพื่อออกจากลูปก่อนกำหนด
# Search for a name in a list
names = ["Alice", "Bob", "Charlie", "Diana", "Eve"]
target = "Charlie"
for name in names:
print(f"Checking {name}...")
if name == target:
print(f"Found {target}!")
break
print("Search complete.")
# Output:
# Checking Alice...
# Checking Bob...
# Checking Charlie...
# Found Charlie!
# Search complete.
ผลลัพธ์
Checking Alice...
Checking Bob...
Checking Charlie...
Found Charlie!
Search complete.

ถ้าไม่มี break ลูปจะตรวจ Diana และ Eve ด้วย ซึ่งเสียแรงเปล่าเพราะเราเจอ Charlie แล้ว คำสั่ง break ช่วยประหยัดเวลาด้วยการหยุดทันทีที่งานเสร็จ

หาค่าแรกที่ตรงเงื่อนไขด้วย break
# Find the first even number in a list
numbers = [7, 3, 11, 8, 5, 2, 9]
for num in numbers:
if num % 2 == 0:
print(f"First even number: {num}")
break
# Output:
# First even number: 8
ผลลัพธ์
First even number: 8

ลูปหยุดที่ 8 เพราะเป็นเลขคู่ตัวแรก แม้ 2 จะเป็นเลขคู่เหมือนกัน แต่ลูปไปไม่ถึงตัวนั้นเลย รูปแบบ "หาตัวแรกที่ตรงเงื่อนไขแล้วหยุด" นี้เป็นการใช้ break ที่พบบ่อยที่สุดแบบหนึ่ง


continue ใน Python ทำงานอย่างไร

คำสั่ง continue ข้ามส่วนที่เหลือของรอบปัจจุบัน แล้วกระโดดกลับไปที่ต้นลูป ตัวลูปยังทำงานต่อ เพียงแต่ไปยังข้อมูลตัวถัดไป (หรือตรวจเงื่อนไขอีกครั้ง ในกรณีของลูป while)

ถ้า break คือทางออกฉุกเฉิน continue ก็เหมือนปุ่ม "ข้ามอันนี้" คุณยังวนลูปต่อไป แค่ไม่ต้องการประมวลผลข้อมูลตัวนี้

ใช้ continue ข้ามเลขคู่
# Print only odd numbers from 1 to 10
for num in range(1, 11):
if num % 2 == 0:
continue # skip even numbers
print(num)
# Output:
# 1
# 3
# 5
# 7
# 9
ผลลัพธ์
1
3
5
7
9

เมื่อ num เป็นเลขคู่ (2, 4, 6, 8, 10) continue จะข้าม print() แล้วไปรอบถัดไป เมื่อ num เป็นเลขคี่ continue จะไม่ทำงาน print() จึงทำงานตามปกติ

ไม่ใช้ continue (โค้ดซ้อนอยู่ใน if)
for num in range(1, 11):
    if num % 2 != 0:
        print(num)
ใช้ continue (โค้ดไม่ซ้อน)
for num in range(1, 11):
    if num % 2 == 0:
        continue
    print(num)

ทั้งสองแบบให้ผลลัพธ์เหมือนกัน สำหรับตัวอย่างง่าย ๆ แบบนี้ ใช้ if ก็ได้ แต่ continue จะเห็นประโยชน์ชัดเมื่อมีโค้ดหลายบรรทัดหลังเงื่อนไขที่ใช้ข้าม เพราะช่วยให้โค้ดไม่ต้องเยื้องลึกหลายชั้น

ข้ามข้อมูลที่ไม่ถูกต้องด้วย continue
# Process only valid scores, skip invalid ones
scores = [85, -1, 92, 150, 73, 88, -5, 100]
valid_count = 0
total = 0
for score in scores:
if score < 0 or score > 100:
print(f" Skipping invalid score: {score}")
continue
valid_count += 1
total += score
print(f" Recorded: {score}")
average = total / valid_count
print(f"\nAverage of {valid_count} valid scores: {average:.1f}")
# Output:
# 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
ผลลัพธ์
  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 และโปรแกรมเมอร์คนอื่นว่าตรงนี้ตั้งใจเว้นว่างไว้

ใช้ pass เป็นตัวยึดตำแหน่ง
# Skeleton code - structure first, logic later
for num in range(10):
if num % 2 == 0:
pass # TODO: handle even numbers
else:
pass # TODO: handle odd numbers
print("Loop finished (nothing happened yet)")
# Output:
# Loop finished (nothing happened yet)
ผลลัพธ์
Loop finished (nothing happened yet)

ถ้าไม่มี pass Python จะแจ้ง IndentationError เพราะต้องการบล็อกที่เยื้องเข้าไปหลังเครื่องหมายโคลอนทุกตัว คำสั่ง pass ทำให้ครบตามข้อกำหนดนี้โดยไม่ทำอะไรเลย

ใช้ pass เพื่อบอกชัดว่าตั้งใจละเว้นบางกรณี
# Common use: ignore specific cases
for char in "Hello, World! 123":
if char.isalpha():
print(char, end="") # print letters only
else:
pass # ignore non-letters (spaces, punctuation, digits)
print() # newline
# Output:
# HelloWorld
ผลลัพธ์
HelloWorld

ในตัวอย่างนี้ pass ทำให้เห็นชัดว่าเราตั้งใจละเว้นอักขระที่ไม่ใช่ตัวอักษร คุณจะตัด else: pass ทิ้งไปทั้งหมดก็ได้ และโปรแกรมจะทำงานเหมือนเดิม แต่การใส่ไว้ช่วยสื่อเจตนาให้คนอื่นที่อ่านโค้ดเข้าใจ


รูปแบบ for-else ใน Python คืออะไร

Python มีความสามารถพิเศษที่ภาษาอื่นส่วนใหญ่ไม่มี คือคุณผูกบล็อก else เข้ากับลูป for หรือ while ได้ บล็อก else จะทำงานก็ต่อเมื่อลูปทำงานจนจบตามปกติ หมายความว่าลูปไม่ได้ถูกขัดจังหวะด้วย break

ตอนแรกอาจงง เพราะปกติ else หมายถึง "ถ้าเงื่อนไขเป็น False" แต่สำหรับลูป ให้คิดว่าเป็น "ถ้าไม่มี break เกิดขึ้น" ถ้าลูปวนครบทุกรอบโดยไม่เจอ break บล็อก else จะทำงาน

for-else เมื่อเจอค่าที่หา (break ทำงาน)
# Search for a number - found case
numbers = [3, 7, 2, 9, 4]
target = 9
for num in numbers:
if num == target:
print(f"Found {target}!")
break
else:
print(f"{target} was not found.")
# Output:
# Found 9!
ผลลัพธ์
Found 9!

ลูปเจอ 9 คำสั่ง break จึงทำงาน และบล็อก else ถูกข้ามไป บล็อก else จะทำงานเฉพาะเมื่อลูปจบโดยไม่มีการ break เท่านั้น

for-else เมื่อไม่เจอค่าที่หา (else ทำงาน)
# Search for a number - not found case
numbers = [3, 7, 2, 9, 4]
target = 6
for num in numbers:
if num == target:
print(f"Found {target}!")
break
else:
print(f"{target} was not found.")
# Output:
# 6 was not found.
ผลลัพธ์
6 was not found.

คราวนี้ลูปตรวจทุกตัวและไม่เจอ 6 เลย เพราะ break ไม่เคยทำงาน บล็อก else จึงทำงาน วิธีนี้ใช้แทนรูปแบบที่พบบ่อยอย่างการใช้ตัวแปรธงชนิดบูลีน เช่น found = False

ไม่ใช้ for-else (ต้องมีตัวแปรธง)
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-else (อ่านง่ายกว่า)
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 ทำงานร่วมกันอย่างไรในตัวอย่างที่ใกล้เคียงงานจริงมากขึ้น โค้ดนี้ประมวลผลคำสั่งซื้อชุดหนึ่งและจัดการกับสถานการณ์ต่าง ๆ

break และ continue ในการใช้งานจริง
# Processing orders
orders = [
{"id": 1, "item": "Laptop", "status": "pending"},
{"id": 2, "item": "Mouse", "status": "shipped"},
{"id": 3, "item": "Keyboard", "status": "cancelled"},
{"id": 4, "item": "Monitor", "status": "pending"},
{"id": 5, "item": "STOP", "status": "system"},
{"id": 6, "item": "Headphones", "status": "pending"},
]
for order in orders:
# Stop processing if we hit a system command
if order["item"] == "STOP":
print("System halt received. Stopping.")
break
# Skip already-handled orders
if order["status"] in ["shipped", "cancelled"]:
continue
# Process pending orders
print(f"Processing order #{order['id']}: {order['item']}")
# Output:
# Processing order #1: Laptop
# Processing order #4: Monitor
# System halt received. Stopping.
ผลลัพธ์
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 (หรือกลับกัน) เป็นข้อผิดพลาดที่พบบ่อย

แบบฝึกหัดที่ 1: หาจำนวนลบตัวแรก
เขียนโค้ด

ใช้ลูป for ร่วมกับ break เพื่อหาและแสดงจำนวนลบตัวแรกในลิสต์ ให้แสดง "Found: " ตามด้วยตัวเลขนั้น

ผลลัพธ์ที่คาดหวัง:

Found: -3
numbers = [4, 7, 2, -3, 8, -1, 5]
# Find and print the first negative number using break
แบบฝึกหัดที่ 2: แสดงผลโดยตัดสระออก
เขียนโค้ด

ใช้ลูป for ร่วมกับ continue เพื่อแสดงทุกตัวอักษรในสตริง "beautiful" แต่ข้ามสระ (a, e, i, o, u) ให้แสดงพยัญชนะแต่ละตัวต่อกันในบรรทัดเดียวโดยใช้ end=""

ผลลัพธ์ที่คาดหวัง:

btfl

เก็บ print() ที่อยู่ท้ายโค้ดเริ่มต้นไว้: บรรทัดนี้ช่วยขึ้นบรรทัดใหม่ให้เรียบร้อย

word = "beautiful"
# Print each character, but skip vowels using continue
print() # newline at the end
แบบฝึกหัดที่ 3: ทายผลลัพธ์
ทายผลลัพธ์

ทายให้ตรงว่าโค้ดจะแสดงอะไรโดยไม่ต้องรัน ไล่ดูทีละรอบและคิดว่า continue กับ break จะทำงานเมื่อไร

จากนั้นรันโค้ดเพื่อตรวจคำตอบ

for i in range(1, 8):
if i == 3:
continue
if i == 6:
break
print(i)
แบบฝึกหัดที่ 4: แก้บั๊ก: รวมผลจนกว่าจะเจอจำนวนลบ
แก้บั๊ก

โค้ดนี้ควรบวกตัวเลขในลิสต์ไปเรื่อย ๆ จนกว่าจะเจอจำนวนลบ แล้วหยุด แต่มีคนใช้ continue แทน break ให้แก้บั๊กเพื่อให้แสดงผลเป็น

Sum before negative: 15

ห้ามแก้อะไรนอกจากคีย์เวิร์ดตัวเดียวที่ผิด

numbers = [5, 3, 7, -2, 8, 4]
total = 0
for num in numbers:
if num < 0:
continue # BUG: this should stop, not skip!
total += num
print(f"Sum before negative: {total}")
แบบฝึกหัดที่ 5: ตรวจรหัสผ่านด้วย for-else
เขียนโค้ด

ใช้รูปแบบ for-else ตรวจว่ารหัสผ่านมีตัวเลขอย่างน้อยหนึ่งตัวหรือไม่ วนลูปผ่านแต่ละตัวอักษรในรหัสผ่าน ถ้าเจอตัวเลข ให้แสดง "Password accepted" แล้ว break ถ้าลูปจบโดยไม่เจอตัวเลขเลย ให้แสดง "Password must contain a number"

ผลลัพธ์ที่คาดหวังสำหรับรหัสผ่านที่กำหนดให้:

Password accepted
password = "hello5world"
# Check if password contains at least one digit using for-else

สรุป: break, continue, pass

สรุปสั้น ๆ ของคำสั่งควบคุมลูปทั้งสามแบบ

คำสั่งทำอะไรใช้เมื่อไร
breakออกจากลูปทันทีเจอสิ่งที่หาแล้ว หรือเจอเงื่อนไขให้หยุด
continueข้ามไปรอบถัดไปข้อมูลตัวปัจจุบันไม่ต้องประมวลผล
passไม่ทำอะไรเลย (ตัวยึดตำแหน่ง)บล็อกว่างที่จะเขียนเพิ่มทีหลัง
for-elseelse ทำงานถ้าไม่มี break เกิดขึ้นงานค้นหา: "เจอแล้ว" กับ "ไม่เจอ"

กฎสำคัญที่ควรจำ:

  • break หยุดลูปทั้งหมด ไม่ใช่แค่รอบเดียว
  • continue ข้ามแค่รอบปัจจุบัน ลูปยังทำงานต่อ
  • pass เป็นแค่ตัวยึดตำแหน่ง ไม่ทำอะไรเลย
  • ในลูปซ้อนกัน break ออกจากลูปในสุดเท่านั้น
  • else ใน for-else ทำงานเมื่อลูปจบโดยไม่มี break
  • อย่าสับสนระหว่าง continue (ข้ามหนึ่งรอบ) กับ break (หยุดทั้งหมด)
  • เรียนอะไรต่อ

    ตอนนี้คุณรู้วิธีควบคุมการทำงานของลูปอย่างแม่นยำแล้ว บทต่อไปคือ ลูปซ้อนใน Python ซึ่งสอนการใส่ลูปไว้ในลูปเพื่อทำงานกับตาราง การจับคู่แบบต่าง ๆ และข้อมูลหลายมิติ ลูปซ้อนเมื่อใช้ร่วมกับ break และ continue จะเปิดทางสู่รูปแบบที่ทรงพลัง

    บทเรียนที่เกี่ยวข้อง

    บทเรียนนี้มีประโยชน์หรือไม่