Notes & software courses · Free to learn
Aph's Blog
On this page

การวนซ้ำ (Loops: for & while)

👋 อ่านฟรีทั้งหมดบน Aph's Blog — เนื้อหาภาษาไทย ทำตามทีละหน้าใน sidebar ได้เลย หากมีข้อเสนอแนะหรืออยากให้เพิ่มหัวข้อไหน บอกได้เสมอ

ทำคำสั่งซ้ำ ๆ โดยไม่ต้องเขียนซ้ำ — for, while, range, break/continue และ pattern ที่เจอบ่อย

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

for loop กับ range()

for ใช้วนตามลำดับของค่า วิธีที่พบบ่อยคือใช้คู่กับ range() ที่สร้างลำดับตัวเลขให้

python
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 แนะนำ

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 วนตราบใดที่เงื่อนไขยังเป็นจริง เหมาะเมื่อไม่รู้จำนวนรอบล่วงหน้า เช่นวนจนกว่าผู้ใช้จะพิมพ์คำว่าออก

python
count = 5
while count > 0:
    print(count)
    count -= 1          # ต้องเปลี่ยนค่า ไม่งั้นวนไม่จบ!
print("ปล่อยจรวด!")

# วนรับข้อมูลจนกว่าจะถูก
password = ""
while password != "1234":
    password = input("รหัสผ่าน: ")
print("เข้าสู่ระบบสำเร็จ")
ระวัง infinite loop

ถ้าเงื่อนไข while ไม่มีวันเป็นเท็จ โปรแกรมจะวนไม่จบจนเครื่องค้าง ต้องมีบรรทัดที่ค่อย ๆ ทำให้เงื่อนไขเป็นเท็จเสมอ (เช่น count -= 1) ถ้าโปรแกรมค้างให้กด Ctrl+C เพื่อหยุด

break และ continue

python
# 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)

python
# สูตรคูณแม่ 2 ถึง 4
for row in range(2, 5):
    for col in range(1, 13):
        print(f"{row}x{col}={row*col}", end="  ")
    print()   # ขึ้นบรรทัดใหม่เมื่อจบแต่ละแม่

Pattern การวนที่เจอบ่อย

python
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)      # 42

zip — วนสองลิสต์พร้อมกัน (ใช้บ่อยในงาน)

เมื่อมีข้อมูล 2 ชุดที่คู่กัน (เช่นชื่อกับคะแนน) ใช้ zip วนพร้อมกันทีละคู่ — สะอาดกว่าวนด้วย index มาก

python
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 ซ้อน