การทำซ้ำ หรือ ลูป (loop) ถือเป็นสิ่งที่สำคัญที่สุดอย่างหนึ่งของคอมพิวเตอร์ เพราะประโยชน์หลักๆของการใช้คอมพิวเตอร์คำนวณก็คือการให้ทำอะไรที่มีขั้นตอน ตายตัวซ้ำๆเดิมหลายๆครั้ง
ในการทำซ้ำนั้นในแต่ละรอบมักจะทำในสิ่งที่ไม่ใช่เหมือนเดิมแต่ต่างไปจากเดิมเรื่อยๆตามเงื่อนไขที่ต่างกันไปในแต่ละรอบ ซึ่งสามารถทำให้ได้ผลอะไรต่างๆมากมายจากการสั่งโปรแกรมเพียงครั้งเดียว
เช่นสั่งให้คอมนำคะแนนดิบของนักเรียนไปประมวลแล้วคิดออกมาเป็นเกรดในวิชา (ตัวอย่างใน
บทที่แล้ว) ก็สามารถให้คอมวนซ้ำเพื่อประมวลผลข้อมูลของนักเรียนร้อยกว่าคน ซึ่งการประมวลผลแต่ละทีก็มีขั้นตอนแบบเดิมเพียงแต่เปลี่ยนเงื่อนไขคือคะแนนดิบของนักเรียนที่ใส่ไปในแต่ละรอบ
คอมที่เร็วๆอาจสามารถคำนวณเป็นล้านๆรอบภายในเวลาชั่วพริบตา ทำให้สะดวกกว่าที่มนุษย์จะคำนวณด้วยตัวเอง ซึ่งทั้งช้าและอาจเกิดข้อผิดพลาดได้ง่าย
ในไพธอนคำสั่งที่ใช้ในการทำซ้ำมีอยู่ ๒ ชนิด คือ
while
กับ
for
ในที่นี้จะเริ่มอธิบายจาก
while
ก่อน
โครงสร้าง while โครงสร้าง
while
สำหรับวนซ้ำเป็นดังนี้
while เงื่อนไข:
โค้ดที่ต้องการทำซ้ำ
ยกตัวอย่างเช่น
x = 1
while(x<5):
print(x)
x += 1
ผลที่ได้
1
2
3
4
ในตัวอย่างนี้โปรแกรมจะเริ่มทำงานโดย
x
รับค่า
1
เข้ามา จากนั้นก็เริ่มเข้าสู่คำสั่ง
while
โดยเงื่อนไขคือจะมีการทำสิ่งที่อยู่บรรทัดต่อจาก
while
เมื่อ
x<5
ซึ่งรอบแรก
x
เป็น
1
ดังนั้นจึงผ่านเงื่อนไขจึงมีการทำคำสั่งสองบรรทัดถัดไปตามลำดับ โดยแสดงผลค่า
x
จากนั้นค่า
x
ก็จะถูกบวกเพิ่มอีก
1
พอสิ้นสุดคำสั่ง ส่วนนี้โปรแกรมก็จะย้อนกลับไปพิจารณาเงื่อนไขหลัง
while
อีกครั้ง ซึ่งคราวนี้
x
กลายเป็น
2
แล้ว ซึ่งก็ยังเข้าเงื่อนไขจึงมีการคำสั่งเดิมใหม่อีกที แต่ด้วยค่า
x
ที่เปลี่ยนไป
โปรแกรมจะวนซ้ำอย่างนี้ไปเรื่อยๆ ในขณะที่แต่ละรอบ
x
จะเพิ่มขึ้นเรื่อยๆ จนถึงรอบที่
4
พอจะขึ้นรอบที่
5
ในตอนนั้น
x
มีค่าเป็น
5
ซึ่งไม่เข้าเงื่อนไข จึงไม่มีการทำซ้ำต่อ แล้วโปรแกรมก็จะออกมาจากวังวนแล้วไปทำคำสั่งอื่นๆที่อยูถัดไปต่อ
จากตัวอย่างจะเห็นว่าลักษณะของโครงสร้าง
while
นั้นคล้ายกับ
if
คือพิมพ์
while
แล้วตามด้วยเงื่อนไข แล้วก็โคลอน
:
จากนั้นก็ขึ้นบรรทัดใหม่โดยมีการร่น แล้วใส่สิ่งที่ต้องการให้ทำซ้ำลงไป
ข้อแตกต่างก็คือ เมื่อโปรแกรมทำคำสั่งบรรทัดสุดท้ายของส่วนที่มีการร่นไปจนเสร็จแล้ว จะกลับมาพิจารณาเงื่อนไขที่อยู่หลัง while ใหม่อีกรอบ
และในทำนองเดียวกันกับ
if
เงื่อนไขที่อยู่ด้านหลัง
while
นั้นอาจใส่วงเล็บครอบแล้วไม่ต้องเว้นวรรคก็ได้ แต่เพื่อความเป็นระเบียบสวยงามจะขอใส่วงเล็บไว้ตลอด
คำสั่ง
while
จะทำให้โปรแกรมวนซ้ำตราบใดที่ยังเป็นไปตามเงื่อนไข ซึ่งโดยทั่วไปแล้วเงื่อนไขควรจะเป็นเท็จหลังจากทำซ้ำไปแล้วเป็นจำนวนหนึ่ง
หากตั้งเงื่อนไขที่ไม่มีวันเป็นจริงโปรแกรมก็จะทำงานต่อไปเรื่อยๆอย่างไม่สิ้นสุด ซึ่งเป็นสภาวะที่อันตราย ควรจะระวัง เช่น
y = 1
while(y>=1):
print(y)
y += 1
ในตัวอย่างนี้จะเห็นว่า
y
ไม่มีทางน้อยกว่า
1
ได้ไม่ว่าจะผ่านไปกี่ครั้งก็ตาม เพราะค่ามีแต่จะเพิ่มขึ้น ดังนั้นโปรแกรมจะทำงานอย่างไม่รู้จบจนกว่าเราจะหาทางหยุดโปรแกรมด้วยวิธีอื่น
หากเกิดเหตุการณ์แบบนี้ควรรีบทำการหยุดโปรแกรมโดยเร็ว สำหรับใน anaconda spyder ให้กดที่ปุ่มสี่เหลี่ยมมุมขวาบนของ IPython console หรือกด
ctrl+. (ในแมค เป็น
command + .) เพื่อรีสตาร์ตเคอร์เนล
เงื่อนไขสามารถตั้งได้หลากหลาย จำนวนครั้งที่ทำซ้ำอาจไม่ตายตัวในแต่ละครั้งที่ทำงาน ขึ้นอยู่กับผู้ใช้ว่าจะทำตามเงื่อนไขเมื่อไหร่
ลองสร้างเกมตอบคำถามทายตัวเลขง่ายๆขึ้นดู
khamtop = int(input('สงครามโลกครั้งที่ 2 สิ้นสุดลงในปี ค.ศ. ใด: '))
while(khamtop!=1945):
if(khamtop>1945): print('เร็วกว่านั้น') # กรณีตอบเลขสูงไป
else: print('ช้ากว่านั้น') # กรณีตอบเลขต่ำไป
khamtop = int(input('ตอบใหม่: '))
print('คำตอบถูกต้อง')
ตัวอย่างนี้เป็นโปรแกรมที่ถามคำถามแล้วให้ตอบ หากตอบผิดก็จะมีการบอกใบ้แล้วก็ให้ตอบใหม่ไปเรื่อยๆจนกว่าจะตอบถูกจึงสิ้น สุดการทำซ้ำ และทำคำสั่งต่อไป คือแสดงผลว่าตอบถูกแล้ว
ตัวอย่างเมื่อรันโปรแกรม
สงครามโลกครั้งที่ 2 สิ้นสุดลงในปี ค.ศ. ใด: 1000
ช้ากว่านั้น
ตอบใหม่: 2000
เร็วกว่านั้น
ตอบใหม่: 1950
เร็วกว่านั้น
ตอบใหม่: 1945
คำตอบถูกต้อง
ลองดูอีกตัวอย่าง โปรแกรมคำนวณค่าแฟ็กทอเรียล x!
x = int(input('ป้อนเลขจำนวนเต็ม: '))
xfac = 1
while(x>1):
xfac *= x
x -= 1
print(xfac)
ในโปรแกรมนี้เริ่มมาจะให้ป้อนจำนวนเต็มที่ต้องการหาค่าแฟ็กทอเรียล โดยเก็บไว้ในตัวแปร
x
จากนั้นกำหนดตัวแปรสำหรับเก็บผลลัพธ์ คือ
xfac
โดยเริ่มต้นมาจะเท่ากับ
1
จากนั้นก็เริ่มเข้าสู่โครงสร้าง
while
ซึ่งจะมีการทำซ้ำ โดยในแต่ละรอบ
x
จะค่อยๆลดลงไปเรื่อยๆทีละ
1
ส่วน
xfac
จะค่อยๆถูกคูณเพิ่มด้วยค่าของ
x
สุดท้ายพอ
x
ลดลงจนเหลือ
1
การทำซ้ำก็จะสิ้นสุดลง และค่า
xfac
ที่ได้ซึ่งเป็นผลลัพธ์ที่ต้องการก็จะถูกแสดงผลออกมา
การใช้ break และ else บางครั้งในการทำซ้ำอาจไม่จำเป็นต้องทำไปจนกว่าเงื่อนไขหลัง
while
จะเป็นเท็จจึงออก แต่อาจจะตั้งเงื่อนไขเพิ่มเติมบางอย่างที่ทำให้สิ้นสุดการทำซ้ำลงทันที ซึ่งทำได้โดยใช้คำสั่ง
break
การใช้ให้ใส่
break
ลงหลังเงื่อนไขบางอย่างซึ่งอาจกำหนดโดย
if
else
อาจถูกใช้คู่กับคำสั่ง
while
ได้ โดยคำสั่งที่อยู่หลัง
else
จะทำงานต่อเมื่อเงื่อนไขใน
while
เป็นเท็จ ดังนั้นโดยทั่วไปแล้วเมื่อหลุดจากการทำซ้ำแบบปกติคำสั่งหลัง
else
จะถูกทำ แต่หากออกจากการทำซ้ำเนื่องจาก
break
จะทำให้คำสั่งตรง
else
ไม่ถูกทำ
ตัวอย่าง
khamtop = input('ผู้คิดค้นภาษาไพธอนมีชื่อเต็มว่า: ')
okat = 3
while(khamtop!='Guido van Rossum'):
print('ตอบผิด')
okat -= 1
if(okat==0):
print('คุณหมดโอกาสแล้ว')
break
print('คุณมีโอกาสตอบอีก',okat,'ครั้ง')
khamtop = input('ตอบใหม่: ')
else: print('คำตอบถูกต้อง')
ผลการรัน
ผู้คิดค้นภาษาไพธอนมีชื่อเต็มว่า: Ludwig van Beethoven
ตอบผิด
คุณมีโอกาสตอบอีก 2 ครั้ง
ตอบใหม่: Johannes Diderik van der Waals
ตอบผิด
คุณมีโอกาสตอบอีก 1 ครั้ง
ตอบใหม่: Vincent Willem van Gogh
ตอบผิด
คุณหมดโอกาสแล้ว
การใช้ continue บางครั้งยังวนไม่ครบรอบก็มีเงื่อนไขบางอย่างที่ทำให้ต้องการจบรอบแล้วขึ้นรอบใหม่ทันที กรณีนี้จะใช้
continue
ตัวอย่าง สมมุติว่าเรากำลังขึ้นตึกสูง 20 ชั้นโดยขึ้นลิฟต์จากชั้น 1 ระหว่างทางก็เห็นตัวเลขชั้นไล่ไปเรื่อยๆ แต่ตึกนั้นไม่มีชั้น 13 พอถึง 12 ก็ข้ามไป 14 เลย
n = 0
while(n<20):
n += 1
if(n==13): continue
print(n,end=' ')
ผลลัพธ์
1 2 3 4 5 6 7 8 9 10 11 12 14 15 16 17 18 19 20
การใช้ while ซ้อน while while
ก็เช่นเดียวกับ
if
สามารถมีการซ้อนกันได้ เกิดเป็นโครงสร้างเป็นชั้นๆ โดย
while
ที่อยู่ด้านในจะต้องร่นเข้าไปอีก
กรณีแบบนี้จะมีการทำซ้ำตามวังวนที่อยู่ด้านในก่อนจนจบแล้วจึงทำซ้ำตามวังวนด้านนอก ซึ่งจะกลับมาเริ่มต้นวังวนด้านในซ้ำอีกเรื่อยๆ
ตัวอย่าง โปรแกรมแสดงค่าสูตรคูณตั้งแต่แม่ 2 ถึง 5
i = 2 # ค่าตัวคูณทางซ้าย เริ่มจาก 2
while(i<=5): # ทำซ้ำไปจนถึง 5
j = 1 # ค่าตัวคูณทางขวา เริ่มจาก 1 ในแต่ละรอบ
while(j<=5): # ทำซ้ำไปจนถึง 5
print(i,'×',j,'=',i*j, end=', ') # พิมพ์สูตรคูณ
j += 1 # เพิ่มทีละ 1 ในแต่ละรอบ
print('') # ขึ้นบรรทัดใหม่
i +=1 # พิมพ์จนจบบรรทัด ตัวซ้ายบวกเพิ่มอีก 1
ผลลัพธ์
2 × 1 = 2, 2 × 2 = 4, 2 × 3 = 6, 2 × 4 = 8, 2 × 5 = 10,
3 × 1 = 3, 3 × 2 = 6, 3 × 3 = 9, 3 × 4 = 12, 3 × 5 = 15,
4 × 1 = 4, 4 × 2 = 8, 4 × 3 = 12, 4 × 4 = 16, 4 × 5 = 20,
5 × 1 = 5, 5 × 2 = 10, 5 × 3 = 15, 5 × 4 = 20, 5 × 5 = 25,
สรุปเนื้อหา
- โปรแกรมสามารถทำการวนซ้ำได้โดยใช้โครงสร้าง
while
- สามารถแทรกคำสั่ง
break
เพื่อหยุดการทำซ้ำเมื่อเข้าเงื่อนไขบางอย่างได้
else
หลัง while
จะทำงานเมื่อสิ้นสุดการทำซ้ำโดยไม่เจอ break
- สามารถแทรกคำสั่ง
continue
เพื่อให้เริ่มการวนซ้ำรอบต่อไปใหม่ทันทีโดยที่ยังไม่ได้ทำจนจบ
while
สามารถซ้อนกันหลายชั้นได้
อ้างอิง