Python ลูป for และ range()



เวลาต้องทำอะไรซ้ำ ๆ เช่น พิมพ์ข้อความ 10 บรรทัด หรือคำนวณทีละรายการในลิสต์ เราไม่เขียนโค้ดซ้ำ 10 รอบ แต่ใช้ลูป for ให้ Python วนทำให้

for วนบนลำดับข้อมูล

รูปแบบคือ “สำหรับสมาชิกแต่ละตัว ใน ลำดับข้อมูล ให้ทำ…”

fruits = ["แอปเปิล", "กล้วย", "ส้ม"]

for fruit in fruits:
    print(f"ฉันชอบ{fruit}")

ผลลัพธ์:

ฉันชอบแอปเปิล
ฉันชอบกล้วย
ฉันชอบส้ม

fruit เป็นตัวแปรที่เราตั้งชื่อเอง ในแต่ละรอบมันจะเปลี่ยนไปถือสมาชิกตัวถัดไปของลิสต์ ตั้งชื่อให้สื่อความหมายจะอ่านง่ายกว่า

วน string ก็ได้ จะได้ทีละตัวอักษร

for ch in "ABC":
    print(ch)

ผลลัพธ์:

A
B
C

range() สร้างลำดับตัวเลข

ถ้าอยากวนตามจำนวนรอบ ไม่ได้วนบนข้อมูลที่มีอยู่ ใช้ range()

range(หยุด)

เริ่มที่ 0 ไปจนถึงก่อนเลขที่ระบุ

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

ผลลัพธ์:

0
1
2
3
4

สังเกตว่าได้ 0 ถึง 4 ไม่ถึง 5 นี่คือพฤติกรรมมาตรฐานของ Python คือ “ไม่รวมตัวสุดท้าย”

range(เริ่ม, หยุด)

for i in range(1, 6):
    print(i)          # 1 2 3 4 5

range(เริ่ม, หยุด, ก้าว)

ตัวเลขที่สามคือระยะก้าว จะข้ามทีละเท่าไหร่

for i in range(0, 21, 5):
    print(i)          # 0 5 10 15 20

for i in range(10, 0, -1):
    print(i)          # นับถอยหลัง 10 ลงมาถึง 1

ใช้ตัวแปรลูปคำนวณ

ตัวอย่างคลาสสิก: หาผลรวม 1 ถึง 100

total = 0

for i in range(1, 101):
    total = total + i

print(total)   # 5050

total = total + i อ่านว่า “เอาค่า total เดิม บวกกับ i แล้วเก็บกลับเข้า total” เขียนย่อได้เป็น total += i

enumerate(): อยากได้ทั้งลำดับและค่า

บ่อยครั้งเราอยากรู้ว่ากำลังวนอยู่ตัวที่เท่าไหร่ด้วย enumerate() ให้ทั้งเลขลำดับและค่ามาพร้อมกัน

students = ["สมชาย", "สมหญิง", "สมศรี"]

for index, name in enumerate(students, start=1):
    print(f"{index}. {name}")

ผลลัพธ์:

1. สมชาย
2. สมหญิง
3. สมศรี

start=1 บอกให้เริ่มนับที่ 1 ถ้าไม่ใส่จะเริ่มที่ 0

ลูปซ้อนลูป

ใส่ for ไว้ใน for ได้ ลูปข้างในจะวนครบทุกรอบ ต่อหนึ่งรอบของลูปข้างนอก

for row in range(1, 4):
    for col in range(1, 4):
        print(f"{row}x{col}={row*col}", end="  ")
    print()

ผลลัพธ์:

1x1=1  1x2=2  1x3=3  
2x1=2  2x2=4  2x3=6  
3x1=3  3x2=6  3x3=9  

end=" " ทำให้ print ไม่ขึ้นบรรทัดใหม่ แต่ต่อด้วยช่องว่างสองช่องแทน ส่วน print() เปล่า ๆ ท้ายลูปในคือการสั่งขึ้นบรรทัดใหม่หนึ่งครั้ง

for … else

Python มีลูกเล่นแปลก ๆ คือ for มี else ได้ บล็อก else จะทำงานเมื่อลูปวนจนจบโดยไม่โดน break (เดี๋ยวเจอ break ในบทถัดไป) ใช้ไม่บ่อยแต่รู้ไว้ก็ดี

for i in range(1, 5):
    print(i)
else:
    print("วนครบแล้ว")

ตัวอย่างรวม: สูตรคูณตามที่ผู้ใช้เลือก

n = int(input("อยากดูสูตรคูณแม่ไหน: "))

print(f"--- สูตรคูณแม่ {n} ---")
for i in range(1, 13):
    print(f"{n} x {i:>2} = {n * i}")

ผลลัพธ์:

อยากดูสูตรคูณแม่ไหน: 7
--- สูตรคูณแม่ 7 ---
7 x  1 = 7
7 x  2 = 14
7 x  3 = 21
...
7 x 12 = 84

สรุป

  • for x in ข้อมูล: วนหยิบสมาชิกทีละตัว ใช้ได้กับลิสต์ string และลำดับข้อมูลอื่น ๆ
  • range(หยุด), range(เริ่ม, หยุด), range(เริ่ม, หยุด, ก้าว) สร้างลำดับตัวเลข และไม่รวมตัวสุดท้าย
  • enumerate() ให้เลขลำดับมาพร้อมค่า
  • += เป็นตัวย่อของ x = x + ... ใช้บ่อยมากกับการสะสมค่าในลูป

บทถัดไปว่าด้วยลูป while พร้อมคำสั่ง break และ continue ที่ใช้ควบคุมการวน