01204111 คอมพิวเตอร์และการโปรแกรม รายการ 01204111 คอมพิวเตอร์และการโปรแกรม
เนื้อหา แนวคิดเกี่ยวกับรายการ รายการและการอ้างถึงข้อมูลในรายการ คำสั่ง for การดำเนินการกับรายการ การทำซ้ำด้วยคำสั่ง for ตัวอย่าง
อะไรคือรายการ
ตัวแปร 5 ตัว ใช้ตัวแปร 5 เพื่อเก็บข้อมูล 5 ค่า s1 = 10 s2 = 16 s3 = 15 s4 = 9 s5 = 23 10 16 15 23 9 s1 s2 s3 s5 s4 โปรแกรม
คำนวณสถิติเกี่ยวกับคะแนน คำนวนค่าอะไร? t = 0 t += s1 t += s2 t += s3 t += s4 t += s5 m = 0 if s1 > m: m = s1 if s2 > m: m = s2 if s3 > m: m = s3 if s4 > m: m = s4 if s5 > m: m = s5 คำนวนค่าอะไร? ค่ามากที่สุด ผลรวม ค่าเฉลี่ย avg = t / 5 คำนวนค่าอะไร?
ตัวดำเนินการเพิ่มเติม ในหน้าก่อน เราได้ใช้ตัวดำเนินการใหม่: +=. a = a + 1 a += 1 a = a * 2 a *= 2
คะแนนสอบ ในห้องหนึ่ง มีนักเรียน 50 คน จะเก็บคะแนนสอบวิชาหนึ่งอย่างไร?
ประมวลผล ลำบากมาก ตัวแปร 50 ตัว ใช้ตัวแปร 50 ตัว เพื่อเก็บข้อมูล 50 ค่า s1 = 10 s2 = 16 s3 = 15 s4 = 9 s5 = 23 … … … ประมวลผล ลำบากมาก
รายการ ในภาษาไพธอนมีรูปแบบการเก็บข้อมูลหลาย ๆ ค่าไว้ด้วยกัน เรียกว่า รายการ (list) ตัวอย่างของรายการ [10, 16, 15, 9, 23] 10 16 15 9 23
, การเขียนรายการ เขียนอยู่ในเครื่องหมายวงเล็บเหลี่ยม โดยคั่นข้อมูลแต่ละค่าด้วยเครื่องหมายลูกน้ำ ( , ) สามารถมีเครื่องหมายลูกน้ำหลังจากข้อมูลตัวสุดท้ายได้
ตัวอย่าง รายการของจำนวนวันในแต่ละเดือน รายการของชื่อวัน [31,28,31,30,31,30, 31,31,30,31,30,31] รายการของชื่อวัน ['sun','mon','tue','wed', 'thu','fri','sat']
["somying", "somsak", "somchai"] ตัวอย่างรายการ ตัวอย่างของรายการ ["somying", "somsak", "somchai"] "somying" "somsak" "somchai"
รายการเป็นข้อมูล เราสามารถนำตัวแปรไปอ้างถึงรายการได้ scores = [10, 16, 15, 9, 23] 10 16 15 9 23 scores
การอ้างถึงข้อมูลในรายการ
ดัชนี เราสามารถอ้างถึงข้อมูลในรายการโดยระบุดัชนี ข้อมูลแรกมีดัชนีเป็น 0 ข้อมูลที่สองมีดัชนีเป็น 1 ไล่ไปเรื่อย ๆ 10 16 15 9 23 scores scores[0] scores[1] scores[2] scores[3] scores[4]
การอ้างถึงข้อมูล อ้างถึงโดยใช้ดัชนี ช่องแรกเริ่มที่ 0 scores = [10, 16, 15, 9, 23] print(scores[0]) >>> 10 print(scores[3]) >>> 9 print(scores[1] + scores[4]) >>> 39
การอ้างถึงข้อมูลในรายการ >>> print(days[3]) days 1 2 3 4 5 6 'sun' 'mon' 'tue' 'wed' 'thu' 'fri' 'sat' wed
มุมนักคิด เขียนโปรแกรมที่พิมพ์ข้อมูลทุกตัวในรายการ a ด้านล่าง เราไม่อนุญาตให้เขียนคำสั่ง print มากกว่าหนึ่งครั้ง a = [1,2,1,4,3,2,4,2,5,6,3,7] หมายเหตุ: มีข้อมูลจำนวน 12 ตัวในรายการ คำใบ้: ทดลองใช้คำสั่ง while
มุมนักคิด: เฉลย a = [1,2,1,4,3,2,4,2,5,6,3,7] i = 0 while i <= 11: print(a[i]) i = i + 1
แบบฝึกหัด ผลลัพธ์คืออะไร? ps = [2,3,5,7,11] i = 0 while i<5: print(ps[i]) i = i + 2 2 5 11
แบบฝึกหัด (เพิ่ม) ผลลัพธ์คืออะไร? ps = [2,3,5,7,11,13] nn = [1,2,1,1, 2, 1] i = 0 while i<6: print(ps[i]) i = i + nn[i] 2 3 7 11
การแก้ไขข้อมูลในรายการ ในลักษณะเดียวกับการอ้างถึงข้อมูลในรายการ เราก็สามารถแก้ไขข้อมูลในรายการได้ >>> s = [10,20,30,40,50] >>> s[2] = 5 >>> s [10,20,5,40,50] >>> s[4] += 7 >>> s [10,20,5,40,57]
แบบฝึกหัด อะไรคือผลลัพธ์ของโปรแกรมนี้ 1 2 2 3 3 4 ps = [1,2,1,3,1,4] t = 0 j = 0 while j < 6: if ps[j] > t: t = ps[j] else: ps[j] = t print(ps[j]) j += 1 1 2 2 3 3 4
รายการที่มีข้อมูลหลากหลาย รายการสามารถมีข้อมูลที่หลากหลายได้ด้วย stinfo = ["dang", 20, 167, 78.5] "dang 20 167 78.5 stinfo stinfo[0] stinfo[1] stinfo[2] stinfo[3]
เกิดข้อผิดพลาดเมื่อพยายามอ้างถึงข้อมูลในรายการเปล่า รายการว่าง รายการที่ไม่มีข้อมูลอยู่เลยก็เป็นรายการเช่นกัน >>> mylist = [] >>> a = mylist[0] Traceback (most recent call last): builtins.IndexError: list index out of range เกิดข้อผิดพลาดเมื่อพยายามอ้างถึงข้อมูลในรายการเปล่า
คำสั่ง for
อย่าลืมว่าต้องย่อหน้าเท่า ๆ กัน คำสั่ง for เราสามารถใช้คำสั่ง for เพื่อไล่พิจารณาข้อมูลทุกตัวในรายการได้ รูปแบบ: for ตัวแปร in รายการ: คำสั่ง คำสั่ง อย่าลืมว่าต้องย่อหน้าเท่า ๆ กัน
คำสั่ง for คำสั่งในย่อหน้าตามคำสั่ง for จะถูกเรียกให้ทำงาน โดยในแต่ละรอบตัวแปรที่ระบุในคำสั่ง for จะอ้างถึงข้อมูลในรายการทีละตัว for x in [2,3,5,7,11]: print(x) 2 3 2 3 5 7 11 x 5 x 7 x 11 x x
มุมนักคิด เขียนโปรแกรมหาผลรวมของข้อมูลทั้งหมดในรายการต่อไปนี้ a = [1,2,1,4,3,2,4,2,5,6,3,7] a = [1,2,1,4,3,2,4,2,5,6,3,7] total = 0 for x in a: total = total + x print(total)
ทำให้ประมวลผลได้ง่ายขึ้น... คำนวนผลรวม s = [10,16,15,9,13] t = 0 for x in s: t += x คำนวนค่ามากที่สุด m = 0 for x in s: if x > m: x = m
...แม้ข้อมูลจะมาก คำนวนผลรวม ไม่มีการเปลี่ยนแปลง คำนวนค่ามากที่สุด s = [10,16,15,9,13,20,12,11,2,14, 6,7,13,4,6,7,14,18,9,12] t = 0 for x in s: t += x คำนวนผลรวม ไม่มีการเปลี่ยนแปลง m = 0 for x in s: if x > m: x = m คำนวนค่ามากที่สุด
สรุปการใช้ข้อมูลในรายการ การอ้างถึงข้อมูลแต่ละตัว a[5] การไล่พิจารณาข้อมูลทีละตัว for x in a: c += x a a
การดำเนินการกับรายการ
การทำงานกับรายการ ตัวดำเนินงานที่เกี่ยวกับรายการ ฟังก์ชันเกี่ยวกับรายการ การเพิ่มข้อมูลในรายการ
ตัวดำเนินงานบนรายการ (1) เราสามารถนำรายการมาบวกกันได้ ผลลัพธ์ที่ได้คือรายการใหม่ที่นำข้อมูลจากรายการทั้งสองมารวมกัน >>> [1,2] + [5,10,15] [1,2,5,10,15] 1 2 5 10 15
ตัวดำเนินงานบนรายการ (2) เราสามารถนำจำนวนเต็มมาคูณกับรายการได้ ผลลัพธ์คือรายการดังกล่าวซ้ำ ๆ กันหลายครั้ง >>> [1,2] * 3 [1,2,1,2,1,2] 1 มีประโยชน์เมื่อต้องการ กำหนดค่าเริ่มต้นให้กับ รายการ 2
ตัวดำเนินงานบนรายการ (3) สมมติต้องการสร้างรายการเพื่อเก็บค่าจำนวนเต็มจำนวน 10 ช่อง โดยมีค่าเริ่มต้นเป็น 0 >>> [0] * 10 [0,0,0,0,0,0,0,0,0,0]
ฟังก์ชันเกี่ยวกับรายการ ฟังก์ชันที่สำคัญและใช้บ่อยได้แก่ ฟังก์ชัน หน้าที่ ตัวอย่าง ผลลัพธ์ len คืนจำนวนสมาชิก len([1,2,5]) 3 sum คืนผลรวม sum([1,2,5]) 8 max คืนค่ามากที่สุด max([1,2,5]) 5 min คืนค่าน้อยที่สุด min([1,2,5]) 1
ตัวอย่างการใช้งาน >>> len([]) 0 >>> s = [1,2] + [3,5,10] >>> sum(s) 21 >>> max(s) 10 >>> len(s) 5 >>> len(s + [1,6]) #=>[1,2,3,5,10,1,6] 7
การเพิ่มข้อมูลในรายการ เราสามารถเพิ่มข้อมูลในรายการโดยการเรียกฟังก์ชัน append ดังตัวอย่างการเรียกใช้ผ่าน console ด้านล่าง >>> s = [1,2,5] >>> s.append(10) >>> s [1,2,5,10]
ตัวอย่างที่ 1
โปรแกรมสถิติ เราจะเขียนโปรแกรมคำนวณค่าสถิติอย่างง่าย เราจะรับข้อมูลจากผู้ใช้จนกระทั่งผู้ใช้พิมพ์ -1 จากนั้นจะแสดงผลรวม ค่าเฉลี่ย ค่าสูงสุด และค่าต่ำสุด
ส่วนของโปรแกรมหลัก data = read_input() # อ่านข้อมูลไว้ในรายการ total = _____________________ average = ___________________ max = _______________________ min = _______________________ # display output sum(data) total / len(data) max(data) min(data)
มุมนักคิด เขียนฟังก์ชัน read_list ที่รับค่าจากผู้ใช้จนกระทั่งป้อน -1 แล้วคือค่าทั้งหมดที่รับมาเป็นรายการ def read_list(): print("Enter list (-1 to end):") data = [] return data x = int(input()) while x!=-1: data.append(x) x = int(input())
การทำซ้ำด้วยคำสั่ง for
การทำซ้ำด้วยคำสั่ง for โปรแกรมนี้คำนวณอะไร? t = 1 for i in [1,2,3,4,5]: t *= i print(t)
การพิมพ์จำนวนวันของแต่ละเดือน months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dev'] days = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31] for i in [0,1,2,3,4,5,6,7,8,9,10,11]: print(months[i],days[i])
ฟังก์ชัน range months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dev'] days = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31] for i in range(12): print(months[i],days[i])
ฟังก์ชัน range ฟังก์ชัน range จะคืนค่าวัตถุที่มีลักษณะเหมือนกับรายการ ฟังก์ชัน range มีลักษณะการใช้งานดังนี้ รูปแบบ ผลลัพธ์ range(r) รายการตั้งแต่ 0 ถึง r-1 range(7) => [0,1,2,3,4,5,6] range(a,b) รายการตั้งแต่ a ถึง b-1 range(3,7) => [3,4,5,6]
ฝึกหัด โปรแกรมด้านล่างคำนวณอะไร? t = 0 for i in range(100): t += i*i print(t)
ฝึกหัด (ต่อ) โปรแกรมด้านล่างคำนวณอะไร? t = 0 for i in range(200): if i % 3 == 0: t += i print(t)
ฝึกหัด ไปทำกันทีละขั้น def is_prime(n): ไปทำกันทีละขั้น จำนวนเฉพาะคือจำนวนเต็มบวกที่มีจำนวนเต็มบวกหารลงทั้งสิ้น 2 จำนวน จงเขียนฟังก์ชัน is_prime ที่คืนค่า True ก็ต่อเมื่อ n เป็นจำนวนเฉพาะ
มุมนักคิด def count_factors(n): count = 0 for f in range(1, n + 1): if n % f == 0: count += 1 return count def count_factors(n): จงเขียนฟังก์ชัน count_factors ที่คืนจำนวนของจำนวนเต็มที่หาร n ลงตัว โดยใช้คำสั่ง for
มุมนักคิด ถ้าเปลี่ยนเป็นแบบนี้จะเกิดอะไรขึ้น? def count_factors(n): count = 0 for f in range(1, n + 1): if n % f == 0: count += 1 return count def count_factors(n): range(n + 1): ถ้าเปลี่ยนเป็นแบบนี้จะเกิดอะไรขึ้น? จงเขียนฟังก์ชัน count_factors ที่คืนจำนวนของจำนวนเต็มที่หาร n ลงตัว โดยใช้คำสั่ง for ZeroDivisionError: integer division or modulo by zero
เปรียบเทียบ def count_factors(n): count = 0 for f in range(1, n+1): if n % f == 0: count = count + 1 return count def count_factors(n): count = 0 f = 1 while f <= n: if n % f == 0: count = count+1 f = f + 1 return count
ฝึกหัด นำมาเขียน is_prime def is_prime(n): def is_prime(n): return count_factors(n)==2 นำมาเขียน is_prime จำนวนเฉพาะคือจำนวนเต็มบวกที่มีจำนวนเต็มบวกหารลงทั้งสิ้น 2 จำนวน จงเขียนฟังก์ชัน is_prime ที่คืนค่า True ก็ต่อเมื่อ n เป็นจำนวนเฉพาะ
ตัวอย่างที่ 2
นับผลโหวต ในการเลือกตัวแทนนิสิตครั้งหนึ่ง มีผู้สมัครทั้งสิ้น 5 คน มีหมายเลข 1 ถึง 5 ต้องการเขียนโปรแกรมรับรายการหมายเลขที่นิสิตลงคะแนน จากนั้นคำนวณว่าผู้สมัครคนใดชนะการเลือกตั้ง
จะเก็บคะแนนโหวตได้อย่างไร เนื่องจากมีผู้สมัคร 5 คน เราจะใช้รายการที่เก็บข้อมูลได้ 5 ค่า อย่างไรก็ตาม เนื่องจากผู้สมัครเริ่มต้นที่หมายเลข 1 เราจะใช้รายการจำนวน 6 ช่อง เพื่อให้สามารถอ้างถึงข้อมูลด้วยดัชนี 1 – 5 ได้ ไม่ได้ใช้ เก็บคะแนนโหวต
เขียนสะดวกกว่า (ในกรณีที่มีจำนวน ผู้สมัครจำนวนมาก) กำหนดค่าเริ่มต้น คะแนนเริ่มต้นของผู้สมัครทุกคนมีค่าเป็น 0 scores = [0,0,0,0,0,0] scores = [0] * 6 เขียนสะดวกกว่า (ในกรณีที่มีจำนวน ผู้สมัครจำนวนมาก)
รับค่าและปรับคะแนนโหวต scores = [0] * 6 choice = int(input()) while choice != -1: scores[choice] += 1 choice = int(input())
แสดงผล scores = [0] * 6 choice = int(input()) while choice != -1: scores[choice] += 1 choice = int(input()) show_result(scores) def show_result(s): for i in range(5): cnum = i + 1 print(cnum,"gets",s[cnum],"votes") def show_result(s): for cnum in range(1,len(s)): print(cnum,"gets",s[cnum],"votes")
มุมนักคิด เขียนฟังก์ชัน freq(ls,x) ที่รับรายการ ls และข้อมูล x จากนั้นคืนค่าจำนวนครั้งที่ x ปรากฏในรายการดังกล่าว ตัวอย่างการใช้งาน: a = [1,2,1,1] print(freq(a,1)) print(freq(a,2)) print(freq(a,3)) 3 1 0
มุมนักคิด: เฉลย def freq(ls,x): c = 0 for y in ls: if y == x: c += 1 return c