On this page
การวนซ้ำ (Loops: for & while)
ทำคำสั่งซ้ำ ๆ โดยไม่ต้องเขียนซ้ำ — for, while, range, break/continue และ pattern ที่เจอบ่อย
loop ใช้สั่งให้คอมพิวเตอร์ทำงานซ้ำ ๆ ซึ่งเป็นสิ่งที่มันถนัดที่สุด แทนที่จะ copy โค้ดเดิม 100 รอบ เราเขียนครั้งเดียวแล้วบอกให้วน มี 2 แบบหลัก: for (รู้ว่าจะวนกี่รอบ/วนตามข้อมูล) และ while (วนจนกว่าเงื่อนไขจะเท็จ)
for loop กับ range()
for ใช้วนตามลำดับของค่า วิธีที่พบบ่อยคือใช้คู่กับ range() ที่สร้างลำดับตัวเลขให้
for i in range(5): # 0,1,2,3,4 (เริ่ม 0 ไม่รวม 5)
print(i)
for i in range(1, 6): # 1,2,3,4,5 (เริ่ม 1 ไม่รวม 6)
print(i)
for i in range(0, 10, 2): # 0,2,4,6,8 (ก้าวทีละ 2)
print(i)
for i in range(5, 0, -1): # 5,4,3,2,1 (นับถอยหลัง)
print(i)| เขียนแบบ | ได้ลำดับ |
|---|---|
| range(5) | 0 1 2 3 4 |
| range(2, 7) | 2 3 4 5 6 |
| range(0, 10, 2) | 0 2 4 6 8 |
| range(10, 0, -2) | 10 8 6 4 2 |
วนตามข้อมูลโดยตรง
for วนตามลิสต์ ข้อความ หรือข้อมูลอื่นได้โดยตรง ไม่ต้องใช้ index — อ่านง่ายและเป็นวิธีที่ Python แนะนำ
fruits = ["แอปเปิล", "กล้วย", "ส้ม"]
for fruit in fruits:
print(f"ฉันชอบ{fruit}")
for ch in "Hello": # วนทีละตัวอักษร
print(ch)
# ต้องการทั้งลำดับและค่า ใช้ enumerate
for i, fruit in enumerate(fruits):
print(f"{i+1}. {fruit}") # 1. แอปเปิล ...while loop
while วนตราบใดที่เงื่อนไขยังเป็นจริง เหมาะเมื่อไม่รู้จำนวนรอบล่วงหน้า เช่นวนจนกว่าผู้ใช้จะพิมพ์คำว่าออก
count = 5
while count > 0:
print(count)
count -= 1 # ต้องเปลี่ยนค่า ไม่งั้นวนไม่จบ!
print("ปล่อยจรวด!")
# วนรับข้อมูลจนกว่าจะถูก
password = ""
while password != "1234":
password = input("รหัสผ่าน: ")
print("เข้าสู่ระบบสำเร็จ")ถ้าเงื่อนไข while ไม่มีวันเป็นเท็จ โปรแกรมจะวนไม่จบจนเครื่องค้าง ต้องมีบรรทัดที่ค่อย ๆ ทำให้เงื่อนไขเป็นเท็จเสมอ (เช่น count -= 1) ถ้าโปรแกรมค้างให้กด Ctrl+C เพื่อหยุด
break และ continue
# break = ออกจาก loop ทันที
for i in range(100):
if i == 5:
break
print(i) # 0 1 2 3 4 (หยุดที่ 5)
# continue = ข้ามไปรอบถัดไป (ไม่ทำบรรทัดที่เหลือ)
for i in range(10):
if i % 2 == 0:
continue
print(i) # 1 3 5 7 9 (ข้ามเลขคู่)loop ซ้อน loop (Nested Loops)
วาง loop ไว้ใน loop ใช้กับตาราง ตัวคูณ หรือข้อมูล 2 มิติ ระวังเรื่องประสิทธิภาพ: loop ซ้อน 2 ชั้นทำงาน n×n รอบ (จะเรียนเรื่องนี้ลึกในบท Big-O)
# สูตรคูณแม่ 2 ถึง 4
for row in range(2, 5):
for col in range(1, 13):
print(f"{row}x{col}={row*col}", end=" ")
print() # ขึ้นบรรทัดใหม่เมื่อจบแต่ละแม่Pattern การวนที่เจอบ่อย
nums = [4, 8, 15, 16, 23, 42]
# 1) สะสมผลรวม
total = 0
for n in nums:
total += n
print(total) # 108
# 2) นับจำนวนที่เข้าเงื่อนไข
count = 0
for n in nums:
if n > 15:
count += 1
print(count) # 3
# 3) หาค่ามากที่สุดเอง
biggest = nums[0]
for n in nums:
if n > biggest:
biggest = n
print(biggest) # 42zip — วนสองลิสต์พร้อมกัน (ใช้บ่อยในงาน)
เมื่อมีข้อมูล 2 ชุดที่คู่กัน (เช่นชื่อกับคะแนน) ใช้ zip วนพร้อมกันทีละคู่ — สะอาดกว่าวนด้วย index มาก
names = ["Aph", "Bee", "Cha"]
scores = [80, 95, 70]
for name, score in zip(names, scores):
print(f"{name} ได้ {score} คะแนน")
# Aph ได้ 80 คะแนน ...
# วน dict ด้วย .items() ก็ได้ทั้ง key และ value
prices = {"กาแฟ": 50, "ชา": 40}
for item, price in prices.items():
print(f"{item} ราคา {price} บาท")สรุปหัวข้อนี้
- for วนตามลำดับ — ใช้กับ range() หรือวนตามลิสต์/ข้อความโดยตรง
- enumerate() ให้ทั้งลำดับ+ค่า; zip() วนหลายลิสต์พร้อมกัน; .items() วน dict
- while วนจนกว่าเงื่อนไขจะเท็จ — ต้องมีจุดที่ทำให้เงื่อนไขเปลี่ยน เลี่ยง infinite loop
- break ออกจาก loop, continue ข้ามไปรอบถัดไป
- loop ซ้อน loop ใช้กับตาราง/2 มิติ แต่ระวังประสิทธิภาพ
- จำ pattern: สะสมผลรวม, นับ, หาค่ามาก/น้อยสุด
1) print เลข 1-100 ที่หาร 3 ลงตัว 2) รับเลข n แล้วหาผลรวม 1 ถึง n 3) หา factorial ของ n ด้วย loop 4) รับตัวเลขไปเรื่อย ๆ จนผู้ใช้พิมพ์ 0 แล้วบอกผลรวมและค่าเฉลี่ย 5) วาดสามเหลี่ยมดาว (* ทีละแถวเพิ่มขึ้น) ด้วย loop ซ้อน