Professional Documents
Culture Documents
ภาควิชาวิศวกรรมคอมพิวเตอร์ คณะวิศวกรรมศาสตร์
สิงหาคม ๒๕๖๑
v1.0.2
ผู้อ่านสามารถดาวน์โหลดหนังสือรุ่นล่าสุด
และร่วมแสดงความคิดเห็น/ข้อแนะน�าเกี่ยวกับหนังสือเล่มนี้ที่
www.cp.eng.chula.ac.th/books/python101
ขอบคุณครับ
กิตติภณ พ ะการ กิตติภพ พ ะการ สมชา ระสิ ิ ตระก สกร สิ ภิ
Python ๑ ๑ กิตติภณ พ ะการ กิตติภพ พ ะการ สมชา ระสิ ิ ตระก สกร สิ ภิ
การเ ร กรม คอมพิวเตอร์
พ อ คอมพิวเตอร์
005.133
พิมพ์ครง า ว เ ม พศ
พิมพ์ครง า ว เ ม พศ
สงว ิ สิ ิตาม พ ร ิ สิ ิ พ ศ
การ ิต ะการ อกเ ห งสอเ ม มวาร งสิ
ตอง ร อ าตเ า ก ณ์อก ร ากเ า อง ิ สิ ิ
พิมพ์
ภาควิชาวิศวกรรมคอมพิวเตอร์
คณะวิศวกรรมศาสตร์ า งกรณ์มหาวิ า
พ า กรงเ พ
กิตติภณ พ ะการ
กิตติภพ พ ะการ
สมชา ระสิ ิ ตระก
เร เร ง ะรว รวมเ อหา
สกร สิ ภิ รก า
ภาควิชาวิศวกรรมคอมพิวเตอร์
คณะวิศวกรรมศาสตร์
า งกรณ์มหาวิ า
๑๒ สิงหาคม ๒๕๖
ศ ร ช เช ์ สา วิ ิตร
ศ ร พศา กิตติศภกร
รศ ร อาณติ เรองรศม
รศ ร พิส ิ เพ รม ก
อ ร กรวิก ต ก รา ์
อ ร พรรณ สง กว
รศ ร ณ ชา ว สงสก
อ ร เช า พ ์เครอ ตร
อ ร สร ว เมอง
ศ ร อ รก ์ ศรอริ ว ์
ศ ร ิรว ์ ชวรง ร ์
ศ ร ณ ว ิห พร ์
ศิ ์เกาภาควิชาวิศวกรรมคอมพิวเตอร์
คณะวิศวกรรมศาสตร์ า งกรณ์มหาวิ า
คณว รรส ร ะ
คณ าว ์ มา า า
คณ ิสา ตรง ระกอ
คณภ ราว อสต าศิ
คณวิ ร ์ ิรพ ก
คณสภช สตณ วิ ์
คณศภเส ์ ชช ศร
คณณ ช า ะศภก
อ อ คณภาพ ระกอ าก
ภาพง
ภาพ า ห งง
ภาพพ ห งห า ก
ส ก ณ์
ภาพ ระกอ คาอ ิ า เ อหา
สำรบัญ
1
5
15
55
121
133
00 : Programming in Engineering
ศ
ต
าสตร์ องวิ ศ วกรรม าเ ศาสตร์ ครอ ค มความห ากห า มการ
เ ง ะมความพ วตอ างมาก
เสมอ ริงอา มต สง หรอ เ
ห า อกาส การสราง
ม เ ชวงเริมต อง ครงการ
ตาง ความสามาร การ ช ก ะการ Programming เพอวต ระสงค์ตาง เช
การสราง า อง ว คอมพิวเตอร์เพอการออก การศก าความเ
การ ชงา การ สอ สมรร ะ หรอ มกระ งการ า องเพอหาเหตการณ์
เกิ ความคา หมา องวิศวกร งเ สิง าเ อ างมากสาหร วิศวกร า กสา า
ะอ าคต
00 : Programming in Engineering 1
ก ารเร วิศวกรรมสิง ว อม อ ครง เราตองคา วณ ะสร วิเคราะห์
คาพารามิเตอร์ างสิง ว อม งคา วณ มงา ะก ม อ ง า ตองเร
ภาคคอม การ ิสิต เร Programming เ องต ะสามาร ชว ห ิสิตสามาร
ตอ อ ความร สงา วิศวกรรมสิง ว อม กอ าคต อ างงา า
2 00 : Programming in Engineering
า องวิศวกรรมอตสาหการ คอ การออก าเ ิ การ ร รง ะ
สรางสรรค์ วตกรรมระ งการ ิต ริการ ะ รกิ
ก ะ Programming ชว หมตรรกะการคิ อ างมเหต อก ง งเ
เครองมอ การวิเคราะห์ ะ ระมว อ างรว เรว ะ ม าตามตว ร ะ
อ าก ริ ห ง งมความ อ มาก อ าคต
วิ
าการ าง า วิศวกรรม หการ ะวส เ ความร เก ว องก ห กการพ า
องวส ตาง กระ ว การ รร ะ ร หะ สม ติ องวส ะการเ อก
ะออก วส เหมาะสมก งา ห ากห า ง เพอ หสามาร พ าวส หม
หมสม ติตาง o pute og a ng งเ ามาม า สาค การ
สราง า องตาง เพอเชอม งความสมพ ์ระหวาง กระ ว การ ิต ครงสราง
องวส สม ติ องวส ความสามาร การ ชงา มการ า o pute
Programming เ ามา ชอ าง พรห า มาก อา ิเช การ า า ครงสราง
ภาค องวส ภา ห งการ ร ว กรรมวิ ตาง เช
สามาร า ห ร รง หวส มความ ง รง สง หรอมการ
ามา ชเพอ า า การพงเส หา องวส ากการเกิ ะ าห
สามาร วาง การ อม ารง อ างเหมาะสมมาก อก าก งมการ า เ ามา ชเพอหา
สว สม องวส หม ง มเค มการค พ อก ว
อก าก
า อง างวิศวกรรม องระ างก ความรอ อง ง ะ อง ห
า อง ว ง ช การคว คมระ างก ตาง เช ระ
อต มติห ต์ เ ต
00 : Programming in Engineering 3
ง า าง า วิ ศ วกรรม ห ง ามความ าเ ะต อง งเก วก อม
า ว มาก ง อม า อม า า อม สภาพพ อม ความตองการการ ช า
Programming งเ เครองมอสาค การชว การ วิเคราะห์ ะ ระมว
อม ตาง อ างม ระสิ ิภาพ
4 00 : Programming in Engineering
01 : Data Type, Variable and Expression
สรุปเนื้อหา
ตว รเ เก อม ร กรม ตองมชอกาก
• ชอตว ร ระกอ ว ตวอก ร ตวเ หรอเครองหมา เส ต _ ตวองก ห มเหมอ ตวเ ก
หาม ต ชอ ว ตวเ
• อ าตงชอตว ร าก ชอ งก์ช เช int, str, max, sum, abs, ...
มหาม า ะตง า ต มควร าอ าง ิง
อม ามา ระมว มห า ระเภ เรา ะศก า ม งตอ
-10
int า ว เตม 5000011 (Python ห้ามไม่ให้เขียน 0 น�าหน้าจ�านวนเต็ม เช่น 020)
10.0
float า ว ริง 1.23e59 มีค่าเท่ากับ 1.23×1059
'Programming is easy'
str อความ "Let's go shopping"
การ หคาก ตว ร
• a = b = c = 0.0 ให้ตัวแปร a b และ c เก็บจ�านวนจริง 0.0
• a = 5; b = 6; a,b = b,a ตัวแปร a กับ ตัวแปร b สลับค่ากัน ได้ a เก็บ 6 และ b เก็บ 5
• a = x ถ้า x ไม่เคยมีการให้ค่ามาก่อน ค�าสั่งนี้จะผิด เพราะไม่รู้ว่า x มีค่าเท่าใด
ตว าเ ิ การ า การ างา ะการ ง ระเภ อม
• ตว าเ ิ การ วก + - คณ * กกา ง ** หาร / หาร เศ // เศ ากการหาร %
• การ าเ ิ การระหวาง า ว เตมก า ว ริง ะ เ า ว ริง เช 2 + 1.0 3.0
• // ก า ว 1//2 0 (-1)//2 -1 11//10 1 (-11)//10 เหมอ 11//-10 -2
• a = 3+97//2**3%8 a มคา 3+97//8%8 = 3+12%8 = 3+4 = 7
• a = 12//3/2+2**3**2 a มคา 12//3/2+2**9 = 12//3/2+512 = 4/2+512 = 2.0+512 = 514.0
• a += 2 กคอ a = a + 2 a //= 2 กคอ a = a // 2 a *= -1 กคอ a = a * -1
• า import math ะมคาคงตว ะ งก์ช างคณิตศาสตร์ ห ชมากมา
o math.pi, math.e, math.sin(x), math.cos(x), math.sqrt(x), math.log(x,b), ...
• าสตริง วกก คอ าสตริงมาตอก เช '12'+'23' คอ '1223'
• สตริงคณก า ว เตม คอ าสตริง มาตอก เ า ว ครงเ าก คา อง า ว เตม เช '12'*3 คอ '121212'
• งก์ช int float ะ str ม วเ ระเภ อม เช
o int('12') 12 float('1.2') 1.2 str(12//2) '6' str('Aa') 'Aa'
• ข้อควรระวัง รความ ตกตาง อง / ก // ะศก า า การ างา อง ห
า มม สวงเ เช a/2*b เ าก (a/2)*b ต a/(2*b) เ าก a/2/b
คาสงการอา อม าก พิมพ์
• a = input() อ่านข้อความจากแป้นพิมพ์หนึ่งบรรทัด เก็บใส่ตัวแปร a (เป็นสตริง)
• a = input().strip() อ่านข้อความจากแป้นพิมพ์หนึ่งบรรทัด ตัดช่องว่างทางซ้ายและขวาออก
เก็บใส่ตัวแปร a
• a = int(input()) อ่านจ�านวนเต็มหนึ่งจ�านวนจากแป้นพิมพ์ เก็บใส่ตัวแปร a
• a = float(input()) อ่านจ�านวนจริงหนึ่งจ�านวนจากแป้นพิมพ์ เก็บใส่ตัวแปร a
• าตองการอา อม ห า ตว ช อ เ ามา รร เ วก อม ต ะตวค ว ชองวาง
o a,b,c = [e for e in input().split()] หรือ
a,b,c = input().split() อ่านสตริง 3 ตัว
o x,y = [int(e) for e in input().split()] อ่านจ�านวนเต็ม 2 จ�านวน
o a,b,c = [float(e) for e in input().split()] อ่านจ�านวนจริง 3 จ�านวน
o หาก ะอา า ว ริงตาม ว า ว เตม กอา เ สตริงกอ ชคาสง f,n = input().split()
ว งคอ งเ า ว ริงก า ว เตม ชคาสง f = float(f); n = int(n)
า ์ อกวา อม ร มาค ว ชองวาง รร เ วก อ า ช input().split(' ')
ตควร ช input().split()
เรื่องผิดบ่อย
ร อม าก พิมพ์ ว ม ง x = input()
เ า ว กอ า คา วณ y = x**2 + 7 ผิดเพราะ x เป็นสตริง
า า การ างา องตว าเ ิ การ y = x / 2*a จะได้ y = (x/2)*a
+ - * / // % ** ิ ถ้าต้องการค�านวณ
(** ากอ * / // % ากอ + - ต้องเขียน y = x/(2*a)
y = x**1/3 จะได้ (x**1)/3
ถ้าต้องการหารากที่สามของ x
ต้องเขียน y = x**(1/3)
ม ส * สาหร การคณ y = 2x + 1 ต้องเขียน y = 2*x + 1
แบบฝึกหัด
Problem Code
ร า ว เตม า ว าก พิมพ์
รร ะ า ว เก ตว ร h m ะs ง า ว
ชว มง า ะ วิ า
คา วณ า ว วิ า รวม คิ าก h m ะs
า ว วิ า รวม งหม คา วณ
ร า ว ริง า ว าก พิมพ์ เก x
คา วณ
คา y คา วณ
ม รร ต ะ รร ม า ว ริง า ว ค ว
ชองวาง อา รร รกเก v1 v2 v3 เวกเตอร์
อา รร สองเก ส u1 u2 u3
เวกเตอร์
คา วณ องเวกเตอร์ v ก
คา คา วณ
เ
ร อม ตว a b ก c ค ว ชองวาง
a ะ b เ ตวอก ร สว c เ า ว เตม
ตวอก ร a ตอก ตวอก ร b ตอก
คา อง า ว เตม c ตอก ช องตวอก ร a ตอก ตวอก ร
b า ก เ า ว cช
เช ช อ v o 5 ะ ส ง vo5vovovovovo
ตัวอย่างการแก้โจทย์ปัญหา
Triangle
งเ ร กรมคา วณพ สามเห ม รา ความ าว า สอง า ก ะมมระหวาง า สอง า ากสตร
► อม าเ า
รร รกคอความ าว า ห ว เ เ ติเมตร
รร สองคอความ าว า ห ว เ เ ติเมตร
รร สามคอมมระหวาง า งสอง ห ว เ องศา
► อม สงออก
พ องสามเห ม ร เ อม าเ า ห ว เ ตารางเ ติเมตร ส ง ร ส งตามตวอ าง า าง
► ตวอ าง
a = input() ิ รร
b = input() ม สวงเ เ เ area = 1/2*a*b*sin(C)
C = input()
area = 1/2*a*b*sin C
print(area)
a = input() สง ส อม ิ รร
b = input() TypeError: can't multiply sequence by non-int of
C = input()
area = 1/2*a*b*sin(C) type 'float'
print(area) วา ระ มสามาร คณ เพราะ a เ สตริง b ะ C ว
าก รร ะ งตอง ง หเ า ว กอ ์
ม อกวาความ าว า ะมมเ int หรอ float ต า ตวอ าง
พ วา ส ง int ะ float งตอง งสตริง าก input()
หเ float
a = float(input() อกวา ิ รร
b = float(input()) ระ อก ิ รร ห รร กอ ห า ว เพราะ ิ กอ ห า
C = float(input())
area = 1/2*a*b*sin(C) าง ามมา รร มา เห วา ม สวงเ
print(area)
a = float(input()) สง ส อม ิ รร
b = float(input()) NameError: name 'sin' is not defined
C = float(input())
area = 1/2*a*b*sin(C) วา ระ มร กคาวา sin กเพราะวาตองเ math.sin
print(area)
a = float(input()) สง ส อม ิ รร
b = float(input()) NameError: name 'math' is not defined
C = float(input())
area = 1/2*a*b*math.sin(C) วา ระ มร กคาวา math กเพราะวาตอง import math
print(area)
แปลงอุณหภูมิ
สตร การเ คา ากองศาเ เ ส เ องศา าเร ต์ ะเค วิ ม ง
► อม าเ า
รร รกคอความ าว า ห ว เ เ ติเมตร
รร สองคอความ าว า ห ว เ เ ติเมตร
รร สามคอมมระหวาง า งสอง ห ว เ องศา
► อม สงออก
ความ าว า สาม องสามเห ม ร เ อม าเ า ห ว เ เ ติเมตร ส ง ร ส งตามตวอ าง า าง
► ตวอ าง
nput ากแ น ิม ์ utput ทาง อ า
3 c = 5.0 cm.
4
90
10 c = 9.999999999999998 cm.
10
60
3 c = 2.9999999999999996 cm.
3
60
100000000 1000000001
สรุปเนื้อหา
Flowchart Code
if C1 :
P1
if C1 : if not C1 :
pass P1
else :
P1
if C1 :
P1
else :
P2
if C1 :
P1
elif C2 :
P2
elif C3 :
P3
else :
P4
02 : Selection ( if-elif-else ) 15
Flowchart Code
if C1 :
P1
if C2 :
P2
if C3 :
P3
else :
P4
if C1 :
if C2 :
P2
if C3 :
P3
else :
P4
else :
P1
if C4 :
P5
elif C5 :
P6
P7
a < b and b < c and c < d and d <= e a < b < c < d <= e
c=='a' or c=='e' or c=='i' or c=='o' or c=='u' c in ('a', 'e', 'i', 'o', 'u') หรือ
c in 'aeiou'
16 02 : Selection ( if-elif-else )
if condition : t = value1 if condition else value2
t = value1 ชเ พาะกรณการ หคาก ตว ร าเงอ เ ริง หคาห ง
else : เ เ หอกคาห ง
t = value2
การเปรยบเทยบท่ ้บ่อย
if a%2 == 0 : a เป็นเลขคู่หรือไม่
if a%100 == 0 : a หารด้วย 100 ลงตัวหรือไม่
if (a//100)%10 == 9 : เลขหลักร้อยของ a คือ หรือไม่ หรือ
if (a%1000)//100 == 9: ก็เหมือนกัน
if a <= x <= b : x มีค่าในช่วงตั้งแต่ a ถึง b หรือไม่
if abs(a-b) <= max(abs(a),abs(b))*1e-10 :
ตรวจว่าจ�านวนจริง a มีค่าใกล้กับ b หรือไม่ ดยตรวจว่า a กับ b ต่างกัน
เชิงสัมพัท ์ไม่เกิน 10 หรือไม่
-10
mx = a
if b > mx : mx = b
if c > mx : mx = c
if d > mx : mx = d mx เก็บค่ามากสดของ a,b,c และ d หรือเขียน ดยใช้ งก์ชัน max
mx = max(a,b,c,d) max(a,b,c,d) หาค่ามากสดของ a,b,c และ d
เรื่องผิดบ่อย
ตองการเ ร เ ความเ าก ตช= if x = 0 : ต้องเขียน if x == 0 :
02 : Selection ( if-elif-else ) 17
เ า ิ เก วก การเ ร เ สตริง 'abcdegh' < 'b' เป็นจริง
สตริงเ ร เ ก ตาม า เ '1234' < '9' เป็นจริง
พ า กรม สมมติวา
'0' < '9' < 'A' < 'Z' < 'a' < 'z' print(x) ได้ 1234
print(y) ได้ 9
print( x < y ) ได้ True ถ้า x = '1234', y = '9'
print( x < y ) ได้ False ถ้า x = 1234, y = 9
เรื่องท่ปรับปรุง ด้
18 02 : Selection ( if-elif-else )
แบบฝึกหัด
Problem Code
ร า ว เตม า ว ค ว ชองวาง
หาม า อง า ว ง
ม า หา
ร อม องวงก ม วง รร ะห งวง
ระกอ ว า ว ริง า ว ค ว ชองวาง
พิก x ก y อง ศ ์ก าง ะรศม องวงก ม
ตรว วาวงก มสองวง ร มา ก หรอ ตะก
หรอ ม
ส งคาวา touch เมอ อ อง งสองวง ตะก
พอ ส งคาวา overlap เมอสองวง ก า ม ตะ
หรอ ห ส งคาวา free
ร า ว เตม า ว ค ว ชองวาง
ตรว วา า าก า วา อง า ว ร มา
เร ง าก อ มากหรอ ม
การตรว วา True หรอ False
02 : Selection ( if-elif-else ) 19
Problem Code
ร า ว เตม า ว ค ว ชองวาง
หา รวม อง า ว ร มา มรวม า ว
มากส ห ง า ว ะ า ว อ ส ห ง า ว
รวม หา
ร า ว เตมห ง า ว เก ตว ร a
ตรว วาม า ว เตม x คา x เ าก a หรอ ม
3
ร า ว เตม รอ อก ห ว เ ิว
หา า องเสอ ตามรอ อก ง
อ กวา ิว า XS
ตง ต ตม ง ิว า S
ตง ต ตม ง ิว า M
ตง ต ตม ง ิว า L
ตง ต ิวเ ต า XL
า เสอ ตามรอ อก ร
20 02 : Selection ( if-elif-else )
ตัวอย่างการแก้โจทย์ปัญหา
a
สลากกินแบ่ง
หากเรา อส ากกิ งเร งหมา เ ตง ตหมา เ n1 ตอเ อง งหมา เ n2 เช หมา เ 10300 ง 13999
ะงว รางว คอหมา เ p1 เ า สองตวคอหมา เ p2 ะ เ า สามตวคอหมา เ p3 เรา ะ รางว
รวมเ เงิ เ า ร
กาห หส ากกิ ง า เ ร พิเศ เ เ ห ก รางว ห ง า ห งรางว รางว เ า
สองตวห งหมา เ า ะรางว เ า สามตวห งหมา เ า
► อม าเ า
ห ง รร ระกอ ว า ว เตม า ว p1 p2 p3 n1 n2 ค ว ชองวาง
► อม สงออก
เงิ รางว รวม ร
► ตวอ าง
nput ากแ น ิม ์ utput ทาง อ า
01234 11 811 01000 01250 10075
ัวอย่างการเขียนโ รแกรม
โ รแกรม ค�าอ ิบาย
p1,p2,p3,n1,n2 = \ รร รกร อม สตว ร p1, p2, p3, n1 ะ
[int(e) for e in input().split()] n2 หตว ร s เก เงิ รางว รวม เริม ว การตรว วา
s = 0
if n1 <= p1 <= n2 : หมา เ องรางว อ ชวงหมา เ อหรอ ม
s += 10000 n1 <= p1 <= n2 า ชกเพิมเงิ รางว า
if n1 <= p2 <= n2 : ตาม ว การตรว รางว เ า สองตว วกสามตว
s += 25
if n1 <= p3 <= n2 :
ก ณะเ วก
s += 100 สง ส อม ตามตวอ าง
print(s) 01234 11 811 01000 01250 10000 า
มตรงตามตวอ าง ครางว ห ง เ า ตรว มพ
02 : Selection ( if-elif-else ) 21
โ รแกรม ค�าอ ิบาย
p1,p2,p3,n1,n2 = \ การเ ร กรม มห า กรณ ควร ก สอ
[int(e) for e in input().split()] หากเ รว เ ว ะหา ิ า าก เ
s = 0
if n1 <= p1 <= n2 : อเ ะ สอ กรณรางว ห งกอ
s += 10000 สง ส อม 12345 00 000 12000 13000
print(s) 10000 กตอง สอ กรณอ ระหวาง
สง ส อม 12345 00 000 12345 13000
10000 กตอง สอ กรณอ อ าง
สง ส อม 12345 00 000 12000 12345
10000 กตอง สอ กรณอ อ
สง ส อม 12345 00 000 12345 12345
10000 กตอง สอ กรณ ค เ ว ะ กรางว
สง ส อม 12345 00 000 12346 14000
0 กตอง สอ กรณอ อกชวง าง า
สง ส อม 12345 00 000 12000 12344
0 กตอง สอ กรณอ อกชวง าง วา
สร วา กรณรางว ห ง กตอง
p1,p2,p3,n1,n2 = \ คราว ส กรณเ า สองตว ะ คาสง
[int(e) for e in input().split()] ตรว รางว ห งออก าก ร กรม รก เ
s = 0
#if n1 <= p1 <= n2 : คาสง if n1 <= p2 <= n2 ตรว เ า มคร
# s += 10000 กกรณ เช อหมา เ 10000 ง 10099 เ า
if n1%100 <= p2 <= n2%100 : p2 = 50 การ สอ n1 <= p2 <= n2 เ เ
s += 25
print(s)
ตความ ริง ว กเ า สองตว งตองเ เ
สอ เ พาะสองห ก วาเ า ว คาสง
if n1%100 <= p2 <= n2%100
สง ส 00000 50 000 10000 10099
25 กตอง
สง ส 00000 50 000 10000 10199
25 ิ า ะ 50
สง ส 00000 50 000 10000 10299
25 ิ า ะ 75
22 02 : Selection ( if-elif-else )
โ รแกรม ค�าอ ิบาย
p1,p2,p3,n1,n2 = \ คาสง
[int(e) for e in input().split()] if n1%100 <= p2 <= n2%100 : s += 25
s = 0
#if n1 <= p1 <= n2 : ช เ พาะ กรณ ห ก รก อง n1 ะ n2 เ าก
# s += 10000 เ า เมอ n//100 มคาเ าก n2//100
if n1//100 == n2//100 : ง อ การเ สองกรณคอ
if n1%100 <= p2 <= n2%100 :
s += 25
กรณ ห ก รกเ าก เช 10000 ง 10099
else: าเหมอ เ ิม
s += 25*(n2//100 - n1//100 + 1) กรณ ห ก รก มเ าก เช 10000 ง 10299
print(s)
เมอ า 102 - 100 = 2 ส งวา
กเ า สองตว หมา เ กคณ ว 25
สง ส 00000 50 000 10000 10199
50 กตอง
สง ส 00000 50 000 10000 10299
75 กตอง
สง ส 00000 50 000 10060 10680
175 ิ า ะ 150
p1,p2,p3,n1,n2 = \ กรณ อง p2 = 50, n1 = 10060 ะ
[int(e) for e in input().split()] n2 = 10680การตรว สอ า ะ อ เก อ
s = 0
#if n1 <= p1 <= n2 : งเ สามชวง คอ
# s += 10000
if n1//100 == n2//100: ่วงที่ 1 ่วงที่ 2 ่วงที่ 3
if n1%100 <= p2 <= n2%100 :
s += 25 10060 - 10100 - 10600 -
else: 10099 10599 10680
if n1%100 <= p2 : # ช่วง 1
s += 25 3 หกา 2 ห ก วา 3 หกา
if p2 <= n2%100 : # ช่วง 3
เ าก 00 ง 99 เ าก
s += 25 เ พาะ กเ า เ พาะ
2 ห ก วา อ 2 ห ก วา
s += 25*((n2//100-1) - \ # ช่วง 2
(n1//100+1) + 1) เ พาะสาม
print(s) n1%100<=p2 หกา p2<=n2%100
าก 101
ง 105
60<=50 เ 50<=80 ริง
ม กเ า กรางว ก 1 ครง
(105-101+1)
ครง
สง run, ส 00000 50 000 10000 10299
75 กตอง
สง run, ส 00000 50 000 10060 10680
150 กตอง
02 : Selection ( if-elif-else ) 23
โ รแกรม ค�าอ ิบาย
p1,p2,p3,n1,n2 = \ ต าพิ ารณา ห ะเอ ะพ วา คาสง พิ ารณา ง
[int(e) for e in input().split()] ชวง ครอ ค มกรณ if n//100 == n2//100
s = 0
#if n1 <= p1 <= n2 : เราเ วตอ ต คอกรณ สามห ก า มคาเ าก
# s += 10000 ง ิง ก า เ ร กรม าง า
if n1%100 <= p2 : #ชวง 1 สง ส 00000 50 000 10000 10299
s += 25 75 กตอง
if p2 <= n2%100 : #ชวง 3 สง ส 00000 50 000 10060 10680
s += 25 150 กตอง
s += 25*((n2//100-1) - \ #ชวง 2
(n1//100+1) + 1)
print(s)
24 02 : Selection ( if-elif-else )
ตัวอย่างโจทย์ปัญหา
Days in Month
หเ ร กรมเพอร คาเ อ ะ เ พ ศกราช าก หาวา เ อ อง ะม า ว ว งสิ กว
ตัวช่วย เดือนกม าพัน ์มี 2 วัน ก็ต่อเมื่อ
(ป ค. . หารด้วย ลงตัว แต่หารด้วย 100 ไม่ลงตัว) หรือ (ป ค. . หารด้วย 00 ลงตัว)
► อม าเ า
ม รร ระกอ ว า ว เตม ตว คอ เ อ ะ เ พ ศกราช
► อม สงออก
า ว ว องเ อ ะ อง อม าเ า
► ตวอ าง
nput ากแ น ิม ์ utput ทาง อ า
10 2557 31
2 2557 28
4 2556 30
2 2547 29
02 : Selection ( if-elif-else ) 25
ตัดเกรด
การต เกร องวิชา เ ตามตาราง า าง หเ ร กรมเพอต เกร ตามเกณ ์ ระ กรณ คะ
ม อ ิ พ า ห ส ง วา ERROR
คะแนนรวม เกรด
A
B+
C+
D+
กรณอ ERROR
► อม าเ า
ม รร เ ว คะ ะต เกร เ า ว ริง
► อม สงออก
ม รร เ ว ระ เกร ร กรณ คะ ม อ ิ พ า ห ส ง วา ERROR
► ตวอ าง
nput ากแ น ิม ์ utput ทาง อ า
87.25 A
69.95 C+
120 ERROR
26 02 : Selection ( if-elif-else )
ิด ่าท่จอดร
หร เว าเ า ะออก องร ค ห ง เ ริการตง ต าก คา วณคา อ ร ตอง า
ห กเกณ ์การคา วณม ง
อ ร มเกิ า มคิ คา ริการ
อ ร เกิ า ต มเกิ ชว มง คิ คา ริการชว มง ะ า เศ องชว มงคิ เ ห งชว มง
อ ร ตง ต ชว มง ง ชว มง คิ คา ริการชว มง ชว มง ะ า เศ องชว มงคิ เ ห งชว มง
อ ร เกิ ชว มง เหมา า ว ะ า
► อม าเ า
ม รร ต ะ รร ม า ว เตมห ง า ว
รร เ ชว มง ะ า องเว าเ า ะ รร เ ชว มง ะ า องเว าออก
► อม สงออก
ม รร เ ว เ คา อ ร ตอง า ห ส ง พ เ์ า ว เตม
► ตวอ าง
nput ากแ น ิม ์ utput ทาง อ า
7 0
0
7
15
7 10
0
7
16
7 30
30
10
30
7 50
30
10
31
7 200
30
13
31
02 : Selection ( if-elif-else ) 27
ว โรรส โรจน
Intania 85
ค ม ง อเ ะ ก ะ งมอเ ร กรมเอง าก
อก าก Programming งเ การ กวิ คิ ก หาอ างเ
กอตง งเ
เ า ติ ภณ ์ ะสรางมาก ส ตองมสว รวม การพ าระ เอง ง ะสามาร า อ ความคิ ะ
ก ติ ภณ ์ ออกมา เร กวามเงิ มาก ค ห าตอง าง หค อ มาเ ร กรม ห ง งกส
สรุปเนื้อหา
Flowchart Code
while True :
P4
while True :
P1
if C2 :
P3
break
P2
while True :
if C1 : break
P2
while C1 :
P1
while C2 :
P2
P3
k = 0 for k in range(n) :
while k < n : P1
P1
k += 1
for p in range(m) :
for k in range(n) :
P1
for k in range(m) :
P1
if C :
P3
break
P2
else:
P4
while C1 :
P1
if C2 :
P3
break
P2
else:
P4
ก ะพ วา า รอ
เรื่องแปลก อง น
ห ง ากว างา for k เร รอ ว for k in range(1,5):
คา k ห งออก ากวงว ะมคาเ าก ...
คาส า างา วงว print(k) # ได้ เพราะเป็นค่าสดท้ายที่ท�าในวงวน
for m in range(4,10):
if m % 3 == 0 : break
...
print(m) # ได้ เพราะค่าสดท้ายในวงวนคือ
ก่อนจะ break ออก
for w in range(10,10):
...
print(w) # ผิด เพราะไม่ได้เข้าไปท�าในวงวน w จึงไม่มีค่า
แบบฝึกหัด
Problem Code
Input มม
หา า ว เตม วก k มคา อ ส า ห ม
คา มเ าก เ อง ากความ ม ม า
อง า ว ริง คอมพิวเตอร์
Output า ว เตม k หา
Input มม
หา า ว เตม วก k มคา อ ส าห
เ ริง
Output า ว เตม k หา
Input มม
คา วณคา ระมาณ อง ากสตร
Output คา ระมาณ อง หา
Input อา า ว เตม า ว a ก b
คา วณคา ากสตร
Output คา คา วณ
Input อา า ว เตม า ว a ก b
คา วณคา ากสตร
Output คา คา วณ
Input า ว เตมเก ตว ร n
หา า ว เตม วก w x y ะ z งหม
w3 = x2 + y2 + z2 1 ≤ x ≤ y ≤ z ≤ n
Output คา อง w x y ะ z หา
ตัวอย่างการแก้โจทย์ปัญหา
คา อง คา วณ ว อ กรมเ ์เ อร์ ง ส ง าง าง
36045 0.7071067811865475
พ ์ รอ k ตวคณ พ ์ รอ k−1
เริม ว f = x คอพ ์ k = 0
k=1 f = (-1)*x**2/((2*k+1)*(2*k)) * f
= -(x**2)/(3*2) * x
= -(x**3)/(3!)
k=2 f = -(x**2)/(5*4) * -(x**3)/(3!)
= +(x**5)/(5!)
k=3 f = -(x**2)/(7*6) * (x**5)/(5!)
= -(x**7)/(7!)
...
ว วคิ เ ร กรม ง าง า
สง ส 45 เ อม เ 0.7071067811865475 กตอง
า องเพิมคาสง print(k, s) วงว for ะพ วา คา s
มคา มเ งตง ต k = 8 เ ต ส งวาการคา วณ
ตง ตรอ 8 เ ต มม ระ ช ์เ ต า ส x = 180
เ อม าเ า พ วา k = 22 เ ต ะ มเ ง
import math งควร ร การ างา อง ร กรม หตรว สอ วา หากคา ตว ร
x = math.radians(float(input()))
s มเ ง หรอ ชวิ ตรว สอ วา เมอ f เ 0 กสามาร
s = f = x ห การคา วณ เ ากการ ช
k = 1 วงว for เ วงว while ะเหมาะสมกวา
while f != 0: มเงอ while f != 0 เ ตวกาห วา ตอง าตอ วงว
f *= (-1)*x**2/((2*k)*(2*k+1))
s += f
เมอ f ง มเ าก 0 ตว ร k เริมต 1 รอ รก ะ
k += 1 เพิม ะ 1 รอ
print(s) สง ส 45 เ อม เ 0.7071067811865475 กตอง
ะ า อง print(k) ะพ วา k = 8
เมอออก ากวงว ว วิ เรา มตองกาห า ว รอ หก วงว
มา องตวอ าง สง ส 36045 เ อม เ
2.541635699930208e+252 ผิด เกิ อะ ร
ตัวอย่างโจทย์ปัญหา
25 143
3 0
-1 No Data
90 41
ลิ สา ตรงปร กอบ
Intania 81
Google Inc.
สรุปเนื้อหา
สตริง เก อก ระ ตง ตศ ์ตว เร ง าก า วาตอก ต ะตวมเ
ระ ตา ห ง องตว า ส คอ อก ระ ต ะตว สตริงเ งตวอก ร ตวเ ะส ก ณ์พิเศ ตาง
การเ สตริง า หา ง
• เ ครอ ว อ ระกาศเ ว 'I am "Python".' 'I\'m Python.'
• เ ครอ ว อ ระกาศค "I'm Python." "I am \"Python\"."
• เ ครอ ว อ ระกาศเ วสามตวติ '''I'm "Python".'''
• เ ครอ ว อ ระกาศคสามตวติ """I'm "Python"."""
หมา เหต 12 เ int ม ชสตริง ต '12' คอสตริง าตองการ ง า ว ตว ร x หก า เ สตริง ช str(x)
ัวอย่างการเข้า ้อักขระและส ริงย่อย นส ริง สมมติ ห s = "ABCDEFG")
• len(t) า ว ตวอก ระ t len('') 0
• s[0] เหมอ s[-len(s)] "A" สว s[-1] เหมอ s[len(s)-1] "G"
• อ า มวา องสตริง s ตองอ ชวง 0 ง len(s)-1 าก า วา ะ -1 ง -len(s) อ าก วามา า
ง เราเ s[k] n ≤ k ≤ n 1 เพราะ ะ "01234"[-6] ก "01234"[5] ิ
• s เหมอ s[:] เหมอ s[0:] เหมอ s[:len(s)] เหมอ s[::] เหมอ s[::1]
• s[::2] ห ิ ตว ค "ACEG", s[1::2] ห ิ ตว ค "BDF"
• s[::-1] เหมอ s[-1::-1] เหมอ s[-1:-(len(s)+1):-1] "GFEDCBA"
• าเ s[a:b] เพอเ อกสตริง อ ออกมา คา a ก b เ อะ รก ม ิ
o "01234"[2:50000] "234", "01234"[4999:50000] ""
o "01234"[-500:-2] "012", "01234"[-3:-500:-1] "210",
"01234"[-500:-300] ""
• ช for c in s : เพอ ก งอก ระ ะตว s าก า วาเก ตว ร c า ช วงว
วั อย่างการ ัดการส ริง ห s = " Python 3.6 ")
• t = s.upper() t เก " PYTHON 3.6 " s เหมอ เ ม
ิ
• t = s.lower() t เก " python 3.6 " s เหมอ เ ม ิ
• t = s.strip() t เก "Python 3.6" s เหมอ เ ม ิ
• s = s.strip().upper() s เก "PYTHON 3.6"
• k = s.find(c) ค อ ส พ c s เริมค ตง ต า มพ ะ เ -1
k = "engineering".find("ng") k เก 1 เพราะ "ng" ราก เริม 1 "engineering"
คาสง if c in s กเหมอ ก if s.find(c) >= 0
• k = s.find(c,j) ค อ ส พ c s เริมค ตง ต jเ ต
• าสตริง วกก คอ าสตริงมาตอก เช '12'+'23' คอ '1223'
• สตริงคณก า ว เตม คอ าสตริง มาตอก เ า ว ครงเ าก คา อง า ว เตม เช '12'*3 คอ '121212'
04 : String 43
ตัวอย่างการจัดการสตริง
า s[2] = 'a' ม s = s[:2] + 'a' + s[3:]
ตสราง หม
หรอ
for i,c in enumerate(s):
print(i,c)
44 04 : String
าตองการ วาม t ราก อ c = 0
s กครง k = s.find(t)
while k >= 0 :
c += 1
c = 0 k = s.find(t,k+1) # 'aaaaaa' มี 'aaa' ครั้ง
while t in s :
c += 1 หรอ
c = 0
for i in range(len(s)-len(t)+1) :
ิ า ม t s เงอ if s[i:i+len(t)] == t :
t in s ะเ True ต อ c += 1
ก ะว มร
ชสตริงสะสม อม เพอ ามา ส ง หา า ว เ พาะ มคา อ กวา
หง result = ""
for n in range(2,30):
for k in range(2, n) :
if n % k == 0 : break
else:
result += str(n) + ", "
print(result[:-2]) ได้ 2, 3, 5, 7, 11, 13, 17, 19, 23, 29
ชสตริงเ เก อม เพอ ง งเ เ อ m เ ชอ อเ อ
าก า ว เตมเ สตริง months = "JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC"
m = int(input())
if 1 <= m <= 12 :
print( months[(m-1)*3:m*3] )
else :
print( 'invalid month number' )
04 : String 45
เรื่องผิดบ่อย
46 04 : String
แบบฝึกหัด
Problem Code
ร สตริงห ง รร
สรางสตริง หม กอก ระ สตริง ร เ ามา ราก า
อกตว เช ร 'pypy' ะ สตริง 'ppyyppyy'
สตริง พ ์
ร สตริงห ง รร
สรางสตริง หม กอก ระ สตริง ร เ ามา ราก า
อกตว ต ามตว าติ ก อ ว ก มตอง า า เช ร
'pythonnnaa' ะ สตริง 'ppyytthhoonnnaa'
สตริง พ ์
ร สตริงห ง รร
ตรว วาสตริง เ
งคอสตริง ก า วคอสตริงเ ิม หรอ ม
าเ ก ส ง Y า มเ ก ส ง N
04 : String 47
Problem Code
ร เ า สิ หก ห ก
งเ า ว า สิ
า ว า สิ ง
0, 1,..., 9, A, B, C, D, E, F
0, 1,..., 9,10,11,12,13,14,15
ร สตริงมาห ง รร
า ว ตวเ ค ราก สตริง ร เ ามา
า ว
ร สตริงมาห ง รร
วามตวอก รติ ก กค เ สระภา าองก
า ว
ร สตริง ม ตเ 0 ก 1
งสตริงเ า สอง ร หเ า ว เตม า สิ
คอ int เอง ตวอ างเช
"01101" = 0×24 + 1×23 + 1×22 + 0×21 + 1×20
= 13
า ว เตม
48 04 : String
ตัวอย่างการแก้โจทย์ปัญหา
ตรวจสอบเล ้า
งเ ร กรม ร สตริง เพอตรว สอ วาสตริง มเ าก หรอ ม เช าร ...102...89..3..
มมเ า ต าร ...102...89..2.. มเ า มเ 2 า
► อม าเ า
ร สตริงห ง รร
► อม สงออก
าสตริง ร มามเ า ส ง True ต า มมเ า ส ง False
► ตวอ าง
..125.9.2. True
ัวอย่างการเขียนโ รแกรม
โ รแกรม ค�าอ ิบาย
t = '' อา เริม ว การ อก ระ ม ชตวเ ออก ากสตริง ร มากอ ห ง าก
for e in input().strip() : คอ หาวิ ตรว สอ อก ระ า ตเราเร มาวา มสามาร เ ง
if '0' <= e <= '9' :
t += e อก ระ สตริง ง ตอง ชวิ การสรางสตริง หม เช า ะ อก ระตว
print(t) 2 ออก ก ชการสราง หม ว ตวเ ม ิ ว คาสง s = s[:2]+s[3:]
วิ คอ าง ง ง อเ เ การเ อกเ พาะตวเ สตริง ร มา เพิม ส
สตริง หมอกตวห ง ะงา กวา
ร กรม าง า เริม ว สตริงวาง t าก ว ห ิ อก ระออกมา ะตว
ากสตริง ร เ ามา าอก ระ เ ตวเ กเพิม ส t
สง ส 12a34bce5 เ 12345 กตอง
t = '' เรา t เก สตริง มตวเ อ างเ ว กมา ง ตอ ตรว วา t มมเ
for e in input().strip() : าหรอ ม ะ าอ าง ร าเราคอ อก ระ ะตว สตริง กตอง
if '0' <= e <= '9' :
t += e ตรว วาอก ระตว หม ราก อก ระ า มาหรอ ม าเรา ชวงว
b = '' for e in t ก าตว า มา ว การ ชตว ร หม b เริม ว สตริงวาง า
for e in t : ตว หม มม b เพิมตว หมตอ า เ า b ง าง า เมอ พ
if e in b : break
b += e
วา e in b เ ริง คอตว หม าก ตว า มา ก break ออก ากวงว
คอรวามเ า ว
04 : String 49
โ รแกรม ค�าอ ิบาย
t = '' ตการ break ออก ากวงว พ ตว า พอออก ากวงว ว เรา ะ
for e in input().strip() : ม รา วา การห ออก ากวงว มา ากกรณ break หรอมา ากกรณ ว
if '0' <= e <= '9' :
t += e คร กอก ระ ว ์ อกวา าพ วา า ห ส ง True า ม าเ
b = '' ห ส ง False ง ควร print(True) เ เมอพ วา า ว break
for e in t : ออก ากวงว สว การตรว วา ว คร กตว ม break ก า
if e in b :
print(True)
เพิมคาสง print(False) ห ง else อง for ส งวาว คร กตว
break ว มพ เ าเ าง า
b += e สง ส ..125.9.0. เ False ส งวา มม า กตอง
else:
print(False)
สง ส ..125.9.2. เ True ส งวาม า กตอง
50 04 : String
ตัวอย่างโจทย์ปัญหา
แปลงวันท่
หอา ว เ อ ร เอ ว mm/dd/yyyy ร คา าง พิมพ์ ะ งว ร เ ร
ว เอ dd MMM yyyy คา องเ อ ร มาเ ตวเ า ว เตม ตอง ง หอ ร ตว อภา าองก องเ อ
ร เ ามา
► อม าเ า
ม รร เ อความสตริง ว ร เอ ว mm/dd/yyyy)
► อม สงออก
ม รร เ ว ร ว เ อ dd MMM yyyy)
► ตวอ าง
nput ากแ น ิม ์ utput ทาง อ า
08/27/2014 27 AUG 2014
04 : String 51
นับตัวอัก ร ิม ์ หญ่
หเ ร กรมอา อม เ สตริงเ ามาห ง รร ระกอ ว อก ระอะ รก เว วรรคก าก ห เ พาะ
ตวอก ร เ ตว ห เ า ะ ส ง พ ์ออกมา างห า อ
► อม าเ า
ม รร ระกอ ว สตริง ระกอ ว ตวอก ระอะ รก เว วรรคก
► อม สงออก
ม รร ส ง า ว ตวอก ร เ ตว ห งหม าก อม าเ า
► ตวอ าง
PYTHON123 6
yes! 0
52 04 : String
กลุ่มสร
คาภา าองก ระกอ ว พ ช ะ ะสระ a e i o u อเร กสระ อ ติ ก วาเ ก มสระ เช beautiful
มก มสระ eau i ะ u งมก มสระ 3 ก ม vowel มก มสระ 2 ก ม group มก มสระ ก ม ะ rhythm มก มสระ
0ก ม
vowel 2
group 1
rhythm 0
04 : String 53
วรวร์ สัตยวินิจ
ภัทราวุ ื่อสัตยา ิลป
ยอด ินสุภั กุล
ุภ ท ิ ก ตยาเกยรณ์
เอกลัก ณ์ วิริย โกวิทยา
Intania 84
Wongnai
ม
วาคณ ะเร คณะอะ รหรอภาคอะ ร Computer Programming ก า มาเ ความร กค าเ
ตองม ว เพราะเ ค เกิ หม รกิ ะอตสาหกรรมตาง มวา ะ าง า การคา า าคาร
การ พ ์ ณา เ ิง ก า เครอง กร ะห ต์ ว ว ตตอง ชความร า Computer
Programming มาชว พ า ิตภณ ์หรอ ริการ ห กวาเ ิม ความตองการ ะ ิงมาก มาก อ าคต
เมอ ิตภณ ์ ริการ หรอ มกระ งเงิ เรา ช อสิ คาตาง ก ง อ ร ิ ิตอ งเ เรองสาค มาก
เรา ะ ส ก ความร า Computer Programming เพราะม คอ ก ะ าเ องค ะสามาร ร มอ
ก ความเ ง อง ก ิ ิตอ ะพรอมเก เก ว อกาส ะมาพรอมก ค ก ์ ก หม อ าคตอ ก
05 : File
สรุปเนื้อหา
การอา อม เก ม อม เ ามา ระมว า ห า วิ ห า คาสง วิชา ชวิ งา ส คอ อา ม อความ
ะ รร มาเก สตริง มร ง
05 : File 55
ก อม ง ม อความ หา า ว เ พาะ มคา อ กวา m กง ม
รร ะ 5 ตว
outfile = open('c:/temp/out.txt','w')
outfile.write(any_string) m = int(input())
outfile.write(any_string + '\n') outfile = open('D:/primes.txt','w')
... c = 0
outfile.close() result = ""
for n in range(2,m):
for k in range(2,n):
if n % k == 0: break
อ า ม write ม เพิมรหส '\n' else:
เพอ รร หม ห ตองเพิมเองเมอตองการ result += str(n) + ", "
c += 1
if c % 5 == 0:
outfile.write(result[:-2] + '\n')
result = ""
if len(result) > 0:
outfile.write(result[:-2] + '\n')
outfile.close()
เรื่องผิดบ่อย
56 05 : File
พิมพ์ readline เ readlines infile = open('c:/temp/data.txt')
readlines อา เ วหม ม (อา first_line = infile.readlines() # ระวัง
เสร ว เ list of strings second_line = infile.readline() # ควรใช้แบบบรรทัดนี้
ง ม าเส อ ง อ ม ง รา ะเอ )
แบบฝึกหัด
Problem Code
Input ห ง รร เ ชอ ม
Process อา อความ มมาก า รร
Output ส ง อความ ม ก า รร
ออก าง อภาพ เช
ข้อมูล นแ ม ผลลั ์ ออกทาง อ
line1 line3
line2 line2
line3 line1
Input ห ง รร เ ชอ ม
Process อา อความ ม วก า รร
ตมเงอ วา ะ มเอา รร วาง หรอม ต blank
Output ก อความ ก า รร ง ม
ชอ reverse.txt
Input ห ง รร เ ชอ ม
Process ส งหว อ าว งหม ม หว อ าวเ
อความ อ ระหวาง <headline> ก
</headline> ม ง <headline> ก
</headline> อ รร เ วก ะ
ต ะ รร ม มเกิ หว อ าว
Output รร ะห งหว อออก าง อภาพ
หคร กหว อ
05 : File 57
Problem Code
Input สอง รร ต ะ รร เ ชอ ม
Process เ ร เ วาสอง ม มคาเหมอ ก หรอ ม
Output า ม งสองม อม เหมอ ก ส ง True
ตางก ก ส ง False
ตัวอย่างการแก้โจทย์ปัญหา
ตรวจ าตอบ
งเ ร กรมอา มเก คาตอ ร อง กเร มาตรว หคะ
► อม าเ า
อม าก ม c:\t\answers.txt ร มเ ง
รร รกเก เ เ สตริง องตวอก ร A, B, C หรอ D
รร ตอมา หม ม ต ะ รร เก เ ระ าตว กเร ตาม ว ชองวางห งชอง ตาม ว คาตอ ร
งเ สตริง องตวอก ร A,B,C,D หรอเ ชองวาง กรณ มตอ อ หรอเ ตวอ กรณกรอกมากกวาห งคาตอ
► อม สงออก
ม หม c:\t\results.txt เก การตรว ต ะ รร ระกอ ว เ ระ าตว กเร ตาม ว คะ ค ว
เครองหมา ภาค
► ตวอ าง
58 05 : File
ัวอย่างการเขียนโ รแกรม
์กาห หอา อม าก ม ะ ก การ างา ง ม เพอ หการเ ร กรม ะหา ิ งา
ะ อเ ส ง ออกห า อกอ เมอ กอ าง กตอง คอ เ ห กง ม
05 : File 59
โ รแกรม ค�าอ ิบาย
fin = open('c:\\t\\answers.txt','r') เรา มควร ก หา คิ วาเ ระ าตว
soln = fin.readline().strip() ม ห กก ก ว
for line in fin:
sid = line[:10]
line = line.strip()
j = line.find(' ') ans = line[10:]
if j > 0 : เพราะ า ม พ วาเ ระ าตว างค ม อ กวา
sid = line[:j] ห ก งควร ชวิ หาชองวาง รก าก าง า ว ริการ
ans = line[j:] find องสตริง ตตองอ า ม strip กอ มเช า
point = 0
line เริม ว ชองวาง ก ะ ิ เมอหาชองวางพ j
for k in range(len(soln)):
if ans[k] == soln[k] : ก ก ว
point += 1 sid = line[:j]
print(sid, point) ans = line[j:]
fin.close() วกตรว คาตอ ว วิ ามา สง
5630120421 12
5631010121 7
563102121 6
วเกิ อ ิ พ า คาสง if ans[k] == soln[k]
IndexError: string index out of range
า คะ กอ เกิ อ ิ พ า ะพ วา
คะ รวม ิ ว
fin = open('c:\\t\\answers.txt','r') ิ คะ งมาก เหมอ ก วา คาตอ ิ มมาก
soln = fin.readline().strip() ิ กติ า รกคาสง print(ans) ก print(soln)
for line in fin:
line = line.strip()
ออกมา เ ก ะ อต มา ห ค รร รก
j = line.find(' ') AABBCCCBBCCDDDABABDDCCDDCA
if j > 0 : AABBCCCBBCCDDDABABDDCCDDCC
sid = line[:j] เห วา รร ans ม เ อ าง วา
ans = line[j:].strip() เพราะวามชองวาง าง า ก หา ว
point = 0
for k in range(len(soln)): ans = line[j:].strip() เพอต ชองวางออก
if ans[k] == soln[k] : สง
point += 1 5630120421 25
print(sid, point) 5631010121 14
fin.close()
วเกิ อ ิ พ า คาสง
if ans[k] == soln[k]
IndexError: string index out of range
างา ิ เหมอ ครง ว ต คะ รวม กตอง
สว างา ิ พ า ก า มาเกิ ก รร ม
งม อม
563102121 ABABCCNNAADDDABAB CCDDAC
60 05 : File
โ รแกรม ค�าอ ิบาย
fin = open('c:\\t\\answers.txt','r') เ อง าก ์กาห วาเ ระ าตวก คาตอ ค ว
soln = fin.readline().strip() ชองวาง ชอง ต รร หางก ชอง ส งวา
for line in fin:
line = line.strip()
ชองวางตว คาตอ มม อง อ
j = line.find(' ') คาสง line[j:].strip() ะ ชองวางออกหม
if j > 0 : า ห ระมว ิ า หม อม มคร ะ า หเมอ า
sid = line[:j] ans[k] มาเ คาตอ ก ิ เพราะ k มคาเกิ ชอง สตริง
ans = line[j+1:] ง ก คาสง line[j:].strip() เ line[j+1:]
point = 0
for k in range(len(soln)): สง
if ans[k] == soln[k] : 5630120421 25
point += 1 5631010121 14
print(sid, point) 563102121 16
fin.close()
วเกิ อ ิ พ า คาสง
if ans[k] == soln[k]
IndexError: string index out of range
ม ิ รร อง ม อม ว ต ิ รร
อง ม
05 : File 61
ตัวอย่างโจทย์ปัญหา
5913842721:Somsak Rakrian:1:56.6
5913845921:Somsri Deeying:2:78.0
5913856821:Rakchard Yingcheep:2:89.0
5913861321:Thumdee Tong Daidee:2:99
591387721:Somrak Rakrian:10:84.25
าก ร อม าก พิมพ์ เ ตอ เร ตองการหาคาคะ เ
หาก มพ ิสิต ตอ เร หพิมพ์ Not Found
► อม าเ า
า ว เตมห ง า ว เ ตอ เร ตองการหาคาคะ เ
► อม สงออก
ส งคะ เ อง ิสิต ตอ เร ตองการ
► ตวอ าง
สมมติ ห ม data.txt ม อความ างต
nput ากแ น ิม ์ utput ทาง อ า
1 56.6
2 88.66666666666667
3 Not Found
62 05 : File
Find Student's Grade
หเ ร กรมเพออา ม score.txt งมรหส ิสิต ะเกร อง ิสิต ต ะค (0-4) ค ว ชองวาง ะ
ร คารหส ิสิต าก พิมพ์ ว ส งเกร อง ิสิตค หาก มพ รหส ิสิต ม ห ส ง Not Found
► อม าเ า
ม รร ร รหส ิสิตเ า ว เตม
► อม สงออก
ม รร ส งเกร อง ิสิตเ า ว เตม หาก มพ รหส ิสิต ม ห ส งคาวา Not Found
► ตวอ าง
05 : File 63
รหัสลับ
งเ ร กรมอา อม รหส าก มห ง งระ วา ะตอง ชรหสตาม า อ าง ร ง ะสามาร อ อาว
อา ภาพร รง วิ การ อ รหส าก ม คอ ตองร อิ พตเ ตวอก รสามตว าก วา ตวอก ร งสามตว ราก
เ า ว เ า ม ว งเร ง า ตวอก ร งสามตาม า ว ครง ราก ม ากมาก ส อ ส อวา
ตวอก รตวพิมพ์ ห ก ตวพิมพ์เ ก มเหมอ ก ะ า ว ตวอก ร งสามตว ะ มเ าก ตวอ างเช
หากม ม data.txt เ อิ พต ง า าง
agAbggggDf
ffgFFFaaD
DaADDFF
FFDFFF
ะเห วา ตวอก ร a ม ตว A ม ตว b ม ตว D ม ตว f ม ตว F ม ตว ะ g ม ตว
หากอิ พตเ a b f ะ พ ์เ afb
หากอิ พตเ F A f ะ พ ์เ FfA
► อม าเ า
อความส รร รร รก ชอ ม อกสาม รร มา ตวอก รสามตว รร ะห งตว
► อม สงออก
ส ง อความ พ ์ตามตองการ
► ตวอ าง
nput ากแ น ิม ์ utput ทาง อ า
data.txt Afb
a
b
f
data.txt FfA
F
A
f
64 05 : File
06.1 : List
สรุปเนื้อหา
รา การหรอ ิสต์ เ เก ก ม อง อม ม า ต ะตวมเ กาก า ตว า ส ม
• การสราง
o x = [] หรอ x = list() ิสต์วาง ม len(x) เ
o x = [0]*10 x = [0,0,0,0,0,0,0,0,0,0]
o x = list(a) ิสต์ ม อม ตาม ห ิ ออกมา าก a ว for e in a
x = list('abcde') x = ['a', 'b', 'c', 'd', 'e']
x = list(range(1,10,2)) x = [1,3,5,7,9]
o a = [1,2,3]; b = [1,2,3]; c = b; d = list(b)
งร วา าส คอ คาสง c = b าหcก b เ ิสต์เ วก
• ช + เพอตอ list ะ * เพอ + ห า ครง
x = 2*([1,2,3] + [3,4,5]) x = [1,2,3,3,4,5,1,2,3,3,4,5]
• x.append(e) เพิม e ตอ า าง วา อง ิสต์ x
• x.insert(i, e) รก e ว i อง ิสต์ x
• x.pop(i) อม ตว i อง ิสต์ x ะค อม ก เ พ์
• x.sort() า ห อม ิสต์ x เร ง าก อ มาก คาสง มม ค ก มา
• sorted(x) ค ิสต์ มคาเหมอ ก งออก าก x ตเร ง า อม าก อ มาก หเร รอ
x มเ ง
• sum(x) ค รวม อง า ว ิสต์ x
• max(x) ค คามากส ิสต์ x min(x) ค คา อ ส ิสต์ x
• x.count(e) ค า ว ครง e ราก ิสต์ x
• if e in x ชตรว สอ วาม e ิสต์ x หรอ ม
• x.index(e) ค อ ส พ e ิสต์ x า มพ ะ างา ิ พ า งตองตรว กอ
if e in x :
k = x.index(e)
...
else :
...
หมา เหต ิสต์ มม find เหมอ ก องสตริง
• ริการ split ก join ม ช ริการ อง ิสต์ ตเ องสตริง เก ว องก ิสต์
o t.split() ค ิสต์ องสตริง อ กออก ากสตริง t ชชองวางเ ตวค สตริง อ
o t.split(s) ค ิสต์ องสตริง อ กออก ากสตริง t ชสตริง s เ ตวค สตริง อ
o s.join(x) ค สตริง ากการ าสตริง ิสต์ x มาตอก ค ว สตริง s
06.1 : List 65
ัวอย่างการเข้า ้ข้อมูลและลิส ์ย่อย นลิส ์ สมมติ ห x = [11,12,13,14,15]
• มวิ การเ า ช ะการเ อก ิสต์ อ ว เหมอ ก วิ องสตริง
• ช for e in x : การ ก ง อม ิสต์ x าก า วาออกมาเก e เพอ า ช วงว for
ค�าเตือน ไม่ควรเปลี่ยนแปลงลิสต์ ในวงวนที่ก�าลังแจกแจงข้อมูลในลิสต์ออกมาใช้งาน อาจมีพ ติกรรมที่ไม่ตรงกับที่คาดไว้
• x[0] เหมอ x[-len(x)] 11
• x[-1] เหมอ x[len(x)-1] 15
• อ า มวา index อง ิสต์ x ตองอ ชวง
o 0 ง len(x)-1 าก า วา
o -1 ง -len(x) อ าก วามา า
ง เราเ x[k] n x ≤ k ≤ n x 1 เพราะ ะ x[-6] ก x[5] ิ
• x[a:b] อง ิสต์ ิสต์เสมอ
• เ x[a:b] คา a ก b เ อะ รก มิ
o x[2:50000] [13,14,15], x[4999:50000] []
o x[-500:-2] [11,12,13], x[-3:-500:-1] [13,12,11], x[-500:-300] []
• x มคาเหมอ x[:] เหมอ x[0:] เหมอ x[:len(s)] เหมอ x[::] เหมอ x[::1]
• x[::2] ิสต์ อ เ พาะ ค x[1::2] ิสต์ อ เ พาะ ค
• x[::-1] เหมอ x[-1::-1] เหมอ x[-1:-(len(x)+1):-1] [15,14,13,12,11]
66 06.1 : List
รูปแบบการปร มวลผลลิสต์ท่ บบ่อย
ช ิสต์เก อม เพอ ามา ชภา ห ง อา อม เ ามา n ตว
n = int(input())
data = []
for k in range(n):
data.append( float(input()) )
หรอ ส
s = sum( sorted(x)[1:-1] )
หรอ
for i,c in enumerate(t):
print(i,c)
หรอ
for k in range(-1,-(len(x)+1),-1) :
# อ่านยาก อกาสผิดสูง
e = x[k]
...
06.1 : List 67
ตองการห ิ อม ิสต์มา ระมว for e in x :
กวาเงอ ห ง ะเ ริง if เงื่อนไขที่ต้องการ :
...
break
...
else :
... # มาท�าที่นี่ ถ้าไม่พบเงื่อนไขที่ต้องการเลย
ตองการห ิ อม สิ ต์ตาม า เร ง for e in sorted(x) :
าก อม อ ส อม มากส ิสต์ ...
เรื่องผิดบ่อย
68 06.1 : List
เมอ x เ ิสต์ อ าส ส ระหวาง x = [1,2,3,4]; x.append( [5] ) # ได้ [1,2,3,4,[5]]
x.append(y) ก x+=y ง x = [1,2,3,4]; x += [5] # ได้ [1,2,3,4,5]
มเหมอ ก x = [1,2,3,4]; x.append( 5 ) # ได้ [1,2,3,4,5]
x = [1,2,3,4]; x += 5 # ผิด
ตองการ สิ ต์ y มคาเหมอ ก สิ ต์ x ตอง x = [1,2,3]
เ อกวา ะ ช y = x หรอ y = x # y เป็นลิสต์เดียวกับ x
y = list(x) กติ มคอ า ะ ช y = x x[2] = 0 # y[2] ก็เปลี่ยนเป็น 0 ด้วย
เ x = list(str) เ การสราง ส
ิ ต์ x = list('abc')
ระกอ ว ต ะอก ระ str x = ['a','b','c'] มช x = ['abc']
หรอ
for i in range(len(x)) :
if x[i]%2 == 1 :
x.pop(i)
06.1 : List 69
แบบฝึกหัด
Problem Code
ม รร ต ะ รร เก สมาชิก องเวกเตอร์
งเ า ว ริงห า า ว ค ว ชองวาง อา งสอง
รร เก สิ ต์ v1 ะ v2
คา วณ องเวกเตอร์ v1 ก v2
ส งคาวา Error า v1 ะ v2 ม า
มเ าก ต าเ าก ส งคา คา วณ
ห ง รร เ ชอ ม ม เก า ว เตม
รร ะ า ว
หาวา า ว เตม ม ราก าก มากส
าม าก มากส ห า ตว หหา กตว
อม กตว ราก าก มากส ม
เร งตาม า ราก ม
70 06.1 : List
Problem Code
ห ง รร เ ชอ ม
ส งหว อ าว งหม ม หว อ าว
เ อความ อ ระหวาง <headline> ก
</headline> ม ง <headline> ก
</headline> อ รร เ วก ะ
ต ะ รร ม มเกิ หว อ าว
ห ง รร ห งหว อ หคร กหว อ
ส งเร งหว อตามตวอก ร าก อ มาก
ห ง รร เ ชอ ม ม เก ชอ
รร ะห งชอ
เร ง า ชอ อา าก ม เร ง า ตาม
ความ าว องชอ าก อ มาก ามความ าวเ าก
หเร งตามตวอก ร พ า กรม
า องชอตาม เร ง
06.1 : List 71
ตัวอย่างการแก้โจทย์ปัญหา
จัด นเลว
กาห ห n เ า ว เตม หากเรา าค n ค ก ค เ ว n ค มา เร งเ วงก ม หค เร งติ ก
ตง ตตา ห ง 0 ง n-1 ะค เ ว เร งตอ ตง ตตา ห ง n ง 2n-1 งหา า ว เตม วก d มคา อ ส เมอ าค
งหม มา ชก หา ว ะเห อค เ ค ส า
หา เ ง อม าเ าคอ า ว เตม ก หมค ค เร งเ วงก ม เริมค
อก ค ก หค ออก ากวง วกเริม ากค อก ค ก หค ออก าเช เรอ เห อค ส า
ค เ ช ะ เช ห ะ การเ ง องค วงก ม ส ง งร าง าง หมา เ เ ช ะ
ง าห ะ คา เ คา เมอ ค ออก ว ะ ค เ ค ส า ค ค เว
► อม าเ า
า ว เตม วก า ว คา n างต
► อม สงออก
คา d เ า ว วก อ ส า ห ค ออก วเห อค ส า เ ค ง อ ิ า ว างต
► ตวอ าง
3 2
6 3
13 4
14 6
72 06.1 : List
ัวอย่างการเขียนโ รแกรม
โ รแกรม ค�าอ ิบาย
n = int(input()) เ อง ากคอมพิวเตอร์ างา รว เรว อ ก หา ว การ า อง
for d in range(1,2*n): การคอ ค วงก มออกตามก เกณ ์ กาห ว ช ิสต์เก
q = ['G']*n + ['B']*n
m = 2*n ค วงก ม วคอ อม ิสต์ออก
ร กรม าง า ร คา n าก สอ การ ค ว คา d
# solve Josephus problem ตาง เริม 1 ง 2n-1 ภา ต ะรอ อง for ะสราง ิสต์ อง
if len(q)==1 and q[0]='G':
ตวอก ร G า ว n ตวตาม ว ตวอก ร B อก n ตว
print(d) 'G' ค 'B' ค เ ว วกเริม ตอ การ ก หา
break ว m = 2*n ะ d ตามคา อง for หาก การ ค
else:
print('Not found')
วงก ม อง หา เห อค ส า เ ค ก ส งคา d ะ
break ออก าก for เ า ม ค เ ค ส า กว ก เพิม
คา d เพอ ารอ ตอ อง for
m = int(input()) อเก ร กรม าง วกอ ะมาเ ร กรมสาหร หา
d = int(input()) าง า ร คา า ว เตม m ก d วสราง ิสต์ เก
q = list(range(m))
k = 0 หมา เ 0 ง m-1 ว คาสง list(range(m)) าก เ าสวงว
while len(q) > 1 : while ะว างา ตรา เ า ิสต์ q งม อม มากกวาห งตว
k += d มตว ร k เก index อง ิสต์มคาเริม 0 ต ะรอ ะ อม
if k >= len(q) :
k -= len(q)
ตว าก k อก d ตว งคอเพิมคา k อก d าคา k เกิ หรอเ าก
q.pop(k) า อง ิสต์ กตองว ก มา า า อง ิสต์ งกคอการ คา อง k
print(q[0]) ว า อง ิสต์ เช q ม อม 7 ตว k = 5, d = 3 คาสง
k += d า ห k = 8 เกิ า อง q คาสง k -= len(q) า ห k
ก มามคาเ 1 สร คอ ากตา ห ง 5 อก 3 ตา ห งคอ 1
(5 -> 6 -> 0 -> 1)
เมอ ตา ห ง k เราตอง อม ออก ก าคาสง q.pop(k) วงว
while ะ อม รอ ะตว เมอเห อ อม ตวเ ว อม เห อรอ
กคอ q[0]
สง ส m เ 6, d เ 2 เ 0 กตอง
สง ส m เ 4, d เ 3 างา ิ
IndexError: pop index out of range
คาสง q.pop(k) วา k เก index มคาเกิ ชวง ิสต์ q ม ห
า อง รกคาสง print(k, len(q)) ะ 3 3 คอ ิสต์ ม 3 ตว
ตว 3 ม เพราะม ห ช ค 0 ง2เ า
06.1 : List 73
โ รแกรม ค�าอ ิบาย
n = int(input()) าช คาสง การหาคาตอ อง หา างต รก
for d in range(1,2*n) : ร กรมตอ รก เ ร กรม าง า
q = ['G']*n + ['B']*n
k = 0 สง ส 1 1 กตอง
while len(q) > 1 : สง ส 3 2 กตอง
k = (k + d) % len(q) สง ส 6 3 กตอง
q.pop(k)
if q[0] == 'G' :
สง ส 13 4 กตอง
print(d) สง ส 14 6 กตอง
break
else:
print('Not found')
74 06.1 : List
06.2 : Nested List
สรุปเนื้อหา
ิสต์เก อะ รก า ว เตม า ว ริง สตริง หรอ อ หรอ มกระ ง ิสต์ ก หxเ ิสต์ ะ า x[k] กเ
ิสต์ ะ x[k][j] คอ อม ตว j อง ิสต์ x[k]
x = []
x.append( 1 ) # [1]
x.append( [2,3] ) # [1,[2,3]]
x.append( [4,5,6] ) # [1,[2,3],[4,5,6]]
x.append( [[7,8]] ) # [1,[2,3],[4,5,6],[[7,8]]]
x.append( [] ) # [1,[2,3],[4,5,6],[[7,8]],[]]
len(x) คอ 5, x[1][1] คอ 3, x[2][1] คอ 5, x[3][0][1] คอ 8, len(x[3][0]) คอ 2, len(x[4]) คอ 0
for c in free :
print(c)
หรอเ
max_followers = []
max_username = ''
for [username,followers] in f :
if len(followers) > len(max_followers) :
max_username = username
max_followers = followers
print(max_username,'has max.# of followers :', \
', '.join(max_followers))
ากตวอ าง
f = [ ['noon',['pat','koi']], ['wii',['noon','koi']],
['pat',['koi','noon','wii']], ['koi',[]] ]
ะ c = [[-2,'noon'],[-2,'wii'],[-3,'pat'],[0,'koi']]
sort [[-3,'pat'],[-2,'noon'],[-2,'wii'],[0,'koi']]
เรื่องผิดบ่อย
แบบฝึกหัด
Problem Code
รร รกม า ว เตม r ก c ตาม ว อก
r รร ต ะ รร ม า ว เตม c ตว
สรางเม ริก ์ ว ิสต์ อ ิสต์ าม รร
ม อม ม ช c ตว ห ส ง เ ิสต์ อ ิสต์วาง [[]]
เม ริก ์ ิสต์ อ ิสต์ สราง
ห ง รร เ ชอ ม ม มห า รร เ าก
า ว username ต ะ รร ระกอ ว username
ตาม ว usernames อ ติ ตาม าวสาร อง
username รกต รร เช
noon pat koi
wii noon
pat koi noon wii
koi
ตัวอย่างการแก้โจทย์ปัญหา
เรยงตาม แนนรวม
งเ ร กรมร รหส กเร ะรา การ องคะ การสอ อ ตาง อง กเร า ว ห ง มา ระมว เพอ
ส งรหส กเร ะคะ รวมตาม า คะ รวม ากมาก อ
► อม าเ า
รร รกม า ว เตม วก n ก m ค ว ชองวาง n คอ า ว กเร ะ m คอ า ว การสอ อ อง กเร ต ะค
n รร ตอมา ต ะ รร ระกอ ว รหส กเร ตาม ว รา การ องคะ อ ค ว ชองวาง
► อม สงออก
าม รร า ว คะ อ มตรงก mหรว รวมรหส กเร มา ส งตามตวอ าง เร งตาม ร าก อม าเ า
า ก รร มคะ คร า ว กค ห ส งรหส กเร ตาม ว คะ รวม อง กเร รร ะค เร ง า ตาม
คะ รวม ากมาก อ กรณ มคะ รวมเ าก หเร งตามรหส กเร าก อ มาก
► ตวอ าง
3 3 Invalid data:
AA 4.0 AA
B 9.0 8.0 7.0 AC
AC 8.0 5.0
ค วามสามาร การเขียนโ รแกรมเ เหมอ พ งวิเศ ชว เพิม ความสามาร การ างา องเรา
มวา ะเ การ ก หา างวิศวกรรม
า าก าเ อ เรา
า ม สาหร วตกร ค
อ การสง หคอมพิวเตอร์ างา
การสอ หคอมพิวเตอร์มความเ ว า ะชว เราต สิ
รวม งการสรางเว หรอ อ เ ระ ช ์ก ค วงกวาง เร ก วาเ ก ะ
06.3 : List Comprehension
สรุปเนื้อหา
เ วิ การสราง ิสต์ เ ส ะ างา รว เรว
รูปแบบการสร้างลิสต์ด้วย ท่ บบ่อย
สร้างลิส ์ด้วยวงวนเ ิ่มข้อมูล สร้างสิส ์ด้วย l st co p ehens on
map: า อม าก ส ิ ต์ห งมา ระมว เก สอก ิสต์ map:
เช สราง ิสต์ b เก เ พาะห กห ว อง า ว สิ ต์ a
b = []
for e in a :
b.append( e%10 ) b = [ e%10 for e in a ]
ตัวอย่าง
x = [e for e in a] เหมอ ก x = list(a)
ิสต์ x เ ิสต์ หมมคาภา เหมอ ก อง a x ก a เ ิสต์ค ะตวก ตมคาเหมอ ก
ต าเ x = a ะ x ก a เ ิสต์เ วก การเ คา ิสต์ x ะ า ห a เ ว
หรอการเ คา ิสต์ a กเ x เช ก
x = [ [0,1,2] ] * 4
แบบฝึกหัด
oble o e
Input ม ิสต์ x เก สตริง ะตว ร c เก ตวอก ร
Process สราง ิสต์ d เก า ว ครง ตวอก ร c ราก
ต ะสตริง อง ิสต์ x
เช x = ['abba','babana','ann']; c = 'a'
ะ d = [2,3,1]
Input ิสต์ x เก า ว เตม
Process า ว เตม x กตว ติ
Input เม ริก ์ m ว
Process ง m หก า เ เช าก
m = [[1,2,3],[4,5,6]] กาเ [1,2,3,4,5,6]
Input ร า ว เตม n
Process สราง ิสต์ c เก า ว ระกอ มคา อ กวา n
เริม ากสราง ิสต์ หม x
เพิมคา 4,6,8,10,... มเกิ n-1 x
เพิมคา 6,9,12,15,... มเกิ n-1 x
เพิมคา 8,12,16,20,... มเกิ n-1 x
...
ตัวอย่างการแก้โจทย์ปัญหา
เรยงตาม แนนรวม
อ ช หาเร งคะ รวม หว อ ิสต์ อ ิสต์ มาเ ตวอ าง า ร กรม เ ว มา ร รง ช
ัวอย่างการเขียนโ รแกรม
โ รแกรมเดิม โ รแกรม รับ รุงแบบ ้ l st co p ehens on
n,m = [int(e) for e in \ n,m = [int(e) for e in \
input().split()] input().split()]
d0 = list() d0 = [input().split() for k in range(n)]
for k in range(n) :
d0.append(input().split())
err = list() err = [x[0] for x in d0 if len(x[1:]) != m]
for x in d0 :
if len(x[1:]) != m :
err.append(x[0])
if len(err) > 0 : if len(err) > 0 :
print('Invalid data: ') print('Invalid data: ')
for sid in err : print('\n'.join(err))
print(sid)
else : else :
d1 = list() # list comprehension ซ้อนใน
for x in d0 : # list comprehension อีกชั้น
s = 0 d1 = [[-sum([float(e) for e in x[1:]]), \
for e in x[1:] : x[0]] for x in d0]
s += float(e)
d1.append( [-s, x[0]] )
d1.sort() d1.sort()
for ntotal,scode in d1 : for ntotal,scode in d1 :
print( scode, -ntotal ) print( scode, -ntotal )
100 99
0 -1
-1
3 0
-3
111 100 5
13 96
1234 96
555 99
2121 96
99 99
1234
4 5
5
5
-1
10 5
5
5
3
5
-1
2 Not found
4
2
4
2
4
-1
สรุปเนื้อหา
Tuple
สราง tuple เหมอ สราง list my_list = [1, 2.5, 3, 'A'] ได้ list
ต ชวงเ คง my_tuple = (1, 2.5, 3, 'A') ได้ tuple
my_tuple_2 = (1,) ได้ tuple ที่มีตัวเดียว (สังเกตที่ o )
not_a_tuple = (1) ได้จ�านวนเต็ม เหมือน not_a_tuple = 1
t1 = tuple('abc') สร้างจากสตริง ได้ ('a','b','c')
t2 = tuple([1, 2, 3]) สร้างจากลิสต์ ได้ (1,2,3)
สามาร สราง list อง tuple L = [('A','B'), (1,20,300), (9.9,)] เป็น list ของ tuple
L[1] ได้ (1,20,300)
L[1][2] ได้ 300
Dictionary
ชเก อม คอ (key, value)
มม key าก ห ง key ม value คก เพ งคาเ ว ต value อา เ list, tuple, ... เก อม อ
าเราม key ะสามาร หา value คก key เรวมาก
ให้กับ k, v
า อง อม ก งออกมา ม าเ ตองเหมอ ก เ หรอ เพิม
ริการ keys(), values() ะ d = {'aka':'as known as', 'so':'significant other'}
x = d.keys()
items() ม เ list ตเ
print(x[1]) ผิด ท�าไม่ได้ เพราะ x ไม่ใช่ลิสต์
อะ ร างอ าง ค า list า ชก
าตองการ อ key งหม หเ ิสต์ ริง ตองเ
for...in ต ช index เพอห ิ
x = list( d.keys() ) ได้ x เป็นลิสต์ ใช้ x[1] ได้
อม ม
print(x[1]) ท�าได้ (แต่ไม่รู้ว่าได้ 'aka' หรือ 'so')
ริการ d.update(d1) เ การเพิม A = {1:'one', 2:'two'}
B = {1:'nueng', 3:'sarm'}
อม หม าก dict d1
A.update(B) ได้ A เป็น {1:'nueng', 2:'two', 3:'sarm'}
เ า d าม key d1 าก d
ส่วน B ไม่เปลี่ยนแปลง
ะเ การ ก value เ ิม
ริการ pop(key) เ การ ค อม C = {1: 'one', 2: 'two', 3: 'three'}
c = a.difference(b) หรือ c = a - b
โดยเซตที่มากระท�ากัน จะไม่เปลี่ยนแปลง
ได้ c = {1}
c = b.difference(a) หรือ c = b - a
ได้ c = {4}
c = a ^ b ได้ c = {1, 4}
dict มี key เป็น a, value เป็นเซตของ b c เป็น dict ที่ key เป็นรหัสนิสิต ส่วน value เป็นเซตของรหัสวิชา
ต้องการสร้างอีก dict ทีก่ ลับลักษณะ จึงใช้ c ตอบค�าถามว่ารหัสนิสิต sid เรียนวิชาอะไร ได้อย่างรวดเร็ว ถ้า
การจัดเก็บคือมี key เป็น b, value เป็นเซต อยากรู้ด้วยว่า รหัสวิชา cid มีรหัสนิสิตใดเรียนบ้าง ก็ต้องสร้างอีก dict
ของ a stu เป็น dict ที่ key เป็นรหัสวิชา ส่วน value เป็นเซตของรหัสนิสิต
stu = dict()
for (sid,cids) in c.items() :
for cid in cids :
if cid not in stu :
stu[cid] = {sid}
else :
stu[cid].add(sid)
เรื่องผิดบ่อย
tuple, dict หรือ set ได้ แต่สามารถ S.sort() ผิด เพรำะ set ไม่มีบริกำร sort
ใช้ sorted(d) ได้ โดย d คือ tuple, L = sorted(S) ได้ L = [1, 2, 3]
dict, set หรือ list L = sorted(D) ได้ L = ['A', 'B', 'C']
L = sorted(D.values()) ได้ L = [2, 5, 7]
เขียนแบบข้างล่างนี้ง่ายกว่า และเร็วกว่ามาก
if key1 in d :
print( 'value =', d[key1] )
else :
print('Not found')
ห้ามเก็บ list, dict หรือ set ใน set my_set = {1} หรือ my_set.add((1,2)) ท�ำได้
my_set.add([2,3,4]) ผิด
การใช้ตัวด�าเนินการของ set ไม่เปลี่ยนค่า a = {1, 2, 3}
b = {2, 3, 4}
ในเซตเดิม c = a.union(b) ได้ c = {1, 2, 3, 4}
แบบฝึกหัด
Problem Code
ลองคิดดูว่าการจะตอบค�าถามแบบนี้ ควรเก็บข้อมูลด้วยอะไร
1) ถามเกรดวิชา comp prog จากรหัสนิสิต
2) มีรายชื่อนิสิตที่ลงทะเบียนเรียนวิชา comp prog เพื่อถามว่านิสิตที่มี
รหัส x ลงทะเบียน comp prog หรือไม่
3) ให้ชื่อภาควิชา แล้วถามว่า มีนิสิตคนใดอยู่ภาควิชานั้นบ้าง
4) ต้องการเก็บข้อมูลรุ่นโทรศัพท์มือถือที่เขาเคยใช้ เรียงจากอดีตจนถึง
ปัจจุบัน ของนิสิตคนหนึ่ง
5) อยากนับว่าหมายเลขโทรศัพท์ส่วนใหญ่ลงท้ายด้วยเลขอะไร
ทะเบียนนิสิต
จงเขียนโปรแกรมรับรายการของข้อมูล ซึ่งประกอบด้วยชื่อของนิสิตและคณะที่นิสิตคนนั้นอยู่ จากนั้นจะก�าหนดชื่อคณะ
มาให้จา� นวนหนึ่ง ให้ตอบว่านิสิตในคณะเหล่านั้นมีชื่ออะไรบ้าง ถ้ามีชื่อซ�้ากัน ให้ตอบเพียงครั้งเดียว
► ข้อมูลน�าเข้า
บรรทัดแรกมีจ�านวนเต็มบวก n คือจ�านวนรายการข้อมูลทั้งหมด
n บรรทัดต่อมา แต่ละบรรทัดประกอบด้วย ชื่อของนิสิตและคณะที่นิสิตอยู่ โดยคั่นด้วยช่องว่าง
บรรทัดสุดท้ายจะเป็นรายชื่อคณะที่ต้องการถาม ถ้ามีหลายชื่อจะคั่นด้วยช่องว่าง
► ข้อมูลส่งออก
แสดงชื่อนิสิตในคณะเหล่านั้น โดยเรียงตามตัวอักษร ให้คั่นแต่ละชื่อด้วยช่องว่าง ถ้ามีชื่อซ�้ากัน ให้ตอบเพียงครั้งเดียว
► ตัวอย่าง
ตัวอย่างการเขียนโปรแกรม
เนื่องจากโจทย์จะก�าหนดชื่อคณะมาให้ และให้เราหาชื่อนิสิตที่อยู่ในคณะเหล่านั้น ดังนั้นเราควรเก็บข้อมูลโดยใช้ dict
ซึ่งมี key คือชื่อคณะ และ value เป็น set ของชื่อนิสิต (เพราะในแต่ละคณะ มีนิสิตได้หลายคน) ตัวอย่างการเก็บข้อมูล เช่น
{
'Engineering' : {'Tom', 'Jim'},
'Arts' : {'Pam', 'Tom'},
'Science' : {'Jenny'}
โปรแกรม ค�าอธิบาย
ขั้นตอนที่ 1
n = int(input()) อ่านค่า n ซึง่ เป็นจ�านวนข้อมูลเข้ามา
fac2name = {}
สร้าง dict ว่าง ๆ ชือ่ fac2name ซึง่ จะใช้เก็บว่า คณะนี้
for i in range(n): มีนสิ ติ ชือ่ อะไรบ้าง จากนัน้ วนลูป n รอบ เพือ่ เก็บข้อมูลคู่
name,fac = input().split()
fac2name[fac] = {name} (key, value) คือ ชือ ่ คณะและ set ของชือ่ นิสติ
แต่ตวั อย่างนีผ้ ดิ เพราะแต่ละ key ของ dict จะเก็บ value
ได้แค่คา่ เดียว ถ้าใส่คา่ แบบนีจ้ ะท�าให้คา่ ทีเ่ ก็บใหม่ไปทับค่าเดิม
n = int(input()) เปลี่ยนมาใช้ add เพิ่มใน value ของ dict แต่การเก็บค่า
fac2name = {}
แบบนี้ยังผิดอยู่ เพราะไม่ได้ตั้งค่าเริ่มต้นของ dict ไว้ก่อน
for i in range(n): จึงท�าให้ add ไม่ได้
name,fac = input().split()
fac2name[fac].add(name)
ขั้นตอนที่ 2
ask_fac = input().split() รับข้อมูลรายชื่อคณะที่ต้องการถาม มาเก็บไว้ใน list ชื่อ
ว่า ask_fac
ขั้นตอนที่ 3
ans_set = {} สร้างเซตค�าตอบเริ่มต้นเป็นเซตว่าง
แต่แบบนี้ผิด เพราะจะได้เป็น dict ว่างแทน
ans_set = set() สร้างแบบนี้ถึงจะได้เซตว่างที่ถูกต้อง
ขั้นตอนที่ 5
print(' '.join(ans_set.sort())) พิมพ์ค่าใน ans_set โดยเรียงล�าดับตามตัวอักษร
แต่แบบนี้ผิด เพราะ sort() ใช้กับ set ไม่ได้
print(' '.join(list(ans_set).sort())) ใช้วธิ แี ปลงเป็น list แล้วค่อยใช้ sort() แบบทีแ่ สดง
ทางซ้ายนีก้ ็ไม่ได้ เพราะ list(ans_sort).sort()
เรียงล�าดับได้ แต่ไม่ได้คืนค่าอะไรกลับไปให้ join
ans_list = list(ans_set) ต้องแปลงเป็น list เก็บใส่ในตัวแปร แล้วค่อยเรียก sort
ans_list.sort()
print(' '.join(ans_list)) กับตัวแปร แล้วส่งตัวแปรนั้นให้ join ไปใช้
print(' '.join(sorted(ans_set))) หรือใช้ sorted แทน เพราะ sorted รับ set ได้ และให้
ผลเป็นลิสต์ที่เรียงล�าดับแล้วกลับคืนมาส่งให้ join
► ข้อมูลส่งออก
บรรทัดแรก แสดงขนาดของเซตที่เกิดจากการ union ทุกเซต
บรรทัดที่ 2 แสดงขนาดของเซตที่เกิดจากการ intersect ทุกเซต
► ตัวอย่าง
Input (จากแป้นพิมพ์) Output (ทางจอภาพ)
3 5
1 2 1 2 3 1 2 1 2 1 2
2 3
2 5 4 3
6 9
100 1000 0
101 123
200
201
-1
-2 -3
6 3
-1 0 1 3
-1 1 0
0 -1 1
0 1 -1
1 -1 0
1 0 -1
6 go
Adjective good 2
Verb wrap good Adjective
Verb write goose Noun
Noun hall
Noun hobby
Noun goose
สรุปเนื้อหา
การ งาน งก์ ัน
• อาจเรียกว่า subprogram หรือ subroutine
• ท�าให้โปรแกรมอ่านง่าย เข้าใจง่าย
ตัวแปร น งก์ ัน ( )
• ตั้งชื่อซ�า้ กับตัวแปรใน ังก์ชันอื่นได้ ถือว่าเป็นคนละตัวแปรกัน
• เรียกใช้ตัวแปรใน ังก์ชันอื่นไม่ได้
• แล้วค่อยเขียนกรณีที่ต้องเรียกซ�า้
def f(n):
if n == 0: return 0
if 1 <= n <= 2: return 1
return f(n-1) + f(n-2)
เรื่องผิดบ่อย
ตั้งชื่อ ังก์ชันซ�้ากันเอง หรือซ�า้ กับชื่อตัวแปร def average(x,y): average เป็น งก์ชันที่รับ ตัวแปร
return (x+y)/2
ในตัวแปรของผู้เรียกที่ส่งมาให้พารามิเตอร์ y = [1, 2, 3]
เปลี่ยนแปลงด้วย (เพราะเป็นทีเ่ ก็บตัวเดียวกัน) print(sum_double(y)) ได้ 12
print(y) ได้ [2, 4, 6]
def f(x) :
...
# ลิสต์ x เปลี่ยนแปลง ลิสต์ y จะเปลี่ยน
x.append(e)
x[i] = e
x[:] = [0,0,0]
x.pop(0)
...
f(y)
def clip(x):
if x > 255 :
return 255 กร ี x ไม่เกิน 255 จะได้ None
ลืม ( ) เมื่อเรียกใช้ ังก์ชัน def read_next_positive_int():
n = int(input())
while n <= 0 :
n = int(input())
return n
a = int(input())
b = f(a/2) ส่ง float ไป จะท�ำงำนผิดใน งก์ชัน f
c = f(10*a) ส่งจ�ำนวนเต็ม ท�ำงำนได้ถูกต้อง
ลืมกรณีพื้น านของ recursive def factorial(n):
return n * factorial(n-1) จะเรียก งก์ชันวนไปเรื่อย ๆ
เขียนตรวจสอบกรณีพื้น านไว้ทีหลัง def factorial(n):
return n * factorial(n-1)
if n == 0: return 1 บรรทัดนี้ไม่เคยท�ำงำนเลย
ถ้ามีการค�านวณค่า recursive ที่ซา�้ กัน def f(n):
if n == 0: return 1
ควรค�านวณทีเดียว แล้วเก็บไว้ในตัวแปร return f(n-1) + f(n-1)**2
มีการค�านวณซ�้า โปรแกรมจะช้า
def f(n):
if n == 0: return 1
x = f(n-1)
return x + x**2
ค�านวณครั้งเดียว จะท�างานเร็วกว่า
แบบฝึกหัด
b
Parameter: รับข้อมูล a เป็นสตริง และ รับ b เป็นจ�านวนเต็ม return [ ลง
*
เขียน ังก์ชันเวียนเกิดเพื่อค�านวณค่าดังนี้
เขียน ังก์ชันเวียนเกิดเพื่อค�านวณค่าดังนี้
k(2n) = k(n)+(k(n)%10) if n > 0
k(2n+1) = k(n-1)*n if n > 0
k(0) = 1
k(1) = 2
เขียน ังก์ชันเวียนเกิดเพื่อค�านวณค่าดังนี้
Function Refactoring
ก�าหนดโปรแกรมค�านวณจ�านวนวันตั้งแต่วันที่ A จนถึงวันที่ B มาให้ จงแยกเป็น ังก์ชันต่อไปนี้ และเติมค�าสั่งให้ครบสมบูรณ์
เส้นประ งั ก์ชัน is_leap_year(y) คืน True เมื่อปีคริสตศักราช y เป็นปีอธิกสุรทิน
ถ้าไม่เป็นให้คืน False
เส้นไข่ปลา ังก์ชัน day_of_year(d,m,y) คืนว่าวันที่ d m y เป็นวันที่ล�าดับที่เท่าใดของปีคริสตศักราช y
เส้นประยาว ังก์ชัน days_in_year(y) คืนจ�านวนวันในปีคริสตศักราช y
► ข้อมูลน�าเข้า
มี 2 บรรทัด บรรทัดแรกเป็นวันที่ A ในรูปแบบ d1 m1 y1 เป็นปีคริสตศักราช
บรรทัดที่ 2 เป็นวันที่ B ในรูปแบบ d2 m2 y2 เป็นปีคริสตศักราช
รับประกันว่าวันที่ทั้งสองวันจะเป็นวันที่ที่ถูกต้อง และวันที่ A จะมาก่อนวันที่ B เสมอ และอยู่คนละปีกัน
► ข้อมูลส่งออก
จ�านวนวันระหว่างวันที่ A และ B โดยรวมวันที่ A และ B ด้วย
► ตัวอย่าง
25 12 1999 76
9 3 2000
print( ?? )
ังก์ชัน days_in_year(y)
จากโปรแกรมในกล่องเส้นประยาว สามารถเขียนเป็น งั ก์ชนั ได้ดงั นี้ คัดลอกโปรแกรมจากกล่องเส้นประยาว
def days_in_year(y):
if y%4==0 and (y%100!=0 or y%400==0):
อย่าลืมเปลี่ยนชื่อตัวแปร และคืนค่าให้ถูกต้อง
return 366
else:
return 365
C = 0
for i in range(y1+1,y2):
C += days_in_year(i)
print(days_in_year(y1) - A + 1 + C + B)
Four Functions
จงเขียน 4 ังก์ชัน ให้ท�างานตามที่เขียนอธิบายก�ากับแต่ละ ังก์ชัน ในโครงของโปรแกรมข้างล่างนี้
def make_int_list(x):
# รับสตริง x มำแยกและแปลงเป็น int เก็บใน list แล้วคืนเป็นผลลัพธ์
# เช่น x = '12 34 5' ได้ผลเป็น [12, 34, 5]
def is_odd(e):
# คืนค่ำจริงเมื่อ e เป็นจ�ำนวนคี่ ถ้ำไม่ใช่ คืนค่ำเท็จ
def odd_list(alist):
# คืน list ที่มีค่ำเหมือน alist แต่มีเ พำะตัวที่เป็นจ�ำนวนคี่
# เช่น alist = [10, 11, 13, 24, 25] จะได้ [11, 13, 25]
def sum_square(alist):
# คืนผลรวมของก�ำลังสองของแต่ละค่ำใน alist
# เช่น alist = [1,3,4] ได้ผลเป็น (1*1 + 3*3 + 4*4) = 26
exec(input().strip()) # ต้องมีบรรทัดนี้เมื่อส่งไป a
► ข้อมูลน�าเข้า
ค�าสั่งในการทดสอบ ังก์ชันที่เขียน
► ข้อมูลส่งออก
ผลที่ได้จากค�าสั่งที่ป้อนเป็นข้อมูลน�าเข้า
► ตัวอย่าง
Input (จากแป้นพิมพ์) Output (ทางจอภาพ)
print(make_int_list('1 2 3 4 5')) [1, 2, 3, 4, 5]
print(is_odd(2222)) False
print(odd_list([1,2,3,4,5,6,7])) [1, 3, 5, 7]
print(sum_square([1,1,2,3])) 15
► ข้อมูลน�าเข้า
มี 2 บรรทัด ประกอบด้วยจ�านวนเต็ม n และ k
► ข้อมูลส่งออก
มี 1 บรรทัด แสดงค่า (n,k) ที่ค�านวณได้
► ตัวอย่าง
Input (จากแป้นพิมพ์) Output (ทางจอภาพ)
6 15
2
10 45
8
0 0
1
3 0
7
10 1
10
def sumlist( x ):
# ???
► ข้อมูลน�าเข้า
ลิสต์ที่เก็บจ�านวนเต็ม (อาจเป็นลิสต์แบบลิสต์ซ้อนลิสต์กี่ชั้นก็ได้)
► ข้อมูลส่งออก
ผลรวมของจ�านวนเต็มทุกตัวในลิสต์ที่เป็นข้อมูลน�าเข้า
► ตัวอย่าง
Input (จากแป้นพิมพ์) Output (ทางจอภาพ)
sumlist([[],[[]]]) 0
sumlist([1,1,2,2]) 6
sumlist([1,[1],[2,[2],0,[0,0]]]) 6
sumlist([0,[1,[2,[3,[4,5],6],7],8],[9,10]]) 55
• umPy เป็นคลังค�าสั่งที่ให้บริการมากมายเกี่ยวกับการค�านวณทางวิทยาศาสตร์
โดยมีที่เก็บข้อมูลที่เรียกว่า อาเรย์ n มิติ (ndarray) มีไว้เก็บข้อมูลเพื่อการประมวลผลที่มีประสิทธิภาพมาก ๆ
• อาเรย์มีลักษณะคล้ายลิสต์ แต่สร้างแล้วเปลี่ยนขนาดไม่ได้
• ค่าในอาเรย์ทุกช่องต้องเป็นประเภทเดียวกันทั้งหมด เช่น เป็น int ทุกช่อง หรือ float ทุกช่อง
(ผสมกันไม่ได้ ถ้าเป็นลิสต์ผสมได้)
• เราสร้าง เวกเตอร์ ได้ด้วยอาเรย์ 1 มิติ และสร้าง เมทริกซ์ ได้ด้วยอาเรย์ 2 มิติ
09 : NumPy 121
nt p t n t n แ In n
• เป็นสามแนวคิดของ umPy (ที่ต้องรู้ในวิชานี้) ที่ช่วยให้การประมวลผลอาเรย์ท�าได้สะดวก
• การด�าเนินการอาเรย์กับอาเรย์ (เช่น A+B) การด�าเนินการหรือท�า ังก์ชันกับอาเรย์ จะเป็นแบบช่องต่อช่อง
(element- ise) เช่น
np.array([1,2,3]) + np.array([1,1,1]) ได้ np.array([2,3,4])
1/(np.array([1,2,4])) ได้ np.array([1.0, 0.5, 0.25])
• การเข้าใช้ข้อมูล
o V[k] = 99 เหมือนกับการใช้ลิสต์
o V[a:b:c] = d แตกต่างจากลิสต์
• ถ้า d เป็น int, float หรือลิสต์ อาเรย์ขนาด 1 ช่อง จะ broadcast ให้มีขนาดเท่ากับช่วงของ a:b:c
122 09 : NumPy
o การอ้างอิงข้อมูลในอาเรย์ 2 มิติ
• สามารถอ้างอิงถึงตัวข้อมูล, อาเรย์ 1 มิติที่แทนแถว (ro ) ของข้อมูล, อาเรย์ 1 มิติที่แทนหลัก (column) ของ
ข้อมูล หรืออาเรย์ย่อย 2 มิติที่แทนช่วงของแถวและหลัก ได้หลากหลายแบบ ดังนี้
o M[r,c] ข้อมูล ณ แถวที่ r หลักที่ c
o M[r,:] หรือ M[r] อาเรย์ 1 มิติของแถวที่ r ทั้งแถว
o M[:,c] อาเรย์ 1 มิติของหลักที่ c ทั้งหลัก (ไม่ใช่อาเรย์ 2 มิติที่มี 1 หลัก)
o M[r1:r2,:] หรือ M[r1:r2] อาเรย์ 2 มิติประกอบด้วย แถวที่ r1 ถึง r2-1
o M[:,c1:c2] อาเรย์ 2 มิติประกอบด้วย หลักที่ c1 ถึง c2-1
o M[r1:r2,c1:c2] อาเรย์ย่อย 2 มิติ ในช่วงแถวที่ r1 ถึง r2-1 และช่วงหลักที่
c1 ถึง c2-1
09 : NumPy 123
ังก์ชันที่ระบุแกนได้, การ transpose และการเปรียบเทียบ (M = np.array([[1,2,3,4],[5,6,7,8]]))
• ังก์ชันที่ระบุแกนได้ เช่น sum, max, min, mean, std, argmax, argmin (คืนต�าแหน่งตัวมาก น้อยสุด)
• np.sum(M) ได้ผลรวมของทุกช่อง np.sum(M) ได้ 36
เรื่องผิดบ่อย
124 09 : NumPy
broadcasting x = np.array([[1,2,3],[4,5,6]])
element- ise operations y = x+2 # [[3,4,5],[6,7,8]]
y = x+[1,2,3] # [[2,4,6],[5,7,9]]
y = x+np.array([1,2,3]) # [[2,4,6],[5,7,9]]
y = x+np.array([[1,2,3]]) # [[2,4,6],[5,7,9]]
y = x+np.array([[1],[2],[3]]).T # [[2,4,6],[5,7,9]]
y = x+np.array([[1],[2],[3]]) # ผิด
y = x+np.array([[1,2,3]]).T # ผิด
y = x+np.array([[1,2]]).T # [[2,3,4],[6,7,8]]
Problem Code
สมมติว่ามีอาเรย์ 2 มิติ M มาให้
Input: จ�านวนเต็มบวก 1 จ�านวนจากแป้นพิมพ์ เก็บใน k
Process: เปลี่ยนค่าของช่องใน M ที่หมายเลขแถวและหลัก
หารด้วย k ลงตัวให้มีคา่ เป็น
สมมติว่ามีอาเรย์ 2 มิติ M มาให้
Input: จ�านวนเต็มบวก 1 จ�านวนจากแป้นพิมพ์ เก็บใน k
Process: เปลี่ยนค่าของช่องใน M ที่หมายเลขแถวและหลัก
หารด้วย k ลงตัวให้มีคา่ เป็น 2 เท่าของค่าเดิม
สมมติว่ามีอาเรย์ 2 มิติ M มาให้
ให้ค�านวณหาผลต่างของค่ามากสุดและค่าน้อยสุดในแต่ละหลัก
เช่น ถ้า M = np.array([[3,2],[5,6],[7,1]])
จะได้ค�าตอบ A เท่ากับ np.array([4,5])
(4 มาจาก 7-3 และ 5 มาจาก 6-1)
ก�าหนดอาเรย์ X เก็บความยาวของด้านประกอบมุม ากของ
รูปสามเหลี่ยมมุม ากหลายรูป เช่น
X = np.array([[3,4],[5,12],[24,7]])
ให้สร้างอาเรย์ Y ซึ่งเก็บความยาวของด้านตรงข้ามมุม าก เช่น
จาก X ด้านบน จะได้ Y เท่ากับ array([5.,13.,25.])
Input: จ�านวนเต็มบวก 1 จ�านวนจากแป้นพิมพ์ เก็บใน k
Process: สร้างเมทริกซ์ขนาด k×k ซึ่งเก็บค่า 0 และ 1 เป็น
ตารางหมากรุก (มุมซ้ายบนเป็น 0) เช่น ถ้า k = 5 จะได้
C = np.array([[0,1,0,1,0]
[1,0,1,0,1]
[0,1,0,1,0]
[1,0,1,0,1]
[0,1,0,1,0]])
09 : NumPy 125
Problem Code
Input: จ�านวนเต็มบวก 1 จ�านวนจากแป้นพิมพ์ เก็บใน k
Process: สร้างเมทริกซ์ขนาด k×k ซึ่งเก็บค่าเป็น
ตารางหมากรุกอีกแบบหนึ่ง (มุมซ้ายบนเป็น 1) โดยแทน 1 ด้วย
เลขแถว (ให้เลขแถวเริ่มที่ 1) เช่น ถ้า k = 5 จะได้
C = np.array([[1,0,1,0,1]
[0,2,0,2,0]
[3,0,3,0,3]
[0,4,0,4,0]
[5,0,5,0,5]])
ตัวอย่างการแก้โจทย์ปัญหา
Weighted Score
รายการประกวดร้องเพลงก�าลังหาผูช้ นะจากการแข่งขัน โดยคะแนนของผูเ้ ข้าแข่งขันมาจาก 3 ส่วน คือ คะแนนของกรรมการ
คะแนนจากผู้ชมในห้องส่ง และคะแนนจากผู้ชมทางบ้าน ทางรายการได้ก�าหนดน�้าหนักของคะแนนแต่ละส่วนมาให้แล้ว ให้ค�านวณ
คะแนนรวมของผู้เข้าแข่งขันแต่ละคน
► ข้อมูลน�าเข้า
บรรทัดแรกคือจ�านวนผู้เข้าแข่งขัน n เป็นจ�านวนเต็ม
n บรรทัดถัดมา รับจ�านวนเต็ม 3 จ�านวน คือคะแนนของกรรมการ คะแนนจากผู้ชมในห้องส่ง และคะแนนจากผู้ชมทางบ้าน
บรรทัดสุดท้ายคือน�้าหนักของคะแนนแต่ละส่วน เป็นจ�านวนทศนิยม 3 จ�านวน
► ข้อมูลส่งออก
มี n บรรทัด แต่ละบรรทัดแสดงคะแนนของผู้เข้าแข่งขันแต่ละคน
► ตัวอย่าง
2 17.0
10 30 20 18.0
20 10 30
0.6 0.3 0.1
126 09 : NumPy
ตัวอย่างการเขียนโปรแกรม
โปรแกรม ค�าอธิบาย
n = int(input()) โปรแกรมส่วนบนเป็นส่วนส�าหรับรับข้อมูล
S = [] ได้ S เป็นลิสต์ซ้อนลิสต์ของคะแนนผู้เข้าแข่งขัน
for i in range(n):
S.append([int(e) for e in input().split()]) แต่ละคน และ W เป็นลิสต์ของน�้าหนัก เช่น
W = [float(e) for e in input().split()] S = [[10,30,20],[20,10,30]]
W = [0.6,0.3,0.1]
for i in range(n):
score = [S[i][j]*W[j] for j in range(3)]
โปรแกรมด้านขวาท�างานถูกต้อง แต่ถ้ามีจ�านวน
print(sum(score)) ข้อมูลมาก จะช้า เพราะใช้ลิสต์ในการประมวลผล
n = int(input()) ยุบ for วงล่างให้เป็น list compre ension
S = [] ท�างานถูกต้อง แต่ก็ยังช้าอยู่ ลองเปลี่ยนมาใช้
for i in range(n):
S.append([int(e) for e in input().split()]) numpy
W = [float(e) for e in input().split()]
score = [sum([S[i][j]*W[j] \
for j in range(3)]) \
for i in range(n)]
for i in score:
print(i)
S = np.array(S)
W = np.array(W)
for i in range(n):
print(sum(S[i]*W))
09 : NumPy 127
โปรแกรม ค�าอธิบาย
import numpy as np เราสามารถเขียน S *= W ได้เลย เพราะ numpy
n = int(input()) จะ broadcast อาเรย์ W ให้โดยอัตโนมัติ
S = []
for i in range(n): สั่ง run, ใส่ข้อมูลตามตัวอย่างแรก, ได้
S.append([int(e) for e in input().split()]) 28
W = [float(e) for e in input().split()] 9
9
S = np.array(S)
W = np.array(W) ไม่ตรงกับที่แสดง พบว่าจ�านวนตัวเลขไม่ครบ 4 ตัว
S *= W น่าจะผิดที่ axis
total_score = np.sum(S, axis = 0)
for i in total_score:
print(i)
S = np.array(S)
W = np.array(W)
for i in S.dot(W):
print(i)
128 09 : NumPy
ตัวอย่างโจทย์ปัญหา
ค่าเช่าหนังสือ
จงเขียนโปรแกรมค�านวณหาราคาค่าเช่าหนังสือของร้านเช่าหนังสือแห่งหนึ่ง ที่มีประเภทหนังสือให้เช่า 4 ประเภท คือ
นิยาย สารคดี ท่องเที่ยว และการ์ตูน
เจ้าของร้านเช่าหนังสือต้องการทราบว่าในหนึง่ สัปดาห์ (คิด 5 วันจันทร์ถงึ ศุกร์) วันใดให้เช่าหนังสือเป็นจ�านวนเล่มมากทีส่ ดุ
เป็นจ�านวนกี่เล่ม และค่าเช่าหนังสือรวมทุกประเภทในแต่ละวันเป็นจ�านวนเท่าไร
► ข้อมูลน�าเข้า
บรรทัดที่ 1 เป็นจ�านวนเต็ม 4 จ�านวนคั่นด้วยช่องว่าง แทนค่าเช่า นิยาย สารคดี ท่องเที่ยว และการ์ตูน
บรรทัดที่ 2 เป็นจ�านวนหนังสือนิยายที่ถูกเช่าในวัน จ. อ. พ. พฤ. และ ศ. (คั่นด้วยช่องว่าง)
บรรทัดที่ 3 เป็นจ�านวนหนังสือสารคดีที่ถูกเช่าในวัน จ. อ. พ. พฤ. และ ศ. (คั่นด้วยช่องว่าง)
บรรทัดที่ 4 เป็นจ�านวนหนังสือท่องเที่ยวที่ถูกเช่าในวัน จ. อ. พ. พฤ. และ ศ. (คั่นด้วยช่องว่าง)
บรรทัดที่ 5 เป็นจ�านวนหนังสือการ์ตูนที่ถูกเช่าในวัน จ. อ. พ. พฤ. และ ศ. (คั่นด้วยช่องว่าง)
► ข้อมูลส่งออก
บรรทัดแรกแสดง ชื่อวันที่มีจ�านวนหนังสือถูกเช่ารวมมากสุด และจ�านวนหนังสือรวมนั้น (ให้ถือว่ามีวันเดียวเท่านั้นที่ให้เช่ามากสุด)
บรรทัดที่สองแสดงค่าเช่ารวมของหนังสือทุกประเภทในแต่ละวัน (เรียงตั้งแต่วันจันทร์ถึงศุกร์ คั่นด้วยช่องว่าง)
► ตัวอย่าง
Input (จากแป้นพิมพ์) Output (ทางจอภาพ)
50 30 40 20 Thu 172
20 50 10 15 20 5700 5400 3480 5940 4950
30 40 20 65 35
75 30 42 70 45
40 25 35 22 55
ขั้นตอนการท�างานของโปรแกรม
1. x = ลิสต์ทส่ี ร้างจากข้อมูลในบรรทัดแรกจากแป้นพิมพ์ เป็นจ�านวนเต็ม 4 จ�านวนแทนค่าเช่าหนังสือแต่ละประเภท
2. rentalrates = สร้าง numpy array ทีม่ คี า่ เริม่ ต้นจากลิสต์ x
3. sales = สร้าง numpy array ขนาด 4 แถว 5 คอลัมน์ (แถวแทนประเภทหนังสือ คอลัมน์แทนวัน)
4. วงวนท�าข้อ 5 โดยเปลีย่ นค่าของตัวแปร k = 0,1,2,3 (k แทนหมายเลขประเภทหนังสือ)
5. sales[k,] = list ทีส่ ร้างจากข้อมูลหนึง่ บรรทัดจากแป้นพิมพ์ เป็นจ�านวนเต็ม 5 จ�านวน แทนจ�านวนหนังสือ
ประเภทที่ k ของแต่ละวันทีข่ ายได้
. totalsales = ผลรวมของจ�านวนหนังสือทีถ่ กู เช่าในแต่ละวันค�านวณจาก sales (ในข้อ 3)
. d = ต�าแหน่งใน totalsales ทีม่ คี า่ มากสุด (d = 0 แทนวันจันทร์, 1 แทนวันอังคาร, ..., 4 แทนวันศุกร์)
. หาชือ่ ย่อวัน จาก d และ tuple ('Mon', 'Tue', 'Wed', 'Thu', 'Fri')
. แสดง ชือ่ ย่อวัน ตามด้วย totalsales[d]
1 . salesvalues = ค่าเช่าหนังสือรวมของหนังสือทุกประเภทในแต่ละวัน (น�า rentalrates มา dot กับ sales)
11. แสดงรายการของยอดเงินทีข่ ายได้จาก salesvalues มาแสดง (คัน่ ด้วยช่องว่าง)
09 : NumPy 129
BMI
งั ก์ชนั read_height_weight() ข้างล่างนี้ อ่านข้อมูลความสูง (หน่วยเป็นเซนติเมตร) และน�า้ หนัก (หน่วยเป็นกิโลกรัม)
มาสร้าง numpy array แบบสองมิติ ดังตัวอย่างในตารางข้างล่างนี้ (บรรทัดแรกคือจ�านวนข้อมูล บรรทัดที่ตามมาคือ ความสูงกับ
น�้าหนัก)
และเขียนค�าสั่ง
• หาค่าเ ลี่ยของ bmi ทั้งหมดที่ค�านวณได้ เก็บใส่ตัวแปร avg_bmi และ
• นับจ�านวน bmi ที่ค�านวณได้ที่มีค่าน้อยกว่า 18.5
130 09 : NumPy
โปรแกรมเริ่มต้น
import numpy as np
def read_height_weight():
list_hw = []
for k in range(int(input())) :
h,w = input().split()
list_hw.append((int(h),int(w)))
return np.array(list_hw)
def cm_to_m(x):
# ???
def cal_bmi(hw):
# ???
def main():
hw = read_height_weight()
bmi = cal_bmi(hw)
avg_bmi = ______________________________________
count_underweight = ____________________________
print('average bmi =', avg_bmi)
print('#bmi < 18.5 =', count_underweight)
exec(input().strip())
► ข้อมูลน�าเข้า
ค�าสั่งในการทดสอบ ังก์ชันที่เขียน
► ข้อมูลส่งออก
ผลที่ได้จากค�าสั่งที่ป้อนเป็นข้อมูลน�าเข้า
► ตัวอย่าง
09 : NumPy 131
การค�านว จ�านวน โบนักชีโดยใช้การยกก�า ังเมทริก ์อย่างรวดเรว
, 1, 1, 2, 3, 5, , ... เป็นล�าดับของจ�านวน โบนักชี ( , 1 1, 2 1, ...) วิธีหนึ่งในการหา n คือค�านวณ
ผลการยกก�าลัง n ของเมทริกซ์ ที่แสดงด้านล่าง จะได้ผลเป็นเมทริกซ์ขนาด 2 2 ทีม่ ี n อยู่ที่มุมขวาบนของเมทริกซ์ เช่น
ก็จะได้ 1 นั่นคือ
import numpy as np
def fib(n,k):
# ???
► ข้อมูลน�าเข้า
จ�านวนเต็ม 2 ค่า n กับ k (0 ≤ n ≤ 10**13, 0 ≤ k ≤ 100000)
► ข้อมูลส่งออก
แสดงค่า F % k n
► ตัวอย่าง
Input (จากแป้นพิมพ์) Output (ทางจอภาพ)
0 10 0
2 10 1
89 10 9
11111 111 55
132 09 : NumPy
10 : Class
สรุปเนื้อหา
• คลาส ใช้สร้างประเภทข้อมูลใหม่ที่ต้องการ โดยเราก�าหนดได้ว่า จะให้เก็บข้อมูลย่อยอะไรบ้าง และท�างานอะไรได้บ้าง
• คลาส คือ ประเภทข้อมูล, อ็อบเจกต์ คือ ตัวข้อมูล เช่น b1 = Book(...) ได้ว่า b1 เป็นอ็อบเจกต์ของคลาส Book
• เมท็อด คือ ังก์ชันซึ่งเป็นบริการของคลาส
class Book:
def __init__(self, title, price, keywords):
self.title = title; self.price = price; self.keywords = set(keywords)
def __str__(self):
return self.title + ' ($' + str(self.price) + ')'
b1.update_price(199)
print(Book.get_common_keywords(b2,b3)) # {'maths'}
if b3 < b2: print(b1) # using __lt__ & __str__
books = [b1,b2,b3]
books.sort() # using __lt__
print(books[0],',',books[1],',',books[2]) # using __str__
# 'Physics ($99) , Calculus ($199) , Python ($199)'
10 : Class 133
• การเรียกเมท็อดท�าได้ 2 แบบ
o เรียกผ่านชื่อคลาส เช่น Book.get_common_keywords(b2,b3)
o เรียกผ่านอ็อบเจกต์ เช่น b2.get_common_keywords(b3)
(b2 จะถูกแทนใน self และ b3 จะถูกแทนใน other โดยอัตโนมัติ และทั้งสองค�าสั่งนี้ท�างานเหมือนกัน)
• str(b1) เหมือนกับการเรียก Book.__str__(b1) หรือ b1.__str__()
• print(b1) เหมือนกับการเรียก print(str(b1))
• b1 < b2 เหมือนกับการเรียก Book.__lt__(b1,b2) หรือ b1.__lt__(b2)
• การเรียก books.sort() จะเรียงล�าดับอ็อบเจกต์ของ Book จากน้อยไปมาก โดยเปรียบเทียบด้วย __lt__
เรื่องผิดบ่อย
การก�าหนดค่าอ็อบเจกต์ให้กับตัวแปรด้วย class B:
เครื่องหมายเท่ากับ จะท�าให้ตัวแปรนั้นชี้ไปที่ def __init__(self, b):
อ็อบเจกต์เดียวกัน self.b = b
b1 = B(10)
b2 = b1 # b1, b2 อ้ำงอิงอ็อบเจกต์เดียวกัน
b2.b = 5
print(b1.b) # 5
134 10 : Class
แบบฝึกหัด
1. เติมเมท็อดของคลาสนิสิตตาม comment ที่ก�าหนดให้สมบูรณ์
class Nisit:
def __init__(self, name, year, faculty):
# n = Nisit('Krit', 4, 'Engineering')
def __str__(self):
# คืนสตริงของนิสิต เช่น 'Krit (year 4) Engineering'
10 : Class 135
2. เติมเมท็อดของคลาสรถยนต์ตาม comment ที่ก�าหนดให้สมบูรณ์
class Car:
def __init__(self, license, brand, color):
# c = Car('AA1234', 'Honda', 'White')
# มีตัวแปร report ส�ำหรับเก็บข้อมูลประวัติกำรซ่อมบ�ำรง ดยก�ำหนดค่ำเริ่มต้นเป็นลิสต์ว่ำง
def __str__(self):
# คืนสตริงของรถยนต์ เช่น 'AA1234 – White Honda'
def total_payment(self):
# คืนค่ำใช้จ่ำยทั้งหมดที่ใช้ในกำรซ่อมบ�ำรงที่ผ่ำนมำ
def max_payment(self):
# คืนลิสต์ของประวัติกำรซ่อมบ�ำรง (วันที่, ค�ำอธิบำย, รำคำ) ทกรำยกำร ที่มีค่ำใช้จ่ำยมำกที่สด
# กร ีที่รถยนต์ไม่มีประวัติกำรซ่อมบ�ำรงเลย ให้คืนค่ำลิสต์ว่ำง
136 10 : Class
3. จาก class Book ให้เติมเมท็อดของ class ShoppingCart ส�าหรับการซื้อหนังสือผ่านเว็บไซต์ ดังนี้
class ShoppingCart:
def __init__(self, id):
self.id = id
self.books = []
# books เก็บลิสต์ของหนังสือในตะกร้ำพร้อมจ�ำนวน เช่น [[b1,2],[b3,7]]
def add_book(self, book, n):
# เพิ่มข้อมูลกำรซื้อหนังสือ book เพิ่มอีก n เล่ม ดยไม่ต้องคืนค่ำ
# หำกไม่มีหนังสือเล่มนี้ในตะกร้ำ ให้เพิ่มลิสต์ [book, n] ต่อท้ำย books
# หำกเคยมีข้อมูลหนังสือเล่มนี้ในตะกร้ำแล้ว ให้เพิ่มจ�ำนวนที่ซื้ออีก n เล่ม
# เช่น ถ้ำ books = [[b1,2]] และเรำสั่ง add_book(b1,3) จะได้ books = [[b1,5]]
def get_total(self):
# คืนค่ำรำคำรวมของหนังสือทั้งหมดในตะกร้ำ
10 : Class 137
4. ข้างล่างนี้แสดงคลาส Station และคลาส BTScard (อ่านค�าอธิบายของแต่ละคลาสจาก comment ที่เขียน)
สถานีรถไ า้ เป็นอ็อบเจกต์ของคลาส Station และบัตรโดยสารแบบเติมเงินแต่ละใบเป็นอ็อบเจกต์ของคลาส BTScard
จงเติมค�าสั่งในเมท็อด add_value, enter, leave และ __lt__ ของคลาส BTScard ให้ท�างานตาม comment ที่เขียน
(เมท็อดอื่นที่ได้เขียนค�าสั่งไว้ ท�างานถูกต้องแล้ว) ดูตัวอย่างการใช้งานข้างล่างนี้ประกอบ
s1 = Station(1,'Siam'); s2 = Station(3,'Mo Chit'); s3 = Station(5,'Asok')
c1 = BTScard(123, 5); c2 = BTScard(999, 10)
# --------------------------------------------------------------
c1.add_value(100) # c1 มีเงินในบัตร 105 บำท
p = c1.enter(s1) # p = True
p = c1.enter(s3) # p = False (แตะเข้ำสถำนีหลังจำกแตะเข้ำไปแล้ว)
p = c1.leave(s2) # c1 เหลือเงินในบัตร 95 บำท ดย p = (95, 0)
# --------------------------------------------------------------
p = c2.enter(s3) # p = True
p = c2.leave(s1) # c2 มีเงินในบัตร 10 บำทไม่พอจ่ำยค่ำ ดยสำร ดย p = (10, -1)
c2.add_value(50) # c2 มีเงินในบัตร 60 บำท
p = c2.leave(s1) # c2 เหลือเงินในบัตร 40 บำท ดย p = (40, 0)
p = c2.leave(s2) # p = (40, -2) (ยังไม่ได้แตะเข้ำสถำนี จงไม่มีสถำนีต้นทำง)
p = c2.enter(s2) # p = True
p = c1 < c2 # p = False
# ------------------------------------------------------------------
def __str__(self):
return '('+str(self.cid)+','+str(self.value)+')'
138 10 : Class
def enter(self, station):
# แตะบัตรเพื่อเข้ำสู่สถำนีรถไ ำ ให้เช็คว่ำ บัตรนี้ไม่ได้แตะเข้ำที่สถำนีอื่นมำก่อน
# ถ้ำไม่มีกำรแตะเข้ำมำก่อน ให้เปลี่ยนค่ำสถำนีต้นทำงเป็น station แล้ว return True
# แต่ถ้ำมีกำรแตะเข้ำสถำนีอื่นมำก่อน ให้ return False ดยไม่เปลี่ยนข้อมูลสถำนีต้นทำงของบัตร ดยสำร
10 : Class 139
ตัวอย่างการแก้โจทย์ปัญหา
Bus
ให้เขียนคลาสของรถเมล์ซึ่งมีเมท็อดดังนี้
1. __init__ สร้างรถเมล์ 1 คัน รับพารามิเตอร์ จ�านวนคนบนรถ people และค่าโดยสาร fare
2. __str__ คืนค่าสตริงซึ่งบอกจ�านวนคนบนรถและค่าโดยสาร
3. __lt__ เปรียบเทียบรถเมล์โดยพิจารณาค่าโดยสารรวมของรถ (จ�านวนคนบนรถคูณค่าโดยสารต่อคน)
4. people_in เพิ่มจ�านวนคนบนรถ k คน ไม่คืนค่า
5. people_out ลดจ�านวนคนบนรถ k คน (หากจ�านวนคนน้อยกว่า 0 จะต้องแก้ไขจ�านวนคนเป็น 0) ไม่คืนค่า
. change_fare เปลี่ยนค่าโดยสารเป็นค่าโดยสารใหม่ new_fare ไม่คืนค่า
► ตัวอย่าง
b1 = Bus(10, 5) # b1 has 10 people with fare = 5
b2 = Bus( 8, 7) # b2 has 8 people with fare = 7
if b1 < b2: # b1 < b2 is True (10*5 < 8*7)
print(b1) this bus has 10 people with fare = 5
else:
print(b2)
b1.people_in(3) # b1 has 13 people with fare = 5
b1.people_out(6) # b1 has 7 people with fare = 5
b1.change_fare(12) # b1 has 7 people with fare = 12
print(b1) this bus has 7 people with fare = 12
ตัวอย่างการเขียนโปรแกรม
โปรแกรม ค�าอธิบาย
class Bus: ท�างานไม่ถูกต้อง มีจุดผิดดังนี้
def __init__(people, fare): - ไม่มีการใช้ self
people = people
fare = fare - เมท็อด people_in, people_out และ
def __str__(): change_fare ต้องไม่คืนค่า
return 'this bus has ' + str(people) \ - เมท็อด people_out ไม่ได้ตรวจสอบว่า
+ ' people with fare = ' + str(fare)
def __lt__(rhs):
จ�านวนคนน้อยกว่าศูนย์หรือไม่
return people*fare < \
rhs.people*rhs.fare
def people_in(k):
return people += k
def people_out(k):
return people -= k
def change_fare(new_fare):
return fare = new_fare
140 10 : Class
โปรแกรม ค�าอธิบาย
class Bus: ท�างานถูกต้อง สังเกตการใช้งาน
def __init__(self, people, fare): self.people = max(0,self.people-k)
self.people = people
self.fare = fare ว่าท�าการแก้ไขจ�านวนคนหากน้อยกว่าศูนย์ให้แล้ว
def __str__(self):
return 'this bus has ' + \
str(self.people) + \
' people with fare = ' + \
str(self.fare)
def __lt__(self, rhs):
return self.people*self.fare < \
rhs.people*rhs.fare
def people_in(self, k):
self.people += k
def people_out(self, k):
self.people = max(0,self.people-k)
def change_fare(self, new_fare):
self.fare = new_fare
10 : Class 141
ตัวอย่างโจทย์ปัญหา
เ ษส่วน
ก�าหนดคลาสของเศษส่วน ประกอบด้วยเศษ (numerator) และส่วน (denominator) และมีเมท็อด 4 เมท็อดคือ เมท็อด
ส�าหรับการแสดงผลเป็นสตริง เมท็อดการท�าเศษส่วนอย่างต�า่ เมท็อดการบวก และเมท็อดการคูณ ดังนี้ (ขอให้สังเกตการเรียกใช้งาน
เมท็อด ว่าสามารถเรียกได้หลายแบบ)
def gcd(x,y):
if x%y == 0: return y
return gcd(y,x%y)
class Fraction:
def __init__(self,a,b):
self.numerator = ___________________
self.denominator = ___________________
def __str__(self):
# ???
def simplify(self):
g = gcd(self.numerator,self.denominator)
return Fraction(self.numerator//g,self.denominator//g)
def add(self,other):
# ???
def multiply(self,other):
ans_numer = self.numerator * other.numerator
ans_denom = self.denominator * other.denominator
return Fraction(ans_numer,ans_denom).simplify()
print(fraction1.add(fraction2))
print(Fraction.multiply(fraction1,fraction2))
142 10 : Class
► ข้อมูลน�าเข้า
มีบรรทัดเดียว เป็นจ�านวนเต็มบวก a b c d ซึ่งแทนเศษส่วน a/b และ c/d
► ข้อมูลส่งออก
มี 2 บรรทัด แสดงผลบวกและผลคูณของเศษส่วนที่กา� หนดให้
► ตัวอย่าง
1 2 1 3 5/6
1/6
1 8 3 8 1/2
3/64
2 3 1 2 7/6
1/3
10 : Class 143
ค าสของไพ่
ข้างล่างนี้แสดงการเรียกใช้คลาส Card ซึ่งแทนไพ่ 1 ใบ ประกอบด้วย ค่าของไพ่ (value) ซึ่งเป็นสตริง ('A', '2',
'3', … , '10', 'J', 'Q', 'K') และ ดอกของไพ่ (suit) ซึ่งเป็นสตริงเช่นกัน ('club', 'diamond', 'heart',
'spade' ) โปรแกรมข้างล่างนี้รับไพ่เข้ามาหลายใบมาสร้างเป็นลิสต์ของไพ่ (cards ) และมีการเรียกใช้เมท็อดต่าง ๆ ของ
คลาส Card ให้นิสิตเขียนเมท็อดต่าง ๆ ของคลาส Card ให้สมบูรณ์
class Card:
def __init__(self, value, suit):
# ???
def __str__(self):
# ???
def getScore(self):
# ???
n = int(input())
cards = []
for i in range(n):
value, suit = input().split()
cards.append(Card(value, suit))
for i in range(n):
print(cards[i].getScore())
print("----------")
for i in range(n-1):
print(Card.sum(cards[i], cards[i+1]))
print("----------")
cards.sort()
for i in range(n):
print(cards[i])
144 10 : Class
รายละเอียดต่าง ๆ ของคลาส Card และเมท็อดของคลาส Card
• เมท็อด getScore จะคืนค่าคะแนนของไพ่เป็นจ�านวนเต็ม ตามก ดังนี้
o ไพ่ที่มีค่า A จะมีคะแนน 1 คะแนน
o ไพ่ที่มีค่า 2 ถึง 10 จะมีคะแนนเท่ากับค่าของไพ่ คือ 2 ถึง 10 คะแนน ตามล�าดับ
o ไพ่ที่มีค่า J, Q, K จะมีคะแนน 10 คะแนน
• เมท็อด sum จะคืนค่าผลรวมคะแนนของไพ่สองใบและ mod ด้วย 1 เช่น
o Card.sum(Card('7', 'club'), Card('2', 'heart')) ได้ผลลัพธ์เป็น 9
o Card.sum(Card('J', 'spade'), Card('5', 'diamond')) ได้ผลลัพธ์เป็น 5
• การเรียงล�าดับของไพ่เป็นดังนี้
o ค่าของไพ่เรียงตามล�าดับดังนี้ 3 < 4 < 5 < … < 10 < J < Q < K < A < 2
o ดอกของไพ่เรียงตามล�าดับดังนี้ club < diamond < heart < spade
o ถ้าไพ่สองใบมีค่าไม่เท่ากัน ไพ่ที่มีค่ามากกว่าจะเป็นไพ่ที่มากกว่า
o ถ้าไพ่สองใบมีค่าเท่ากัน ไพ่ที่มีดอกสูงกว่าจะเป็นไพ่ที่มากกว่า
► ข้อมูลน�าเข้า
บรรทัดแรกมีจ�านวนเต็ม n แทนจ�านวนไพ่ที่จะรับเข้ามา
n บรรทัดต่อมา แต่ละบรรทัดมีค่าและดอกของไพ่แต่ละใบ คั่นด้วยช่องว่าง
► ข้อมูลส่งออก
มี 3n+1 บรรทัด
n บรรทัดแรก แสดงคะแนนของไพ่แต่ละใบ ตามด้วยขีดคั่น 1 บรรทัด
n-1 บรรทัดถัดมา แสดงคะแนนรวมของไพ่ 2 ใบที่ติดกันในล�าดับ ตามด้วยขีดคั่น 1 บรรทัด
n บรรทัดสุดท้าย แสดงไพ่เรียงตามล�าดับ
► ตัวอย่าง
Input (จากแป้นพิมพ์) Output (ทางจอภาพ)
5 1
A spade 10
K heart 10
K club 7
7 diamond 2
2 spade ----------
1
0
7
9
----------
(7 diamond)
(K club)
(K heart)
(A spade)
(2 spade)
10 : Class 145
กระปุกออมสิน
จงเขียนคลาส piggybank เพื่อผลิตอ็อบเจกต์กระปุกออมสิน ที่สามารถหยอดเหรียญมูลค่าอะไรก็ได้ โดยจ�ากัดจ�านวน
เหรียญรวมทุกแบบในกระปุกแล้วห้ามเกิน 1 เหรียญ (ถ้าหยอดแล้วเกินไม่รับเพิ่ม) ตามโครงของคลาสและตัวอย่างการใช้งาน
ข้างล่างนี้
def __float__(self):
# น�ำค่ำของเหรีย คู กับจ�ำนวนเหรีย ของเหรีย ทกแบบ
# ต้องคืนจ�ำนวนแบบ float เท่ำนั้น อยำกคืน ูนย์ ก็ต้อง 0.0
def __str__(self):
# คืนสตริงที่แสดงจ�ำนวนเหรีย แต่ละแบบตำมตัวอย่ำง
# ดยให้เรียงเหรีย ตำมมูลค่ำจำกน้อยไปมำก
146 10 : Class
เมท็อด __float__ ถูกเรียกเมื่อ float(p) ท�างาน โดยที่ p เป็น piggybank ได้ผลลัพธ์เป็น float แทนค่าของ p
เมท็อด __str__ ถูกเรียกเมื่อ str(p) ท�างาน โดยที่ p เป็น piggybank ได้ผลลัพธ์เป็นสตริงแทนค่าของ p
► การส่งตรวจ
ให้น�าโปรแกรมข้างล่างนี้ ต่อท้าย class piggybank ที่เขียนข้างบนนี้ แล้วจึงส่งให้ rader ตรวจ
cmd1 = input().split(';')
cmd2 = input().split(';')
p1 = piggybank(); p2 = piggybank()
for c in cmd1: eval(c)
for c in cmd2: eval(c)
► ข้อมูลน�าเข้า
ค�าสั่งต่าง ๆ เพื่อการทดสอบคลาส
► ข้อมูลส่งออก
ผลการท�างานของโปรแกรมข้างบนที่อาศัยคลาส piggybank
► ตัวอย่าง
10 : Class 147
ดร
Intania 63
สุภชัย
สุตั วิบ ย์
ความส�าเร็จส่วนใหญ่มีความรู้ความสามารถในการใช้โปรแกรม
) มีความส�าคัญมากส�าหรับการออกแบบ
ystem on ips ซึ่งประกอบด้วยทรานซิสเตอร์หลายพันล้านตัว วิศวกรออกแบบ c ips ที่ประสบ
และสามารถเขียนโปรแกรมเสริมเพื่อให้
ตนเองท�างานออกแบบได้เร็วขึ้น การเขียนโปรแกรมให้ได้ดีจึงต้องเริ่มด้วยทักษะพื้น านด้าน Programming
แล้วเสริมด้วยองค์ความรู้เรื่อง lgorit ms และ ata tructures จึงจะท�าให้เขียนโปรแกรมที่มีประสิทธิภาพ เช่น
ท�างานได้เร็ว ใช้หน่วยความจ�าน้อย และใช้พลังงานต�่า เป็นต้น
11 : Solutions to Exercises
บทที่ ► ขอที
import math
x,y = [float(e) for e in input().split()]
► ขอที r = math.sqrt(x**2+y**2)
h = int(input()) theta = math.atan2(y,x)
m = int(input()) print(r,theta)
s = int(input())
total = 60*60*h + 60*m + s ► ขอที
print( total ) a,b,c,d,g = \
[float(e) for e in input().split()]
► ขอที avg = (a+b+c+d+g)/5
import math print(avg)
x = float(input())
y = 2 - x + 3/7*x**2 - 5/11*x**3 + \ ► ขอที
math.log(x,10) a,b,c = [e for e in input().split()]
print(y) c = int(c)
out = a + b + str(c) + (a + b) * c
► ขอที print(out)
a = float(input())
x = 1
x = (x + a/x)/2
x = (x + a/x)/2
x = (x + a/x)/2
บทที่
x = (x + a/x)/2
print(x) ► ขอที
# ex. 3 4 1 --> median is 3
a,b,c = [int(e) for e in input().split()]
► ขอที if b <= a <= c or c <= a <= b :
v1,v2,v3 = [float(e) \
print(a)
for e in input().split()]
elif a <= b <= c or c <= b <= a :
u1,u2,u3 = [float(e) \
print(b)
for e in input().split()]
else :
dotp = v1*u1 + v2*u2 + v3*u3
print(c)
print(dotp)
► ขอที ► ขอที
import math x1,y1,r1 = [float(e) \
x1,y1,x2,y2 = \ for e in input().split()]
[float(e) for e in input().split()] x2,y2,r2 = [float(e) \
d = math.sqrt((x1-x2)**2+(y1-y2)**2) for e in input().split()]
print(d)
d = (x1-x2)**2 + (y1-y2)**2
sumr2 = (r1+r2)**2
► ขอที
import math if d < sumr2 :
r,theta = [float(e) \ print('overlap')
for e in input().split()] elif d == sumr2 :
x = r*math.cos(theta) print('touch')
y = r*math.sin(theta)
else :
print(x, y)
print('free')
บทที่
else :
print('Quadrant IV')
► ขอที ► ขอที
a,b,c,d,e = [int(e) \ k = 1
for e in input().split()] while 1/k*k == 1 :
if a <= b <= c <= d <= e : k += 1
print('True') print(k)
else :
print('False') ► ขอที
k = 1
# print( a <= b <= c <= d <= e ) p = 1.0
while (1-p) < 0.5 :
► ขอที p *= (365-k)/365
a,b,c,d = [int(e) \ k += 1
for e in input().split()] print(k)
mx = a
if b > mx : mx = b ► ขอที
if c > mx : mx = c p = 0.0
if d > mx : mx = d for k in range(1,400000,4):
mn = a p += 1/k
if b < mn : mn = b p -= 1/(k+2)
if c < mn : mn = c print(4*p)
if d < mn : mn = d
s = (a+b+c+d) - mx - mn ► ขอที
print(s) a,b = [int(e) for e in input().split()]
s = 0
# s = (a+b+c+d)-max(a,b,c,d)-min(a,b,c,d) for i in range(a,b):
t = 0
► ขอที for j in range(i+1,b+1):
a = int(input()) t += (i+j)
x = int(round(a**(1/3),0)) s += (-1)**i * t
if x**3 == a : print(s)
print(x)
else : ► ขอที
print('Not Found') a,b = [int(e) for e in input().split()]
s = 0
for i in range(a,b):
for j in range(i+1,b+1):
s += (-1)**i * (i+j)
print(s)
บทที่ ► ขอที
b = input().strip()
► ขอที b = b[::-1]
s = input().strip() d = 0
t = '' for i in range(len(b)) :
for e in s: d += int(b[i])*2**i
t += e*2 print(d)
print(t)
► ขอที
s = input().strip()
t = ''
บทที่
s = ' ' + s + ' ' ► ขอที
for i in range(1,len(s)-1) : file1 = open( input().strip() )
t += s[i] s = ''
if s[i-1] != s[i] != s[i+1] : for line in file1 :
t += s[i] if line[-1] != '\n' : # กร บ ี รรทัดสดท้ำยไม่มี \n
print(t) line = line + '\n'
s = line + s # น�ำบรรทัดใหม่มำต่อทำงซ้ำย
► ขอที file1.close()
s = input().strip() print(s[:-1]) # ลบ \n ที่บรรทัดสดท้ำย
if s == s[::-1] :
print('Y')
else:
print('N')
► ขอที
d,n = [int(e) for e in input().split()]
t = "0"*n + str(d)
t = t[-max(n,len(str(d))):]
print(t)
► ขอที ► ขอที
c = sum( [1 for e in input().split() \
# สมมติว่ำมี
f มำแล้ว if int(e) < 0])
nofollowers = []
for [username,followers] in f :
if len(followers) == 0 : ► ขอที
nofollowers.append( username ) t = ''.join([e for e in input() \
print( 'No followers :', \ if 'a' <= e.lower() <= 'z'])
','.join(nofollowers) )
► ขอที
► ขอที x = [float(e) for e in input().split()]
n = int(input()) y = [float(e) for e in input().split()]
d = [] z = [x[i]+y[i] for i in range(len(x))]
for k in range(n)
s = input().strip() ► ขอที
d.append( [len(s),s] ) f = [e for row in m for e in row]
d.sort()
for [c,s] in d : ► ขอที
print(s) x = [int(e) for e in input().split()]
x.sort()
t = [x[i] for i in range(len(x)-1) \
if x[i] != x[i+1] ]
t.append(x[-1])
เขียนแบบนี้ก็ได้ (แต่ช้ำกว่ำเยอะ)
x = [int(e) for e in input().split()]
t = []
for e in x :
if e not in t :
t.append(e)
บทที่ ► ขอที
x = input().strip()
y = input().strip()
► ขอที set_x = set(x)
1) dict มี key คือ studentID, set_y = set(y)
print(set_x.intersection(set_y))
value คือ grade
2) set ของ studentID
3) dict มี key คือ dept,
value คือ set ของ studentID บทที่
4) list ของ phone
5) dict มี key คือ เลขท้าย TelNo, ► ขอที
def f1(a,b):
value คือ count
for i in range(b): print(a)
► ขอที ► ขอที
x = int(input())
def f2(a,b):
t = ()
return [a]*b
for i in range(0,x,2):
# ค�ำสั่งข้ำงล่ำงนี้ไม่ได้เปลี่ยน tuple ของ t แต่สร้ำง ► ขอที
# tuple ใหม่ แล้วแทนที่ t ตัวเก่ำ def g(m,b,n,c):
t += (i,) # เหมือน t = t + (i,) if m==n and b!=c: return 1
print(t) if m==n and b==c: return 2
หรือ x = (c-b)/(m-n)
t = tuple([e for e in range(0,x,2)]) y = m*x + b
return (x,y)
หรือ
t = tuple(range(0,x,2))
► ขอที
def h(x):
return [e for e in x if e%2==0]
► ขอที
def a(n):
if n==0: return 1
if n==1: return -2
return a(n-2)*n
บทที่
บทที่ ► ขอที
def __init__(self, name, year, faculty):
► ขอที self.name = name
k = int(input()) self.year = year
M[::k,::k] = 0 self.faculty = faculty
แบบนี้เร็ว
k = int(input())
N = np.zeros_like(M)
N[::k,::k] = 1
M += M*N
แบบนี้เร็วและสั้น
k = int(input())
M[::k,::k] *= 2
def get_total(self):
return sum([b.price*n for \
[b,n] in self.books])
เวบไ ต์ที่เปนประโยชน์
• youtu.be/U2l1xgpVsuo?list=PL0ROnaCzUGB4ieaQndKybT9xyoq2n9 (ภาพยนตร์บรรยายเนื้อหาวิชา)
• en. ikibooks.org iki Pyt on Programming (เว็บไซต์อ้างอิงส�าหรับการเขียนโปรแกรมภาษา Pyt on)
• .pyt on.org (เว็บไซต์ทางการของภาษา Pyt on)
• docs.python.org/3/tutorial/index.html, docs.python.org/3/library/index.html,
docs.python.org/3 reference index. tml (เว็บไซต์ทางการของภาษา Pyt on ส่วนเอกสารอ้างอิง)
• .numpy.org (เว็บไซต์ทางการของคลังค�าสั่ง umPy)
• .lfd.uci.edu go lke pyt onlibs (เว็บไซต์สา� หรับดาวน์โหลดคลังค�าสั่งภาษา Pyt on)
• .pyt ontutor.com (เว็บไซต์ส�าหรับการ visuali e โปรแกรมภาษา Pyt on)
• repl.it/languages/python3 (เว็บไซต์ส�าหรับเขียนโปรแกรมภาษา Pyt on ออนไลน์ สามารถใช้ umPy ได้)
• openbookproject.net/thinkcs/python/english3e (เว็บไซต์อ้างอิงส�าหรับการเขียนโปรแกรมภาษา Pyt on)
ImportError: No module พิมพ์ชื่อ module ที่ต้องการ import แก้ไขชื่อ module ที่ต้องการ import
named 'maht' ผิด เช่น import maht ให้ถูกต้อง
AttributeError: module module ที่เรียก ไม่มี ังก์ชันที่ แก้ไขชื่อ ังก์ชันให้ถูกต้อง
'math' has no attribute ต้องการ เช่น เช่นในที่นี้ต้องใช้ math.asin(0)
'arcsin' print(math.arcsin(0))
158 Appendix
ขอความ าเ ต แนวทางการแก ข
'int' object is not มีการใช้ค�าสั่ง in กับสิ่งที่ไล่ล�าดับ ใช้ in กับสิ่งที่ไล่ล�าดับได้ เช่น range,
iterable ไม่ได้ (int หรือ float) เช่น string, list, tuple, set, dict
for i in 5:
index out of range มีการเรียก index เกินจากที่มี เช่น ตรวจสอบว่า index ที่ต้องการเรียก
x = 'cat'; print(x[100]) ไม่เกินความยาวที่มี
y = [1,2,3]; print(y[100])
indices must be integers มีการเรียก index ของสตริงหรือลิสต์ ตรวจสอบว่า index ที่เรียก เป็น
ด้วยค่าที่ไม่เป็นจ�านวนเต็ม เช่น จ�านวนเต็มหรือไม่ และแก้ไขให้ถูกต้อง
x = 'cat'; print(x[2/1])
y = [1,2,3]; print(y['a'])
TypeError: unhashable type มีการใช้ list, set, dict เป็น key ตรวจสอบประเภทข้อมูลที่น�ามาใช้
ของ dict หรือเก็บ list, set, ว่าไม่ใช่ list, set, dict
dict ใน set เช่น
d = {}; d[{1}] = 'cat'
Appendix 159
ุภเส
Intania 86
์ ชชัย รี
Intania 95
ั ชยา ี ะ ุภกุ
ตลาดหลักทรัพย์แห่งประเทศไทย
len(a): คืนค่าเป็นจ�านวนข้อมูลใน a ซึง่ a อาจเป็นลิสต์ ดิกชันนารี เซต s.split(sep): คืนลิสต์ของสตริงทีแ ่ ยกด้วย sep (หรือ space ถ้าไม่ระบุ)
ทูเปล สตริง หรือ numpy array ก็ได้ s.strip(): คืนสตริงใหม่ทม ี่ คี า่ เหมือน s แต่ตดั spaces หัวท้ายออก
max(a), min(a): คืนค่าทีม ่ าก น้อยทีส่ ดุ ของข้อมูลใน a ซึง่ a อาจเป็น s.join(L): คืนสตริงทีส ่ ร้างจากการน�าแต่ละ element ในลิสต์ L มาต่อกัน
ลิสต์ ดิกชันนารี เซต ทูเปล หรือสตริงก็ได้ โดยมี s เป็นตัวคัน่ ระหว่างข้อมูลทีต่ อ่ กัน (L ต้องเป็นลิสต์ของสตริง)
(numpy array ใช้ np.max(a), np.min(a)) import numpy as np
ถ้า a เป็นดิกชันนารี จะคืนค่ามาก น้อยทีส่ ดุ ของ key ของดิกชันนารี np.array(L): คืนค่า numpy array ทีส่ ร้างจากลิสต์ L
type(a): คืนค่าประเภทของ a เช่น type([1,2]) ได้ <class 'list'>
np.arange(start,stop,step): คืนอาเรย์ 1 มิตขิ องจ�านวนทีม่ คี า่ ตาม
list(), dict(), tuple(), set():
start,stop,step
สร้างลิสต์วา่ ง ดิกชันนารีวา่ ง ทูเปลว่าง เซตว่าง np.ones(shape): คืนอาเรย์ทมี่ คี า่ 1 ทัง้ หมด มีขนาดตาม tuple shape
list L np.zeros(shape): คืนอาเรย์ทมี่ คี า่ 0 ทัง้ หมด มีขนาดตาม tuple shape
np.identity(size): คืนอาเรย์ขนาด size x size ซึง่ มีขอ ้ มูลในแนว
L.append(e): เพิม่ e ไปทีท่ า้ ยลิสต์ L เส้นทแยงมุมเป็น 1 และค่าในต�าแหน่งอืน่ ๆ เป็น 0
L.insert(index,e): เพิม่ e ไปทีต่ า� แหน่ง index ในลิสต์ L np.empty_like(a): คืนอาเรย์ใหม่ทม ี่ ขี นาดเหมือน a แต่ไม่มกี ารก�าหนด
L.pop(index): ลบข้อมูลทีต ่ า� แหน่ง index และคืนค่าข้อมูลทีถ่ กู ลบ ค่าข้อมูลในอาเรย์ใหม่นี้
L.count(e): คืนจ�านวนครัง้ ที่ e ปรากฏในลิสต์ L
np.add(a,b), np.subtract(a,b), np.multiply(a,b), np.divide(a,b):
dict D คืนค่าอาเรย์ใหม่ทเี่ ป็นผลบวกลบคูณหารแบบช่องต่อช่องของ a และ b
D.items(): คืนลิสต์ของ tuple (key, value) ของดิกชันนารี D np.dot(a,b): คืนอาเรย์ทเี่ ป็นผลคูณแบบเมทริกซ์ของ a และ b
D.keys(): คืนลิสต์ของ key ทัง้ หมดของดิกชันนารี D np.sin(a), np.cos(a), np.sqrt(a), np.abs(a):