For Loop กับ While Loop ใน Python ต่างกันยังไง (พร้อมตัวอย่าง)

for loop กับ while loop เป็นคำสั่งวนซ้ำ (loop) ทั้งคู่ใน Python ทำหน้าที่คล้ายกันคือรันโค้ดชุดเดิมซ้ำหลายรอบ แต่เหมาะกับสถานการณ์ต่างกัน มือใหม่มักสับสนว่าควรเลือกใช้ตัวไหนตอนไหน บทความนี้จะอธิบายความต่างพร้อมตัวอย่างโค้ดจริงให้เห็นชัดว่าเมื่อไหร่ควรใช้แบบไหน

การวนซ้ำ (looping) เป็นหนึ่งในแนวคิดพื้นฐานที่สำคัญที่สุดของการเขียนโปรแกรม ไม่ว่าจะเขียนภาษาไหนก็ต้องเจอแนวคิดนี้ เพราะช่วยให้ไม่ต้องเขียนโค้ดซ้ำๆ ด้วยมือเวลาต้องทำงานเดิมหลายรอบ Python เลือกให้มีทั้งสองแบบเพราะแต่ละแบบเหมาะกับรูปแบบปัญหาที่ต่างกัน เข้าใจความต่างให้ชัดตั้งแต่ต้นจะช่วยให้เขียนโค้ดที่อ่านง่ายและตรงจุดขึ้นมาก

for loop คืออะไร ใช้ยังไง

for loop เหมาะกับตอนที่รู้แน่ชัดแล้วว่าต้องวนกี่รอบ หรือต้องการวนไล่ทีละตัวจากของที่มีอยู่แล้ว (list, string, range) รูปแบบพื้นฐาน

for i in range(5):
    print(i)

โค้ดนี้จะพิมพ์เลข 0 ถึง 4 ออกมา เพราะ range(5) สร้างชุดตัวเลข 0, 1, 2, 3, 4 ให้วนไล่ทีละตัว

ใช้วนไล่ list ได้โดยตรงเช่นกัน ไม่ต้องนับ index เอง

ผลไม้ = ["แอปเปิล", "กล้วย", "ส้ม"]
for f in ผลไม้:
    print(f)

โค้ดนี้จะพิมพ์ชื่อผลไม้ทีละชื่อจนครบทุกตัวใน list โดยอัตโนมัติ ไม่ต้องเขียนเงื่อนไขหยุดเองเลย เพราะ for loop รู้เองว่าเมื่อไหร่ของใน list หมด

while loop คืออะไร ใช้ยังไง

while loop เหมาะกับตอนที่ยังไม่รู้ว่าต้องวนกี่รอบ แต่รู้ว่า “จะวนไปเรื่อยๆ ตราบใดที่เงื่อนไขนี้ยังเป็นจริง” รูปแบบพื้นฐาน

count = 0
while count < 5:
    print(count)
    count += 1

โค้ดนี้ให้ผลลัพธ์เหมือนตัวอย่าง for loop ด้านบนทุกประการ (พิมพ์ 0 ถึง 4) แต่เขียนคนละแบบ — while loop จะเช็คเงื่อนไข count < 5 ก่อนทุกรอบ ถ้ายังเป็นจริงอยู่ก็รันโค้ดข้างในต่อ ถ้าเป็นเท็จก็หยุดทันที

จุดสำคัญที่ต้องระวังคือ ต้องมีบรรทัดที่เปลี่ยนค่าตัวแปรที่ใช้เช็คเงื่อนไข (ในตัวอย่างคือ count += 1) ถ้าลืมบรรทัดนี้ไป เงื่อนไข count < 5 จะเป็นจริงตลอดไป กลายเป็น infinite loop ที่ไม่มีวันหยุด โปรแกรมจะค้างทันที

range() มีกี่แบบ ใช้ยังไงบ้าง

range() ที่ใช้คู่กับ for loop มีวิธีเรียกใช้ 3 แบบ ให้ผลลัพธ์ต่างกัน

range(5)        # 0, 1, 2, 3, 4 — เริ่มจาก 0 ถึงก่อนตัวเลขที่ระบุ
range(2, 5)     # 2, 3, 4 — เริ่มจากตัวแรกถึงก่อนตัวที่สอง
range(0, 10, 2) # 0, 2, 4, 6, 8 — เริ่ม, สิ้นสุด, ก้าวกระโดดทีละเท่าไหร่

พารามิเตอร์ตัวที่สาม (step) มีประโยชน์มากเวลาต้องการวนแบบข้ามทีละหลายค่า เช่น วนเฉพาะเลขคู่ หรือวนย้อนกลับด้วยค่า step ติดลบ

for i in range(10, 0, -1):
    print(i)

โค้ดนี้จะพิมพ์เลข 10 ลงมาถึง 1 ไล่ลำดับย้อนกลับ เพราะกำหนด step เป็น -1

list comprehension ทางเลือกที่กระชับกว่า for loop

เมื่อใช้ for loop เพื่อสร้าง list ใหม่จากของเดิม Python มีวิธีเขียนที่กระชับกว่าเรียกว่า list comprehension ตัวอย่างเช่นต้องการยกกำลังสองของตัวเลข 0 ถึง 4 ทุกตัว

เขียนแบบ for loop ปกติ

squares = []
for i in range(5):
    squares.append(i ** 2)

เขียนแบบ list comprehension ในบรรทัดเดียว

squares = [i ** 2 for i in range(5)]

ทั้งสองแบบให้ผลลัพธ์เหมือนกันทุกประการ ([0, 1, 4, 9, 16]) แต่ list comprehension สั้นและอ่านง่ายกว่าเมื่อ logic ข้างในไม่ซับซ้อนมาก เหมาะกับใช้แทน for loop แบบง่ายๆ ที่แค่แปลงค่าจาก list เดิมไปเป็น list ใหม่

ตารางเปรียบเทียบ

หัวข้อfor loopwhile loop
ใช้เมื่อไหร่รู้จำนวนรอบแน่ชัด หรือวนไล่ของที่มีอยู่แล้วไม่รู้จำนวนรอบ ขึ้นกับเงื่อนไข
ความเสี่ยง infinite loopแทบไม่มีมีถ้าลืมอัปเดตตัวแปรเงื่อนไข
ใช้กับ list/stringใช้ตรงๆ ได้เลยต้องนับ index เอง
ตัวอย่างการใช้งานจริงวนพิมพ์รายการสินค้า, วนอ่านทุกแถวใน CSVวนถามซ้ำจนกว่าผู้ใช้กรอกถูกต้อง, วนรอจนกว่า API ตอบกลับ

ตัวอย่างที่ for loop เหมาะกว่า

วนไล่ตัวอักษรใน string

for ch in "Python":
    print(ch)

วนพร้อมรู้ index ด้วย enumerate

ผลไม้ = ["แอปเปิล", "กล้วย", "ส้ม"]
for index, f in enumerate(ผลไม้):
    print(index, f)

enumerate() ให้ทั้ง index และค่าของแต่ละตัวพร้อมกัน สะดวกมากเวลาต้องรู้ทั้งตำแหน่งและค่าไปพร้อมกัน ไม่ต้องนับ index มือเองแบบ while loop

ตัวอย่างที่ while loop เหมาะกว่า

วนถามผู้ใช้ซ้ำจนกว่าจะกรอกถูกต้อง — สถานการณ์นี้ไม่รู้ล่วงหน้าว่าผู้ใช้จะกรอกถูกตั้งแต่ครั้งแรกหรือต้องลองกี่ครั้ง เหมาะกับ while loop มากกว่า

password = ""
while password != "1234":
    password = input("กรอกรหัสผ่าน: ")
print("เข้าสู่ระบบสำเร็จ")

วนจนกว่าจะเจอเงื่อนไขที่ต้องการ — เช่น สุ่มตัวเลขไปเรื่อยๆ จนกว่าจะได้ค่าที่ต้องการ ซึ่งไม่รู้ล่วงหน้าว่าต้องสุ่มกี่ครั้ง

break และ continue ใช้ได้กับทั้งสองแบบ

ทั้ง for loop และ while loop ใช้ break เพื่อหยุดวนทันที และ continue เพื่อข้ามไปรอบถัดไปได้เหมือนกัน

for i in range(10):
    if i == 5:
        break
    print(i)

โค้ดนี้จะพิมพ์แค่ 0 ถึง 4 แล้วหยุดทันทีที่ i เท่ากับ 5 ไม่วนต่อจนครบ 10 รอบ

for i in range(5):
    if i == 2:
        continue
    print(i)

โค้ดนี้จะพิมพ์ 0, 1, 3, 4 ข้าม 2 ไปเพราะ continue สั่งให้ข้ามโค้ดที่เหลือในรอบนั้นแล้วกระโดดไปรอบถัดไปทันที

ข้อผิดพลาดที่เจอบ่อยที่สุด: infinite loop

infinite loop คือ loop ที่ไม่มีวันหยุด มักเกิดจาก while loop ที่ลืมอัปเดตตัวแปรเงื่อนไข ตัวอย่างโค้ดที่ผิด

count = 0
while count < 5:
    print(count)

โค้ดนี้จะพิมพ์ 0 ไม่หยุดตลอดไป เพราะไม่มีบรรทัดไหนเปลี่ยนค่า count เลย เงื่อนไข count < 5 จึงเป็นจริงตลอดกาล ถ้าเจอโปรแกรมค้างแบบนี้ ให้กด Ctrl+C ใน terminal เพื่อหยุดการทำงานทันที แล้วกลับไปเช็คว่าลืมอัปเดตตัวแปรที่ใช้ในเงื่อนไขหรือเปล่า

วิธีป้องกันที่ดีคือก่อนเขียน while loop ทุกครั้ง ให้ถามตัวเองว่า “อะไรที่จะทำให้เงื่อนไขนี้กลายเป็นเท็จในที่สุด” แล้วเช็คให้แน่ใจว่ามีบรรทัดโค้ดที่ทำสิ่งนั้นจริงอยู่ในลูป ถ้าเป็นไปได้ ลองเขียนโค้ดแล้วรันทดสอบด้วยจำนวนรอบน้อยๆ ก่อนเสมอ เพื่อเช็คว่า loop หยุดทำงานตามที่คาดไว้จริงหรือไม่ ก่อนนำไปใช้กับข้อมูลจริงที่มีขนาดใหญ่กว่า

คำถามที่พบบ่อย

ใช้ for loop แทน while loop ได้ทุกกรณีไหม ทำได้ในทางเทคนิคด้วยการเขียนเงื่อนไขซับซ้อนขึ้น แต่ไม่แนะนำ เพราะโค้ดจะอ่านยากและไม่สื่อความหมายเท่าที่ควร เลือกใช้ตัวที่สื่อความหมายของสถานการณ์ได้ตรงที่สุดจะดีกว่าเสมอ คนอื่นที่มาอ่านโค้ดทีหลัง (รวมถึงตัวเราเองในอนาคต) จะเข้าใจเจตนาของโค้ดได้เร็วกว่ามาก

do-while loop มีใน Python ไหม ไม่มี Python ไม่มี syntax do-while แบบภาษาอื่น (เช่น C, Java) แต่จำลองพฤติกรรมเดียวกันได้ด้วย while True: ร่วมกับ break ภายในเมื่อเงื่อนไขที่ต้องการเป็นจริง วิธีนี้ใช้บ่อยเวลาต้องการให้โค้ดรันอย่างน้อยหนึ่งรอบก่อนเช็คเงื่อนไข ซึ่งเป็นพฤติกรรมเฉพาะของ do-while ที่ while ธรรมดาทำไม่ได้โดยตรง

for loop ใน Python ช้ากว่า while loop ไหม ความเร็วแทบไม่ต่างกันในการใช้งานทั่วไป ปัจจัยที่ส่งผลต่อความเร็วจริงๆ คือสิ่งที่ทำอยู่ข้างในลูปมากกว่าประเภทของลูปที่เลือกใช้ ไม่ต้องกังวลเรื่องนี้ตอนเริ่มเขียนโปรแกรม ให้เลือกตามความเหมาะสมของสถานการณ์และความอ่านง่ายของโค้ดเป็นหลักดีกว่า

วนซ้อนกัน (nested loop) ทำได้ไหม ได้ ทั้ง for และ while ใส่ซ้อนกันได้ตามต้องการ เช่น for loop ข้างในอีก for loop หนึ่ง มักใช้ตอนต้องวนไล่ข้อมูล 2 มิติ เช่น ตารางหรือ matrix แต่ควรระวังเรื่องความเร็ว เพราะ loop ซ้อนกันยิ่งมากชั้น ยิ่งใช้เวลาประมวลผลมากขึ้นตามไปด้วย

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

for i in range(5):
    if i == 10:
        break
else:
    print("วนจนจบไม่มี break")

เพราะเงื่อนไข i == 10 ไม่มีทางเป็นจริงเลยในตัวอย่างนี้ (range มีแค่ 0-4) loop จึงวนจนจบโดยไม่โดน break ตัด ทำให้ข้อความใน else ถูกพิมพ์ออกมา มีประโยชน์เวลาต้องการเช็คว่า “หาเจอไหม” ในการวนค้นหาข้อมูล เป็นฟีเจอร์ที่หลายคนเขียน Python มานานยังไม่เคยรู้ว่ามีอยู่ด้วยซ้ำ

ใช้ตัวแปรที่ประกาศใน for loop ต่อนอก loop ได้ไหม ได้ ต่างจากบางภาษาที่ตัวแปรใน loop จะถูกจำกัดขอบเขตแค่ภายใน loop เท่านั้น (block scope) ใน Python ตัวแปรที่ประกาศในทั้ง for loop และ while loop ยังใช้งานต่อได้หลังจบ loop เพราะ Python ไม่มีแนวคิด block scope แบบนั้น ต้องระวังเรื่องนี้เป็นพิเศษเวลาตั้งชื่อตัวแปรซ้ำกับที่ใช้ที่อื่นในโค้ดเดียวกัน อาจเผลอเขียนทับค่าตัวแปรสำคัญโดยไม่รู้ตัวได้ง่ายกว่าที่คิด

สรุป

for loop กับ while loop ทำหน้าที่วนซ้ำเหมือนกัน แต่เลือกใช้ตามสถานการณ์ต่างกัน

  • ใช้ for loop เมื่อรู้จำนวนรอบแน่ชัด หรือวนไล่ของที่มีอยู่แล้ว เช่น list, string, range
  • ใช้ while loop เมื่อไม่รู้จำนวนรอบล่วงหน้า ต้องพึ่งเงื่อนไขในการตัดสินใจว่าจะหยุดเมื่อไหร่

ข้อควรระวังที่สำคัญที่สุดของ while loop คือต้องมีบรรทัดที่เปลี่ยนค่าตัวแปรเงื่อนไขเสมอ ไม่งั้นจะกลายเป็น infinite loop ที่ทำให้โปรแกรมค้างทันที เช็คให้ชัวร์ทุกครั้งก่อนรันโค้ดจริง และอย่าลืมว่ายังมี list comprehension เป็นทางเลือกที่กระชับกว่า for loop แบบง่ายๆ ที่แค่แปลงค่าจาก list เดิมเป็น list ใหม่ด้วย

Leave a Comment