φυβλαςのβλογ
บล็อกของ phyblas



ภาษา python เบื้องต้น บทที่ ๗: การทำซ้ำด้วย while
เขียนเมื่อ 2016/03/04 23:08
แก้ไขล่าสุด 2024/02/23 18:43
 

การทำซ้ำ หรือ ลูป (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 สามารถซ้อนกันหลายชั้นได้


อ้างอิง




-----------------------------------------

囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧

ดูสถิติของหน้านี้

หมวดหมู่

-- คอมพิวเตอร์ >> เขียนโปรแกรม >> python

ไม่อนุญาตให้นำเนื้อหาของบทความไปลงที่อื่นโดยไม่ได้ขออนุญาตโดยเด็ดขาด หากต้องการนำบางส่วนไปลงสามารถทำได้โดยต้องไม่ใช่การก๊อปแปะแต่ให้เปลี่ยนคำพูดเป็นของตัวเอง หรือไม่ก็เขียนในลักษณะการยกข้อความอ้างอิง และไม่ว่ากรณีไหนก็ตาม ต้องให้เครดิตพร้อมใส่ลิงก์ของทุกบทความที่มีการใช้เนื้อหาเสมอ

สารบัญ

รวมคำแปลวลีเด็ดจากญี่ปุ่น
มอดูลต่างๆ
-- numpy
-- matplotlib

-- pandas
-- manim
-- opencv
-- pyqt
-- pytorch
การเรียนรู้ของเครื่อง
-- โครงข่าย
     ประสาทเทียม
ภาษา javascript
ภาษา mongol
ภาษาศาสตร์
maya
ความน่าจะเป็น
บันทึกในญี่ปุ่น
บันทึกในจีน
-- บันทึกในปักกิ่ง
-- บันทึกในฮ่องกง
-- บันทึกในมาเก๊า
บันทึกในไต้หวัน
บันทึกในยุโรปเหนือ
บันทึกในประเทศอื่นๆ
qiita
บทความอื่นๆ

บทความแบ่งตามหมวด



ติดตามอัปเดตของบล็อกได้ที่แฟนเพจ

  ค้นหาบทความ

  บทความแนะนำ

ตัวอักษรกรีกและเปรียบเทียบการใช้งานในภาษากรีกโบราณและกรีกสมัยใหม่
ที่มาของอักษรไทยและความเกี่ยวพันกับอักษรอื่นๆในตระกูลอักษรพราหมี
การสร้างแบบจำลองสามมิติเป็นไฟล์ .obj วิธีการอย่างง่ายที่ไม่ว่าใครก็ลองทำได้ทันที
รวมรายชื่อนักร้องเพลงกวางตุ้ง
ภาษาจีนแบ่งเป็นสำเนียงอะไรบ้าง มีความแตกต่างกันมากแค่ไหน
ทำความเข้าใจระบอบประชาธิปไตยจากประวัติศาสตร์ความเป็นมา
เรียนรู้วิธีการใช้ regular expression (regex)
การใช้ unix shell เบื้องต้น ใน linux และ mac
g ในภาษาญี่ปุ่นออกเสียง "ก" หรือ "ง" กันแน่
ทำความรู้จักกับปัญญาประดิษฐ์และการเรียนรู้ของเครื่อง
ค้นพบระบบดาวเคราะห์ ๘ ดวง เบื้องหลังความสำเร็จคือปัญญาประดิษฐ์ (AI)
หอดูดาวโบราณปักกิ่ง ตอนที่ ๑: แท่นสังเกตการณ์และสวนดอกไม้
พิพิธภัณฑ์สถาปัตยกรรมโบราณปักกิ่ง
เที่ยวเมืองตานตง ล่องเรือในน่านน้ำเกาหลีเหนือ
ตระเวนเที่ยวตามรอยฉากของอนิเมะในญี่ปุ่น
เที่ยวชมหอดูดาวที่ฐานสังเกตการณ์ซิงหลง
ทำไมจึงไม่ควรเขียนวรรณยุกต์เวลาทับศัพท์ภาษาต่างประเทศ

ไทย

日本語

中文