เมื่อจบหัวข้อนี้ ผู้เรียนควรจะ
√ CLO2: เลือกใช้ตัวแปร ชนิดข้อมูล คำสั่งเงื่อนไข คำสั่งทำซ้ำ และไลบรารีมาตรฐานในการเขียนโปรแกรมได้อย่างเหมาะสม
ใช้คำสั่ง for และ while เพื่อเขียนโปรแกรมที่มีการวนซ้ำ
ใช้คำสั่ง range ร่วมกับคำสั่ง for ได้
เขียนคำสั่ง while และคำสั่ง for ที่ทำงานเหมือนกันได้
ใช้คำสั่ง break และ continue ร่วมกับ loop ได้
ระบุข้อแตกต่างระหว่างการทำซ้ำแบบ for และ while
√ CLO5: เขียนโปรแกรมเพื่อแก้ปัญหาทางด้านคณิตศาสตร์ สถิติ และปัญหาในชีวิตประจำวัน
เขียนโปรแกรมเพื่อแก้ปัญหาโจทย์ที่มีการวนซ้ำ
√ CLO6: ทดสอบโปรแกรม ค้นหาจุดบกพร่อง และแก้ไขให้โปรแกรมทำงานถูกต้อง
ทดสอบโปรแกรมปัญหาแบบมีการวนซ้ำ โดยสร้างกรณีทดสอบให้ครอบคลุมกรณีที่เป็นไปได้ทั้งหมด
ค้นหาจุดบกพร่อง (bug) และแก้ไข (debug) ให้โปรแกรมทำงานถูกต้อง
สิ่งที่คอมพิวเตอร์ถนัดมากที่สุดคือการทำงานซ้ำๆ กัน กระบวนการการแก้ปัญหาบางครั้งมีการทำงานในลักษณะเดิมซ้ำๆ กัน ภาษาโปรแกรมจึงมีคำสั่งที่ช่วยทำให้สามารถทำซ้ำได้อัตโนมัติ ลดการเขียนคำสั่งเดิมซ้ำๆ กันได้ นอกจากนี้ยังช่วยให้โปรแกรมอ่านง่าย และเพิ่มความยืดหยุ่นในการทำงานขึ้นด้วย
คำสั่งทำซ้ำ (Loop) ในภาษาไพธอน มี 2 รูปแบบ ได้แก่
คำสั่ง for
คำสั่ง while
คำสั่ง for เหมาะสำหรับการทำซ้ำโดยรู้จำนวนครั้งที่แน่นอน (definite loop)
คำสั่ง for
ใช้เมื่อต้องการทำซ้ำตามลำดับของข้อมูล (sequence) ในโครงสร้างข้อมูล โดยจะทำชุดคำสั่งใน for-block จนครบจำนวนครั้งที่ระบุ แล้วจึงจะไปทำคำสั่งลำดับถัดไปนอก loop for
รูปแบบคำสั่ง
for iterating_var in seq :
statements(s) # body of for loop
โดย
iterating_var คือ ตัวแปรที่ใช้อ้างถึงค่าแต่ละตัวใน seq ในแต่ละรอบ
seq คือ โครงสร้างข้อมูลที่ต้องการวนซ้ำ
statements คือ ชุดคำสั่งที่ต้องการทำซ้ำ
แบ่งเป็นประเภทดังนี้
ชนิดข้อมูลพื้นฐาน (Primitive data types)
ชนิดข้อมูลที่
Float, Integer, Boolean, String
ชนิดข้อมูลที่ไม่ใช่พื้นฐาน (Non-primitive data types)
Complex number, Set, List, Tuple, Dictionary
ลำดับ (sequence) คือประเภทข้อมูลที่สามารถเข้าถึงข้อมูลได้โดยใช้ดัชนี ลำดับในไพธอน ได้แก่ รายการ (list) ทูเพิล (tuple) และสตริง (string)
ชนิดข้อมูลที่สามารถใช้ในการทำซ้ำได้ ได้แก่ String, List, Tuple, ซึ่งถือเป็นชนิดข้อมูลประเภท Sequence และ Dictionary
โดยในวิชานี้เราจะเน้นการทำซ้ำกับ string, list และ dictionary
ตัวอย่างโปรแกรมวนซ้ำกับ string
my_string = "Python"
for char in my_string :
print(char)
คำสั่งทำซ้ำ for จะวนทำซ้ำเพื่อพิมพ์ตัวอักษรทุกตัวที่อยู่ในตัวแปร my_string
โดย char เป็นตัวแปรที่ใช้เก็บค่าตัวอักษรในแต่ละรอบ
ดังนั้นในลูปนี้จะทำงาน 5 รอบ เพราะ string มีความยาว 5 ตัวอักษร
output
P
y
t
h
o
n
ตัวอย่างโปรแกรมวนซ้ำกับ list
my_list = [1, 2, 3, 4]
for num in my_list :
print(num * 2)
คำสั่งทำซ้ำ for จะวนทำซ้ำเพื่อพิมพ์สมาชิกใน list ทุกตัวที่อยู่ในตัวแปร my_list คูณด้วย 2
โดย num เป็นตัวแปรที่ใช้เก็บค่าสมาชิกแต่ละตัวในแต่ละรอบ
ดังนั้นในลูปนี้จะทำงาน 4 รอบ เพราะสมาชิกใน list มีจำนวน 4 ตัว
List เป็นชนิดข้อมูลที่มีสมาชิกได้หลายค่า เขียนอยู่ภายในเครื่องหมาย [ ] และคั่นสมาชิกแต่ละตัวด้วยเครื่องหมาย ","
output
2
4
6
8
ตัวอย่างโปรแกรมวนซ้ำกับ list ของ string
cars = ['Toyota', 'Honda', 'Nissan', 'Ford']
for car in cars:
print('Car brand:', car)
output
Car brand: Toyota
Car brand: Honda
Car brand: Nissan
Car brand: Ford
เราสามารถสร้าง list ของตัวเลขได้อัตโนมัติ โดยใช้ฟังก์ชัน range
รูปแบบฟังก์ชัน range
for iterating_var in range(start, stop, step) :
statements(s)
เมื่อเรียกใช้ฟังก์ชัน range จะต้องระบุค่าที่ฟังก์ชันจำเป็นต้องใช้ เรียกว่า parameter ไว้ในวงเล็บเสมอ
โดยฟังก์ชัน range มี parameter ตั้งแต่ 1-3 ตัว โดยต้องมี stop อย่างน้อย 1 ตัวเสมอ ส่วนอีก 2 ตัวจะมีหรือไม่ก็ได้ และ parameter ทุกตัวต้องเป็นเลขจำนวนเต็มเท่านั้น
ความหมายของ parameter แต่ละตัว คือ
start เป็นค่าเริ่มต้นของสมาชิกตัวแรกใน list ถ้าไม่ระบุจะมีค่าเริ่มต้นเป็น 0
stop เป็นค่าสิ้นสุด โดยสมาชิกตัวสุดท้ายของ list จะเป็นค่าที่อยู่ก่อนค่าสิ้นสุดเสมอ (ไม่รวมค่าสิ้นสุดเป็นสมาชิกใน list)
step เป็นจำนวนค่าที่ต้องการเพิ่มขึ้นหรือลดลง สำหรับสมาชิกตัวถัดไป ถ้าไม่ระบุจะมีค่าเพิ่มขึ้นครั้งละ 1
กรณีที่ start >= stop จะไม่สามารถสร้าง list ได้ จะได้คำตอบเป็น [ ] คือ list ว่าง (empty list)
ตัวอย่างโปรแกรมวนซ้ำโดยใช้ range ระบุค่า stop
ตัวอย่าง for1.py
for i in range(5):
print(i)
ฟังก์ชัน range(5) เป็นการระบุเฉพาะค่า stop จะได้ list ประกอบด้วย [0, 1, 2, 3, 4]
สังเกตว่าจะเริ่มต้นที่ค่า start คือ 0 และไม่รวมค่า stop คือ 5 เป็นสมาชิกใน list
output
0
1
2
3
4
ตัวอย่าง for2.py
for i in range(1,7):
print(i)
ฟังก์ชัน range(1,7) เป็นการระบุเฉพาะค่า start และ stop
จะได้ list ประกอบด้วย [1, 2, 3, 4, 5, 6]
สังเกตว่าจะเริ่มต้นที่ค่า start คือ 1 และไม่รวมค่า stop คือ 7 เป็นสมาชิกใน list
output
1
2
3
4
5
6
ตัวอย่าง for3.py
for i in range(2,10,2):
print(i)
ฟังก์ชัน range(2,10, 2) เป็นการระบุเฉพาะค่า start และ stop
จะได้ list ประกอบด้วย [2, 4, 6, 8] สังเกตว่าจะเริ่มต้นที่ค่า start คือ 2 จากนั้นเพิ่มค่าขึ้นทีละ 2 และไม่รวมค่า stop คือ 10 เป็นสมาชิกใน list
output
2
4
6
8
ตัวอย่างผลของฟังก์ชัน range
range(0, 7, 1)
range(-3, 5, 2)
range(7, 3, -2)
range(7, 3, 2)
range(0.5, 2, 0.25)
list ที่ได้
[0, 1, 2, 3, 4, 5, 6]
[-3, -1, 1, 3]
[7, 5]
[] (list ว่าง)
syntax error
ข้อสังเกต
สังเกตผลลัพธ์ของ 2 ฟังก์ชันสุดท้าย
เนื่องจาก 7 >= 3 และ step เป็นค่าบวกจึงระบุค่าสมาชิกตัวถัดไปใน list ไม่ได้
ค่า parameter ต้องเป็น integer เท่านั้น
เราสามารถตรวจสอบคำตอบได้โดยพิมพ์คำสั่งใน python shell โดยใช้ฟังก์ชัน list ครอบไว้เพื่อแสดงผล เช่น
>>> list(range(5))
[0, 1, 2, 3, 4]
ลองหาแสดงสมาชิกใน list ของฟังก์ชัน range ต่อไปนี้
range(10)
range(2)
range(1)
range(0)
range(-10)
range(5, 10)
range(5, 7)
range(5, 5)
range(0, 5)
range(0, -1)
range(0, 10, 6)
range(10, 90, 20)
range(10, 5, -1)
range(6, 5, -2)
range(4, 5, -2)
ตัวอย่างโจทย์ระดับง่าย
เขียนโปรแกรมโดยใช้ลูป for และฟังก์ชัน range อย่างน้อย 3 รูปแบบที่แตกต่างกัน
พิมพ์เลข 1 ถึง 10
พิมพ์เลขคู่ที่อยู่ระหว่าง 2 ถึง 10
พิมพ์เลขยกกำลังสองของค่าระหว่าง -5 ถึง 5
พิมพ์เลขนับถอยหลังจาก 10 ถึง 1
ตัวอย่างโจทย์ระดับกลาง
1. รับจำนวนเต็ม n จากผู้ใช้ แล้วคำนวณหาผลรวมตั้งแต่เลข 1 ถึง n โดยใช้ loop for
n = 10
sum = 55
n = 100
sum = 5050
n = 5
sum = 15
คำตอบ
n = int(input('n = '))
sum = 0
for i in range(1, n+1):
sum = sum + i
print(sum)
2. รับจำนวนเต็ม n จากผู้ใช้ 5 จำนวน แล้วคำนวณหาผลรวมและค่าเฉลี่ยของเลข
20
1
34
8
15
sum = 78
average = 15.60
คำตอบ
sum_n = 0
for i in range(5):
n = int(input())
sum_n = sum_n + n
print('sum =', sum_n)
print('average = %.2f' % (sum_n/5))
3. รับเลขจำนวนเต็ม n จากผู้ใช้ รับเลขมาอีก n ตัว แล้วนับว่าในจำนวนนี้มีเลขจำนวนเต็มลบกี่ตัว
n = 5
1
-3
0
-1
4
count = 2
คำตอบ
n = int(input('n = '))
count = 0
for i in range(n):
x = int(input())
if x < 0:
count += 1
print('count =', count)
4. รับ string จากผู้ใช้ แล้วนับว่ามีสระ (aeiou) และพยัญชนะทั้งหมดกี่ตัว
hello
2
3
programming
3
8
คำตอบ
nvows, ncons = 0, 0
str = input()
for ch in str:
if ch in "aeiou":
nvows += 1
else:
ncons += 1
print(nvows)
print(ncons)
5. รับเลขจำนวนเต็ม n จากผู้ใช้ แล้วพิมพ์ * ตามตัวอย่างในรูป
n = 5 n = 3 n = 1
* * *
** **
*** ***
****
*****
คำตอบ
n = int(input("n = "))
for i in range(1, n+1):
print("* "*i)
คำสั่ง while เหมาะสำหรับการทำซ้ำไม่รู้จำนวนครั้งที่แน่นอน (indefinite loop)
คำสั่ง while
ใช้เมื่อต้องการทำซ้ำโดยไม่รู้จำนวนครั้งที่แน่นอน แต่ใช้เงื่อนไขในการตรวจสอบว่าจะทำซ้ำหรือไม่ได้ โดยจะทำชุดคำสั่งใน while-block ถ้าเงื่อนไขเป็นจริง ถ้าเงื่อนไขเป็นเท็จจะหยุดทำซ้ำ แล้วไปทำคำสั่งลำดับถัดไปนอก loop while
รูปแบบคำสั่ง
while condition :
statements(s) # body of while loop
โดย condition คือ นิพจน์ที่ให้ค่าเป็นจริงหรือเท็จ
เราสามารถอ่านได้ว่า ขณะที่เงื่อนไขเป็นจริง จะทำคำสั่งซ้ำ
ตัวอย่างโปรแกรมวนซ้ำโดยใช้คำสั่ง while
ตัวอย่าง while1.py
i = 0
while i < 5:
print(i, end = ' ')
i = i + 1 # หรือ i += 1
คำสั่งที่อยู่ในบล็อคจะทำทุกครั้งที่เงื่อนไขเป็นจริง เมื่อเปรียบเทียบกับคำสั่ง for จะเห็นว่า
ต้องกำหนดค่าเริ่มต้นของตัวแปรก่อนคำสั่ง while
กำหนดเงื่อนไขที่ต้องการให้ทำซ้ำ (ถ้าเป็นจริงจะทำซ้ำ)
ปรับค่าตัวแปร i
เปรียบเทียบกับคำสั่ง for
for i in range(5):
print(i, end = ' ')
ผลลัพธ์
0 1 2 3 4
ตัวอย่าง while2.py แสดงค่า 2 ยกกำลัง 0 ถึง 2 ยกกำลัง 4
i = 0
while i < 5:
print(2**i, end = ' ')
i += 1 # หรือ i = i + 1
i = 1
while i <= 2**4:
print(i, end = ' ')
i *= 2 # หรือ i = i * 2
เปรียบเทียบกับคำสั่ง for
for i in range(5):
print(2**i, end = ' ')
ผลลัพธ์
1 2 4 8 16
ตัวอย่าง while3.py หาผลรวมของเลข 1 ถึง 10 (1+2+3+...+10)
total = 0
i = 1
while i <= 10:
total += i
i += 1 # หรือ i = i * 1
print("1+2+3+...+10 = %d" % total)
เปรียบเทียบกับคำสั่ง for
total = 0
for i in range(1, 11):
total += i
print("1+2+3+...+10 = %d" % total)
ผลลัพธ์
1+2+3+...+10 = 55
ตัวอย่าง while4.py หาผลรวมของเลข 1 ถึง 10 (10+9+8+...+1)
total = 0
i = 10
while i > 0:
total += i
i -= 1 1
print("10+9+8+...+1 = %d" % total)
เปรียบเทียบกับคำสั่ง for
total = 0
for i in range(10, 0,-1):
total += i
print("10+9+8+...+1 = %d" % total)
ผลลัพธ์
1+2+3+...+10 = 55
เป็นคำสั่งที่ใช้ร่วมกับคำสั่งทำซ้ำทั้ง for และ while
คำสั่ง break
ใช้ร่วมกับคำสั่ง for/while เพื่อหยุดการทำงาน ของลูป
ใช้ร่วมกับคำสั่งเงื่อนไข เพื่อระบุเงื่อนไขที่ใช้ในการหยุดลูป
คำสั่ง continue
ใช้ร่วมกับคำสั่ง for/while เพื่อข้ามการทำงานในรอบนั้น แต่ไม่หยุดการทำงานของลูป
จะใช้ร่วมกับคำสั่งเงื่อนไข เพื่อระบุเงื่อนไขที่ต้องการข้ามการทำงานในรอบนั้น
ตัวอย่าง while_break.py
total = 0
while True:
num = int(input())
if num <= 0:
break
total += num
print('sum =', total)
ตัวอย่างคำสั่ง while สามารถใช้ร่วมกับคำสั่ง break เพื่อหยุดการทำงานของ loop ที่ไม่มีที่สิ้นสุด เมื่อผู้ใช้ใส่ค่าที่น้อยกว่าหรือเท่ากับ 0
ผลลัพธ์
1
10
9
8
-4
sum = 28
ตัวอย่าง for_continue.py
string = input("Enter string: ")
for char in string:
if not char.isalpha():
continue
print(char, end = '')
ตัวอย่างคำสั่ง for ที่พิมพ์ตัวอักษรใน string ถ้าเป็นตัวอักษร แต่ถ้าไม่ใช่ตัวอักษรจะข้ามไปไม่พิมพ์ แต่จะยังไม่หยุดลูปจนกว่าจะวนลูปครบตัวอักษรทุกตัว
ผลลัพธ์
Enter string: 517111 Python
Python
Enter string: AB12CD?EFG
ABCDEFG
Enter string: B.Sc. in Science
BScinScience
ตัวอย่าง while_break_continue.py
total = 0
while True:
num = int(input())
if num < 0:
continue
if num == 0:
break
total += num
print('sum =', total)
ตัวอย่างคำสั่ง while ที่ทำซ้ำแบบไม่รู้จบ ใช้ร่วมกับคำสั่ง continue เพื่อข้ามการทำงานของ loop เมื่อผู้ใช้ใส่ค่าเลขติดลบ และใช้คำสั่ง break เพื่อหยุดการทำงานของ loop เมื่อผู้ใช้ใส่ค่า 0
ผลลัพธ์
1
10
-4
2
-4
0
sum = 13
คำสั่ง for สามารถใช้กับคำสั่ง else ได้ โดยคำสั่งในส่วนของ else จะทำงานเมื่อวนลูปจนครบทุกรอบของคำสั่ง for
ตัวอย่าง for_else.py
digits = [0, 1, 5]
for i in digits:
print(i)
else:
print("No items left.")
ในตัวอย่างเมื่อลูป for หยุดเพราะคำสั่ง break ส่วนของ else จะไม่ทำงาน แต่ถ้าลูป for ทำตั้งแต่รอบที่ i มีค่าเป็น 2 จนถึงรอบสุดท้ายที่ i มีค่า num-1 นั่นคือไม่มีเลขใดที่อยู่ระหว่าง 2 ถึง num-1 หารค่า num ลงตัว จะเป็นเลขจำนวนเฉพาะ
ผลลัพธ์
0
1
5
No item left.
ตัวอย่าง prime.py เพื่อตรวจสอบว่า num เป็นเลขจำนวนเฉพาะหรือไม่
num = int(input())
for i in range(2, num):
if (num % i) == 0: #check for a factor
print(num, "is not a prime number.")
break # not prime number
else: #prime number
print(num, "is a prime number.")
ในตัวอย่างเมื่อลูป for หยุดเพราะคำสั่ง break ส่วนของ else จะไม่ทำงาน แต่ถ้าลูป for ทำตั้งแต่รอบที่ i มีค่าเป็น 2 จนถึงรอบสุดท้ายที่ i มีค่า num-1 นั่นคือไม่มีเลขใดที่อยู่ระหว่าง 2 ถึง num-1 หารค่า num ลงตัว จะเป็นเลขจำนวนเฉพาะ
ผลลัพธ์
7
7 is a prime number.
4
4 is not a prime number.
ตัวอย่าง guess_num1.py ให้ผู้ใช้เดาเลขที่กำหนดไว้ โดยมีคำใบ้ว่ามากกว่าหรือน้อยกว่าเลขที่กำหนด และนับจำนวนครั้ง
แบบที่ 1 ใช้ร่วมกับคำสั่ง else และรับตัวเลขจากผู้ใช้ 1 ครั้งก่อนเริ่มต้นลูป โดยเช็คเงื่อนไขในการทำซ้ำถ้าเลขที่ทายไม่เท่ากับเลขที่กำหนด จะทำลูปซ้ำๆ กันไปเรื่อยๆ จนกว่าผู้ใช้จะทายถูก
answer = 44
num = int(input())
count = 1
while num != answer:
if num > answer:
print("greater than")
else:
print("less than")
num = int(input())
count += 1
else:
print("That is correct")
print(count, "times")
แบบที่ 2 ใช้ลูปแบบ infinite โดยรับตัวเลขจากผู้ใช้ไปเรื่อยๆ จนกว่าผู้ใช้จะทายถูก
answer = 44
count = 0
while True:
num = int(input())
count += 1
if num > answer:
print("greater than")
elif num < answer:
print("less than")
else:
print("That is correct")
break
print(count, "times")
ผลลัพธ์
50
greater than
34
less than
40
less than
45
greater than
44
That is correct
5 times
ตัวอย่างโจทย์ while
การคำนวณผลรวมของตัวเลขจนกว่าผลรวมเกินค่าที่กำหนด
ตัวอย่าง output
Enter the target sum: 10
Current sum up to 1 is 1.
Current sum up to 2 is 3.
Current sum up to 3 is 6.
Current sum up to 4 is 10.
The sum of numbers up to 4 is 10.
คำตอบ
target_sum = int(input("Enter the target sum: "))
current_sum = 0
num = 1
while current_sum + num <= target_sum:
current_sum += num
print("Current sum up to %d is %d." % (num, current_sum))
number += 1
print("The sum of numbers up to %d is %d." % (num-1, current_sum))
การคำนวณเงินต้นรวมดอกเบื้ยที่จะได้รับให้ใกล้เคียงกับเป้าหมายมากที่สุด โดยรับอัตราดอกเบื้ยต่อปี (annual_rate), เงินฝากตั้งต้น (initial_amount), และจำนวนเงินเป้าหมาย (target_value) จากผู้ใช้ จากนั้นใช้ while loop เพื่อทำนายจำนวนปีที่ได้มูลค่าเงินใกล้เคียงกับเป้าหมายมากที่สุด
ตัวอย่าง output
Enter the interest rate: 3.5
Enter the initial amount: 10000
Enter the target value: 12000
After year 1, current value 10350.00
After year 2, current value 10712.25
After year 3, current value 11087.18
After year 4, current value 11475.23
After year 5, current value 11876.86
After year 6, current value 12292.55
It will take 6 years.
ตัวอย่างการคำนวณ
คำนวณหาดอกเบี้ยในแต่ละปี โดยใช้สมการ
ดอกเบื้ย = เงินต้น * อัตราดอกเบี้ย / 100
เงินต้น = เงินต้น + ดอกเบี้ย
ปีที่ 1
ดอกเบื้ย = 10000 * 3.5 /100 = 350.00
เงินต้น = 10000 + 350.00 = 10350.00
ปีที่ 2
ดอกเบื้ย = 10350 * 3.5 /100 = 362.25
เงินต้น = 10350.00 + 362.25 = 10712.25
คิดแบบนี้ไปเรื่อยๆ จนกว่าเงินต้นจะมากกว่าหรือเท่ากับเป้าหมาย
คำตอบ
annual_rate = float(input("Enter the annual growth rate: "))
initial_amount = float(input("Enter the initial amount: "))
target_value = float(input("Enter the target value: "))
current_value = initial_amount
years = 0
while current_value < target_value:
interest = current_value * (annual_rate / 100)
current_value += interest
years += 1
print("After year %d, current value %.2f" % (years,current_value))
print("It will take", years, "years.")
สามารถใช้โจทย์เดียวกันกับลูป for ได้ทุกข้อ
โจทย์เพิ่มเติมใน grader ข้อ 31, 32, 39, 41, 42, 44, 45, 46