φυβλαςのβλογ
บล็อกของ 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)
หอดูดาวโบราณปักกิ่ง ตอนที่ ๑: แท่นสังเกตการณ์และสวนดอกไม้
พิพิธภัณฑ์สถาปัตยกรรมโบราณปักกิ่ง
เที่ยวเมืองตานตง ล่องเรือในน่านน้ำเกาหลีเหนือ
ตระเวนเที่ยวตามรอยฉากของอนิเมะในญี่ปุ่น
เที่ยวชมหอดูดาวที่ฐานสังเกตการณ์ซิงหลง
ทำไมจึงไม่ควรเขียนวรรณยุกต์เวลาทับศัพท์ภาษาต่างประเทศ

บทความแต่ละเดือน

2024年

1月 2月 3月 4月
5月 6月 7月 8月
9月 10月 11月 12月

2023年

1月 2月 3月 4月
5月 6月 7月 8月
9月 10月 11月 12月

2022年

1月 2月 3月 4月
5月 6月 7月 8月
9月 10月 11月 12月

2021年

1月 2月 3月 4月
5月 6月 7月 8月
9月 10月 11月 12月

2020年

1月 2月 3月 4月
5月 6月 7月 8月
9月 10月 11月 12月

ค้นบทความเก่ากว่านั้น

ไทย

日本語

中文