You are on page 1of 170

Python ๑๐๑

ภาควิชาวิศวกรรมคอมพิวเตอร์ คณะวิศวกรรมศาสตร์
สิงหาคม ๒๕๖๑
v1.0.2

ผู้อ่านสามารถดาวน์โหลดหนังสือรุ่นล่าสุด
และร่วมแสดงความคิดเห็น/ข้อแนะน�าเกี่ยวกับหนังสือเล่มนี้ที่
www.cp.eng.chula.ac.th/books/python101
ขอบคุณครับ
กิตติภณ พ ะการ กิตติภพ พ ะการ สมชา ระสิ ิ ตระก สกร สิ ภิ
Python ๑ ๑ กิตติภณ พ ะการ กิตติภพ พ ะการ สมชา ระสิ ิ ตระก สกร สิ ภิ
การเ ร กรม คอมพิวเตอร์
พ อ คอมพิวเตอร์

005.133

พิมพ์ครง า ว เ ม พศ
พิมพ์ครง า ว เ ม พศ

สงว ิ สิ ิตาม พ ร ิ สิ ิ พ ศ
การ ิต ะการ อกเ ห งสอเ ม มวาร งสิ
ตอง ร อ าตเ า ก ณ์อก ร ากเ า อง ิ สิ ิ

พิมพ์
ภาควิชาวิศวกรรมคอมพิวเตอร์
คณะวิศวกรรมศาสตร์ า งกรณ์มหาวิ า
พ า กรงเ พ

เ าชมห งสอเ มอ องภาควิชา

ออก ก กม พรรณ ิว ระเสริ


ออก ร เ ม ภา กร ส รเวชพง ์

พิมพ์ รงพิมพ์ หง า งกรณ์มหาวิ า รศพ ์ รสาร


ค�ำน�ำ
วิชา ๒๑๑ ๑ ๑ การเ ร กรมคอมพิวเตอร์ เ ห ง วิชาพ า างวิศวกรรมศาสตร์ ิสิตช ๑
คณะวิศวกรรมศาสตร์ กค ตอง ง ะเ เร วต ระสงค์ห ก องวิชา คอ ห ิสิตเ า ห กการ การ ชคาสงตาง
องภา า ร กรม เพอเ ร กรมคอมพิวเตอร์ หตรงตาม อกาห ร การเ ร กรมเ ความสามาร ตอง
งมอ ก ก ิ ติ ว ต เอง เหมอ ก ก ะอ างวิศวกรรม าเ ตอง ก หชา า ง ะ มสามาร มา
ว การอา า

ห งสอ Python ๑ ๑ เ ม ก า เพอ ห ิสิต ช ว เ อหาห งชมภาพ ตร์ รร า เ อหา ว ต เอง


ต ะ ชเตร มตวกอ เ าเร ะ ชระหวางการเ ร กรม ริง หอง ิ ติการ เ กิ กรรม ระ า กส าห์
มระ ชว ตรว สอ ความ กตอง อง การ างา อง ร กรมอ างอต มติ ิสิต ะ กเ ร กรมตาม
์ กหา ิ ะ กตรว สอ ความ กตอง อง ร กรม พ า อก าก งม ก ิ ติเพิมเติมอกมากมา
ระ ห ิสิต าเสริมอก ว

เ ตอง อ อ คณ ศ ร ิภา ์ ร รงระ ตรว ร กรมอต มติ เพอ ช ระกอ


การเร การสอ ะการสอ วิชาการเ ร กรมมาตง ต การศก า ๒๕๕ อ อ คณ ค ากร องศ ์คอมพิวเตอร์
คณะวิศวกรรมศาสตร์ ห ริการ เตร มความพรอม องอ กรณ์ ะเครอ า หอง ิ ติการ อ อ คณคณา าร ์ ะ
ิสิตชว สอ รวมก สราง ์ หา สอ ะ ร รงวิชา ๒๑๑ ๑ ๑ ต อ มา อ อ คณ ภา กร ส รเวชพง ์ ะ
อติคณ ออ อศร ์ ชว ร เ ม ะ กม พรรณ วิ ระเสริ ชว ออก ห า ก อ อ คณภาควิชาวิศวกรรมคอมพิวเตอร์
หการส ส สารพ เรอง ะ า ส ตอง อ คณ ส กคอ สิ ติ คณะวิศว กวาห า พ ค หม ศก า ะ า
อ สรรค การเร วิชาพ า งค คอ าง มค เค สาเร

กิตติภณ พ ะการ
กิตติภพ พ ะการ
สมชา ระสิ ิ ตระก
เร เร ง ะรว รวมเ อหา
สกร สิ ภิ รก า

ภาควิชาวิศวกรรมคอมพิวเตอร์
คณะวิศวกรรมศาสตร์
า งกรณ์มหาวิ า
๑๒ สิงหาคม ๒๕๖

ภาควิชาวิศวกรรมคอมพิวเตอร์ อ อ คณ ริ เอก อ ม ิ าก หการส ส คา ช า สาหร การ พิมพ์ หก


ิสิต กค ง ะเ เร วิชา ๒๑๑ ๑ ๑ ช ระกอ การเร การศก า ๒๕๖ ะ ๒๕๖๑
อ อ คณ

คณา าร ์คณะวิศวกรรมศาสตร์ า งกรณ์มหาวิ า

ศ ร ช เช ์ สา วิ ิตร
ศ ร พศา กิตติศภกร
รศ ร อาณติ เรองรศม
รศ ร พิส ิ เพ รม ก
อ ร กรวิก ต ก รา ์
อ ร พรรณ สง กว
รศ ร ณ ชา ว สงสก
อ ร เช า พ ์เครอ ตร
อ ร สร ว เมอง
ศ ร อ รก ์ ศรอริ ว ์
ศ ร ิรว ์ ชวรง ร ์
ศ ร ณ ว ิห พร ์

ศิ ์เกาภาควิชาวิศวกรรมคอมพิวเตอร์
คณะวิศวกรรมศาสตร์ า งกรณ์มหาวิ า

คณว รรส ร ะ
คณ าว ์ มา า า
คณ ิสา ตรง ระกอ
คณภ ราว อสต าศิ
คณวิ ร ์ ิรพ ก
คณสภช สตณ วิ ์
คณศภเส ์ ชช ศร
คณณ ช า ะศภก

กรณา หความร งความสาค องการเ ร กรมก งา างวิศวกรรม สา าตาง

อ อ คณภาพ ระกอ าก

ภาพง
ภาพ า ห งง
ภาพพ ห งห า ก
ส ก ณ์
ภาพ ระกอ คาอ ิ า เ อหา
สำรบัญ
1
5
15

55

121
133
00 : Programming in Engineering



าสตร์ องวิ ศ วกรรม าเ ศาสตร์ ครอ ค มความห ากห า มการ
เ ง ะมความพ วตอ างมาก
เสมอ ริงอา มต สง หรอ เ
ห า อกาส การสราง
ม เ ชวงเริมต อง ครงการ
ตาง ความสามาร การ ช ก ะการ Programming เพอวต ระสงค์ตาง เช
การสราง า อง ว คอมพิวเตอร์เพอการออก การศก าความเ
การ ชงา การ สอ สมรร ะ หรอ มกระ งการ า องเพอหาเหตการณ์
เกิ ความคา หมา องวิศวกร งเ สิง าเ อ างมากสาหร วิศวกร า กสา า
ะอ าคต

P rogramming เ เครองมอ ชว การหาคาตอ เพออ ิ า ราก การณ์


หรอพ ติกรรมพ วต องห ว ิ ติการหรอกระ ว การตาง อก าก
ง ช ระมาณคาตว รหรอพารามิเตอร์ ะพ า สการ า า ราก การณ์หรอ
พ ติกรรมพ วต องห ว ิ ติการหรอกระ ว การตอ

างวิศวกรรม า โ รแกรมม ชก อ างมากเพอ ช า องพ ติกรรม อง


ครงสรางเช อาคาร สะพา า ราก ภา ตการร รง ง ะ า ห รา
รง เกิ ก ครงสรางเพอ วิศวกร า ะ าการออก ครงสราง ห อ ภ
ะ ระห ะ การกอสรางกตอง ชโ รแกรมเพอการวาง ะ การ
การกอสราง อก าก กมการ ชโ รแกรม การ า องระ สงเพอการออก
หรอวิเคราะห์ระ คม าคม ตาง

00 : Programming in Engineering 1
ก ารเร วิศวกรรมสิง ว อม อ ครง เราตองคา วณ ะสร วิเคราะห์
คาพารามิเตอร์ างสิง ว อม งคา วณ มงา ะก ม อ ง า ตองเร
ภาคคอม การ ิสิต เร Programming เ องต ะสามาร ชว ห ิสิตสามาร
ตอ อ ความร สงา วิศวกรรมสิง ว อม กอ าคต อ างงา า

ก ารเขียนโ รแกรมมความสาค ก งา ก า องวิศวกรรมสารว


อ าง ิงงา า
วิเคราะห์ ะ ส ง อม
ตองการการเขียนโ รแกรม การ การ ระมว
เ พาะ อม า ห อ ต์ วร์ พ า
เ พาะ

ว เช มสามาร รองร อก าก งมความสาค ตอการ


พ า อ ต์ วร์ า เ พาะระ เว ตองอาศ การพ า ว
การเขียนโ รแกรม ะการเขียนโ รแกรมสาค มาก ส ก การศก า ระ สง
เ อง าก ะตองพ า อ ต์ วร์ หม มา หมเอง

P rogramming มความสาค ตอการเร สา าวิชาวิศวกรรม ิวเค ร์คอ างมาก


การ ระมว การตรว ว รงส เ า ว รงส า ว อม การ รงส
ม า ว มากตอการว เครองตรว รงสตอง ชโ รแกรมคอม ิวเ อร์ การรว รวม
ะ ระมว อม มาสรางเ สเ กตรม อม สาหร การ ระมว ากภาพ
การ า รงส ภาพคอ ราส าว า การ า ภาพรงส ะ า ะมสเต การ า
หม รอ วต เร กวา เมอรว รวม อง ต ะสเต มารวมก ะ
ภาพต วาง องวต หรอ ามการว วตง ว า ห ภาพส า เ ภาพ ง ะ
เ มเ มรา ะเอ ภา ว เ ค ิค า ห อม ภา องวต หรอ ม ต
ภา องรางกา ม ์ ะ งออก โ รแกรม การคว คมอ กรณ์การตรว ว รงส ห างา อ างอต มติ ะ
คว คม ากระ ะ ก า ห ชร ริมาณรงส อ ง สาหร ระ การคว คมการ างา งหม อง รง า วิ เค ร์
า โ รแกรมคอม ิวเ อร์ งหม

2 00 : Programming in Engineering
า องวิศวกรรมอตสาหการ คอ การออก าเ ิ การ ร รง ะ
สรางสรรค์ วตกรรมระ งการ ิต ริการ ะ รกิ
ก ะ Programming ชว หมตรรกะการคิ อ างมเหต อก ง งเ
เครองมอ การวิเคราะห์ ะ ระมว อ างรว เรว ะ ม าตามตว ร ะ
อ าก ริ ห ง งมความ อ มาก อ าคต

วิ
าการ าง า วิศวกรรม หการ ะวส เ ความร เก ว องก ห กการพ า
องวส ตาง กระ ว การ รร ะ ร หะ สม ติ องวส ะการเ อก
ะออก วส เหมาะสมก งา ห ากห า ง เพอ หสามาร พ าวส หม
หมสม ติตาง o pute og a ng งเ ามาม า สาค การ
สราง า องตาง เพอเชอม งความสมพ ์ระหวาง กระ ว การ ิต ครงสราง
องวส สม ติ องวส ความสามาร การ ชงา มการ า o pute
Programming เ ามา ชอ าง พรห า มาก อา ิเช การ า า ครงสราง
ภาค องวส ภา ห งการ ร ว กรรมวิ ตาง เช
สามาร า ห ร รง หวส มความ ง รง สง หรอมการ
ามา ชเพอ า า การพงเส หา องวส ากการเกิ ะ าห
สามาร วาง การ อม ารง อ างเหมาะสมมาก อก าก งมการ า เ ามา ชเพอหา
สว สม องวส หม ง มเค มการค พ อก ว

P rogramming เ เครองมอ ช การสราง คา วณ ะวิเคราะห์ อง

อก าก
า อง างวิศวกรรม องระ างก ความรอ อง ง ะ อง ห
า อง ว ง ช การคว คมระ างก ตาง เช ระ
อต มติห ต์ เ ต

00 : Programming in Engineering 3
ง า าง า วิ ศ วกรรม ห ง ามความ าเ ะต อง งเก วก อม
า ว มาก ง อม า อม า า อม สภาพพ อม ความตองการการ ช า
Programming งเ เครองมอสาค การชว การ วิเคราะห์ ะ ระมว
อม ตาง อ างม ระสิ ิภาพ

ก าร ช า อง ห งกกเก ตรเ มเ สิง าเ


เพอ าความเ า ก พ ติกรรมการ ิต อ ต ะ
งา วิศวกรรม ตรเ ม

การ ิต อ าคตอก ว อก าก ริมาณ อม การ ิต ก เก อ างตอเ อง


ะ งช า า

าเ ตองมการ ริหาร การ เพอ หวิศวกรสามาร า ช ระ ช ์ ห ากห า


ร ความสาค องการเ า ะสามาร เขียนโ รแกรมเพอ ชงา เ การเ พาะ
เ สิง าเ สาหร วิศวกร ตรเ ม
สาหร งา วิศวกรรมเหมอง รมการ า 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

01 : Data Type, Variable and Expression 5


คาสงการ ส ง อม าง อภาพ
• print(a,b,c) น�าค่าในตัวแปร a b และ c มาแสดงต่อกันคัน่ ด้วยช่องว่างบนบรรทัดเดียวกัน
• print(str(a)+str(b)+str(c)) น�าค่าในตัวแปร a b และ c มาเปลีย่ นเป็นสตริงต่อกัน แล้วแสดงบนบรรทัดเดียวกัน

คาสงการอา อม าก พิมพ์
• 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

10e7 มคา มเ าก 107 10e7 มคาเ าก 10×107 อ าก 107 ตองเ 1e7

1e3 ม ช า ว เตม 1000 1e3 มคาเ าก 1000.0 ง 2345 % 1e2 45.0

6 01 : Data Type, Variable and Expression


สาหร เค เร ภา า ++k คอการติ วกคา k สองครง งมคาเ าก k คา k มเ
อ าเ อเ คาสง ++k หรอ --k --k คอการติ คา k สองครง งมคาเ าก k คา k มเ
ม import math เมอ ช งก์ช อง y = (-b+math.sqrt(b*b-4*a*c)) / (2*a)
math ะ องวา มร ก math
สวงเ เ ก มคร import math
y = 2+(x*abs(y-z/2) วงเล็บปิดมีน้อยไป
y = -b+math.sqrt(b*b-4*a*c)) / (2*a) ขาดวงเล็บเปิด
สะก ชอตว ร ิ หรอ ิ เรองการ ช count = 0
ตวองก เ กก ห Count = count + 1 Count กับ count เป็นคนละตัว
ตงชอตว ร าก ชอ งก์ช มาตร า int = 27
ตว ร กตองมส า เ สอ ะ print( int ) ได้ 27
สราง หา ตห ง าก ชคาสง a = int(input())
เพออา อม าก พิมพ์ ว งเ า ว เตม ม ว
ส ง int ว สมวง
า อม ม ชสตริงมา วกก สตริง import math
a = math.pi * r**2
print('area = '+a) ผิด
print('area = '+str(a)) แปลง a เป็นสตริงก่อน
print('area =',a) แบบนี้ print แปลง a เป็นสตริงให้

แบบฝึกหัด
Problem Code
ร า ว เตม า ว าก พิมพ์
รร ะ า ว เก ตว ร h m ะs ง า ว
ชว มง า ะ วิ า
คา วณ า ว วิ า รวม คิ าก h m ะs
า ว วิ า รวม งหม คา วณ

ร า ว ริง า ว าก พิมพ์ เก x
คา วณ
คา y คา วณ

01 : Data Type, Variable and Expression 7


Problem Code
ร า ว ริง า ว าก พิมพ์ เก a
ห x มคาเ าก าคาสง
x = (x + a/x)/2 า ว ครง
คา x ากการ างา าง

ม รร ต ะ รร ม า ว ริง า ว ค ว
ชองวาง อา รร รกเก v1 v2 v3 เวกเตอร์
อา รร สองเก ส u1 u2 u3
เวกเตอร์
คา วณ องเวกเตอร์ v ก
คา คา วณ

อา า ว ริง า ว ค ว ชองวาง าก พิมพ์


เก x1 y1 x2 ะ y2 คา อง x1 y1 พิก อง
ะ x2 y2 พิก อง ระ า
คา วณระ ะหางส ส ระหวาง งสอง
ระ ะหาง หา

อา พิก เชิง ว อง ระ า งเ า ว ริง


า ว ค ว ชองวาง เก ตว ร r ะ theta
เ เรเ
คา วณคา x ะ y งเ พิก คาร์ เ
อง (r, theta) อา เ ามา
คา x ะ y ค ว ชองวาง

อา พิก คาร์ เ อง ระ า งเ า ว ริง


า ว ค ว ชองวาง เก ตว ร x ะ y
คา วณคา r ะ theta เ เรเ งเ
พิก เชิง ว อง (x, y)
คา r ะ theta ค ว ชองวาง

8 01 : Data Type, Variable and Expression


Problem Code
อา า ว ริง า ว ค ว ชองวาง
คา วณคาเ อง า ว งหา
คาเ หา


ร อม ตว a b ก c ค ว ชองวาง
a ะ b เ ตวอก ร สว c เ า ว เตม
ตวอก ร a ตอก ตวอก ร b ตอก
คา อง า ว เตม c ตอก ช องตวอก ร a ตอก ตวอก ร
b า ก เ า ว cช
เช ช อ v o 5 ะ ส ง vo5vovovovovo

ตัวอย่างการแก้โจทย์ปัญหา

Triangle
งเ ร กรมคา วณพ สามเห ม รา ความ าว า สอง า ก ะมมระหวาง า สอง า ากสตร

► อม าเ า
รร รกคอความ าว า ห ว เ เ ติเมตร
รร สองคอความ าว า ห ว เ เ ติเมตร
รร สามคอมมระหวาง า งสอง ห ว เ องศา
► อม สงออก
พ องสามเห ม ร เ อม าเ า ห ว เ ตารางเ ติเมตร ส ง ร ส งตามตวอ าง า าง
► ตวอ าง

nput ากแ น ิม ์ utput ทาง อ า


10.0 area = 50.0 (sq cm)
10
90.0

1e1 area = 77.162458338772 (sq cm)


2e1
50.5

01 : Data Type, Variable and Expression 9


ัวอย่างการเขียนโ รแกรม
โ รแกรม ค�าอ ิบาย
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() ม สวงเ เ เ 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)

10 01 : Data Type, Variable and Expression


โ รแกรม ค�าอ ิบาย
import math สง ส อม ตามตวอ าง รก
a = float(input()) 10
b = float(input())
C = float(input()) 10
area = 1/2*a*b*math.sin(C) 90
print(area)
44.699833180027895
มตรงก ส ง ตอง พ 50.0 ิ ก า ะ ิ การคา วณ
องคา วณเอง
1/2*10*10*math.sin(90) = 1/2*10*10*1
ก า ะ 50.0 ว า ม ม ช ม ก เค ง ว ตว าสงส ส ก า ะ
เ math.sin(90) เมอเร ก ช งก์ช เราตองเ า ก เกณ ์ อง
การเร ก ช ว องค เ ต ะพ อความวา
math.sin(x)
Return the sine of x radians.
สามาร ช งก์ช ส งวา ตอง งองศาเ เรเ กอ สง ห math.sin กตอง
math.radians(d) งร d คิ วิ ง องศา เ าก C องศากเ าก C* /180
เ องศา เ เรเ ว ะ ชคา เ า ร ะ ช C*(22/7)/180 หรอ
C*3.14159/180 ต า ะรวา ควร ช math.pi เพราะระ เก คา
ะเอ มาก ว ง ช CR = C*math.pi/180 เ เ
เรเ กอ วคอ ช
import math สง ส อม ตามตวอ าง รก 50.0 กตอง อกครง
a = float(input()) ส อม องอกตวอ าง
b = float(input())
C = float(input()) 1e1
CR = C*math.pi/180 2e1
area = 1/2*a*b*math.sin(CR) 50.5
print(area)
77.162458338772 ก กตอง
เา ตรว หคะ ท�าไม ????
คา วณพ กตอง ต ส ง มเหมอ ก ์ อก ตวอ าง
area = 50.0 (sq cm)
ต ร กรม ส ง คพ ก รร ส า หตรงตามตวอ าง
import math สง ส อม ตามตวอ าง รก
a = float(input()) area = 50.0 (sq cm.)
b = float(input())
C = float(input()) ม วา ก เา ตตรว ว ท�าไม ????
CR = C*math.pi/180 เ หม วาเหมอ ์ตองการ หม
area = 1/2*a*b*math.sin(CR) area = 50.0 (sq cm)
print("area =",area, "(sq cm.)")
พ วาม เกิ มาห งตว ก ิง
import math สง ส อม ตามตวอ าง รก
a = float(input()) area = 50.0 (sq cm)
b = float(input())
C = float(input()) ม วา ก ชวร์ เา ตรว เตม
CR = C*math.pi/180
area = 1/2*a*b*math.sin(CR)
print("area =",area, "(sq cm)")

01 : Data Type, Variable and Expression 11


ตัวอย่างโจทย์ปัญหา

แปลงอุณหภูมิ
สตร การเ คา ากองศาเ เ ส เ องศา าเร ต์ ะเค วิ ม ง

หอา อม อณหภมิ ห ว เ องศาเ เ ส าก คา วณหาคาองศา าเร ต์ ะเค วิ ว สมการ า


เมอ คอ องศาเ เ ส คอ องศา าเร ต์ ะ คอ เค วิ
► อม าเ า
ห ง รร ระกอ ว คาองศาเ เ สเ า ว ริง
► อม สงออก
มห ง รร ระกอ ว ตวเ า ว ริงสอง า ว ตว รกเ องศา าเร ต์ ะตว สองเ เค วิ
► ตวอ าง
nput ากแ น ิม ์ utput ทาง อ า
39.85 103.73 313.0

12 01 : Data Type, Variable and Expression


Triangle 2
งเ ร กรมคา วณหาความ าว อง า สาม องสามเห ม เมอเรา รา ความ าว า สอง า ก
ะมมระหวาง า สอง า งคา วณ าก

► อม าเ า
รร รกคอความ าว า ห ว เ เ ติเมตร
รร สองคอความ าว า ห ว เ เ ติเมตร
รร สามคอมมระหวาง า งสอง ห ว เ องศา
► อม สงออก
ความ าว า สาม องสามเห ม ร เ อม าเ า ห ว เ เ ติเมตร ส ง ร ส งตามตวอ าง า าง
► ตวอ าง
nput ากแ น ิม ์ utput ทาง อ า
3 c = 5.0 cm.
4
90

7.0 c = 25.0 cm.


24.0
90.0

10 c = 9.999999999999998 cm.
10
60

3 c = 2.9999999999999996 cm.
3
60

ตอ การ างา อง ร กรม


ร อม าก พิมพ์ เ เ า ว ริง วเก ตว ร a
ร อม าก พิมพ์ เ เ า ว ริง วเก ตว ร b
ร อม าก พิมพ์ เ เ า ว ริง วเก ตว ร D
า D มห ว เ องศา งเ เรเ เก ตว ร C
คา วณความ าว อง า สาม ว สตร
ส งความ าว า คา วณ าง อภาพ ร ส งตามตวอ าง

01 : Data Type, Variable and Expression 13


ISBN
เ ตวเ า ว ห ก ชระ ห งสอ ต ะเ ม ์อ
ส เ พาะ ม ห ก การตรว สอ ความ กตอง อง ะ ชตวเ ห กส า เ การตรว สอ
ความ กตอง องตวเ อ วิ ชตรว สอ คอ
6
ะตองหาร ว งตว
ตวอ างเช หากตวเ ห ก รกคอ ะ วา
ตองหาร ว งตว
ะ วา ตองมคาเ าก เพอ ห รวมเ งหาร ว งตว ะ คอ
หากกาห ตวเ ห ก มา ห งคา วณหา งสิ ห ก
► อม าเ า
ม รร เ ว ระ หก
► อม สงออก
ม รร เ ว ส ง งสิ ห ก ร ระก วากรณ สอ ะ มมกรณ เ าก
► ตวอ าง
nput ากแ น ิม ์ utput ทาง อ า
020131452 0201314525

100000000 1000000001

14 01 : Data Type, Variable and Expression


02 : Selection ( if-elif-else )

สรุปเนื้อหา
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

ตัวอย่างเงื่อน ท่เ ยนแทนกัน ด้


not(x == 0) x != 0

not(x==2 or x==4) x!=2 and x!=4

not(x<2 and y>=4) x>=2 or y<4

3<=x and x<9 3 <= x < 9

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 s > a + b % 7 : t = True if s > a+b%7 else False


t = True
หรอเ ส
else :
t = (s > a + b % 7)
t = False

การเปรยบเทยบท่ ้บ่อย
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 :

ช and ก or ิ ความหมา if x != 2 or x != 3 : แบบนี้ได้จริงตลอด


า ห คา ริงหรอเ ต อ if x <= 3 and x == 4 : แบบนี้ได้เท็จตลอด
เ องคาสงภา if หรอ else มตรงก if x > 0 :
a = math.sqrt(x)
print(a) ทกบรรทัดใน if เยื้องบรรทัดไม่ตรงกัน ผิด
ช สมก การเ องคาสง สมก กอา วาเ องตรงก ติ การเรอง
ก ห งม ิ ต าช ะิ

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

เรื่องท่ปรับปรุง ด้

คาสง เหมอ ก ง ก มห ง if ะ if d > 0 : a = 9


ก มห ง else อา กออกมา าง อกก a = 9 if d > 0:
c += d - 5 c += d - 5
e = c else:
else: c -= d + 7
a = 9 e = c
c -= d + 7
e = c

การ ช if-elif-else ตรว คาวาตกอ if s >= 80 : if s >= 80 :


ชวง สามาร การเ ร เ ง า g = 'A' g = 'A'
elif 70 <= s < 80 : elif s >= 70 :
า การเ ร เ หเหมาะสม g = 'B' g = 'B'
elif 60 <= s < 70 : elif s >= 60 :
g = 'C' g = 'C'
elif 50 <= s < 60 : elif s >= 50 :
g = 'D' g = 'D'
else : else :
g = 'F' g = 'F'

18 02 : Selection ( if-elif-else )
แบบฝึกหัด

Problem Code
ร า ว เตม า ว ค ว ชองวาง
หาม า อง า ว ง
ม า หา

ร อม องวงก ม วง รร ะห งวง
ระกอ ว า ว ริง า ว ค ว ชองวาง
พิก x ก y อง ศ ์ก าง ะรศม องวงก ม
ตรว วาวงก มสองวง ร มา ก หรอ ตะก
หรอ ม
ส งคาวา touch เมอ อ อง งสองวง ตะก
พอ ส งคาวา overlap เมอสองวง ก า ม ตะ
หรอ ห ส งคาวา free

ร า ว ริง า ว ค ว ชองวาง พิก


(x, y) ระ า สองมิติ
ตรว วาพิก (x, y) อ ริเวณ ระ า
ตา ห ง องพิก (x, y) วา อ ตภาค
หรออ ก x หรอ y หรออ กาเ ิ

ร า ว เตม า ว ค ว ชองวาง
ตรว วา า าก า วา อง า ว ร มา
เร ง าก อ มากหรอ ม
การตรว วา True หรอ False

02 : Selection ( if-elif-else ) 19
Problem Code
ร า ว เตม า ว ค ว ชองวาง
หา รวม อง า ว ร มา มรวม า ว
มากส ห ง า ว ะ า ว อ ส ห ง า ว
รวม หา

ร า ว เตมห ง า ว เก ตว ร a
ตรว วาม า ว เตม x คา x เ าก a หรอ ม
3

าม ส งคา อง x า มม ส ง Not Found

ร า ว เตม รอ อก ห ว เ ิว
หา า องเสอ ตามรอ อก ง
อ กวา ิว า 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

99999 99 999 99950 99999 10125

19999 13 001 09015 13000 1275

ัวอย่างการเขียนโ รแกรม
โ รแกรม ค�าอ ิบาย
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)

p1,p2,p3,n1,n2 = \ การตรว เ า ตวกค า ก เ า ตว สามาร


[int(e) for e in input().split()] า ก ณะเ วก ร กรม าง วาเพิมการตรว
s = 0
if n1 <= p1 <= n2 : เงิ รางว งรางว เ า ะ ตว คราว ก
s += 10000 สง สอ การ างา ว ตวอ าง ์ หมา
สง ส 01234 11 811 01000 01250
if n1%100 <= p2 :
10075 กตอง
s += 25
if p2 <= n2%100 : สง ส 99999 99 999 99950 99999
s += 25 10125 กตอง
s += 25*(n2//100 - n1//100 - 1)
สง ส 19999 13 001 09015 13000
if n1%1000 <= p3 : 1275 กตอง
s += 100
if p3 <= n2%1000 :
s += 100
s += 100*(n2//1000 - n1//1000 - 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

CEO & Co-Founder


Dek-D Interactive co., ltd.

P rogramming าเ มาก การเริมกิ การ า เพราะกิ การสว ห สามาร อ รอ

ค ม ง อเ ะ ก ะ งมอเ ร กรมเอง าก
อก าก Programming งเ การ กวิ คิ ก หาอ างเ
กอตง งเ
เ า ติ ภณ ์ ะสรางมาก ส ตองมสว รวม การพ าระ เอง ง ะสามาร า อ ความคิ ะ
ก ติ ภณ ์ ออกมา เร กวามเงิ มาก ค ห าตอง าง หค อ มาเ ร กรม ห ง งกส

ตอ า ห เร มระ การคิ งสามาร


ระ กต์ ก หา ห า งอ าง เร คา ม งอก ว เ พ ห า วงการ วิศว คอม
03 : Repetition ( while, for )

สรุปเนื้อหา
Flowchart Code

while True :
P4

while True :
P1
if C2 :
P3
break
P2

while True :
if C1 : break
P2

while True : while C2 :


if not C2 : break P2
P2

03 : Repetition ( while, for ) 29


Flowchart Code

while C1 :
P1
while C2 :
P2
P3

หสงเกตวา ภา วงว ควรมคาสง เ งเงอ อง มเช ะว างา มสิ ส เช


while i < j :
...
i += 2
เงอ i < j าง ะเ เ เพอ หออก ากวงว ก ว การ คา อง i เพิม หรอคา อง j ง
คาสง i += 2 ตวอ าง าง สรางความม วา วงว างา ว ะม สิ ส ะออก ากวงว

Flowchart Code Flowchart Code

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

30 03 : Repetition ( while, for )


Flowchart Code

for k in range(m) :
P1
if C :
P3
break
P2
else:
P4

ะมา าห ง else อง for กเมอ าคร กรอ


ห ง ารอ k = m-1 เสร กมา า P4 กอ ออก ากวงว

while C1 :
P1
if C2 :
P3
break
P2
else:
P4

ะมา าห ง else อง while กเมอ า เงอ C1 อง while


เ เ กมา า P4 กอ ออก ากวงว

range(start, stop, step)


• start, stop ะ step ตองเ า ว เตม
• for k in range(10) : k = 0, 1, 2, ..., 9
• for k in range(2,10) : k = 2, 3, 4, ..., 9
• for k in range(2,10,2) : k = 2, 4, 6, 8
• for k in range(10,1,-2) : k = 10, 8, 6, 4, 2
• for k in range(11,11) : ไม่ท�าสักรอบ เพราะ step เป็นบวก และ start >= stop
• for k in range(9,10,-1) : ไม่ท�าสักรอบ เพราะ step ติดลบ และ start <= stop

*** break ะ า การ างา ออก ากวงว break อเ า


for i in range(5):
for j in range(6):
if condition1 :
break # break นี้ออกจาก for j
if condition2 :
break # break นี้ออกจาก for i

03 : Repetition ( while, for ) 31


วงวนท่ บบ่อย
เมอตองการ าอะ ร างอ าง าก n ครง เช ตองการอา อม า ว ตว เพอหาคาเ
s = 0
ช for k in range(n) for k in range(10) : # เป็นแค่ค�าสั่งควบคมจ�านวนรอบการท�าซ�้า
a = float(input())
s += a
print('average =', (s/10))

เมอตองการ าคา สราง าก เช ตองการหาวา q เ า ว เ พาะหรอ ม ชวงว for หาวา


range(start, stop, step) า ว เตมมากกวาห ง า เ กส อะ ร หาร q งตว
มา ช การ ระมว for k in range(2, q+1) : # k = 2,3,...,q
if q % k == 0 : break # มีการน�า มาใช้
ช for k in range(...) if k == q :
print(q,'is prime')
else:
print(q, '=', k, 'x', q//k)

เมอตองการ ระมว ช คาสง า เช ตองการหาคาเ ากช อม ช อ เ ามาเรอ


กวาเงอ ห ง ะเ ริง กวา ะร า ว ติ
s = 0 s = 0
ช while หรอ ช if break วงว n = 0 n = 0
while True : t = float(input())
t = float(input()) while t >= 0 :
if t < 0 : break s += t
s += t n += 1
n += 1 t = float(input())
if n == 0 : if n == 0 :
print('No Data') print('No Data')
else : else :
print('avg =',(s/n)) print('avg =',(s/n))

เมอตองการ ก งวิ การเ อกหมา เ เช งหาวาม า ว เตม x y ะ z อะ ร าง า หสมการ


ากหมา เ 0 ง n-1 z =x + y เ
3 2 2
ริง x ก y มคา ง เช 3
า ว หมา เ เ อก ว ตเรา มตองการคาตอ 3
เพราะ า งตองกาห วา x < y
มเ อกอก (คอ ก งการเ อก ต าเราตองการคาตอ 3
ว กตอง ห x <= y
หมา เ ออกมา ะค) ห y มคาเริม x เ ต ว for y in range(x,n) าง าง
for i in range(n) : n = 20
for j in range(i+1, n) : for x in range(1,n) :
i<j ก กรณ for y in range(x,n):
t = x**2 + y**2
หรอ าตองการ ห i = j ว กเ z = int(round(t**(1/3),0)) # หารากที่สามแล้ว
for i in range(n) : # ปดเ
for j in range(i, n) : if z**3 == t :
print( z,x,y )
i≤j ก กรณ

32 03 : Repetition ( while, for )


เรื่องผิดบ่อย

เ า ิ เรองตวส า อง range for k in range(1,5) k = 1,2,3,4 (ไม่รวม )


ชวงว าอะ ร างอ าง เพอสร วา เ A หรอ เช ตองการหาวา q เ า ว เ พาะหรอ ม
เ B ะเ A เมอเงอ C เ ริง for k in range(2, q) :
if q % k == 0 :
อ าง อ ห งครง ต ะเ B เมอ C ตอง print(q,'is composite') # สรปถูก เพราะ
มเ ริง กครง กรอ าเ # หาตัวหารพบ
for k in range(...) : else :
if C : print(q,'is prime') # ผิด สรปเร็วไป
print('A') # ต้องวนทดสอบต่อ
else :
print('B') ก ชตว รเก สภาวะการตรว เ ง
ิ เพราะสร วาเ B เรว งตรว
มคร กรอ กกรณ ก ว การ ชตว ร iscomposite = False
for k in range(2,q) :
เก สภาวะการตรว if q % k == 0 :
found = False print(q,'is composite')
for k in range(...): iscomposite = True
if C : break
print('A') if not iscomposite :
found = True print(q,'is prime')
break
if not found :
print('B')
หรอ ช for-else กงา กวา
หรอ ช for-else กงา กวา for k in range(2,q) :
for k in range(...): if q % k == 0 :
if C : print(q,'is composite')
print('A') break
break else :
else: print(q,'is prime')
print('B')

วงว า า ว รอ อ หรอมาก กวา เช ากช คาสงตรว สอ า ว เ พาะ าง าเ


ตองการ ว มก า หรอเกิ ห งรอ for k in range(2,q+1): # เขียน q+1 แทนที่จะเป็น q
if q % k == 0 :
print(q,'is composite')
break
else :
print(q,'is prime')

เกิ รอ า ห ออกมาเ composite เสมอ


เพราะอะ ร
หรอ อ ากหาคา อง าเ
s = 0
for k in range(1,n):
s += k**3
print(s)

ก ะพ วา า รอ

03 : Repetition ( while, for ) 33


ม ร คา องตว ร ช เงอ อง while เช ตองการว ร า ว าก ช มาหาคาเ กวา ะพ
หรอ มก ร คา ิ ความ ิ พ า อา า ห า ว
ว างา มสิ ส s = n = 0
t = float(input())
while t >= 0 :
s += t
n += 1
print('avg =', (s/n))

ช t การตรว สอ เงอ อง while ตคา t ม


เ งเ วงว าห เ ามา วงว ะเกิ อะ ร
ควร กเ
s = n = 0
t = float(input())
while t >= 0 :
s += t
n += 1
t = float(input()) # เพิ่มบรรทัดนี้
print('avg =', (s/n))

ตงคา หก ตว ร ควร ะ หคากอ เ าวงว เช ตองการว ร า ว าก ช มาหาคาเ กวา ะพ


ตก เ วงว า ว
while True :
s = n = 0 # บรรทัดนี้ไม่น่ามาอยู่ในวงวน
t = float(input())
if t < 0 : break
s += t
n += 1
print('avg =', (s/n))
ะเกิ อะ ร

เรื่องแปลก อง น
ห ง ากว างา 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 จึงไม่มีค่า

34 03 : Repetition ( while, for )


การ ร คา k ภา วงว for k in range(1, 4) : 1
for k in range(...) print(k) 3
k += 2 2
ะ มม ตอการเ คา k รอ print(k) # ได้ผลตามทางขวาบน 4
3
เพราะ ะ าตองการ ร คา อง k วงว าตองการเ k ตอง ช while 5
k = 1
ตอง ชวงว while while k < 4 : 1
print(k) 3
k += 2 3
print(k) 5

แบบฝึกหัด
Problem Code
Input มม
หา า ว เตม วก k มคา อ ส า ห ม
คา มเ าก เ อง ากความ ม ม า
อง า ว ริง คอมพิวเตอร์
Output า ว เตม k หา
Input มม
หา า ว เตม วก k มคา อ ส าห

เ ริง
Output า ว เตม k หา
Input มม
คา วณคา ระมาณ อง ากสตร

Output คา ระมาณ อง หา
Input อา า ว เตม า ว a ก b
คา วณคา ากสตร

Output คา คา วณ
Input อา า ว เตม า ว a ก b
คา วณคา ากสตร

Output คา คา วณ

03 : Repetition ( while, for ) 35


Problem Code
Input รร รกร า ว เตมเก ตว ร n
n ะมคามากกวา ะอก n รร เ า ว เตม
รร ะ า ว
หา ตาง องคามากส ก คา อ ส
ะหาวามก า ว เ เ
Output ตาง ะ า ว เ หา

Input า ว เตมเก ตว ร n
หา า ว เตม วก w x y ะ z งหม
w3 = x2 + y2 + z2 1 ≤ x ≤ y ≤ z ≤ n
Output คา อง w x y ะ z หา

ตัวอย่างการแก้โจทย์ปัญหา

คา อง คา วณ ว อ กรมเ ์เ อร์ ง ส ง าง าง

งเ ร กรมร คา อง เพอคา วณคา ห ความ ม ามาก ส เ า ะมาก ว สตร าง


► อม าเ า
ห ง รร ระกอ ว า ว ริง ห ว เ องศา
► อม สงออก
คา ระมาณ อง ากสตร างต
► ตวอ าง

nput ากแ น ิม ์ utput ทาง อ า


45 0.7071067811865475

36045 0.7071067811865475

36 03 : Repetition ( while, for )


ัวอย่างการเขียนโ รแกรม

โ รแกรม ค�าอ ิบาย


import math เริม ว การร อม งเ float วเ เ เรเ
x = math.radians(float(input()))
สตรการคา วณม ก ณะเ การ วก า ก ห า พ ์ ชคา อง
n = 30 k เริม าก เพิม ะ เรอ า หคิ งการ ชวงว for
s = 0 หาคอ ะตองหม คา วณกรอ กพ ์ ง ะ ะเอ ส ตาม
for k in range(n+1): ต์ องการ
# k=0,1,...,n
s+=(-1)**k*x**(2*k+1) \
/math.factorial(2*k+1)
print(s) อ องตง ห n = 30 มตว ร s เก พ ์ คา วณคา องพ ์
ตรง ตรงมาตามสตร งมการ กกา ง ว ** ะการหาคา
กตอเร ว math.factorial
สง ส 45 เ อม เ 0.7071067811865475 กตอง
import math อ าก ห ะเอ กวา องตง n = 100
x = math.radians(float(input()))
สง ส 45 เ อม ิ รร มการคา วณ
n = 100 OverflowError: int too large to convert to float
s = 0 วา มการ ง า ว เตมเ float ต า ว เตมม า ห
for k in range(n+1): เกิ float ะร ว ะร อ าง รวา ิ ตรง ห
# k=0,1,...,n
s+=(-1)**k*x**(2*k+1)\
หาก ว เมอเกิ อ ิ พ า ว เราสามาร อ ตว ร
/math.factorial(2*k+1) ตาง เช อ ากรคา k เมอเกิ ความ ิ พ า ก สคาสง print(k)
print(s) ะ ส งวา ิ ตอ k มคาเ ก องคา วณ
คาตาง สตร วา ิ
>>> print(k)
85
>>> print((-1)**k)
-1
>>> print(x**(2*k+1))
1.1491314574538792e-18
>>> print(math.factorial(2*k+1))
12410180702176678234248405241031039926166055775
01693185388951803611996075221691752992751978120
48758557646495950167038705280988985869071076733
12420322184843643104735778899685482782907545415
61964852153468318044293239598173696899657235903
94761615227855818006117636510842880000000000000
0000000000000000000000000000
>>>
ก มมอะ ร ิ ต าก อกวา ิ เพราะ ง า ว เตม ห เกิ
เ float า หวิเคราะห์ วา องการหาคา กตอเร ตอง ง
เ float เพอ เ ตวหาร สตร หาก องคาสง
>>> print(1/math.factorial(2*k+1))
กพ วา ิ ว เหต เ วก

03 : Repetition ( while, for ) 37


โ รแกรม ค�าอ ิบาย
import math ก หา ม ช า ว เตม า ห ตมองวา การคา วณหา
x = math.radians(float(input()))
พ ์ ต ะรอ สามาร คา วณ ากพ ์ รอ กอ
n = 100 ม าตองคา วณ ะ กรอ ตสามาร
s = f = x คา วณ ากความสมพ ์ ง
for k in range(1,n+1):
f *= (-1)*x**2/((2*k)*(2*k+1))
s += f
print(s)

พ ์ รอ 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 ผิด เกิ อะ ร

38 03 : Repetition ( while, for )


โ รแกรม ค�าอ ิบาย
import math คา 36045 เมอ งเ เรเ ว x มคามาก การคา วณคา f
x = float(input())
วงว ะ ความ ม า ง ว เหต า ว ห ง ศ ิ ม อง
x = math.radians(x%360) float ม า ว าก า หการคา วณ ิ พ า ว คณสม ติ
s = f = x อง งก์ช เ เชิงคา เราควร า องคา x ง ว การ
k = 1
while f != 0:
เ คา 36045 องศาเ 36045 % 360 = 45 องศา
f *= (-1)*x**2/((2*k)*(2*k+1)) กอ เ เ เรเ ะเพิมความ ม า ะ ความ ิ พ า
s += f การคา วณ ง าง า
k += 1
print(s)

ตัวอย่างโจทย์ปัญหา

งเ ร กรม คา วณหา รวม อง า ว เตม วก ก า ว มคาตากวา า ว เ อม าเ า ะ


ม หรอ เ ตว ระกอ เช หาก อม าเ าคอ คาตอ เราตองการ ะเ าก
สงเกตวาคาตอ องเรา มรวมคา เ อง ากเราส เ พาะ า ว มคาตากวา
► อม าเ า
ม รร เ ว เ า ว เตม วก
► อม สงออก
ม รร เ ว ส ง รวม อง า ว เตม วก ก า ว มคาตากวา า ว เ อม าเ า ะม หรอ เ ตว ระกอ
► ตวอ าง
nput ากแ น ิม ์ utput ทาง อ า
20 78

25 143

3 0

03 : Repetition ( while, for ) 39


Average until -1
หอา อม าก พิมพ์ เ า ว ริง กวา ะพ คา -1 เพอหาคาเ อง า ว เห า งหม มรวม -1
► อม าเ า
า ว ริง รร ะ า ว ห า รร รร ส า คอ -1
► อม สงออก
ม รร เ ว ส งคาเ อง า ว งหม มรวม -1 ออก างห า อ
กรณ ม า ว อม เ ห ส ง No Data
► ตวอ าง
nput ากแ น ิม ์ utput ทาง อ า
2295.498850599365 5111.43305555306
8502.139421733784
515.0100470901091
3705.6829835190097
8722.343211974356
4446.712951812571
6375.086965715
3801.511489785674
7638.911577747659
-1

-1 No Data

40 03 : Repetition ( while, for )


สามเหล่ยมมุม าก
์ ส
เ พาะสามเห มมม าก ความ าว า ก า เ า ว เตม
งเ ร กรมอา คาความ าวเส รอ ร าก พิมพ์ เพอหา า ว เตมมากส เ ความ าว อง า ตรง าม
มม าก องสามเห มมม าก มความ าวเส รอ ร ตาม ร เช หเส รอ ร องสามเห ม าว ะมสามเห มมม าก
ตาม อกาห อ สองร คอ ะ คาตอ ตองการคอ เพราะเ ความ าว า ตรง ามมม าก าวส
องสามเห มมม ากตาม อกาห ะมเส รอ ร าว
► อม าเ า
ม รร เ วเ า ว เตม วก ความ าวเส รอ ร องสามเห มมม ากตาม อกาห
ร ระก วา มสามเห มมม าก มความ าวเส รอ ร เ าก า ว เ อม าเ า
► อม สงออก
ม รร เ ว ส งความ าว อง า ตรง ามมม าก าว ส องสามเห มมม ากตาม อกาห
► ตวอ าง
nput ากแ น ิม ์ utput ทาง อ า
30 13

90 41

03 : Repetition ( while, for ) 41


นาวั น์ มาลาบุปผา
Intania 84

CEO & Co-Founder of Priceza

P rogramming เ ห ง วิชา มชอ เร มาก ส วิชา งเ ตอ


กระ ว การคิ ะการ ก หาตาง อ างเ ระ
ว ความเ า
เหต เพราะวาม ชว ห มม
มา งตอ อ าก า สราง
Programming า ห มมพ า วิ คิ การศก าพ าระ ตาง เรา มเค พ า
มากอ ะ า หเราศก า ะวิ ตง ตต พ าม มา ส
มา

ลิ สา ตรงปร กอบ
Intania 81

Google Inc.

P rogramming า หเราร กคิ ะร กสอสาร ะ ม ชการคิ ะการสอสาร


การคิ อ างเ ระ คิ อ างรอ คอ คิ
สงสาร ะ ร สารตองเ า
ก ความเ

ะเ การสอสาร ตองช เ
ตเ

างเ วก ามอะ ร ิ พ า มเพ ง ิ เ ว มคิ ิ ง สอสาร ิ


เ ก อ ก ะออกมา ม อ าง วาง ว การคิ ะการสอสาร
สราง พ ์เ อะ รก ตาม ต เราอ าก หเ
สามาร า ชก อะ รก ะสามาร

04 : String

สรุปเนื้อหา
สตริง เก อก ระ ตง ตศ ์ตว เร ง าก า วาตอก ต ะตวมเ
ระ ตา ห ง องตว า ส คอ อก ระ ต ะตว สตริงเ งตวอก ร ตวเ ะส ก ณ์พิเศ ตาง
การเ สตริง า หา ง
• เ ครอ ว อ ระกาศเ ว '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:]
ตสราง หม

ตรว วาตว ร c เก ตวอก ร if len(c) == 1 and c.lower() in 'aeiou' :


ตวเ ว ะเ สระ ภา าองก # c contains a vowel
...
หรอ ม
ตรว วาตว ร c เก ตวอก ร if len(c) == 1 and 'a' <= c.lower() <= 'z' :
ตวเ ว ะเ ตวอก รภา าองก # c contains an English alphabet
...
หรอ ม

รูปแบบการปร มวลผลสตริงท่ บบ่อย


ตองการห ิ อก ระ สตริง าก ตองการ วาสตริง s มตวเ กตว
า วามา ระมว ะตว c = 0
for e in s :
if '0' <= e <= '9' :
c += 1

ตองการห ิ ะตว พรอมก for i in range(len(s)):


องตว c = s[i]
print(i,c)

หรอ
for i,c in enumerate(s):
print(i,c)

ตองการห ิ อก ระ สตริง าก for e in s[::-1] :


วามา า ะตว ...
หรอ
for k in range(-1,-(len(s)+1),-1):
e = s[k]
...

ตองการห ิ อก ระ สตริง าก ตองการ วาสตริง s มตว ติ ก เ ตวเ งคอ กค


า วามา ระมว ะค c = 0
ติ ก for k in range(len(s)-1) : # ต้องการตัวติดกัน จึงวนถึงตัวรองสดท้าย
if '0' <= s[k] <= '9' and '0' <= s[k+1] <= '9' :
c += 1

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

ตองการห ิ สตริง อ อ ระหวาง หาสตริง อ อ ระหวาง "<title>" ะ "</title>"


ร สตริง กาห ห อวา าสตริง ร ม <title> กตองม </title> ว
t = input().strip()
a = t.find("<title>")
if a >= 0 : # a j b
j = a+len("<title>") #..<title>.....</title>
b = t.find("</title>",j)
print( t[j:b] )
else :
print( 'No title' )

ชสตริงเ เก อม เพอ ง งเ เ อ m เ ชอ อเ อ
าก า ว เตมเ สตริง months = "JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC"
m = int(input())
if 1 <= m <= 12 :
print( months[(m-1)*3:m*3] )
else :
print( 'invalid month number' )

ชสตริงสองสา เ เก อม หาชอ อสก เงิ ตวอก ร ากชอ อ ระเ ศ ตวอก ร


เพอการ ง อม ากสตริงห ง c = input().strip().lower() # country code
เ อกสตริงห ง # USA, Thailand, Japan, China, Singapore
countries = "usthjpcnsg"
currency_codes = "USDTHBJPYCNYSGD"
k = countries.find(c)
if k >= 0:
k //= 2
print( currency_codes[3*k:3*(k+1)] )
else :
print( 'Not found' )

04 : String 45
เรื่องผิดบ่อย

เครองหมา เ สตริง มคร s = "String


มตรงก หรอ ส อ ภา s = String'
s = "string'
ม าห า ว \ s = "You shouted "Hey!" very loudly yesterday"

าตองการร สตริง าก คาสง าง าง า ช อ ok ตาม ว ชองวาง วก enter


พิมพ์ ควร strip ว การเ ร เ ก ะ มเ า 'ok'
เพราะ ชอา เ อเพิมชองวาง s = input()
าง า หรอ วาเพิมเติม if s == 'ok' :
print('OK')
งควรเ s = input().strip()
กเว กรณ เราตองการคง กสิง ช อ งหม
ช index เกิ ชวง ช s = input().strip()
องสตริง อ า มวา index t = ""
for i in range(10):
องสตริง s อ ชวง 0 ง t = s[i] + t # ถ้า len(s) < 10 ก็ผิดแน่
len(s)-1 าก า วา
ะ -1 ง -len(s)
อ าก วามา า
เ index ชก สตริง ม ช print( s[n/2] ) # ผิดเพราะ n/2 ได้จ�านวนจริง
า ว เตม
เ อม ภา สตริง t = input().strip()
t[0],t[-1] = t[-1],t[0] # สลับตัวแรกกับตัวท้ายแบบนี้ผิด
าตองการส ตว รกก ตว า ตองสราง หม
t = t[-1] + t[1:-1] + t[0]

เ สตริงระ ตา ห ง อง s = "c:\temp\data\input.txt" # ผิด


ม อม มเครองหมา \ ตองเ
ต ม เ \\ s = "c:\\temp\\data\\input.txt"

าสตริง วกก อม print("average = " + avg) # ผิด


ระเภ อ ตองเ
print("average = " + str(avg)) หรือ
print("average =", avg)

46 04 : String
แบบฝึกหัด

Problem Code
ร สตริงห ง รร
สรางสตริง หม กอก ระ สตริง ร เ ามา ราก า
อกตว เช ร 'pypy' ะ สตริง 'ppyyppyy'
สตริง พ ์

ร สตริงห ง รร
สรางสตริง หม กอก ระ สตริง ร เ ามา ราก า
อกตว ต ามตว าติ ก อ ว ก มตอง า า เช ร
'pythonnnaa' ะ สตริง 'ppyytthhoonnnaa'
สตริง พ ์

ร สตริงห ง รร
ตรว วาสตริง เ
งคอสตริง ก า วคอสตริงเ ิม หรอ ม
าเ ก ส ง Y า มเ ก ส ง N

ร า ว เตม วกสอง า ว เก สdก n


สรางสตริง หม าก า ว d มnห ก าd
ม มคร n ห ก กตองเติมเ 0 ว าง า หคร n ห ก
ต า d ม า ว ห ก n ห ก ก หเ สตริง อง d เ ิม
สตริง หม ตองการ

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
► ตวอ าง

nput ากแ น ิม ์ utput ทาง อ า


..125.9.0. 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 ส งวาม า กตอง

t = '' าคิ อก ิ พ วา หากเราว งรอ k การตรว วาตว k าก ตว


for e in input().strip() : า มาหรอ ม สามาร ตว า มา ากสว าง า อง t มเห าเ ตอง
if '0' <= e <= '9' :
t += e สราง b ามา ว คาสง if t[k] in t[:k] งเ าก
for k in range(len(t)) : for e in t เ for k in range(len(t)) ง าง า
if t[k] in t[:k] : สง ส ..125.9.0. เ False ส งวา มม า กตอง
print(True)
break
สง ส ..125.9.2. เ True ส งวาม า กตอง
else:
print(False)

t = input().strip() เราสามาร ร รงตอ อก รวมวงว for สองวงว เ า ว ก


for k in range(len(t)) : for รก อก ระ ม ชตวเ for ห งตรว เรองตว า เราก รวม หม
if '0'<=t[k]<= '9' and \
t[k] in t[:k] : for เ ว ะตว า ม ชตวเ ก าม า ชกตรว วา าก
print(True) า มาหรอ ม า องเ วก ามา าง า
break สง ส ..125.9.0. เ False ส งวา มม า กตอง
else:
print(False)
สง ส .125.9.2. เ True ส งวาม า กตอง
t = input().strip() หรอ ะเ มา ช for k,e in enumerate(t): กเ ิ มกวา
for k,e in enumerate(t) : for ะ ง เก k ะตว อม เก e)
if '0' <= e <= '9' and \
e in t[:k] : มา ชงา วงว
print(True) สง ส ..125.9.0. เ False ส งวา มม า กตอง
break สง ส ..125.9.2. เ True ส งวาม า กตอง
else:
print(False)

50 04 : String
ตัวอย่างโจทย์ปัญหา

แปลงวันท่
หอา ว เ อ ร เอ ว mm/dd/yyyy ร คา าง พิมพ์ ะ งว ร เ ร
ว เอ dd MMM yyyy คา องเ อ ร มาเ ตวเ า ว เตม ตอง ง หอ ร ตว อภา าองก องเ อ
ร เ ามา
► อม าเ า
ม รร เ อความสตริง ว ร เอ ว mm/dd/yyyy)

► อม สงออก
ม รร เ ว ร ว เ อ dd MMM yyyy)
► ตวอ าง
nput ากแ น ิม ์ utput ทาง อ า
08/27/2014 27 AUG 2014

02/01/2018 01 FEB 2018

04 : String 51
นับตัวอัก ร ิม ์ หญ่
หเ ร กรมอา อม เ สตริงเ ามาห ง รร ระกอ ว อก ระอะ รก เว วรรคก าก ห เ พาะ
ตวอก ร เ ตว ห เ า ะ ส ง พ ์ออกมา างห า อ
► อม าเ า
ม รร ระกอ ว สตริง ระกอ ว ตวอก ระอะ รก เว วรรคก
► อม สงออก
ม รร ส ง า ว ตวอก ร เ ตว ห งหม าก อม าเ า
► ตวอ าง

nput ากแ น ิม ์ utput ทาง อ า


HelLo WoRLd 5

PYTHON123 6

yes! 0

52 04 : String
กลุ่มสร
คาภา าองก ระกอ ว พ ช ะ ะสระ a e i o u อเร กสระ อ ติ ก วาเ ก มสระ เช beautiful
มก มสระ eau i ะ u งมก มสระ 3 ก ม vowel มก มสระ 2 ก ม group มก มสระ ก ม ะ rhythm มก มสระ
0ก ม

หเ ร กรมเพอ า ว ก มสระ คาภา าองก


► อม าเ า
ม รร คาภา าองก ระกอ ว อก รตวพิมพ์เ กเ า
► อม สงออก
ม รร ส ง า ว ก มสระ องคา กาห
► ตวอ าง

nput ากแ น ิม ์ utput ทาง อ า


beautiful 3

vowel 2

group 1

rhythm 0

04 : String 53
วรวร์ สัตยวินิจ
ภัทราวุ ื่อสัตยา ิลป
ยอด ินสุภั กุล
ุภ ท ิ ก ตยาเกยรณ์
เอกลัก ณ์ วิริย โกวิทยา

Intania 84
Wongnai


วาคณ ะเร คณะอะ รหรอภาคอะ ร Computer Programming ก า มาเ ความร กค าเ
ตองม ว เพราะเ ค เกิ หม รกิ ะอตสาหกรรมตาง มวา ะ าง า การคา า าคาร
การ พ ์ ณา เ ิง ก า เครอง กร ะห ต์ ว ว ตตอง ชความร า Computer
Programming มาชว พ า ิตภณ ์หรอ ริการ ห กวาเ ิม ความตองการ ะ ิงมาก มาก อ าคต
เมอ ิตภณ ์ ริการ หรอ มกระ งเงิ เรา ช อสิ คาตาง ก ง อ ร ิ ิตอ งเ เรองสาค มาก
เรา ะ ส ก ความร า Computer Programming เพราะม คอ ก ะ าเ องค ะสามาร ร มอ
ก ความเ ง อง ก ิ ิตอ ะพรอมเก เก ว อกาส ะมาพรอมก ค ก ์ ก หม อ าคตอ ก
05 : File

สรุปเนื้อหา
การอา อม เก ม อม เ ามา ระมว า ห า วิ ห า คาสง วิชา ชวิ งา ส คอ อา ม อความ
ะ รร มาเก สตริง มร ง

อา ม อความ ะ รร ช readline อา อม มมาหาคาเ ต ะ รร เก รหสก คะ


infile = open(filename, 'r') infile = open('c:/temp/data.txt', 'r')
first_line = infile.readline() n = 0
second_line = infile.readline() s = 0
for line in infile : for line in infile :
# ค�าสั่ง for อ่านจาก infile รอบละหนึ่งบรรทัด sid, sc = line.strip().split()
# มาเก็บเป็นสตริงใน line จนหมดแ ้ม s += float(sc)
... n += 1
infile.close() # ไม่อา่ นแล้ว ก็ปิดแ ้ม infile.close()
print('average =', (sc/n))
า รร อา เ ามาเ รร วาง เก t
ะ t = '\n' หรอ len(t) เ 1 อก อา อม มมาหาคาเ ต ะ รร เก
ต าอา ตอ ม มม อม หอา ว รหสก คะ รร รก อก า ว รร ตองอา
ะ t = '' หรอ len(t) เ 0
infile = open('c:/temp/data.txt', 'r')
for line in infile : n = int(infile.readline()) # อ่านบรรทัดแรก
... s = 0

เหมอ ก for k in range(n) :


sid, sc = infile.readline().strip().split()
line = infile.readline()
s += float(sc)
while len(line) > 0 :
infile.close()
...
print('average =', (sc/n))
line = infile.readline()

การอา าก มห ง รร อา มรหส รร หม f = open('data.txt', 'r')


\n อ า รร (กรณอา รร ส า อง t = f.readline()
if len(t)>0 and t[-1]=='\n' :
มอา มมรหส )
t = t[:-1]
า มตองการรหส \n กอ า ม ิง
ต าอา มา วมการ strip() for line in f :
รหส \n ะ ก ว มตอง าอะ รเพิม if line[-1] == '\n' :
line = line[:-1]
...

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()

เรื่องผิดบ่อย

เมออา อม าก มมาห ง รร t = input().strip()


ม รหส \n า หการ ระมว f = open('names.txt', 'r')
ิพา for line in f :
if line == t : # ผิด เพราะ line อาจมีรหัส \n
print(t, ': found in names.txt')
break
else :
print(t, ': not found')

ชอ มมเครองหมา \ ต ส คตวเ ว of = open('c:\temp\data.txt', 'w')


ิ เพราะ \t คอ ตองเ
of = open('c:\\temp\\data.txt', 'w')
หรอ ช / ก เพราะระ ร ชอ ม เ /
ม หมา ความวา \ เหมอ ก /
of = open('c:/temp/data.txt', 'w')

เ ม มมอ เครองมาอา infile = open('h:\\file.data')


า มม ม h:/file.data เครอง ก ะ ิ
fn = input()
infile = open(fn)
อา ิ า fn ม blank ห าหรอห ง งควร strip กอ
infile = open( input().strip() )

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 เก การตรว ต ะ รร ระกอ ว เ ระ าตว กเร ตาม ว คะ ค ว
เครองหมา ภาค
► ตวอ าง

nput อ่าน ากแ ม utput บันทกลงแ ม


AABBCCCBBCCDDDABABDDCCDDCC 5630120421,25
5630120421 AABBCCCBBCCDDDABABDDCCDDCA 5631010121,14
5631010121 A BBCD BDBAAABA ABDBCCCDCC 563102121,16
563102121 ABABCCNNAADDDABAB CCDDAC 5630121821,24
5630121821 AABBCCCBBCCDDDABABDDCCDD

58 05 : File
ัวอย่างการเขียนโ รแกรม
์กาห หอา อม าก ม ะ ก การ างา ง ม เพอ หการเ ร กรม ะหา ิ งา
ะ อเ ส ง ออกห า อกอ เมอ กอ าง กตอง คอ เ ห กง ม

โ รแกรม ค�าอ ิบาย


fin = open('c:\t\answers.txt', 'r') เริม ว การเ ม ช readline ห งเ ม ะ
soln = fin.readline().strip()
for line in fin:
รร รก อง ม งคอเ strip เพอ ชองวาง
sid,ans = line.strip().split() า วา ะรหส รร หม าก ช for อา รร
point = 0 เห อ ช split กเ ระ าตวก คาตอ ออก ากก
for k in range(len(soln)):
if ans[k] == soln[k]: ว ชอก for าคาตอ ะตวเ ร เ ก เ เรา ช
point += 1 for เ คา k เ อง งคาตอ ก เ
print(sid, point) าตรงก กเพิมคะ ว ตรว คร ก อก ส ง าง
fin.close()
อภาพ ว คร ก รร ก ม ง าง า
กอ สง างา กตองสราง ม answers.txt าก สง

OSError: [Errno 22] Invalid


argument: 'c:\t\x07nswers.txt'
เกิ อะ ร ก ก ชอ ม
fin = open('c:\\t\\answers.txt','r') า ง า เครองหมา \ ราก สตริง ะ กตความ
soln = fin.readline().strip()
for line in fin:
หา าตองการส ก ณ์ \ สตริง ตองเ \\
sid,ans = line.strip().split() ก ห กตอง
point = 0 สง 5630120421 25 ิ รร 4 อง
for k in range(len(soln)):
if ans[k] == soln[k]: ร กรม
point += 1 ValueError: too many values to
print(sid, point) unpack (expected 2)
fin.close() วาห ง split ว สตริงมากกวาตว ร ะมาร
ง า ะเกิ ห งอา รร อง ม
5631010121 A BBCD BDBAAABA ABDBCCCDCC
รร มชองวาง คาตอ ชองวาง วา อ มตอ
ง า ห split ว สตริงมากกวา สตริง งตองหา าง
ก รร หเ สองสตริง เ ระ าตว ก คาตอ งห า

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
ม ิ รร อง ม อม ว ต ิ รร
อง ม

fin = open('c:\\t\\answers.txt','r') index out of range วาคา อง อ อกชวง


soln = fin.readline().strip() กตอง คาสง ans[k] == soln[k] ิ ans[k]
for line in fin:
line = line.strip()
หรอ มก soln[k] คาสง soln[k] ม า ิ เพราะ k
j = line.find(' ') มคา range(len(soln)) ต ans[k] อา ิ า
if j > 0 : ans ม า อ กวา soln าก รร ม
sid = line[:j] พ วาคาตอ ม มคร กเร มตอ คาตอ า ะเ
ans = line[j+1:] ชองวาง ะ ก strip ิง
if len(ans) < len(soln) :
ans += ' '*(len(soln)-len(ans))
point = 0 วิ ก ก คตรว วา า len(ans) < len(soln) ะ
for k in range(len(soln)): เติมชองวางตอ าง วา อง ans เ า ว เ าก ตาง
if ans[k] == soln[k] : องความ าว งสองสตริง
point += 1
print(sid, point)
สง
fin.close() 5630120421 25
5631010121 14
563102121 16
5630121821 24
กตอง ภาระ เห อก คเ ากการ ส ง ออกห า อ
เ การ ก ง ม ง อ ห อา องเ ตอเอง

05 : File 61
ตัวอย่างโจทย์ปัญหา

แนนเ ล่ย องตอนเรยน


งเ ร กรมเพออา ม data.txt ม เก อม
คะ อง ิสิต มร id:name:section:score

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
► ตวอ าง

ข้อมูล นแ ม score.txt nput ากแ น ิม ์ utput ทาง อ า


1111 3 12345 2
12345 2
9999 4 9999 4
89431 0
76238 1 1234 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]

ัวอย่างการเ ลี่ยนข้อมูล นลิส ์ เ อก ระภา สตริง ม ตเ อม ภา ิสต์


• x[k] = e เหมอ ก x[k:k+1] = [e]
• x[a:b:c] = y า อม ิสต์ y อม x[a:b:c]
า |c|>1 len(y) ตองเ าก len(x[a:b:c]) เช
x = [1,2,3,4,5]; x[::2] = [0,0,0] า ห x เ เ [0,2,0,4,0]
• x[len(x):] = [e] เหมอ ก x.append(e)
• x[i:i] = [e] เหมอ ก x.insert(i,e)
• x[i:i+1] = [] เหมอ ก x.pop(i)
• x += [1,2] ก x = x + [1,2] า ห x มสมาชิกเพิมอก ตวคอ 1 ก 2 เหมอ ก ตสองคาสง มการ างา ตางก
o x += [1,2] หมา ความวา ห า 1 ก 2 ตอ า ิสต์ x
เหมอ ก า x.append(1) ตาม ว x.append(2)
o x = x + [1,2] หมา ความวา ห x เก ิสต์ หม สราง ากการ าคา ิสต์ x เ ิมมาตอก ิสต์ [1,2]
o ง x = [3]; y = x า ห x ก y เ ิสต์เ วก
ต าตอ ว x = x + [9] ะ า ห x ก y เ ิสต์ค ะตว
o ณะ x = [3]; y = x เมอ า x.append(9) ว x ก y ก งเ ิสต์เ วก
• สร ความ ตกตาง อง x = y, x = y[:], x[:] = y, ะ x[:] = y[:] เมอ ง x ะ y เ ิสต์
o x = y xเ อางอิง ิสต์ตวเ วก อง y หมา ความวา x ะ y อางอิง ิสต์เ วก
o x = y[:] xเ อางอิง ิสต์ หม กสราง เหมอ ก อง y เหมอ คาสง x = list(y)
o x[:] = y x งอางอิง สิ ต์ตวเ มิ ต อม สิ ต์ x เ เหมอ ก อม อง y x ก y เ ค ะ สิ ต์
o x[:] = y[:] เหมอ x[:] = y

66 06.1 : List
รูปแบบการปร มวลผลลิสต์ท่ บบ่อย
ช ิสต์เก อม เพอ ามา ชภา ห ง อา อม เ ามา n ตว
n = int(input())
data = []
for k in range(n):
data.append( float(input()) )

ตองการห ิ อม ิสต์ าก า วามา ตองการ วา ิสต์ x ม อม เ าก e กตว


ระมว ะตว c = 0
for d in x :
if d == e : c += 1
ช for e in x
หรอ ส
c = x.count(e)

ตองการห ิ อม อง ิสต์ ชวง ส มา ตองการหา รวม องคะ เก ิสต์ x อ มรวมคะ


ระมว อ ส ะมากส ต ออกอ าง ะห งตว
s = 0
ช for e in x[a:b:c] for d in sorted(x)[1:-1] :
s += d

หรอ ส
s = sum( sorted(x)[1:-1] )

ตองการ ร เ คา ิสต์ ช x เ ิสต์เก คะ ตองการ ร ชอง มคา อ กวา 30


หมคาเพิมอก 10%
for i in range(len(x)) : for i in range(len(x)) :
x[i] = ... if x[i] < 30 :
x[i] += 0.1*x[i]
เ าง าง ม เพราะ e งออกมาเ เก ค ะ ก อ
ิสต์
for e in x :
if e < 30 :
e += 0.1*e

ตองการห ิ อม ต ะตว พรอมก for i in range(len(t)) :


องตว c = t[i]
print(i,c)

หรอ
for i,c in enumerate(t):
print(i,c)

ตองการห ิ อม ิสต์ าก วามา า for e in x[::-1] :


ะตว ...

หรอ
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) :
าก อม อ ส อม มากส ิสต์ ...

ตองการห ิ อม สิ ต์ตาม า เร ง for e in sorted(x)[::-1] :


าก อม มากส อม อ ส ิสต์ ...

ตองการห ิ อม ิสต์ าก า วามา ตองการตรว วา อม ิสต์ s เร ง า าก อ มากหรอ ม


ระมว ะค อม ติ ก for k in range(len(s)-1) :
if s[k] > s[k+1] :
print("False")
break
else:
print("True")

ตองการห ิ อม ก ค ิสต์ ตองการ วา ม อม กค ิสต์ ตว าง า มคามากกวาตว าง วา


ม าเ ตองติ ก มา ระมว ม าเ ตองอ ติ ก
c = 0
for i in range(len(x)) :
for j in range(i+1,len(x)) :
if x[i] > x[j] : c += 1
print(c)

เร ง า อม ิสต์ # ต้องการเรียงล�าดับข้อมูลในลิสต์ d จากน้อยไปมาก


ว วิ for k in range(len(d)-1) :
for i in range(len(d)-1) :
if d[i] > d[i+1] :
d[i],d[i+1] = d[i+1],d[i]

เรื่องผิดบ่อย

ช เกิ ชวง ช อง ิสต์ x = [2,3,5,7,11,13,17,19,23]


อ า มวา อง ิสต์ x อ ชวง s = 0
for i in range(len(x),0,-1):
0 ง len(x)-1 าก า วา ะ s += i*x[i]
-1 ง -len(x) อ าก วามา า # ผิด ค่าแรกของ i คือ len(x) อยู่นอกช่วง
เ ชก ิสต์ ม ช า ว เตม print( x[n/2] ) # ผิด เพราะ n/2 ได้จ�านวนจริง

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']

า อม ิสต์มา join ก หเ สตริง x = [1,2,3]


ต ม วา อม ิสต์ ตองเ สตริง s = ','.join(x) # ผิด เพราะ 1,2,3 ไม่ใช่สตริง
ง ะ join t = []
for e in x :
t.append( str(e) )
s = ','.join(t) # ใช้ได้ เพราะ t เป็นลิสต์ของสตริง
ส ส คาสง x.sort() ก sorted(x) x = [9,2,0,4]
x.sort() เร ง า อม ิสต์ x x = x.sort() # ผิด แบบนี้ท�าให้ x เก็บค่า None
คาสง มค ณะ # เพราะ x.sort() ไม่คืนผลใด
sorted(x) า อม าก x มาเร ง for e in x.sort() :
า วค ิสต์ หม ม อม เหมอ x ... #ผิด x.sort() ไม่คืนผล ไม่มีอะไรให้ e
ตเร ง า ว x มเ ง าตองการเร ง า อม x ช x.sort() หรอ x = sorted(x)
for e in sorted(x) :
... # แบบนี้ได้ sorted(x) คืนลิสต์ที่เรียงแล้ว
มการ หรอเพิม อม ิสต์ระหวาง x = [1,2,3,3,2,1]
มการ ก ง อม ิสต์ for e in x :
if e%2 == 1 :
x.pop(x.index(e))

หรอ
for i in range(len(x)) :
if x[i]%2 == 1 :
x.pop(i)

ะ ม ตาม คา ะเกิ อ ิ พ า ระหวางการ างา ว อง


ควร ชการสราง สิ ต์ชวคราวกอ วคอ าก ส สิ ต์เ มิ
t = []
for e in x :
if e%2 != 1 :
t.append(e)
x[:] = t

หสงเกตวาคาสงส า คอ x[:] = t ะเ x = t เพราะตองการ


เ อม สิ ต์ x หเหมอ t ม ตองการ ห x อางอิง สิ ต์เ วก t

06.1 : List 69
แบบฝึกหัด

Problem Code
ม รร ต ะ รร เก สมาชิก องเวกเตอร์
งเ า ว ริงห า า ว ค ว ชองวาง อา งสอง
รร เก สิ ต์ v1 ะ v2
คา วณ องเวกเตอร์ v1 ก v2
ส งคาวา Error า v1 ะ v2 ม า
มเ าก ต าเ าก ส งคา คา วณ

รร รกเ า ว เตม n ะมอก n รร


ต ะ รร เ า ว เตม า ว
เร ง า า ว เตม ง n ตว าก อ มาก
า ว เตม ง n เร ง าก อ มาก รร
เ วก เร ง าก า วา ค ว ภาค ,

ห ง รร เ ชอ ม ม เก า ว เตม
รร ะ า ว
หาวา า ว เตม ม ราก าก มากส
าม าก มากส ห า ตว หหา กตว
อม กตว ราก าก มากส ม
เร งตาม า ราก ม

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 เ า ว วก อ ส า ห ค ออก วเห อค ส า เ ค ง อ ิ า ว างต
► ตวอ าง

nput ากแ น ิม ์ utput ทาง อ า


1 1

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เ า

m = int(input()) ก หา างต ว การ ชคาสง


d = int(input()) k = (k + d) % len(q) เพอคา วณ าก k อก
q = list(range(m))
k = 0 d ชอง กรณ เ าง วา อง ิสต์ การ ว า อง
while len(q) > 1 : ิสต์ ะ ว ก มา าง า เช า ิสต์ม า 4 ตว
k = (k + d) % len(q) ากตา ห ง 3 อก 5 ตา ห งกคอ (3+5) % 4 = 0
q.pop(k)
print(q[0])
สง สmเ 6 dเ 2 เ 0 กตอง
สง สmเ 4 dเ 3 เ 1
อง า องการ างา
0,1,2,3 -> 0,1,2 -> 1,2 -> 1 กตอง

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

รูปแบบการปร มวลผลลิสต์ ้อนลิสต์ท่ บบ่อย


ช ิสต์ อ สิ ต์ การเก สิ ต์ อง ช สิ ต์ อ สิ ต์เก อม องวงก มห า วง สิ ต์ าง คอ า ว สาม า ว
อม อม ต ะตวเ สิ ต์ พิก x, y ะรศม องวงก ม เช
เก อม อ า ว เ า ก [[0.0, 0.0, 10.0], [1.0, 5.0, 3.0]]

ร กรม าง าง อา อม วงก ม าก มมาเก ิสต์


circles = []
file1 = open('c:/temp/circles.txt')
for line in file1 :
x,y,r = line.split()
circles.append( [float(x),float(y),float(r)] )

าง าง หาวงก ม ม หรอ ตะวงก มอ เ


free = []
for i in range(len(circles)) :
for j in range(i+1,len(circles)) :
dx = circles[i][0] - circles[j][0]
dy = circles[i][1] - circles[j][1]
sumr = circles[i][2] + circles[j][2]
if dx**2 + dy**2 <= sumr**2 : break
else :
free.append(circles[i])

for c in free :
print(c)

06.2 : Nested List 75


ช ิสต์ อ ิสต์ สรางเม ริก ์ ตวอ างการหา วก องเม ริก ์ A ก B
าตองการเม ริก ์ า m × n ก
สราง ิสต์ A len(A) มคาเ าก A = [ [1,2], [1,1] ]
B = [ [0,1], [4,3] ]
m า ว ว ะ C = []
len(A[0]) = len(A[1]) for i in range(len(A)) :
= ... = len(A[m-1]) = n C.append([0]*len(A[i]))
for j in range(len(A[i])) :
า ว คอ ม ์ เช สรางเม ริก ์ C[i][j] = A[i][j] + B[i][j]
มคา 0 หม า
A = []
for k in range(5):
A.append( [0]*3 )

ช ิสต์ อ ิสต์ สิ ต์ าง เก ช ิสต์ อ ิสต์ เก อม ระกอ ว username ชอง 0 ะ ิสต์ อง


อม ม าเ ตองม า เ าก usernames รา อ อติ ตาม าวสาร ชอง 1 ิสต์ ม าเ ตองม
า คงตว ตวอ าง อ ตงสามช เช
f = [ ['noon',['pat','koi']], ['wii',['noon','koi']],
['pat',['koi','noon','wii']], ['koi',[]] ]

ตองการหาวา username มค ติ ตามเ า ว มากส


maxindex = 0
for k in range(1,len(f)) :
if len(f[k][1]) > len(f[maxindex][1]) :
maxindex = k
print(f[maxindex][0],'has max.# of followers :', \
', '.join(f[maxindex][1]))

หรอเ
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))

76 06.2 : Nested List


ช ิสต์ อ ิสต์เ เก อม ากตวอ างกอ ห า เมอม f ว าตองการเร ง า usernames
ชวคราวเพอ า sort ตาม งห า ตาม า ว ติ ตาม ก ช
อกาห ตองการ สราง ิสต์ c = []
าง หมสมาชิกตว รกเ เกณ ์ for [username,followers] in f :
c.append([len(followers),username])
ช การ sort c.sort()
for [x,username] in c :
หมา เหต การ sort ิสต์ อ ิสต์ print(username)
ะเ ร เ ความ อ กวา อง ากตวอ าง
อม อง ิสต์ าง ะตว าก า f = [ ['noon',['pat','koi']], ['wii',['noon','koi']],
วา เช ['pat',['koi','noon','wii']], ['koi',[]] ]
x=[[3,2],[3,1],[9],[2,5],[3]] ะ c = [[2,'noon'],[2,'wii'],[3,'pat'],[0,'koi']]
x.sort() ะ x เ เ c.sort() [[0,'koi'],[2,'noon'],[2,'wii'],[3,'pat']]
[[2,5],[3],[3,1],[3,2],[9]] หากตองการ ห sort ว เกณ ์ อ เช หเร งตาม า ว ติ ตาม
คอ าก อ มาก ะ กรณ า ว ติ ตามเ าก หเร งตาม username
[2,5] < [3] < [3,1] < ... าก อ มากเช ก ตองการ งสอง อม อ ิสต์เร ง อ
มาก สามาร ช sort() เ ต าเ เ หเร งตาม า ว ติ ตาม
ากมาก อ สาหร กรณ า ว ติ ตามเ าก หเร งตาม username
าก อ มาก กอา ชก วิ เ ก อ เช ติ า ว ตองการเร ง ากมาก
อ การเร งเ าก อ มาก กคอเร งเ วก ากมาก อ
c = []
for [username,followers] in f :
c.append([-len(followers),username])
c.sort()

ากตวอ าง
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']]

เรื่องผิดบ่อย

การเพิม ิสต์ อ a เ า ิสต์ ห x x = [[2,3],[3,4]]


ตอง ช x.append(a) ม ช มา ากการ append [2,3] ก [3,4] เ าx
x = x + a หรอ x += a x = []
x.append( [2,3] )
x.append( [3,4] )
ต มเหมอ คาสง าง าง
x = []
x = x + [2,3] + [3,4] # ได้ [2,3,3,4]

06.2 : Nested List 77


อ าสราง ิสต์ อ ิสต์ ว * ตองการสรางเม ริก ์ ว สิ ต์ อ สิ ต์ ม า มคาเ 0 หม
อ าเ [a]*n เมอ a เ ิสต์ x = [ [0,0,0] ] * 3
print(x) ะ [[0,0,0],[0,0,0],[0,0,0]]
ต ิสต์ าง งสามตว คอ ิสต์ตวเ วก าสง x[0][1] = 1 างา
x ะเ เ [[0,1,0],[0,1,0],[0,1,0]]
ช x = [[0]*3]*3 ก ก าง เหมอ ก
เราตองสราง ิสต์ าง หเ ค ะตว เ
x = [[0,0,0],[0,0,0],[0,0,0]]
หรอ ชวงว สราง
n = 3
x = []
for i in range(n) :
x.append( [0]*n )
สร คอ เมอ เ [a]*n ตองระวง า a เ ิสต์ ห ชวงว สราง

แบบฝึกหัด
Problem Code
รร รกม า ว เตม r ก c ตาม ว อก
r รร ต ะ รร ม า ว เตม c ตว
สรางเม ริก ์ ว ิสต์ อ ิสต์ าม รร
ม อม ม ช c ตว ห ส ง เ ิสต์ อ ิสต์วาง [[]]
เม ริก ์ ิสต์ อ ิสต์ สราง

ห ง รร เ ชอ ม ม มห า รร เ าก
า ว username ต ะ รร ระกอ ว username
ตาม ว usernames อ ติ ตาม าวสาร อง
username รกต รร เช
noon pat koi
wii noon
pat koi noon wii
koi

สราง ิสต์ อ ิสต์ มร ตามตวอ าง


f = [['noon',['pat','koi']],
['wii', ['noon']],
['pat', ['koi','noon','wii']],
['koi', []] ]
ิสต์ สราง

78 06.2 : Nested List


Problem Code
าก f มา อ ว
ตองการรวา คร าง มม ครติ ตามเ
รา ชอ อง มม ครติ ตามเ

รร รกม า ว เตม n ะอก n รร


ตามมาเ สตริง
เร ง า สตริง อา เ ามา าก อ มาก
ตามความ าวสตริง าสตริง าวเ าก หเร งตาม
ตวสตริงเอง เช 'xyz','xy','abc' เร ง ว
'xy','abc','xyz'
สตริง เร ง ว รร ะสตริง

ตัวอย่างการแก้โจทย์ปัญหา

เรยงตาม แนนรวม
งเ ร กรมร รหส กเร ะรา การ องคะ การสอ อ ตาง อง กเร า ว ห ง มา ระมว เพอ
ส งรหส กเร ะคะ รวมตาม า คะ รวม ากมาก อ
► อม าเ า
รร รกม า ว เตม วก n ก m ค ว ชองวาง n คอ า ว กเร ะ m คอ า ว การสอ อ อง กเร ต ะค
n รร ตอมา ต ะ รร ระกอ ว รหส กเร ตาม ว รา การ องคะ อ ค ว ชองวาง
► อม สงออก
าม รร า ว คะ อ มตรงก mหรว รวมรหส กเร มา ส งตามตวอ าง เร งตาม ร าก อม าเ า
า ก รร มคะ คร า ว กค ห ส งรหส กเร ตาม ว คะ รวม อง กเร รร ะค เร ง า ตาม
คะ รวม ากมาก อ กรณ มคะ รวมเ าก หเร งตามรหส กเร าก อ มาก
► ตวอ าง

nput ากแ น ิม ์ utput ทาง อ า


3 2 B 9.0
A 3.0 2.0 A 5.0
B 4.0 5.0 C 5.0
C 2.0 3.0

3 3 Invalid data:
AA 4.0 AA
B 9.0 8.0 7.0 AC
AC 8.0 5.0

06.2 : Nested List 79


วั อย่างการเขียนโ รแกรม
อเก อม ิสต์ ิสต์ อ ิสต์ ิสต์ าง ต ะ ิสต์เก รหส กเร ชอง 0 ตาม ว คะ ตง ตชอง 1 ง m
[ [รหส กเร , คะ , ..., คะ ], [รหส กเร , คะ , ..., คะ ], ... ]
อ งการ ระมว เ ตอ ะ ง
1. อา อม าเ าเก เ ิสต์ อ ิสต์ เ อง าก อม เ ามา รหสเ สตริง สว คะ ตองการเก เ า ว ริง
ต อเริม ว การอา เ ามาเ สตริง หหม กอ า ช อม าเ า องตวอ าง สอง
d0 = [['AA','4.0'],['B','9.0','8.0','7.0'],['AC','8.0','5.0']]
2. า d0 มาหาวารหส กเร ม า ว คะ มเ าก า ว กาห ห ตวอ าง สองระ วาตองม อ
err = ['AA','AC']
า err ม า เกิ ก ส งวาม ิ ง ส ง Invalid data ตาม ว รหส กเร เก err
0
4. า err ม า เ 0 คอ ม ิ เ ระมว ตอ คราว อ ช อม ากตวอ าง รก เพราะ มม ิ
d0 = [['A','3.0','2.0'], ['B','4.0','5.0'], ['C','2.0','3.0']] ะ err = []
4.1. า d0 าก ตอ วเ คะ หเ า ว ริง วหา รวม ามาเก คก รหส กเร
d1 = [[5.0,'A'], [9.0,'B'], [5.0,'C']]
4.2. เร ง า อม d1 ตาม ์ คอคะ รวม ากมาก อ าคะ รวมเ าก เร งตามรหส
าก อ มาก d1 = [[9.0,'B'], [5.0,'A'], [5.0,'C']]
า อม d1 มา ส งเ พ์

โ รแกรม ค�าอ ิบาย


n,m = [int(e) for e in input().split()] ตอ อา คา n า ว กเร ก m
d0 = list() า ว คะ ตอค ชวงว for ว า ว n รอ
for k in range(n) :
d0.append(input().split()) อา าก พิมพ์ ว split เ ิสต์ องสตริง
เพิม ต ะ ิสต์ เ า ิสต์ d0
สง ส อม ตามตวอ าง สอง ว print(d0)
[['AA','4.0'], [B','9.0','8.0','7.0'],
['AC','8.0','5.0']]

err = list() ตอ า ต ะ ิสต์ x าง ิสต์ d0 าก ตอ


for x in d0 : ว มาตรว า x[1:] ม า มเ าก m คอม
if len(x[1:]) != m :
err.append( x[0] ) า ว คะ มเ าก กาห ะ า x[0] สเพิม ิสต์
if len(err) > 0 : err ห ง ากสรางเสร า err ม า เกิ 0 ก ส ง
print('Invalid data: ') รหส กเร มความ ิ พ า
for sid in err :
print(sid)
สง ส อม ตามตวอ าง สอง
Invalid data:
AA
AC

else : ตอ เ กรณ มคะ คร ง ิสต์ x าง


d1 = list() d0 สว เก คะ งคอ x[1:] มาหา รวม ตอง
for x in d0 :
s = 0 งเ float กอ าก า รวมมาตอก x[0]
for e in x[1:] : ิสต์ อ เก ส ิสต์ หม d1
s += float(e) สง ส อม ตามตวอ าง รก ว print(d1)
d1.append( [s, x[0]] )
[[5.0,'A'], [9.0,'B'], [5.0,'C']]

80 06.2 : Nested List


โ รแกรม ค�าอ ิบาย
for k in range(len(d1)-1) : ตอ ะ ตองการเร ง า ตามคะ รวม
for i in range(len(d1)-1) : ต ชคาสง d1.sort() ม เพราะ ะเร ง อม าก อ
if d1[i][0] < d1[i+1][0] \
or (d1[i][0]==d1[i+1][0] \ มาก สิง ์ตองการคอเร งตามคะ ากมากมา อ
and d1[i][1]>d1[i+1][1]) : ตก ชคาสง d1.sort(reverse=True) ม เพราะ า
d1[i],d1[i+1] = \ กรณ คะ เ าก ะเร งรหส กเร ากมากมา อ
d1[i+1],d1[i]
for [total,sid] in d1 :
ง มตรง ์ตองการ
print( sid, total ) ง อเ การเร ง า เอง ว วิ เร มา
ร คาสงการเ ร เ คอ ะส อม สองตว ติ ก เมอ
• คะ รวม องตว า อ กวาคะ รวม องตว วา
หรอ
• าคะ รวม อง งสองตวเ าก รหส กเร อง
ตว า มากกวารหส กเร องตว วา
เมอเร ง า เสร ก า อม d1 มา ส งตาม ์
กาห สง ส อม ตามตวอ าง รก กตอง
B 9.0
A 5.0
C 5.0

else : สาหร ตอ ง เราอา เ การ เก อม


d1 = list() อง d1 คอ ิสต์ าง ะเ
for x in d0 :
s = 0 [คะ รวม, รหส ิสิต] เ มาเก เ
for e in x[1:] : [-คะ รวม, รหส ิสิต] ว ชคาสง d1.sort()
s += float(e) เพอเร ง อม าก อ มาก เมอคะ รวมมคามาก
d1.append( [-s, x[0]] )
d1.sort()
ติ คะ รวม ะมคา อ ก า เ ตองการเร งคะ รวม
for sumsc,sid in d1 : ากมาก อ ะ าเ าก กเร งรหส ิสิต าก อ
print( sid, -sumsc ) มาก ตามตองการ ตอ ส งคะ รวม กตอง ส งคาติ
องคา เก ว เพราะ เก เ คาติ

องเ ร กรม หม าเราเ การ เก อม าก


[ [รหส กเร คะ ..., คะ ], [รหส กเร คะ ..., คะ ], ... ]

[ [รหส กเร [คะ ..., คะ ] ], [รหส กเร [คะ ..., คะ ] ], ... ]

06.2 : Nested List 81


ดร
Intania 87
วิโรจน์
จิร ั นกุล

ค วามสามาร การเขียนโ รแกรมเ เหมอ พ งวิเศ ชว เพิม ความสามาร การ างา องเรา
มวา ะเ การ ก หา างวิศวกรรม
า าก าเ อ เรา

า ม สาหร วตกร ค
อ การสง หคอมพิวเตอร์ างา
การสอ หคอมพิวเตอร์มความเ ว า ะชว เราต สิ
รวม งการสรางเว หรอ อ เ ระ ช ์ก ค วงกวาง เร ก วาเ ก ะ
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 ]

filter: เ อก อม าก ิสต์ห งมา สอก ส ิ ต์ เช filter:


สราง ิสต์ b เก สตริง าก สิ ต์ a เ พาะตว าวเกิ 5
b = []
for e in a :
if len(e) > 5 :
b.append( e ) b = [e for e in a if len(e)>5]

map & filter: สมการ ระมว สอง เช map & filter:


า อม ความสง เ วิ เกิ 10 ิสต์ a มา ง
เ เ ติเมตรเก ส ิสต์ b
b = []
for e in a :
if e > 10 :
b = [2.54*e for e in a if e>10]
b.append( 2.54*e )

สราง สิ ต์ มการ ก ง ว ห า วงว อ ก ก เช


เ อก า ว เตม มคาระหวาง 0 ง 20 สองตว ม รวม
เ าก คณ
c = []
for a in range(0,21) :
c = [[a,b] for a in range(0,21) \
for b in range(a,21) :
for b in range(a,21) \
if a+b == a*b :
if a+b == a*b ]
c.append( [a,b] )

ตัวอย่าง
x = [e for e in a] เหมอ ก x = list(a)
ิสต์ x เ ิสต์ หมมคาภา เหมอ ก อง a x ก a เ ิสต์ค ะตวก ตมคาเหมอ ก
ต าเ x = a ะ x ก a เ ิสต์เ วก การเ คา ิสต์ x ะ า ห a เ ว
หรอการเ คา ิสต์ a กเ x เช ก

06.3 : List Comprehension 83


x = [int(e) for e in input().split()]
อา สตริง าก พิมพ์ ว input() กออกเ สิ ต์ องสตริง ว split()
า ต ะสตริง ิสต์มาเ เ า ว เตม เก ส ิสต์ x
t = ','.join( [str(e) for e in x] )
ช สราง ิสต์ องสตริง า อม าก ิสต์ x มา ง วสง พ์ join ก อก
c = sum( [ 1 for e in x if e%2 == 0 ] )
วา ิสต์ x ม า ว คกตว สราง ิสต์ เพิมเ 1 กครง พ า ว ค ิสต์ x วกหา รวม ว sum

b = [ (1 if x[i] >= 0 else -1) for i in range(len(x)) ]


หสงเกตการ ชคาสง (1 if x[i] >= 0 else -1) เ 1 า x[i] >= 0 มเช เ -1
งเ การสราง ิสต์ b ห b[i] = 1 า x[i] >= 0 มเช ห b[i] = -1
x = [ [e for e in range(3)] for k in range(4) ] เหมอ
x = [ list(range(3)) for k in range(4) ] เหมอ
x = [ [0,1,2], [0,1,2], [0,1,2], [0,1,2] ] เหมอ
x = [ [0,1,2] for k in range(4) ] เหมอ ร าง าง าง า ต มเหมอ ก
x = [ [0,1,2] ] * 4 คอร าง าง าง วา
ห งส กตรง x[0], x[1], x[2] ะ x[3] คอ ิสต์ตวเ วก หม า า x[0][0] = 9
ะ x มคาเ [[9,1,2],[9,1,2],[9,1,2]] ณะ อ ิสต์ าง เ ค ะตวก หม

x = [ [0,1,2] ] * 4

a = [ [x**2+y**2, x, y] for [x,y] in data ]


a.sort()
d = [ [x,y] for [s,x,y] in a ]
data เ ิสต์ อ ิสต์ ิสต์ภา ต ะตวเก พิก x ก y
ตองการเร ง า เห า ตามระ ะหาง อง ง กาเ ิ าก อ มาก
สราง ิสต์ อ ิสต์ชวคราว a ม ิสต์ภา เก ระ ะหาง ตาม ว พิก x ก y
าก sort ิสต์ชวคราว งคอการเร ง า ตามระ ะหาง าก อ มาก
า ว การ ช ห ิ อม ตาม า a มาสราง ิสต์ หม ม ตพิก x, y เก ส d

84 06.3 : List Comprehension


เรื่องผิดบ่อย

มควร ช เพอ ห างา มควรเ [print(k) for k in range(5)]


วงว ต ม า ากการสราง ิสต์ ว ง มวา ะ ส งคา 0 1 2 3 4 รร ะคา ตามตองการ
ชงา เ เ อง ากมการสราง ิสต์ ว ม ช เส เว าเ า หรอเ
[t.append(e) for e in x if e not in t]
เพอ า อม x ม ราก t เพิม t
ะเกิ การสราง ิสต์ [None, None, ...] ว ิง
ควรเ วงว กติ
for e in x :
if e not in t :
t.append(e)

อ า าคา องตว ร for อง x = [e for e in range(10)]


มา ชงา อกคาสง print(e) # ผิด เพราะ e ไม่มีค่า
อา า หส ส ต าเ
x = []
for e in range(10) :
x.append(e)
print(e) # ได้ 9
ตา
e = 99
x = [e for e in range(10)]
print(e) # ได้ 99

แบบฝึกหัด
oble o e
Input ม ิสต์ x เก สตริง ะตว ร c เก ตวอก ร
Process สราง ิสต์ d เก า ว ครง ตวอก ร c ราก
ต ะสตริง อง ิสต์ x
เช x = ['abba','babana','ann']; c = 'a'
ะ d = [2,3,1]
Input ิสต์ x เก า ว เตม
Process า ว เตม x กตว ติ

06.3 : List Comprehension 85


oble o e
Input: x เ
Process หา รวม อง า ว เตม x

Input ร ห ง รร ม า ว เตมห า า ว ค ว ชองวาง


าก พิมพ์
Process หาวา ร มาม า ว ติ ก า ว

Input ร อความห ง รร าก พิมพ์


Process ต อก ระ กตว อความ ร มา ม ชพ ช ะภา าองก

Input ร ห ง รร ม า ว เตมห า า ว ค ว ชองวาง ช ห ง


เก ส ิสต์ x ะร อกห ง รร เก ส ิสต์ y า องเ วก
ิสต์ งสองม า ว อม เ าก
Process สราง ิสต์ z z[i] มคาเ าก x[i]+y[i]

Input เม ริก ์ m ว
Process ง m หก า เ เช าก
m = [[1,2,3],[4,5,6]] กาเ [1,2,3,4,5,6]

Input ร ห ง รร ม า ว เตมห า า ว ค ว ชองวาง


เก ส ิสต์ x
Process สราง ิสต์ หม าก อม x ต มมตว า
1. เร ง า อม x าก อ มาก
2. สราง ิสต์ หม า อม ิสต์ตว ติ ก มาพิ ารณา าก
า วา าคา องตวติ ก ตว า มเ าก ตว วา ห า
ตว า เก ส ิสต์ หม
3. าตว วาส x เพิมตอ า ิสต์ หม
ิสต์ หม ก ะเก อม x มมตว า

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
...

เรอ ตรา เ า ง มเกิ n-1 คอ


เพิมคา 2k,3k,4k,5k,... มเกิ n-1 x
รคา k = 2,3,4,...,N//2-1
าก สราง ิสต์ หม c อม าก x ต มมตว า
ชวิ เ อ ว

86 06.3 : List Comprehension


oble o e
Input ร า ว เตม n
Process สราง ิสต์ เก า ว เ พาะ มคา อ กวา n
1. สราง ิสต์ เก า ว ระกอ มคา อ กวา n
2. สราง ิสต์ เก า ว เตม าก 2 ง n-1 ต มเอา
า ว ระกอ สราง ว ตอ 1

ตัวอย่างการแก้โจทย์ปัญหา

เรยงตาม แนนรวม
อ ช หาเร งคะ รวม หว อ ิสต์ อ ิสต์ มาเ ตวอ าง า ร กรม เ ว มา ร รง ช

ัวอย่างการเขียนโ รแกรม
โ รแกรมเดิม โ รแกรม รับ รุงแบบ ้ 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 )

06.3 : List Comprehension 87


ตัวอย่างโจทย์ปัญหา

์ อ ห ิสิตเ ร กรมร ช ตวเ า ว เตมช ห ง ง ะ ว เ มคาติ าก ห ส ง


ช ตวเ หม มรวมตวเ ติ สมาชิก ต ะตวมคาเ าก คาเ ิมรวมก คา ติ
► อม าเ า
เ ช องตวเ ต ะ รร ะ ระกอ ว ตวเ า ว เตม มติ า ว ะ รร ส า ะ ว ตวเ า ว เตม
มคาติ ร ระก วา ะมตวเ า ว เตม มติ อ าง อ า ว
► อม สงออก
ห ส งช ตวเ หม มรวมตวเ ติ สมาชิก ต ะตวมคาเ าก คาเ มิ รวมก คา ติ ส ง รร ะ า ว
► ตวอ าง
nput ากแ น ิม ์ utput ทาง อ า
1 -4
10 5
2 -3
-5

100 99
0 -1
-1

3 0
-3

88 06.3 : List Comprehension


านวณหา
งเ ร กรมเพอคา วณหา องรหส ิสิต กาห เมอเร ง า ตามคะ คอมคะ มาก ส
► อม าเ า
ต ะ รร ะระ อม ิสิต ต ะค ระกอ ว รหส ิสิต ตาม ว คะ เ เ ศ ิ ม
รร ส า ระ รหส ิสิต ตองการคา วณหา
การคา วณ หากม ิสิต คะ เ าก หเร ง า ตามรหส ิสิต เร ง า ว เตม
► อม สงออก
ม รร เ ว ส ง อง ิสิต ตองการค หา หาก มพ รหส ิสิต งก าว ห ส งวา Not Found
► ตวอ าง
nput ากแ น ิม ์ utput ทาง อ า
5931111121 87.25 4
5932222221 77.00
5933333321 82.50
5934444421 69.75
5935555521 66.00
5934444421

111 100 5
13 96
1234 96
555 99
2121 96
99 99
1234

429801 78 Not Found


359124 89
902316 91.25
773842 45.75
264336

06.3 : List Comprehension 89


วาม ่เกิน ร่ง
หเ ร กรมเพอหา อม มความ มากกวาครงห ง อง า ว อม งหม ร เ ามา อา คา า ว เตม
กระ งพ
► อม าเ า
หอา อม า ว เตม รร ะ า ว กระ งพ คา
► อม สงออก
ม รร เ ว ส ง อม มความ มากกวาครงห ง อง อม งหม มรวม า มม อม มความ มากกวาครงห งเ
ห ส ง Not found
► ตวอ าง
nput ากแ น ิม ์ utput ทาง อ า
4 Not found
5
5
10
-1

4 5
5
5
-1

10 5
5
5
3
5
-1

2 Not found
4
2
4
2
4
-1

90 06.3 : List Comprehension


07 : Tuple, Dictionary and Set

สรุปเนื้อหา
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 my_tuple[0] ได้ 1


my_tuple[1:3] ได้ (2.5, 3)
my_tuple[-2:-1] ได้ (3,)

เครองหมา + ชตอ tuple a = (2, 3, 5)


เครองหมา * ชตอ tuple ห า ครง b = (7,)
p = a + b ได้ (2, 3, 5, 7)
q = p*2 ได้ (2, 3, 5, 7, 2, 3, 5, 7)
a += (2,) เหมือนกับเขียน a = a + (2,)
คือน�า a เดิมมาต่อกับ (2,) สร้าง tuple ใหม่
ได้ (2, 3, 5, 2) แล้วให้ค่า tuple นี้กับตัวแปร a
ก อม tuple ม เหมอ สตริง my_tuple[3] = 'B' ผิด
าตองการเ ตองต ตอสราง หม
my_tuple = my_tuple[:3] + ('B',) + my_tuple[4:]

ระ ะ งสิง ม ค a,b,c = (1,2,3) ได้ a = 1, b = 2, c = 3


หก า เ tuple เช t = 1,2,3 x,y = 'A','Z' ได้ x = 'A', y = 'Z'
เมอ print(t) (1, 2, 3) a,x = x,a เป็นการสลับค่าในตัวแปร a กับ x

สามาร สราง list อง tuple L = [('A','B'), (1,20,300), (9.9,)] เป็น list ของ tuple
L[1] ได้ (1,20,300)
L[1][2] ได้ 300

07 : Tuple, Dictionary and Set 91


สามาร สราง tuple อง list T = (['A','B'], [1,20,300], [9.9]) เป็น tuple ของ list
T[1] ได้ [1,20,300]
T[1][2] ได้ 300
T เ tuple งเ T[1] = 9 ม
ตเ อง าก T[1] เ สิ ต์ งเ T[1][2] = 9

สามาร สราง tuple อง tuple ก T = ((1,2), (3,4)) เ tuple อง tuple


T[1][0] 3

อ ตกตางระหวาง องสง างา ร กรม าง วา วสงเกตเว าการ างา


tuple1 += (0,) ก list1 += [0] import time
n = 100000
tuple1 += (0,) เหมอ
t0 = time.time()
tuple1 = tuple1 + (0,) list1 = []
ะสราง tuple หม างา ชา for k in range(n):
list1 += [0]
ณะ list1 += [0] print(time.time()-t0)
มเหมอ ก list1 = list1 + [0] t0 = time.time()
ต ะเหมอ ก list1.append(0) tuple1 = tuple()
for k in range(n):
เ การเพิม 0 ตอ า ิสต์ มสราง ิสต์ หม tuple1 += (0,)
ะ างา เรวกวา print(time.time()-t0)

Dictionary
ชเก อม คอ (key, value)
มม key าก ห ง key ม value คก เพ งคาเ ว ต value อา เ list, tuple, ... เก อม อ
าเราม key ะสามาร หา value คก key เรวมาก

การสราง dict า ห า dict1 = {} หรอ dict1 = dict()

อา ะระ อม ตองการเก ว ก เ การสราง dict วาง


dict2 = {'Name':'Tom', 'Age':39}

เ การสราง dict เก คอ ('Name','Tom') ะ ('Age',39)


สามาร เร ก ช ก ะเพิม value D = {'Name':'Sarah'}

การอาง ง ว key print(D['Name']) ได้ Sarah


D['Age'] = 20 เป็นการเพิม่ ข้อมูล ('Age',20)
D['Name'] = 'Somsri' เป็นการแก้ขอ้ มูลให้เป็น ('Name','Somsri')

92 07 : Tuple, Dictionary and Set


key อง dict อา เ า ว เตม my_dict = {}
my_dict[1] = 8.00
า ว ริง สตริง หรอ tuple ก my_dict[3.75] = [3, 7, 5]
ตหามเ list, dict หรอ set สว my_dict['Hello'] = 'World'
my_dict[(2,99)] = 999
value คก key ะเ ระเภ ก my_dict[[1,2,3]] = '123' ผิด ห้ามใช้ list เป็น key
ม ริการ keys(), values(), d = {1:7, 2:8, 3:9}

items() ง ชก for...in for e in d : แจกแจงแต่ละ key ของ d ให้กับ e


for e in d.keys() แจกแจงแต่ละ key ของ d ให้กับ e
for e in d.values() แจกแจงแต่ละ value ของ d ให้กับ e
for e in d.items() แจกแจงแต่ละคู่ข้อมูลของ d เป็น
tuple ให้กับ e

e[0] คือ key, e[1] คือ value

for k,v in d.items() แจกแจง key, value ของ d

ให้กับ 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'}

ม key ออก า มม key อ x = C.pop(1) ได้ x = 'one', C = {2:'two', 3:'three'}

ะเกิ error y = C.pop(4) เกิด error


การ ช เพอตรว สอ วาม key หรอ
in D = {1: 'one', 2: 'two', 3: 'three'}

value หรอ ค (key,value) x = 1 in D ได้ x = True

dict อ หรอ ม การตรว value y = 4 in D.keys() ได้ y = False

ะ มเรวเ าก อกสองกรณ z = 'two' in D.values() ได้ z = True

w = (2,'two') in D.items() ได้ w = True


การค keys ะ items เรวมาก ตการค values มเรวเ า

07 : Tuple, Dictionary and Set 93


Set
• เหมือนกับเซตทางคณิตศาสตร์ เซตไม่เก็บข้อมูลซ�า้ สามารถ union, intersect ได้
• เหมือนกับ dict แบบที่เก็บแค่ key ไม่มี value (เพราะ key ไม่ซ�้ากัน)
• การค้นด้วย in สามารถท�าได้เร็วมาก ๆ

การสร้างเซต สามารถสร้างเซตจากข้อมูล set_1 = set() ได้เซตว่ำง


ใน string, tuple, list, set หรือ set_2 = {1, 2, 3} ได้เซตที่มีสมำชิกเป็น 1, 2, 3
dict ได้ set_3 = set('Hello') ได้เซต {'H','e','l','o'}
set_4 = set(['oh', 'no']) ได้เซต {'oh', 'no'}
set_5 = set(set_2) ได้เซตใหม่มีสมำชิก
เหมือนของ set_2
set_6 = set({1:2, 3:4}) ได้เซตของ key ของ dict
คือ {1,3}
บริการ add(e) ใช้เพิ่มข้อมูล 1 ตัว S = {1}

ถ้าเพิ่มตัวที่ซ�้ากับที่มีอยู่ใน set ก็ไม่เพิ่มให้ S.add((2, 3)) ได้ {1, (2, 3)}

S.add('Hello') ได้ {1, (2, 3), 'Hello'}

บริการ update(t) ใช้เพิ่มข้อมูลที่แจกแจง S = {1}

ได้จาก t ที่เป็นกลุ่มข้อมูล ซึ่งเป็นได้ทั้ง S.update([2, 3]) ได้ {1,2,3}


string, tuple, list, set และ S.update('Hello') ได้ {1,2,3,'H','e','l','o'}
dict (ในกรณีของ dict จะเพิ่ม key) S.update(6) เกิด error
ค�าสั่ง s.update(t) ท�างานเหมือนค�าสั่ง
for e in t :
s.add(e)

การใช้ e in S เพื่อตรวจสอบความเป็น S = {1, 2, 3, 'H', 'e', 'l', 'o'}

สมาชิกของ e ในเซต S x = 1 in S ได้ x = True

y = 'h' in S ได้ y = False

บริการ remove(e) และ discard(e) S = {1, 2, 3, 'H', 'e', 'l', 'o'}

เพื่อลบข้อมูล ถ้าไม่มีข้อมูลที่ต้องการจะลบ S.discard(1) เหลือ {2, 3, 'H', 'e', 'l', 'o'}

remove() จะเกิด error S.discard(4) เหลือเท่ำเดิม ไม่เกิด error


ดังนั้นควรใช้ discard() S.remove('e') เหลือ {2, 3, 'H', 'l', 'o'}
S.remove('h') เกิด error เพรำะไม่เจอ 'h'

94 07 : Tuple, Dictionary and Set


การด�าเนินการของ set a = {1, 2, 3}
b = {2, 3, 4}
union() หรือใช้สัญลักษณ์ |
c = a.union(b) หรือ c = a | b
intersection() หรือใช้สัญลักษณ์ &
ได้ c = {1, 2, 3, 4}
difference() หรือใช้สัญลักษณ์ – c = a.intersection(b) หรือ c = a & b

(A B) – (A B) หรือใช้สัญลักษณ์ ^ ได้ c = {2, 3}

c = a.difference(b) หรือ c = a - b
โดยเซตที่มากระท�ากัน จะไม่เปลี่ยนแปลง
ได้ c = {1}

c = b.difference(a) หรือ c = b - a

ได้ c = {4}

c = a ^ b ได้ c = {1, 4}

บริการ issubset() และ a = {1, 2, 3}


b = {1, 2}
issuperset() ใช้ตรวจสอบความเป็น
a.issubset(b) ได้ False
subset และ superset
b.issubset(a) ได้ True

a.issuperset(b) ได้ True

b.issuperset(a) ได้ False

07 : Tuple, Dictionary and Set 95


สรุปการใช้งาน list, tuple, dict, set
• ใช้คา� สั่ง len, sum, max, min, in ได้ทั้งหมด
• ใช้ x = sorted(q) ได้ โดยที่ q เป็นได้ทั้ง list, tuple, dict, set

ผลที่ได้เป็น list ที่น�าข้อมูลที่แจกแจงได้จาก q ไปเรียงล�าดับ

list tuple dict set


การ ล�าดับมีความหมาย ล�าดับมีความหมาย เก็บคู่ลา� ดับ เก็บข้อมูลไม่ซ�้า
ใช้งาน สร้างแล้วแก้ไขได้ สร้างแล้วแก้ไขไม่ได้ (key, value) ไม่สนล�าดับ สามารถใช้
key ไม่ซ�้า, ไม่สนล�าดับ set operation ได้
ประเภท อะไรก็ได้ อะไรก็ได้ key เป็น int, int, float,
float, str, str, tuple,
ข้อมูลที่ bool
tuple, bool
เก็บ ส่วน value เป็นอะไรก็ได้
การ ใช้จา� นวนเต็มระบุ ใช้จ�านวนเต็มระบุ ใช้ key ระบุต�าแหน่ง ไม่มี
เข้าถึง ต�าแหน่งหรือช่วง ต�าแหน่งหรือช่วง d[key]

ข้อมูล x[i] t[i] ได้ value ที่คู่กัน


x[a:b:c] t[a:b:c] ไม่มีแบบรับ value
แล้วได้ key
การ for e in x for e in t for k in d for e in s
for k in d.keys()
แจกแจง for v in d.values()
ข้อมูล for k,v in d.items()

ได้ล�าดับจากซ้ายไปขวา ได้ล�าดับจากซ้ายไปขวา ได้ล�าดับไม่แน่นอน ได้ล�าดับไม่แน่นอน


การค้น ค้นจากซ้ายไปขวา (ช้า) ค้นจากซ้ายไปขวา (ช้า) ค้น key เร็วมาก ค้นข้อมูลเร็วมาก
ด้วย in, ใช้ x.index(e) หา ใช้ x.index(e) หา
not in index ของ e ใน x index ของ e ใน x

96 07 : Tuple, Dictionary and Set


list tuple dict set
การสร้าง x = [1,2,3,4] t = (1, 2, 3, 4) d = {'k1':1,'k2':2} s = {1, 2, 3, 4}
x = list() t = (5,) d = dict() s = set()
x = [] t = tuple() d = {}
x = list(q) t = () s = set(q)
t = tuple(q)
เมื่อ q เป็นสิ่งที่ใช้กับ เมื่อ q เป็นสิ่งที่ใช้กับ
เมื่อ q เป็นสิ่งที่ใช้กับ for in ได้
for in ได้
for in ได้

ใช้ x = list(x1) ใช้ t = t1 ได้ ใช้ d = dict(d1) ใช้ s = set(s1)


เมือ่ x1 เป็น list เมื่อ t1 เป็น tuple เมือ่ d1 เป็น dict เมือ่ s1 เป็น set
ไม่ควรเขียน x = x1 เพราะ tuple ไม่ควรเขียน d = d1 ไม่ควรเขียน s = s1
จะเป็น list ตัวเดียวกัน ไม่เปลี่ยนค่า จะเป็น dict ตัวเดียวกัน จะเป็น set ตัวเดียวกัน
การเพิ่ม x.append(9) ต้องสร้างตัวใหม่ d['k3'] = 9 s.add(9)
x.insert(1,9) t=t + (9,) d.update({'k3':9}) s.update({9})
ข้อมูล t=t[:1]+(9,)+t[1:]

การลบ x.pop(2) ต้องสร้างตัวใหม่ d.pop('k3') s.discard(99)


t = t[:2] + t[3:]
ข้อมูล
การแก้ไข x[2] = 7 ต้องสร้างตัวใหม่ d['k3'] = 7 ต้องลบแล้วเพิ่ม
t=t[:2]+(7,)+t[3:]
ข้อมูล

การใช้ tuple, dict, set ที่พบบ่อย


ใช้ dict เพื่อจับคู่ข้อมูล หรือสร้างความ month = {'JAN':1, 'FEB':2, 'MAR':3}

สัมพันธ์ระหว่างคู่ข้อมูล key กับ value ใช้ month[k] เพื่อขอเลขเดือนจากชื่อย่อเดือนที่เก็บในตัวแปร k


โดยหวังจะขอ value จากค่า key num2en = {11:'eleven', 2:'two', 3:'three'}
ใช้ num2en[a] เพื่อขอค�าภาษาอังกฤษจากจ�านวนเต็มในตัวแปร a
ใช้ set เพื่อเก็บกลุ่มข้อมูลที่ไม่ซ�้า ต้องการ ต้องการหาจ�านวนประกอบที่มีค่า ระหว่าง 2 ถึง 12
n = 13; c = set()
ค้นข้อมูลว่ามีอยู่หรือไม่ในเซตอย่างรวดเร็ว for i in range(2, n//2) :
หรือต้องการบริการ intersection, for j in range(2*i, n, i) :
c.add(j) # มีกำรเพิม
่ j ทีซ่ ำ�้ กัน แต่ add ไม่เพิม่ ข้อมูลซ�ำ้
union, issubset และอื่น ๆ ของ set # c = {4, 6, 8, 9, 10, 12}

07 : Tuple, Dictionary and Set 97


ใช้ tuple เมื่อต้องการเก็บข้อมูลมีลา� ดับ มีพกิ ดั x, y, z จ�านวนหนึง่ ทีต่ อ้ งเก็บ ถ้าต้องการหา z จาก x,y ที่
คล้าย list แต่มั่นใจว่าหลังสร้างแล้วจะ ก�าหนดให้บอ่ ย ๆ ก็ไม่ควรเก็บเป็น list of tuples (x,y,z) เช่น
ไม่เปลี่ยนค่าภายใน tuple ประหยัด d = [ (1,1,3), (2,1,8), (3,1,2) ]

หน่วยความจ�า แบบนีก้ ารหา z จาก x,y ก็ตอ้ งเป็น


for a,b,z in d :
if x == a and y == b :
ใช้ค�าสั่ง t1 = t2 ได้โดยไม่ต้องห่วงเรื่อง print('z =', z)
break
การใช้ tuple ร่วมกัน (เพราะค่าภายใน else:
เปลี่ยนไม่ได้) และสามารถใช้เป็น key ของ print('Not Found')

dict และเป็นข้อมูลที่เก็บใน set ได้ ควรใช้ dict {(x,y):z} เช่น d={(1,1):3,(2,1):8,(3,1):2}


แบบนี้ การหา z จาก x,y ก็งา่ ยและทีส่ า� คัญคือเร็ว
if (x,y) in d :
print('z =', d[(x,y)])
else :
print('Not Found')

การแจกแจงข้อมูลต่าง ๆ ใน dict d = {1:7, 2:8, 3:9}


for k in d:
print(k)
for k in d.keys():
print(k)
for v in d.values():
print(v)
for k,v in d.items():
print(k,v)

การแจกแจงข้อมูลใน dict เรียงตาม key d = {2:8, 1:8, 3:9}


for k in sorted(d.keys()):
หรือเรียงตาม value จากน้อยไปมาก print(k,d[k])
for v in sorted(d.values()):
print(v)

การรับคู่อันดับข้อมูล แล้วเพิ่มลงใน dict d = {}


n = int(input())
for i in range(n):
k,v = input().split()
d[k] = v

การรับคู่อันดับข้อมูล แล้วเพิ่มลงใน dict ที่ d = {}


n = int(input())
มี value เป็น list หรือ set for i in range(n):
k,v = input().split()
if k not in d:
d[k] = [v] ,
# ถ้ำ d[k] เป็นเซต ใช้ d[k] = {v}
else :
d[k].append(v) # ถ้ำ
d[k] เป็นเซต, ใช้ d[k].add(v)

ข้อควรระวัง : ค�าสั่ง d[k] = [v] ถ้าเขียนเป็น d[k] = list(v)

จะมีปัญหา ถ้า v เป็นสตริง (เพราะอะไร ?)

98 07 : Tuple, Dictionary and Set


สร้างลิสต์ของ tuple เก็บข้อมูลชั่วคราว d เป็น dict ที่ key เป็นรหัสนิสิต ส่วน value เป็นลิสต์ของคะแนน
เพื่อการประมวลผล (เช่น เรียงล�าดับข้อมูล) ต้องการแสดงชื่อเรียงล�าดับตามคะแนนรวมจากน้อยไปมาก
x = [(sum(scores),sid) for sid,scores in d.items()]
t = [sid for sum_scores,sid in sorted(x)]
print('\n'.join(t))

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)

น�าชุดข้อมูลที่อาจมีค่าซ�้ากันมาเพิ่มใส่ set จาก dict c ในข้อที่แล้ว อยากทราบว่ามีรหัสวิชาอะไรบ้างที่มีนิสิตเรียน


แล้วได้ชุดข้อมูลที่ไม่มีค่าซ�้า d = set()
for cids in c.values() :
d.update( cids )

เรื่องผิดบ่อย

ค�าสั่ง a = b โดยที่ b คือ set, dict A = {1:'one', 2:'two', 3:'three', 10:'ten'}


B = A
หรือ list จะท�าให้ a กับ b เป็นตัวแปร B[4] = 'four'
ของที่เก็บข้อมูลที่เดียวกัน ถ้าต้องการเป็น จะเป็นการแก้ทั้ง A และ B เพราะเป็น dict เดียวกัน
คนละตัว แต่เก็บข้อมูลเหมือนกัน ต้องใช้ ถ้าใช้ค�าสั่ง C = dict(A) จะได้ A และ C เป็นคนละ dict กัน
a = set(b) หรือ a = dict(b) แต่มีข้อมูลเหมือนกัน
หรือ a = list(b)
ไม่สามารถใช้ d.sort() เมื่อ d เป็น S = {3, 1, 2}; D = {'A':5, 'C':2, 'B':7}

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]

07 : Tuple, Dictionary and Set 99


tuple ที่มีตัวเดียวต้องมี comma ต่อท้าย my_tuple = (1,) ได้ tuple ทีม่ ตี วั เดียว (สังเกตที่ comma)
my_tuple += (4,) ได้ (1, 4)
my_tuple += 5 ผิด น�ำ 5 ไปรวมกับ tuple ไม่ได้
my_tuple += (5) ผิด เขียน (5) ก็เหมือน 5
not_a_tuple = (1) ได้จ�ำนวนเต็มธรรมดำ
tuple แก้ข้อมูลไม่ได้ my_tuple[3] = 'B' ผิด
tuple ไม่มีบริการ append, insert, ถ้าจะแก้ข้อมูล ต้องสร้างใหม่
add, pop, remove, discard my_tuple = my_tuple[:3] + ('B',) + my_tuple[4:]

การอ้างถึงข้อมูลใน dict ที่ไม่มีมาก่อน D = {'Name':'Tom', 'Age':39}

จะผิด print(D['Gender']) ผิดเพราะอ้างได้แค่ 'Name' และ 'Age'


หรือ ต้องการนับจ�านวนตัวอักษรภาษาอังกฤษแต่ละตัวว่าปรากฏกีค่ รัง้ ในสตริง t
c = dict()
for e in t :
c[e] += 1 # ผิด เพรำะอำจไม่มี key e ใน t
ต้องเปลี่ยนเป็น
for e in t :
if e not in c :
c[e] = 1
else :
c[e] += 1

key ของ dict ห้ามเป็น list, dict my_dict = {}

หรือ set my_dict[[1,2,3]] = 'list' ผิด


เพรำะ [1,2,3] ใช้เป็น key ไม่ได้
การเก็บคู่อันดับใน dict อาจจะไม่เรียง D = {}
D[1] = 1.00; D[2] = 2.00
ล�าดับตามล�าดับการใส่ข้อมูล for k in D.keys():
# อำจได้ 1 แล้ว 2 หรือ 2 แล้ว 1 ก็ได้ ไม่แน่นอน
ใช้วงวนหา key เพื่อให้ได้ value ที่คู่กัน ต้องการหา value ของ key ที่มีค่าเท่ากับ key1 ใน d
ท�าแบบนีไ้ ม่ได้ใช้ความสามารถของ dict เลย ไม่ควรเขียนแบบข้างล่างนี้
for k,v in d.items() : for k in d.keys() :
if k == key1 : if k == key1 :
print('value =', v) print('value =', d[k])
break break
else : else :
print('Not found') print('Not found')

เขียนแบบข้างล่างนี้ง่ายกว่า และเร็วกว่ามาก
if key1 in d :
print( 'value =', d[key1] )
else :
print('Not found')

100 07 : Tuple, Dictionary and Set


วงเล็บปีกกาว่าง คือ dict ไม่ใช่ set x = {} เป็นกำรสร้ำง dict ว่ำง ๆ
การเก็บข้อมูลใน set อาจจะไม่เรียงล�าดับ S = {1, 2}

ตามล�าดับการใส่ข้อมูล print(S) อำจได้ {1, 2} หรือ {2, 1} ก็ได้ ไม่แน่นอน


การสร้างเซตจากสตริง ต่างจากการสร้างเซต set_1 = {'Hello'} ได้เซต {'Hello'}
จากลิสต์ของสตริง set_2 = set('Hello') ได้เซต {'H', 'e', 'l', 'o'}

set_3 = set(['Hello', 'World'])

ได้เซต {'Hello', 'World'}

การเขียน s = set(q) เหมือนการเขียน


s = set()
for e in q :
s.add(e)

ห้ามเก็บ 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}

แต่ค่าของ a = {1, 2, 3} และ b = {2, 3, 4} ไม่เปลี่ยนแปลง


ใช้ index เพื่อเข้าใช้ข้อมูลใน set ไม่ได้ A = {'one', 'two', 'three'}
for i in range(len(A)) :
เพราะข้อมูลใน set ไม่มีล�าดับ ไม่มี index print( A[i] ) แบบนี้ผิด
for...in แทน
ควรใช้
for e in A :
print( e )

แบบฝึกหัด
Problem Code
ลองคิดดูว่าการจะตอบค�าถามแบบนี้ ควรเก็บข้อมูลด้วยอะไร
1) ถามเกรดวิชา comp prog จากรหัสนิสิต
2) มีรายชื่อนิสิตที่ลงทะเบียนเรียนวิชา comp prog เพื่อถามว่านิสิตที่มี
รหัส x ลงทะเบียน comp prog หรือไม่
3) ให้ชื่อภาควิชา แล้วถามว่า มีนิสิตคนใดอยู่ภาควิชานั้นบ้าง
4) ต้องการเก็บข้อมูลรุ่นโทรศัพท์มือถือที่เขาเคยใช้ เรียงจากอดีตจนถึง
ปัจจุบัน ของนิสิตคนหนึ่ง
5) อยากนับว่าหมายเลขโทรศัพท์ส่วนใหญ่ลงท้ายด้วยเลขอะไร

07 : Tuple, Dictionary and Set 101


Problem Code
Input: รับจ�านวนเต็มบวก 1 จ�านวนจากแป้นพิมพ์เก็บใน x
Process: สร้าง tuple ของจ�านวนเต็มคู่ตั้งแต่ 0 และน้อยกว่า x
Output: tuple ที่สร้าง
เช่น รับค่า 10 ให้แสดงผล (0, 2, 4, 6, 8)

Input: รับจ�านวนเต็มบวก 1 จ�านวนจากแป้นพิมพ์ เก็บใน x


Process: สร้าง tuple ของการแยกหลักของ x
Output: tuple ที่สร้าง
เช่น รับค่า 12803 ให้แสดงผล (1, 2, 8, 0, 3)

Input: รับสตริงจากแป้นพิมพ์ เก็บใน x


Process: สร้าง dict แสดงการนับตัวอักษรของ x
Output: dict ที่สร้าง (ไม่สนใจล�าดับที่แสดงผล)
เช่น รับค่า book ให้แสดงผล {'b':1, 'k':1, 'o':2}

Input: รับสตริง 2 บรรทัดจากแป้นพิมพ์ เก็บใน x และ y


Process: สร้าง set ของตัวอักษรใน x และ set ของตัวอักษรใน y
จากนั้นน�ามาหาตัวอักษรที่ปรากฏในทั้งสองสตริง
Output: set ของ ตัวอักษรที่ปรากฏในทั้งสองสตริง (ไม่สนใจล�าดับที่
แสดงผล) เช่น รับค่า book และ bank ให้แสดงผล {'b', 'k'}

102 07 : Tuple, Dictionary and Set


ตัวอย่างการแก้โจทย์ปัญหา

ทะเบียนนิสิต
จงเขียนโปรแกรมรับรายการของข้อมูล ซึ่งประกอบด้วยชื่อของนิสิตและคณะที่นิสิตคนนั้นอยู่ จากนั้นจะก�าหนดชื่อคณะ
มาให้จา� นวนหนึ่ง ให้ตอบว่านิสิตในคณะเหล่านั้นมีชื่ออะไรบ้าง ถ้ามีชื่อซ�้ากัน ให้ตอบเพียงครั้งเดียว
► ข้อมูลน�าเข้า
บรรทัดแรกมีจ�านวนเต็มบวก n คือจ�านวนรายการข้อมูลทั้งหมด
n บรรทัดต่อมา แต่ละบรรทัดประกอบด้วย ชื่อของนิสิตและคณะที่นิสิตอยู่ โดยคั่นด้วยช่องว่าง
บรรทัดสุดท้ายจะเป็นรายชื่อคณะที่ต้องการถาม ถ้ามีหลายชื่อจะคั่นด้วยช่องว่าง
► ข้อมูลส่งออก
แสดงชื่อนิสิตในคณะเหล่านั้น โดยเรียงตามตัวอักษร ให้คั่นแต่ละชื่อด้วยช่องว่าง ถ้ามีชื่อซ�้ากัน ให้ตอบเพียงครั้งเดียว
► ตัวอย่าง

Input (จากแป้นพิมพ์) Output (ทางจอภาพ)


3 Jim Tom
Tom Engineering
Pam Arts
Jim Engineering
Engineering

5 Jim Pam Tom


Tom Engineering
Pam Arts
Jim Engineering
Tom Arts
Jenny Science
Engineering Arts

ตัวอย่างการเขียนโปรแกรม
เนื่องจากโจทย์จะก�าหนดชื่อคณะมาให้ และให้เราหาชื่อนิสิตที่อยู่ในคณะเหล่านั้น ดังนั้นเราควรเก็บข้อมูลโดยใช้ dict
ซึ่งมี key คือชื่อคณะ และ value เป็น set ของชื่อนิสิต (เพราะในแต่ละคณะ มีนิสิตได้หลายคน) ตัวอย่างการเก็บข้อมูล เช่น

{
'Engineering' : {'Tom', 'Jim'},
'Arts' : {'Pam', 'Tom'},
'Science' : {'Jenny'}

07 : Tuple, Dictionary and Set 103


ขอแบ่งการประมวลผลเป็นขั้นตอนทีละขั้นดังนี้
1. อ่านข้อมูลน�าเข้าเก็บเป็น dict
2. รับรายการของชื่อคณะที่ต้องการถาม มาเก็บเป็น list
3. เนื่องจากเราต้องการพิมพ์ชื่อที่ไม่ซา�้ กัน ดังนั้นเราจะใช้ set มาช่วย ให้สร้าง set ค�าตอบเริ่มต้นเป็นเซตว่าง
4. วนลูปทีละคณะที่ต้องการถาม ให้น�าชื่อนิสิตของคณะนั้นไปรวมกับเซตค�าตอบที่มีอยู่เดิม
5. พิมพ์ค�าตอบ โดยเรียงล�าดับชื่อตามตัวอักษร

โปรแกรม ค�าอธิบาย
ขั้นตอนที่ 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)

n = int(input()) แบบที่ถูกต้อง ต้องมีการตรวจสอบก่อนว่า dict ของเรามี


fac2name = {}
key นี้เก็บไว้หรือยัง ถ้ายังไม่มี ให้สร้าง set ขึ้นมาก่อน แต่
for i in range(n): ถ้ามีแล้ว จะสามารถให้ค�าสั่ง add เพิ่มได้
name,fac = input().split()
if fac in fac2name:
fac2name[fac].add(name)
else:
fac2name[fac] = {name}

ขั้นตอนที่ 2
ask_fac = input().split() รับข้อมูลรายชื่อคณะที่ต้องการถาม มาเก็บไว้ใน list ชื่อ
ว่า ask_fac
ขั้นตอนที่ 3
ans_set = {} สร้างเซตค�าตอบเริ่มต้นเป็นเซตว่าง
แต่แบบนี้ผิด เพราะจะได้เป็น dict ว่างแทน
ans_set = set() สร้างแบบนี้ถึงจะได้เซตว่างที่ถูกต้อง

104 07 : Tuple, Dictionary and Set


โปรแกรม ค�าอธิบาย
ขั้นตอนที่ 4
for f in ask_fac: น�าชื่อนิสิตในคณะมาเพิ่มในเซต ans_set แบบ union
ans_set.union(fac2name[f])
แต่แบบนี้ผิด เพราะการใช้ค�าสั่ง union แบบนี้ไม่ได้ท�าให้ค่า
ของ ans_set เปลี่ยนไปด้วย
for f in ask_fac: การใช้ค�าสั่ง union แบบนี้จะท�าให้ค่าใน
ans_set = ans_set.union(fac2name[f])
ans_set เปลี่ยน แต่แบบนี้ยังผิดอยู่ เพราะคณะที่ถามมา

อาจจะไม่มีอยู่ใน dict ของเราก็ได้ ต้องตรวจสอบก่อน


for f in ask_fac: แบบนี้ถูกต้องแล้ว
if f in fac2name:
ans_set = ans_set.union(fac2name[f])

ขั้นตอนที่ 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

07 : Tuple, Dictionary and Set 105


ตัวอย่างโจทย์ปัญหา

Union & Intersection


เขียนโปรแกรมเพื่อหา union และ intersection ของเซตที่ก�าหนด
► ข้อมูลน�าเข้า
บรรทัดแรก ระบุจา� นวนเต็ม n แทนจ�านวนเซต
n บรรทัดถัดมา ระบุเซตของจ�านวนเต็มบรรทัดละ 1 เซต โดยระบุจ�านวนเต็มที่อยู่ในเซต คั่นด้วยช่องว่าง

► ข้อมูลส่งออก
บรรทัดแรก แสดงขนาดของเซตที่เกิดจากการ 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

106 07 : Tuple, Dictionary and Set


อักษรสองตัวหน้าที่พบมากในประเภทของค�าภาษาอังกฤษ
จากข้อมูลค�าศัพท์ภาษาอังกฤษแยกตามประเภทของค�า จงเขียนโปรแกรมเพื่อหาตัวอักษรสองตัวแรกยอดฮิตของค�าศัพท์
ที่เป็นข้อมูลน�าเข้า จ�านวนค�าศัพท์ และรายการค�าศัพท์ที่ขึ้นต้นด้วยอักษรสองตัวแรกยอดฮิตนี้
► ข้อมูลน�าเข้า
บรรทัดแรก บอกจ�านวนรายการข้อมูลที่ต้องอ่านเข้ามา
บรรทัดที่เหลือ เป็นรายการข้อมูล โดยข้อมูลแรกเป็นประเภทของค�าศัพท์ ข้อมูลที่สองเป็นค�าศัพท์ คั่นด้วยเครื่องหมายแท็บ
► ข้อมูลส่งออก
ให้พิมพ์อักษรสองตัวหน้ายอดฮิต จ�านวนค�าศัพท์ และรายการค�าศัพท์ที่ขึ้นต้นด้วยตัวอักษรสองตัวหน้ายอดฮิตนี้ พร้อมประเภทของ
ค�าศัพท์ คั่นด้วยเว้นวรรค โดยเรียงล�าดับค�าตามล�าดับเดียวกันกับข้อมูลน�าเข้า ถ้ามีอักษรสองตัวที่ปรากฏบ่อยมากที่สุดเท่ากัน
ให้เลือกอักษรสองตัวแรกที่มาก่อนเรียงตามพจนานุกรม
► ตัวอย่าง
Input (จากแป้นพิมพ์) Output (ทางจอภาพ)
10 wr
Adjective good 5
Noun goose wrap Verb
Verb wrap write Verb
Verb write wrinkle Noun
Noun wrinkle wreck Noun
Noun wreck wrangler Noun
Noun wrangler
Noun hall
Adjective happy
Noun hobby

6 go
Adjective good 2
Verb wrap good Adjective
Verb write goose Noun
Noun hall
Noun hobby
Noun goose

07 : Tuple, Dictionary and Set 107


ใครเรียนอะไร
ให้อ่านข้อมูลจากแป้นพิมพ์ โดยอ่านข้อมูลเป็นบรรทัด แต่ละบรรทัดมีรหัสนักเรียนคั่นด้วยเว้นวรรค ตามด้วยรหัสวิชา
(อาจมีมากกว่า 1 วิชา) เมื่อพบว่า รหัสนักเรียนเป็น -1 ให้หยุดอ่าน จากนั้นให้อ่านรหัสวิชาสองรหัสวิชา แล้วให้แสดงจ�านวนนักเรียน
ที่เรียนทั้งสองวิชานั้น จ�านวนนักเรียนที่เรียนวิชาเดียวเท่านั้น และจ�านวนนักเรียนทั้งหมดซึ่งเรียนวิชาใดวิชาหนึ่งหรือทั้งสองวิชา
► ข้อมูลน�าเข้า
รหัสนักเรียนคั่นด้วยเว้นวรรค ตามด้วยรหัสวิชา (อาจมีมากกว่า 1 วิชา คั่นด้วยเว้นวรรค)
รับประกันว่าจะไม่มีนักเรียนที่รหัสซ�า้ กัน และนักเรียน 1 คนจะไม่มีรหัสวิชาซ�้ากัน
เมื่อใส่ข้อมูลนักเรียนครบทุกคนแล้ว บรรทัดต่อไปจะเป็นข้อมูล -1
บรรทัดสุดท้ายเป็นรหัสวิชาสองรหัสวิชา คั่นด้วยเว้นวรรค
► ข้อมูลส่งออก
มี 3 จ�านวนคั่นด้วยเว้นวรรค เรียงล�าดับดังนี้
จ�านวนนักเรียนที่เรียนทั้งสองวิชานั้น
จ�านวนนักเรียนที่เรียนวิชาใดวิชาหนึ่งเท่านั้น
จ�านวนนักเรียนซึ่งเรียนวิชาใดวิชาหนึ่งหรือทั้งสองวิชา
► ตัวอย่าง
Input (จากแป้นพิมพ์) Output (ทางจอภาพ)
001 c001 c002 c003 2 1 3
002 c002 c003 c004
003 c003 c005
-1
c002 c003

5931111121 2110101 2109101 0 1 1


5932222221 2109101
-1
2110101 5500101

► ค�าแนะน�า (ถ้ารู้วิธีทา� แล้ว ไม่ต้องอ่านก็ได้)


ควรเก็บข้อมูลด้วย dict ที่มี key คือรหัสวิชา และ value เป็นเซตของนักเรียน (ลองคิดดูว่าท�าไม) เช่น ตัวอย่างที่ 1
จะได้ dict ดังนี้
{
'c001':{'001'},
'c002':{'001', '002'},
'c003':{'001', '002', '003'},
'c004':{'002'},
'c005':{'003'}

108 07 : Tuple, Dictionary and Set


08 : Function and Recursion

สรุปเนื้อหา
การ งาน งก์ ัน
• อาจเรียกว่า subprogram หรือ subroutine

• เป็นการแยกส่วนค�าสั่งที่ซ�้า ๆ กัน หรือเข้าใจยาก ออกมาจากโปรแกรมหลัก

• ท�าให้โปรแกรมอ่านง่าย เข้าใจง่าย

• ท�าให้โปรแกรมหลักเรียกใช้ ังก์ชันได้ โดยไม่ต้องเขียนค�าสั่งหลายรอบ

• ังก์ชันควรมีหน้าที่การท�างานชัดเจน เช่น ังก์ชันหาค่าเ ลี่ยของจ�านวนในลิสต์ ังก์ชันกลับสตริง เป็นต้น


• ต้องเขียน ังก์ชันไว้ก่อนส่วนที่จะเรียกใช้

องค์ปร กอบของ งก์ ัน


• ชื่อ ังก์ชัน มีข้อก�าหนดเหมือนการตั้งชื่อตัวแปร
def average3(x,y,z):
• ค่าที่รับเข้ามา หรือ พารามิเตอร์ (ไม่จา� เป็นต้องมีก็ได้) s = x+y+z
return s/3
• การคืนค่าจาก ังก์ชันด้วยค�าสั่ง return (ไม่จา� เป็นต้องมีก็ได้)

การคนการท�างานจาก งก์ ันแ การคนค่าจาก งก์ ัน


• สามารถใช้ค�าสั่ง return ได้หลายที่ใน ังก์ชัน

• เมื่อท�าค�าสั่ง return แล้ว จะหยุดการท�างานของ ังก์ชันทันที และกลับไปท�างานต่อหลังจุดที่เรียกใช้ ังก์ชัน

• ังก์ชันคืนค่าได้ 1 ค่าเท่านั้น ถ้าต้องการคืนหลายค่า ให้ใช้ tuple เช่น return (answer1, answer2)


• หากค�าสั่งสุดท้ายของ ังก์ชันไม่ใช่ return ระบบจะเพิ่มค�าสั่ง return (ไม่คืนค่าใด ๆ) ที่ท้าย ังก์ชัน

• ค�าสั่ง return ที่ไม่ได้ก�าหนดให้คืนค่าใด ๆ ระบบจะคืนค่า None (None เป็นค่าพิเศษในระบบ ไม่ใช่สตริง 'None')

ตัวแปร น งก์ ัน ( )
• ตั้งชื่อซ�า้ กับตัวแปรใน ังก์ชันอื่นได้ ถือว่าเป็นคนละตัวแปรกัน

• เรียกใช้ตัวแปรใน ังก์ชันอื่นไม่ได้

• หากส่งตัวแปรประเภท int, float, string, boolean เข้ามาใน งั ก์ชน ั จะถือว่าเป็นคนละตัวกัน


• หากส่งตัวแปรประเภท list, dict, set เข้ามาใน ังก์ชัน

ถ้ามีการแก้ค่าใน ังก์ชัน ตัวแปรเดิมของผู้เรียก ังก์ชันจะเปลี่ยนค่าด้วย

08 : Function and Recursion 109


งก์ ันเวียนเกิ
• ังก์ชันเวียนเกิดมี 2 ส่วนคือ ส่วนการค�านวณแบบพื้น าน def factorial(n):
if n < 2: return 1
และส่วนที่มีการเรียกซ�า้ return n * factorial(n-1)

• บางครั้งเขียนง่ายกว่า loop เหมาะกับการท�าซ�้าที่ไม่รู้จ�านวนรอบ

• ท�างานช้ากว่า loop และใช้หน่วยความจ�ามากกว่า

การแป งความ ัมพันธ์ทางค ิต า ตร์เปน งก์ ันเวียนเกิ


• เขียนกรณีพื้น านก่อน คือกรณีที่รู้คา� ตอบทันที ไม่มีการเรียกซ�้า

• แล้วค่อยเขียนกรณีที่ต้องเรียกซ�า้

def f(n):
if n == 0: return 0
if 1 <= n <= 2: return 1
return f(n-1) + f(n-2)

เรื่องผิดบ่อย

เขียน ังก์ชันไว้หลังส่วนที่เรียกใช้ print(median(3,1,2)) ผิด เพรำะหำ งก์ชัน median ไม่เจอ


ต้องย้ำย งก์ชันข้นไปไว้ก่อนบรรทัดนี้
def median(x,y,z):
return (x+y+z)-min(x,y,z)-max(x,y,z)

ตั้งชื่อ ังก์ชันซ�้ากันเอง หรือซ�า้ กับชื่อตัวแปร def average(x,y): average เป็น งก์ชันที่รับ ตัวแปร
return (x+y)/2

def average(x,y,z): average กลำยเป็น งก์ชัน


return (x+y+z)/3 ที่รับ ตัวแปร
print(average(1,2,3)) ยังเรียกได้อยู่
print(average(4,5)) ผิด เพรำะต้องใช้แบบ พำรำมิเตอร์
average = 0 average กลำยเป็นตัวแปรแล้ว
print(average(1,2,3)) ผิด เพรำะ average เป็นตัวแปรแล้ว

110 08 : Function and Recursion


ถ้าพารามิเตอร์ของ ังก์ชันเป็น list, set def sum_double(x):
for i in range(len(x)):
หรือ dict การเปลี่ยนแปลงข้อมูลที่เก็บ x[i] *= 2 # x เป็นที่เก็บเดียวกับตัวแปรที่ส่งให้ x
ในพารามิเตอร์นี้ จะส่งผลให้ข้อมูลที่เก็บ return sum(x)

ในตัวแปรของผู้เรียกที่ส่งมาให้พารามิเตอร์ 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 double(x) :


x *= 2
จะไม่ส่งผลถึงตัวแปรของผู้เรียกที่ส่งมาให้
พารามิเตอร์ def sum_double(x):
x = [2*e for e in x] # x ถูกเปลี่ยนเป็นลิสต์ตัวใหม่แล้ว
def f(x) : return sum(x)
...
# ตัวแปร x เปลี่ยนค่ำ ลิสต์ y ไม่เปลี่ยน a = 8
x = [1,2,3] double(a)
... print(a) ได้ 8 เหมือนเดิม ไม่ใช่ 16
y = [1, 2, 3]
f(y) print(sum_double(y)) ได้ 12
print(y) จะได้ [1, 2, 3]

ลืม return ผลลัพธ์ def square(x):


x = x**2 ลืมคืนค่ำ จะท�ำให้ได้ None

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 = read_next_positive_int ผิด ต้องมี () หลังชื่อ งก์ชัน


a = read_next_positive_int() ถูกต้อง

08 : Function and Recursion 111


ส่งค่าหรือตัวแปรที่เก็บค่าผิดประเภทให้กับ def f(n): n ต้องเป็นจ�ำนวนเต็ม เพรำะใช้ใน range
g = 1
พารามิเตอร์ของ ังก์ชัน for k in range(n) :
g = 1 + 1/(1+g)
return g

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
ค�านวณครั้งเดียว จะท�างานเร็วกว่า

แบบฝึกหัด

ชื่อ ังก์ชัน: f1 deff, ( ab ) :

Parameter: รับข้อมูล a เป็นสตริง และ รับ b เป็นจ�านวนเต็ม foriinrangec b) :p


rintc a)

Process: พิมพ์ a ออกทางหน้าจอจ�านวน b บรรทัด


eturn: ไม่ต้องคืนค่า

ชื่อ ังก์ชัน: f2 deffa Ca ,


b) :

b
Parameter: รับข้อมูล a เป็นสตริง และ รับ b เป็นจ�านวนเต็ม return [ ลง
*

Process: สร้างลิสต์ที่เก็บสตริง a จ�านวน b ตัว


eturn: ลิสต์ที่สร้าง

112 08 : Function and Recursion


ชื่อ ังก์ชัน: g defgcmb , กาย ) :

Parameter: รับจ�านวนจริงสี่จา� นวน m b n และ c


eturn: คืนค่าจุดตัดของเส้นตรง y = mx+b และ y = nx+c

เป็น tuple ของจุดตัด (x,y)


หากเป็นเส้นตรงที่ขนานกัน ให้คืนค่าจ�านวนเต็ม 1
หากเป็นเส้นตรงเดียวกัน ให้คืนค่าจ�านวนเต็ม 2
ชื่อ ังก์ชัน: h
Parameter: รับลิสต์ของจ�านวนเต็ม x
eturn: คืนลิสต์ใหม่ ที่มีสมาชิกจาก x เ พาะที่เป็นเลขคู่เท่านั้น
โดยห้ามแก้ไขค่าในลิสต์ x

เขียน ังก์ชันเวียนเกิดเพื่อค�านวณค่าดังนี้

เขียน ังก์ชันเวียนเกิดเพื่อค�านวณค่าดังนี้
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

เขียน ังก์ชันเวียนเกิดเพื่อค�านวณค่าดังนี้

ชื่อ ังก์ชัน: is_palindrome


Parameter: รับข้อมูล s เป็นสตริง
Process: เขียน ังก์ชันเวียนเกิดเพื่อตรวจสอบว่า s เป็น
palindrome (อ่านจากหน้าไปหลังเหมือนหลังไปหน้า) หรือไม่
eturn: ถ้า s เป็น palindrome ให้คืนค่า True ถ้าไม่เป็น
ให้คืนค่า False

08 : Function and Recursion 113


ตัวอย่างการแก้โจทย์ปัญหา

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 ด้วย
► ตัวอย่าง

Input (จากแป้นพิมพ์) Output (ทางจอภาพ)


1 1 2018 731
1 1 2020

25 12 1999 76
9 3 2000

114 08 : Function and Recursion


โปรแกรมเริมตน

d1,m1,y1 = [int(e) for e in input().split()]


d2,m2,y2 = [int(e) for e in input().split()]

# ค�ำนว ว่ำวันที่ A เป็นวันที่เท่ำไรของป


D = [31,28,31,30,31,30,31,31,30,31,30,31]
if y1%4==0 and (y1%100!=0 or y1%400==0): # ตรวจสอบปอธิกสรทิน
D[1] += 1
A = 0
for i in range(m1-1):
A += D[i]
A += d1

# ค�ำนว ว่ำวันที่ B เป็นวันที่เท่ำไรของป


D = [31,28,31,30,31,30,31,31,30,31,30,31]
if y2%4==0 and (y2%100!=0 or y2%400==0): # ตรวจสอบปอธิกสรทิน
D[1] += 1
B = 0
for i in range(m2-1):
B += D[i]
B += d2

# ค�ำนว จ�ำนวนวันระหว่ำงป A และป B


C = 0
for i in range(y1+1,y2):
# บวกด้วยจ�ำนวนวันในปนั้น ๆ
if i%4==0 and (i%100!=0 or i%400==0): # ตรวจสอบปอธิกสรทิน
C += 366
else:
C += 365

print( ?? )

# (จ�ำนวนวันในป A) – (ล�ำดับที่ของวัน A) + 1 + (จ�ำนวนวันระหว่ำงปทั้งสอง) + (ล�ำดับที่ของวัน B)

08 : Function and Recursion 115


ตัวอย่างการเขียนโปรแกรม
โปรแกรม ค�าอธิบาย
ังก์ชัน is_leap_year
จากโปรแกรมในกล่องเส้นประ สามารถเขียนเป็น ังก์ชันได้ดังนี้ งั ก์ชัน is_leap_year จะตรวจสอบว่าเป็น
def is_leap_year(y):
if y%4==0 and (y%100!=0 or y%400==0):
ปีอธิกสุรทินหรือไม่ ตามเงื่อนไขในกล่องเส้นประ
return True ถ้าตรงตามเงื่อนไขให้คืนค่า True แต่ถ้าไม่ตรงให้
else:
return False
คืนค่า False

หรือสามารถเขียนให้สั้นลงได้เป็นแบบนี้ ปรับปรุง : ในกรณีนี้ เราสามารถตัดค�าว่า else ออก


def is_leap_year(y):
if y%4==0 and (y%100!=0 or y%400==0):
ได้ เนือ่ งจากถ้าเงือ่ นไขเป็นจริงแล้วจะ return True
return True และจบการท�างาน งั ก์ชนั ทันที จะไม่มาท�างานทีบ่ รรทัด
return False
return False อีก

หรือสามารถเขียนให้สั้นลงได้อีกเป็นแบบนี้ ปรับปรุง : เนื่องจากประโยคตรวจสอบเงื่อนไข


def is_leap_year(y):
return y%4==0 and (y%100!=0 or y%400==0)
มีค่าความจริงเป็น True หรือ False อยู่แล้ว
เราสามารถคืนผลการเปรียบเทียบนี้โดยตรงได้เลย
ังก์ชัน day_of_year
จากโปรแกรมในกล่องเส้นไข่ปลา สามารถเขียนเป็น ังก์ชันได้ดังนี้ คัดลอกโปรแกรมจากกล่องเส้นไข่ปลา
def day_of_year(d,m,y):
D = [31,28,31,30,31,30,31,31,30,31,30,31]
อย่าลืมเปลี่ยนชื่อตัวแปรด้วย
if y%4==0 and (y%100!=0 or y%400==0): (d1,m1,y1 เป็น d,m,y)
D[1] += 1
A = 0
แต่ ังก์ชันนี้ยังไม่ถูกต้องเพราะลืมคืนค่า
for i in range(m-1)
A += D[i]
A += d

def day_of_year(d,m,y): เติมค�าสั่ง return A ท�าให้ ังก์ชันท�างาน


D = [31,28,31,30,31,30,31,31,30,31,30,31]
if y%4==0 and (y%100!=0 or y%400==0):
ได้ถูกต้องแล้ว
D[1] += 1
A = 0
for i in range(m-1)
A += D[i]
A += d
return A

116 08 : Function and Recursion


โปรแกรม ค�าอธิบาย
def day_of_year(d,m,y): ปรับปรุง: น�า ังก์ชัน is_leap_year ที่เขียนไว้แล้ว
D = [31,28,31,30,31,30,31,31,30,31,30,31]
if is_leap_year(y):
มาใช้ได้
D[1] += 1
A = 0
for i in range(m-1)
A += D[i]
A += d
return A

ังก์ชัน 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

def days_in_year(y): ปรับปรุง: น�า ังก์ชัน is_leap_year ที่เขียนไว้แล้ว


if is_leap_year(y):
return 366
มาใช้
else:
return 365

def days_in_year(y): ปรับปรุง: น�า ังก์ชัน day_of_year ที่เขียนไว้แล้ว


return day_of_year(31,12,y)
มาใช้ โดยขอล�าดับของวันที่ 31 ธันวาคม ปี y
(กรณีนี้ได้โปรแกรมสั้นลง แต่อาจท�าให้ ังก์ชัน
เข้าใจยากขึ้น)
ส่วนโปรแกรมหลัก
d1,m1,y1 = [int(e) for e in input().split()] เปลี่ยนกล่องต่าง ๆ เป็นการเรียก ังก์ชันและส่งค่าไป
d2,m2,y2 = [int(e) for e in input().split()]
ให้แต่ละ ังก์ชันให้ถูกต้อง
A = day_of_year(d1,m1,y1)
B = day_of_year(d2,m2,y2)

C = 0
for i in range(y1+1,y2):
C += days_in_year(i)

print(days_in_year(y1) - A + 1 + C + B)

08 : Function and Recursion 117


ตัวอย่างโจทย์ปัญหา

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

118 08 : Function and Recursion


Recursive C(n,k)
เราสามารถหาค่าของจ�านวนวิธใี นการเรียงสับเปลีย่ น (n,k) ได้จากสมการด้านล่าง จงใช้สมการต่อไปนีใ้ นการเขียนโปรแกรม
แบบ recursive เพื่อค�านวณค่า (n,k)

► ข้อมูลน�าเข้า
มี 2 บรรทัด ประกอบด้วยจ�านวนเต็ม n และ k
► ข้อมูลส่งออก
มี 1 บรรทัด แสดงค่า (n,k) ที่ค�านวณได้
► ตัวอย่าง
Input (จากแป้นพิมพ์) Output (ทางจอภาพ)
6 15
2

10 45
8

0 0
1

3 0
7

10 1
10

08 : Function and Recursion 119


Recursive SumList
โจทย์ข้อนี้สั้น ๆ จงเขียน ังก์ชัน sumlist(x) ของโครงโปรแกรมข้างล่างนี้ sumlist รับ x เป็นลิสต์เก็บจ�านวนเต็ม
แล้วคืนผลรวมของจ�านวนเต็มทุกตัวใน x โดย x เป็นลิสต์ที่ภายในเป็นลิสต์ซ้อนลิสต์กี่ชั้นก็ได้ ดังตัวอย่างที่แสดงข้างล่างนี้
หมายเหตุ : สามารถใช้คา� สั่ง if type(x) == list เพื่อทดสอบว่า x เป็นข้อมูลประเภทลิสต์หรือไม่

def sumlist( x ):
# ???

print(eval(input().strip())) # do not remove this line

► ข้อมูลน�าเข้า
ลิสต์ที่เก็บจ�านวนเต็ม (อาจเป็นลิสต์แบบลิสต์ซ้อนลิสต์กี่ชั้นก็ได้)
► ข้อมูลส่งออก
ผลรวมของจ�านวนเต็มทุกตัวในลิสต์ที่เป็นข้อมูลน�าเข้า
► ตัวอย่าง
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

120 08 : Function and Recursion


09 : NumPy

สรุปเนื้อหา import numpy as np

• umPy เป็นคลังค�าสั่งที่ให้บริการมากมายเกี่ยวกับการค�านวณทางวิทยาศาสตร์
โดยมีที่เก็บข้อมูลที่เรียกว่า อาเรย์ n มิติ (ndarray) มีไว้เก็บข้อมูลเพื่อการประมวลผลที่มีประสิทธิภาพมาก ๆ
• อาเรย์มีลักษณะคล้ายลิสต์ แต่สร้างแล้วเปลี่ยนขนาดไม่ได้
• ค่าในอาเรย์ทุกช่องต้องเป็นประเภทเดียวกันทั้งหมด เช่น เป็น int ทุกช่อง หรือ float ทุกช่อง
(ผสมกันไม่ได้ ถ้าเป็นลิสต์ผสมได้)
• เราสร้าง เวกเตอร์ ได้ด้วยอาเรย์ 1 มิติ และสร้าง เมทริกซ์ ได้ด้วยอาเรย์ 2 มิติ

การ รางอาเรย์ วย งก์ ัน


สร้างอาเรย์จาก np.array(L) หาขนาดของ M.shape
ลิสต์ L อาเรย์ M
[1 0 2 3 -1] np.array([1,0,2,3,-1]) [[2 3] np.array([[2,3],[4,1],[7,5]])
[4 1]
[7 5]]

[[0. 0. 0.] np.zeros((2,3)) [[1 1] np.ones((3,2),int)


[0. 0. 0.]] [1 1]
[1 1]]

[[1 0 0 0] np.identity(4,int) [[1. 0. 0.] np.identity(3)


[0 1 0 0] [0. 1. 0.]
[0 0 1 0] [0. 0. 1.]]
[0 0 0 1]]

สร้างอาเรย์ที่ np.zeros_like(x,int) สร้างอาเรย์ที่ np.ones_like(y,float)


มีขนาดเท่ากับ (x อาจเก็บ int หรือ float ก็ได้) มีขนาดเท่ากับ (y อาจเก็บ int หรือ float ก็ได้)
อาเรย์ x และเป็น อาเรย์ y และเป็น
0 (int) ทุกช่อง 1.0 ทุกช่อง

[4 5 6 7 8 9] np.arange(4,10) [8. 7. 6. 5.] np.arange(8.0,4.0,-1.0)


np.arange(8,4,-1,float)

[2.3 2.33 2.36 2.39 2.42 2.45 2.48] np.arange(2.3,2.5,0.03)

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])

• การด�าเนินการอาเรย์กับอาเรย์ที่มีขนาดไม่เท่ากัน อาจมีการขยายอาเรย์ให้มีขนาดเท่ากันก่อน (broadcasting)


โดยพิจารณามิติของทั้งสองอาเรย์จากขวาไปซ้าย ให้เป็นไปตามก การ broadcast (ขอน�าเสนอด้วยตัวอย่าง)
• A.shape = (2,3), B.shape = (3,) ดูจากขวามาซ้าย 3 เท่ากัน จึง broadcast B ให้มีขนาดเท่ากับ A ได้
เช่น [[1 2 3] + [9 8 7] broadcast แล้วกลายเป็น [[1 2 3] + [[9 8 7] = [[10 10 10]
เช่น [4 5 6]] broadcast แล้วกลายเป็น [4 5 6]] [9 8 7]] [13 13 13]]
• มิติไหนขนาดเป็น 1 ถือว่า มิตินั้น broadcast ได้ (แต่มิติอื่นที่ไม่ใช่ 1 ต้องเท่ากัน)
o A.shape = (2,3), B.shape = (2,1) broadcast B ให้เป็น (2,3) มีขนาดเท่ากับ A
o A.shape = (1,3), B.shape = (2,1) broadcast ทั้ง A และ B ให้เป็น (2,3)
เช่น [[1 2 3]] + [[6] broadcast แล้วกลายเป็น [[1 2 3] + [[6 6 6] = [[ 7 8 9]
เช่น [่ [1 2 3]] + [[7]] broadcast แล้วกลายเป็น [1 2 3]] [7 7 7]] [ 8 9 10]]
o A.shape = (2,3), B.shape = (1,) broadcast B ได้ (ถ้า B เป็นสเกลาร์ ให้ถือว่ามีมิติเป็น (1,))
เช่น [[1 2 3] + 9 broadcast แล้วกลายเป็น [[1 2 3] + [[9 9 9] = [[10 11 12]
เช่น [4 5 6]] broadcast แล้วกลายเป็น [4 5 6]] [9 9 9]] [13 14 15]]
o A.shape = (3,5), B.shape = (5,1) broadcast B ไม่ได้ (ปรับ 1 ได้ แต่อกี มิตไิ ม่เท่ากัน เลยท�าไม่ได้)
• การอ้างอิงข้อมูลในอาเรย์ (Indexing ของ umPy)
o การอ้างอิงข้อมูลในอาเรย์ 1 มิติ

• การเข้าใช้ข้อมูล

o V[k] เหมือนการใช้ลิสต์ คือเลือกข้อมูลหนึ่งช่อง โดยที่ k เป็นจ�านวนเต็ม


o V[a:b:c] เหมือนการใช้ลิสต์ คือเลือกข้อมูลเป็นช่วง ได้ผลเป็นอาเรย์
• การใส่ค่าใหม่

o V[k] = 99 เหมือนกับการใช้ลิสต์
o V[a:b:c] = d แตกต่างจากลิสต์
• ถ้า d เป็น int, float หรือลิสต์ อาเรย์ขนาด 1 ช่อง จะ broadcast ให้มีขนาดเท่ากับช่วงของ a:b:c

• ถ้า d เป็นลิสต์ อาเรย์ขนาดมากกว่า 1 ช่อง ต้องมีขนาดเท่ากับขนาดของช่วง a:b:c เช่น


o V = np.zeros(5,int)
o V[2:4] = 1 ท�าได้, V เปลี่ยนเป็น [0 0 1 1 0]
o V[::2] = 3 ท�าได้, V เปลี่ยนเป็น [3 0 3 1 3]
o V[::2] = [9] ท�าได้, V เปลี่ยนเป็น [9 0 9 1 9]
o V[::2] = [8,8,8] ท�าได้, V เปลี่ยนเป็น [8 0 8 1 8]
o V[1:5] = [1,2] ท�าไม่ได้, เพราะขนาดของข้อมูลไม่ตรงกัน
o V[7:7] = [1,2] ไม่เกิดการเปลี่ยนแปลงใด ๆ

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

o M[r1:r2:a,c1:c2:b] อาเรย์ย่อย 2 มิติ ในช่วงแถวและหลักที่ก�าหนดโดย


r1:r2:a, c1:c2:b

o เช่น ให้ M = np.array([[1,2,3,4],[5,6,7,8],[9,10,11,12]])


M[1:3] ได้ np.array([[5,6,7,8],[9,10,11,12]])
M[1:2, 1:3] ได้ np.array([[6,7]])
M[:, 2] ได้ np.array([3,7,11])
M[1:, :2] ได้ np.array([[5,6],[9,10]])
M[0:3:2] ได้ np.array([[1,2,3,4],[9,10,11,12]])
M[0:3:2, 1:4:2] ได้ np.array([[2,4],[10,12]])
M[::-1] ได้ np.array([[9,10,11,12],[5,6,7,8],[1,2,3,4]])
• สามารถให้คา่ กับหลาย ๆ ช่องในอาเรย์พร้อมกันได้ เช่น
o M[2:4, 1:4] = [[-1, 1, -1], [-1, 1, -1]] ขนาดเท่ากันพอดี
M[2:4, 1:4] = [-1, 1, -1] ขนาดไม่เท่า ระบบ broadcast ให้
o M[:, 0] = [1, 2, 3, 4] M ต้องมี 4 แถว

o M[::2, ::3] = 0 broadcast 0

ค�าสั่ง dot (ใช้ว่า x.dot(y) หรือ np.dot(x,y) ก็ได้)


dot ใช้กับเวกเตอร์ คือการหา dot product dot ใช้กับเมทริกซ์ คล้ายกับการคูณเมทริกซ์
x = np.array([ 1, 2, 3, 4]) x = np.array([[1,2],[3,4],[5,6]]) x.shape คือ (3,2)
y = np.array([ 0, -1, 1, 2]) y = np.array([[-2],[3]]) y.shape คือ (2,1)
x.dot(y) ได้ค่าเท่ากับ y.dot(x) เท่ากับ z = np.array([[-2,3]]) z.shape คือ (1,2)
1*0 + 2*(-1) + 3*1 + 4*2 = 9 w = np.array([-2,3]) w.shape คือ (2,)
x.dot(y) ได้ np.array([[4],[6],[8]])
มีมิติเป็น (3,2) กับ (2,1) คูณได้ ได้อาเรย์ขนาด (3,1)
y.dot(x) ท�าไม่ได้ เพราะมิติไม่ถูกต้อง (2,1) กับ (3,2)
x.dot(z) ท�าไม่ได้ เพราะมิติไม่ถูกต้อง (3,2) กับ (1,2)
x.dot(w) ได้ np.array([4,6,8])
อันนี้แปลก (3,2) กับ (2,) คูณได้ ได้อาเรย์ขนาด (3,)

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

• np.sum(M,axis=0) ได้ผลรวมตามแนวตั้ง np.sum(M,axis=0) ได้ np.array([6,8,10,12])

• np.sum(M,axis=1) ได้ผลรวมตามแนวนอน np.sum(M,axis=1) ได้ np.array([10,26])

• matrix transpose ใช้ว่า M.T M.T ได้ np.array([[1,5],[2,6],[3,7],[4,8]])

• M > 3 ได้ array([[False,False,False,True],[True,True,True,True]])

• ใช้ np.sum นับจ�านวน element ที่ตรงตามเงื่อนไขได้ np.sum(M > 3) ได้ 5

• ใช้เงื่อนไขในการเลือกบาง element ของอาเรย์ได้ M[M%2==0] ได้ np.array([2,4,6,8])

เรื่องผิดบ่อย

ลืม import numpy โดยทั่วไปมักใช้ import numpy as np


คือการ import คลังค�าสั่ง numpy และตั้งชื่อใหม่ว่า np จะได้เขียนสั้น ๆ
ลืมระบุประเภทของข้อมูลที่จะเก็บว่าเป็น x = np.zeros((3,4)) # ได้เป็น float
int หรือ float x = np.zeros((3,4),int) # ได้เป็น int
x = np.zeros_like(y) # ข้นกับประเ ทข้อมูลของ y

ถ้าเก็บค่า float ในเมทริกซ์ที่เก็บ int x = np.array([1,2,3],int)


ระบบจะปัดค่าหลังจุดทศนิยมทิ้ง x[0] = 4.8 # ได้ x เท่ำกับ np.array([4,2,3])
ใช้ np.array กับ np.ndarray ผิด ต้องการสร้างเมทริกซ์ขนาด 4×5 แต่เขียน
a = np.array((4,5)) # ได้ [4,5]
ต้องการสร้างเวกเตอร์ [2,3] แต่เขียน
a = np.ndarray([2,3]) # ได้เมทริกซ์ขนำด 2x3

การท�างานของเวกเตอร์ไม่เหมือนเมทริกซ์ x = np.array([1,2,3]) ได้อาเรย์ 1 มิติ 3 ช่อง


(อาเรย์ 1 มิติ vs 2 มิติ) y = np.array([[1,2,3]]) ได้อาเรย์ 2 มิติ 1 แถว 3 คอลัมน์
x.shape ได้ (3,)
y.shape ได้ (1,3)
x.T ได้อาเรย์เหมือนกับ x x.T.shape ได้ (3,)
y.T ได้อาเรย์ 3 แถว 1 คอลัมน์ y.T.shape ได้ (3,1)
print(x.dot(x.T)) ได้ 14
print(x.T.dot(x)) ก็ได้ 14
print(y.dot(y.T)) ได้ array([[14]])
print(y.T.dot(y))
ได้ np.array([[1,2,3],[2,4,6],[3,6,9]])

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 บรรทัด แต่ละบรรทัดแสดงคะแนนของผู้เข้าแข่งขันแต่ละคน
► ตัวอย่าง

Input (จากแป้นพิมพ์) Output (ทางจอภาพ)


4 11.25
10 15 10 15.0
20 5 15 10.75
14 8 7 12.0
12 12 12
0.5 0.25 0.25

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)

n = int(input()) เปลี่ยนลิสต์ S และ W มาใช้ numpy array


S = [] สั่ง run, ใส่ข้อมูลตามตัวอย่างแรก, ผิดที่บรรทัดที่ 7
for i in range(n):
S.append([int(e) for e in input().split()]) NameError: name 'np' is not defined
W = [float(e) for e in input().split()] แปลว่า ระบบไม่รู้จักค�าว่า np เนื่องจากไม่ได้
import numpy as np
S = np.array(S)
W = np.array(W)
for i in range(n):
print(sum(S[i]*W))

import numpy as np ท�างานได้ถูกต้อง (ใช้การคูณแบบ element- ise)


n = int(input()) แต่ไม่ได้เร็วกว่าของเดิมนัก เพราะยังใช้ค�าสั่งของ
S = []
for i in range(n): numpy ได้ไม่เต็มที่
S.append([int(e) for e in input().split()])
W = [float(e) for e in input().split()]

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)

import numpy as np เปลี่ยนเป็น axis = 1


n = int(input()) สั่ง run, ใส่ข้อมูลตามตัวอย่างแรก, ได้
S = []
for i in range(n): 10
S.append([int(e) for e in input().split()]) 14
W = [float(e) for e in input().split()] 10
12
S = np.array(S)
W = np.array(W) ไม่ตรงกับที่แสดง พบว่าสิ่งที่แสดงเป็นจ�านวนเต็ม
S *= W แสดงว่าน่าจะมีปัญหาที่การเก็บค่า พบว่าค�าสั่ง
total_score = np.sum(S, axis = 1)
S *= W จะเก็บผลคูณในอาเรย์ S ซึ่งเก็บ
for i in total_score:
print(i) จ�านวนเต็ม ดังนั้น ผลลัพธ์จึงเป็นจ�านวนเต็ม
ซึ่งไม่ถูกต้อง
import numpy as np เปลี่ยนเป็น T = S*W
n = int(input()) สั่ง run, ใส่ข้อมูลตามตัวอย่างแรก, ได้
S = []
for i in range(n): 11.25
S.append([int(e) for e in input().split()]) 15.0
W = [float(e) for e in input().split()] 10.75
12.0
S = np.array(S)
W = np.array(W) ถูกต้อง
T = S*W
total_score = np.sum(T, axis = 1)
for i in total_score:
print(i)

import numpy as np อีกวิธีที่ท�าได้ และง่ายกว่าคือ ใช้ค�าสั่ง S.dot(W)


n = int(input()) ซึ่งได้ผลลัพธ์เป็นอาเรย์ 1 มิติ มีข้อมูลแต่ละตัวคือ
S = []
for i in range(n): คะแนนรวมที่ถ่วงน�้าหนักแล้ว
S.append([int(e) for e in input().split()])
W = [float(e) for e in input().split()]

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 แบบสองมิติ ดังตัวอย่างในตารางข้างล่างนี้ (บรรทัดแรกคือจ�านวนข้อมูล บรรทัดที่ตามมาคือ ความสูงกับ
น�้าหนัก)

Input ที จาก read_height_weight()


4 array([[160, 60],
160 60 [155, 62],
155 62 [170, 54],
170 54 [180, 55]])
180 55

จงเขียน ังก์ชัน cm_to_m(x) และ cal_bmi(hw) ในโปรแกรมข้างล่างนี้ ที่มีข้อก�าหนดของพารามิเตอร์ และผลลัพธ์


ที่ได้ตามตารางนี้
un t n Input p t tu n u
cm_to_m(x) array หนึ่งมิติ เก็บความสูงหน่วยเป็นเซนติเมตร array หนึ่งมิติเก็บความสูงหน่วยเป็นเมตร
เช่น array([160, 155, 170, 180]) เช่น array([1.6,1.55,1.7,1.8])
cal_bmi(hw) array สองมิติ ขนาด n แถว 2 คอลัมน์ แต่ละแถว array หนึ่งมิติเก็บ bmi ที่ค�านวณจาก
แทนข้อมูลหนึ่งคู่ คอลัมน์ เก็บความสูง (เซนติเมตร) ความสูงและน�้าหนักใน Input parameter
คอลัมน์ 1 เก็บน�้าหนัก (กิโลกรัม) เช่น ที่ได้รับ เข่น
array([[160, 60], array([23.4375, 25.80645161,
[155, 62], 18.68512111, 16.97530864])
[170, 54],
[180, 55]])

และเขียนค�าสั่ง
• หาค่าเ ลี่ยของ 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())

► ข้อมูลน�าเข้า
ค�าสั่งในการทดสอบ ังก์ชันที่เขียน
► ข้อมูลส่งออก
ผลที่ได้จากค�าสั่งที่ป้อนเป็นข้อมูลน�าเข้า
► ตัวอย่าง

Input (จากแป้นพิมพ์) Output (ทางจอภาพ)


x=np.array([160,150,140]); print(cm_to_m(x)); print(x) [ 1.6 1.5 1.4]
[160 150 140]

d=np.array([[100,30],[120,36]]); print(cal_bmi(d)) [ 30. 25.]

main() average bmi = 21.2260953405


4 #bmi < 18.5 = 1
160 60
155 62
170 54
180 55

09 : NumPy 131
การค�านว จ�านวน โบนักชีโดยใช้การยกก�า ังเมทริก ์อย่างรวดเรว
, 1, 1, 2, 3, 5, , ... เป็นล�าดับของจ�านวน โบนักชี ( , 1 1, 2 1, ...) วิธีหนึ่งในการหา n คือค�านวณ
ผลการยกก�าลัง n ของเมทริกซ์ ที่แสดงด้านล่าง จะได้ผลเป็นเมทริกซ์ขนาด 2 2 ทีม่ ี n อยู่ที่มุมขวาบนของเมทริกซ์ เช่น

หา 3 ค�านวณ ได้ 3 2 หา 4 ค�านวณ ได้ 4 3

ถ้าคิดดูดี ๆ จะพบว่าการหาด้วยวิธีข้างต้นนี้คือการหาค่ายกก�าลัง ซึ่งเราก็ไม่น่าหาแบบค่อย ๆ คูณไปทีละครั้ง เช่น


การหา ก็ไม่น่าใช้วิธีที่เริ่มด้วยเมทริกซ์เอกลักษณ์ I แล้วคูณด้วย ไป 1 ครัง้ น่าจะใช้วิธีการหา 5 แล้วจับมาคูณกับตัวเอง
1

ก็จะได้ 1 นั่นคือ

จงเขียน ังก์ชัน fib(n,k) เพื่อค�านวณ F % k ด้วยวิธีข้างต้นนี้ โดยใช้ค�าสั่งของ numpy เพื่อคูณเมทริกซ์


n

(หมายเหตุ: หลังการคูณเมทริกซ์ทุกครั้ง ให้น�าผลที่ได้มา % k numpy จะท�า % k แบบ element- ise ในเมทริกซ์)

import numpy as np

def fib(n,k):
# ???

n,k = [int(e) for e in input().split()]


print( 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

1234567890 1234 162

10000000000000 999 600

132 09 : NumPy
10 : Class

สรุปเนื้อหา
• คลาส ใช้สร้างประเภทข้อมูลใหม่ที่ต้องการ โดยเราก�าหนดได้ว่า จะให้เก็บข้อมูลย่อยอะไรบ้าง และท�างานอะไรได้บ้าง
• คลาส คือ ประเภทข้อมูล, อ็อบเจกต์ คือ ตัวข้อมูล เช่น b1 = Book(...) ได้ว่า b1 เป็นอ็อบเจกต์ของคลาส Book
• เมท็อด คือ ังก์ชันซึ่งเป็นบริการของคลาส

ตัวอย่าง: คลาส Book


• คลาส Book ข้างล่างนี้ ใช้สร้างอ็อบเจกต์ที่เก็บข้อมูลของหนังสือ (ชื่อ ราคา และค�าส�าคัญต่าง ๆ ของหนังสือ)
• ทุกเมท็อดของคลาสต้องมีตัวแปร self เป็นพารามิเตอร์แรก ซึ่งแทนอ็อบเจกต์ที่จะใช้บริการ
เมื่อเรียกใช้ตัวแปรประจ�าอ็อบเจกต์ภายในคลาส จะต้องมี self. น�าหน้าเสมอ
• เมท็อด __init__ (เรียกว่า constructor) ใช้สร้างอ็อบเจกต์ของคลาส โดยบอกว่าอ็อบเจกต์จะเก็บข้อมูลอะไรบ้าง
และจะถูกเรียกเมื่อมีการสร้างอ็อบเจกต์ โดย self จะแทนอ็อบเจกต์ที่เพิ่งสร้าง
• เมท็อด __str__ คืนค่าสตริงของอ็อบเจกต์ จะถูกเรียกเมื่อใช้งาน ังก์ชัน str หรือ print
• เมท็อด __lt__ ใช้สา� หรับเปรียบเทียบอ็อบเจกต์ของ Book ในที่นี้จะเปรียบเทียบโดยใช้ราคาก่อน ถ้าราคาเท่ากัน
จะใช้ชื่อหนังสือเป็นตัวเปรียบเทียบ เมท็อดนี้จะถูกเรียกเมื่อเปรียบเทียบอ็อบเจกต์ด้วย < หรือใช้ ังก์ชัน sort
• นอกจากนี้ยังมีบริการ ปรับราคา และขอค�าส�าคัญร่วมของหนังสือ 2 เล่ม ผ่านเมท็อด update_price และ
get_common_keywords (สามารถเขียนเมท็อดอื่น ๆ เพิ่มได้ตามต้องการ เป็นการเพิ่มความสามารถของอ็อบเจกต์)
• เมท็อดอาจจะคืนค่าหรือไม่ก็ได้ โดยทั่วไปเมท็อดที่ไม่คืนผลลัพธ์มักเป็นเมท็อดที่มีการเปลี่ยนแปลงค่าภายในอ็อบเจกต์

class Book:
def __init__(self, title, price, keywords):
self.title = title; self.price = price; self.keywords = set(keywords)

def __lt__(self, rhs):


if self.price != rhs.price: return self.price < rhs.price
else: return self.title < rhs.title

def __str__(self):
return self.title + ' ($' + str(self.price) + ')'

def update_price(self, new_price):


self.price = new_price

def get_common_keywords(self, other):


return self.keywords & other.keywords

b1 = Book('Python', 99, ['code','computer']) # using __init__


b2 = Book('Calculus', 199, ['maths'])
b3 = Book('Physics', 99, ['science','maths'])

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__

เรื่องผิดบ่อย

ลืม self ในเมท็อด class A:


ไม่ได้ประกาศ self เป็นพารามิเตอร์ def __init__(self, x, y):
ไม่มี self. น�าหน้าตัวแปรของอ็อบเจกต์ d = dict() # แก้เป็น self.d = dict()
d[x] = y # แก้เป็น self.d[x] = y
def total(): # แก้เป็น def total(self):
return sum(d.values())
# แก้เป็น return sum(self.d.values())

การก�าหนดค่าอ็อบเจกต์ให้กับตัวแปรด้วย class B:
เครื่องหมายเท่ากับ จะท�าให้ตัวแปรนั้นชี้ไปที่ def __init__(self, b):
อ็อบเจกต์เดียวกัน self.b = b

b1 = B(10)
b2 = b1 # b1, b2 อ้ำงอิงอ็อบเจกต์เดียวกัน
b2.b = 5
print(b1.b) # 5

indent ผิด class C:


def __init__(self, c):
self.c = c
def double(self): # ผิด กลำยเป็น งก์ชนั ทัว่ ไป
self.c *= 2 # เรียก double(c1) ได้
# แต่จะเรียก c1.double() ไม่ได้
# เรียก C.double(c1) ก็ไม่ได้

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'

def __lt__(self, rhs):


# เรียงล�ำดับนิสิตด้วยค ะตำมพจนำนกรม ถ้ำอยู่ค ะเดียวกัน ให้เรียงล�ำดับด้วยชั้นปจำกน้อยไปมำก
# ถ้ำอยู่ค ะและชั้นปเดียวกัน ให้เรียงล�ำดับด้วยชื่อตำมพจนำนกรม
# เช่น Nisit('Krit', 4, 'Engineering') < Nisit('Boy', 3, 'Science')
# Nisit('Prim', 2, 'Engineering') < Nisit('Krit', 4, 'Engineering')
# Nisit('Joey', 2, 'Engineering') < Nisit('Prim', 2, '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 __lt__(self, rhs):


# เรียงล�ำดับรถยนต์ ดยเปรียบเทียบปำยทะเบียนรถแบบสตริง

def add_report(self, new_report):


# เพิ่มประวัติกำรซ่อมบ�ำรง ดยไม่ต้องคืนค่ำ
# ตัวแปร new_report เก็บ tuple (วันที่, ค�ำอธิบำย, รำคำ)
# เช่น c.add_report( ('25 May 2017', 'change tires', 1500) )

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 delete_book(self, book):


# ลบข้อมูลกำรซื้อหนังสือ book ออกจำกตะกร้ำ ดยไม่ต้องคืนค่ำ
# ถ้ำในตะกร้ำไม่มีหนังสือ book ไม่ต้องท�ำอะไร

def get_total(self):
# คืนค่ำรำคำรวมของหนังสือทั้งหมดในตะกร้ำ

def __lt__(self, rhs):


# ตะกร้ำที่มีรำคำรวมของหนังสือน้อยกว่ำ จะเป็นตะกร้ำที่น้อยกว่ำ

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

class Station: # คลำสของสถำนีรถไ ำ


def __init__(self, id, name): # สร้ำงสถำนีที่มีหมำยเลข (id) และชื่อสถำนี (name)
self.sid = int(id) # ก�ำหนดให้หมำยเลขสถำนีเป็นจ�ำนวนเต็ม ดยสถำนีที่ติดกัน
self.name = name # มีค่ำห่ำงกัน 1
def get_price(self, other): # คืนค่ำ ดยสำรระหว่ำงสถำนี self และ other
return abs(self.sid - other.sid)*5

# ------------------------------------------------------------------

class BTScard: # คลำสของบัตร ดยสำรแบบเติมเงิน


def __init__(self, id, value): # สร้ำงบัตร ดยสำรที่มีเลขบัตร (id) และเงินเริ่มต้น (value)
self.cid = id # self.station เก็บว่ำสถำนีต้นทำงคือสถำนีอะไร
self.value = value # ดยถ้ำบัตรไม่ได้อยู่ระหว่ำงกำรเดินทำง จะเก็บค่ำ
self.station = '' # สถำนีต้นทำงนี้เป็นสตริงว่ำง ๆ

def __str__(self):
return '('+str(self.cid)+','+str(self.value)+')'

def add_value(self, x): # เพิ่มเงินในบัตร ดยสำรเท่ำกับ x ดยไม่ต้อง return

138 10 : Class
def enter(self, station):
# แตะบัตรเพื่อเข้ำสู่สถำนีรถไ ำ ให้เช็คว่ำ บัตรนี้ไม่ได้แตะเข้ำที่สถำนีอื่นมำก่อน
# ถ้ำไม่มีกำรแตะเข้ำมำก่อน ให้เปลี่ยนค่ำสถำนีต้นทำงเป็น station แล้ว return True
# แต่ถ้ำมีกำรแตะเข้ำสถำนีอื่นมำก่อน ให้ return False ดยไม่เปลี่ยนข้อมูลสถำนีต้นทำงของบัตร ดยสำร

def leave(self, station):


# แตะบัตรเพื่อออกจำกสถำนีรถไ ำ ให้เช็คว่ำ บัตรนี้มีข้อมูลสถำนีต้นทำงอยู่
# ถ้ำไม่มีข้อมูลสถำนีต้นทำง ให้ return tuple ของเงินในบัตรและ -2
# ถ้ำมีสถำนีต้นทำง แต่จ�ำนวนเงินในบัตรไม่พอจ่ำยค่ำ ดยสำร ให้ return tuple ของเงินในบัตรและ -1
# ถ้ำมีสถำนีต้นทำง และจ�ำนวนเงินในบัตรพอจ่ำยค่ำ ดยสำร ให้ลบค่ำ ดยสำรออกจำกจ�ำนวนเงินในบัตร
# เปลี่ยนสถำนีต้นทำงเป็นสตริงว่ำง แล้ว return tuple ของเงินในบัตรหลังหักค่ำ ดยสำรและ 0

def __lt__(self, rhs): # บัตร ดยสำรที่มีเงินในบัตรน้อยกว่ำ จะถือว่ำน้อยกว่ำ

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

class Bus: เราสามารถเขียนคลาส Bus แบบอื่นได้ เช่น


def __init__(self, people, fare): แทนที่จะเก็บจ�านวนคนและค่าโดยสาร
self.fare = fare
self.total = people*fare อาจจะเก็บค่าโดยสารต่อคนและค่าโดยสารรวม
def __str__(self): ก็ได้ แต่ก็ต้องปรับการท�างานของคลาสให้ถูกต้อง
return 'this bus has ' + \ (ในเมท็อด change_fare ถ้าท�าการเปลี่ยนค่า
str(self.total//self.fare) + \
self.fare ก่อน จะท�าให้เมท็อดท�างานผิดได้)
' people with fare = ' + \
str(self.fare)
def __lt__(self, rhs):
return self.total < rhs.total
def people_in(self, k):
self.total += self.fare*k
def people_out(self, k):
self.total = max(0,self.total- \
self.fare*k)
def change_fare(self, new_fare):
self.total = \
self.total//self.fare*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()

a,b,c,d = [int(e) for e in input().split()]


fraction1 = ____________________
fraction2 = ____________________

print(fraction1.add(fraction2))
print(Fraction.multiply(fraction1,fraction2))

โจทย์ได้เขียนเมท็อดการท�าเศษส่วนอย่างต�่าและเมท็อดการคูณมาให้แล้ว ให้เขียนเติมส่วนอื่น ๆ ให้สมบูรณ์ ส�าหรับ


การบวก เมื่อบวกแล้วให้ตอบเป็นเศษส่วนอย่างต�่าด้วย สามารถเรียกใช้เมท็อด simplify ได้

142 10 : Class
► ข้อมูลน�าเข้า
มีบรรทัดเดียว เป็นจ�านวนเต็มบวก a b c d ซึ่งแทนเศษส่วน a/b และ c/d
► ข้อมูลส่งออก
มี 2 บรรทัด แสดงผลบวกและผลคูณของเศษส่วนที่กา� หนดให้
► ตัวอย่าง

Input (จากแป้นพิมพ์) Output (ทางจอภาพ)


1 7 3 7 4/7
3/49

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):
# ???

def sum(self, other):


# ???

def __lt__(self, rhs):


# ???

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 เหรียญ (ถ้าหยอดแล้วเกินไม่รับเพิ่ม) ตามโครงของคลาสและตัวอย่างการใช้งาน
ข้างล่างนี้

โครงของค า piggybank ตัวอย่างการ งาน piggybank


class piggybank: p1 = piggybank()
def __init__(self): print( float(p1) ) # 0.0
# มีตัวแปร self.coins เก็บ dict เริ่มต้นให้ว่ำง ๆ p1.add(0.25, 4)
# มี key เป็นมูลค่ำเหรีย และ value เป็นจ�ำนวนเหรีย # เพิ่มเหรีย 25 สตำงค์ 4 เหรีย
print( float(p1) ) # 1.0
p1.add(0.50, 1)
# เพิ่มเหรีย 50 สตำงค์ 1 เหรีย
def add(self, v, n): print( float(p1) ) # 1.5
# ถ้ำเพิ่มจ�ำนวนเหรีย ในกระปกอีก n เหรีย แล้วเกิน 100 p1.add(10, 1)
# จะไม่ให้เพิ่ม ให้คืน False แทนว่ำ เพิ่มไม่สำ� เร็จ # เพิ่มเหรีย 10 บำท 1 เหรีย
# แปลง v เป็น float ก่อน (เพิ่ม 5 กับ 5.0 จะได้เหมือนกัน) print( float(p1) ) # 11.5
# ถ้ำกระปกไม่เคยมีเหรีย v ท�ำ self.coins[v] = 0 print( p1 )
# ท�ำค�ำสั่ง self.coins[v] += n # {0.25:4, 0.5:1, 10.0:1}
# คืน True แทนว่ำเพิ่มส�ำเร็จ print(p1.add(10, 1))
# True เพิ่มได้
print( float(p1) ) # 21.5
print(p1.add(1,94))
# False เพิ่มไม่ได้ เกิน 100 เหรีย
print( float(p1) ) # 21.5

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
► ตัวอย่าง

Input (จากแป้นพิมพ์) Output (ทางจอภาพ)


p1.add(1.11,2); print(float(p1), p1) 2.22 {1.11:2}
print(float(p2), p2) 0.0 {}

p1.add(0.25,1);p1.add(5,1);p1.add(0.25,2);p1.add(5.0,1) 10.75 {0.25:3, 5.0:2}


print(float(p1), str(p1))

p1.add(0.25,1); print(p1.add(0.25,100)) False


print(p1.add(0.25,99)); print(float(p1)) True
25.0

10 : Class 147
ดร
Intania 63
สุภชัย
สุตั วิบ ย์

Principal Member of Technical Staff


Advanced Micro Devices Inc. (AMD)
California, USA

ก ารใช้คอมพิวเตอร์ช่วยออกแบบ ( omputer id esign :

ความส�าเร็จส่วนใหญ่มีความรู้ความสามารถในการใช้โปรแกรม
) มีความส�าคัญมากส�าหรับการออกแบบ
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')

11 : Solutions to Exercises 149


► ขอที ► ขอที
x,y = [float(e) \ c = int(input())
for e in input().split()] if c < 37 :
if x == 0 and y == 0 : s = 'XS'
print('At the origin') elif c < 41 :
elif x == 0 : s = 'S'
print('On y-axis') elif c < 43 :
elif y == 0 : s = 'M'
print('On x-axis') elif c < 46 :
elif x > 0 and y > 0 : s = 'L'
print('Quadrant I') else :
elif x < 0 and y > 0 : s = 'XL'
print('Quadrant II') print(s)
elif x < 0 and y < 0 :
print('Quadrant III')

บทที่
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)

150 11 : Solutions to Exercises


► ขอที ► ขอที
n = int(input()) h = input().strip()
a = int(input()) d = '0123456789ABCDEF'.find(h)
mn = mx = a if d >= 0 :
c = 0 print(d)
if a < 0 : c = 1 else :
for k in range(n-1): print('invalid hex digit')
a = int(input())
if a > mx : mx = a ► ขอที
if a < mn : mn = a t = input().strip()
if a < 0 : c += 1 c = 0
print( (mx - mn), c ) for e in t :
if e in '13579' :
► ขอที c += 1
n = int(input()) print(c)
for x in range(1,n+1):
for y in range(x,n+1): ► ขอที
for z in range(y,n+1): t = input().strip()
t = x**2+y**2+z**2 c = 0
w = int(round(t**(1/3),0)) for k in range(len(t)-1) :
if w**3 == t: if t[k] in 'aeiou' and \
print(w,x,y,z) t[k+1] in 'aeiou' :
c += 1
print(c)

บทที่ ► ขอที
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)

11 : Solutions to Exercises 151


► ขอที ► ขอที
file1 = open( input().strip() ) n = int(input())
s = '' d = []
for line in file1 : for k in range(n):
if len(line.strip()) > 0 : d.append( int(input()) )
if line[-1] != '\n' d.sort()
line = line + '\n' t = []
s = line + s for e in d :
file1.close() t.append(str(e))
out = open('reverse.txt', 'w') print(','.join(t))
out.write(s[:-1])
out.close() ► ขอที
file1 = open( input().strip() )
► ขอที d = []
file1 = open( input().strip() ) for line in file1:
for line in file1 : d.append( int(line) )
a = line.find("<headline>") file1.close()
if a >= 0 : c = []
j = a+len("<headline>") for e in d:
b = line.find("</headline>",j) c.append( d.count(e) )
print( line[j:b] ) maxc = max(c)
file1.close() out = []
for k in range(len(d)):
► ขอที if c[k]==maxc and d[k] not in out :
file1 = open( input().strip() ) out.append(d[k])
file2 = open( input().strip() ) for e in out :
for line1 in file1 : print(e)
line2 = file2.readline()
if line1 != line2 : ► ขอที
print( False ) file1 = open( input().strip() )
break h = []
else : for line in file1 :
print( len(file2.readline()) == 0 ) a = line.find("<headline>")
file1.close() if a >= 0 :
file2.close() j = a+len("<headline>")
b = line.find("</headline>",j)
h.append( line[j:b] )
หรือแบบสั้น ๆ ใช้ readlines file1.close()
h.sort()
file1 = open( input().strip() ) for e in h :
file2 = open( input().strip() ) print(e)
print( file1.readlines() == \
file2.readlines() )
► ขอที
file1 = open( input().strip() )
d = []

บทที่ for line in file1 :


d.append( line.strip() )
file1.close()
► ขอที
v1 = [float(e) for e in input().split()] for k in range(len(d)-1) :
v2 = [float(e) for e in input().split()] for i in range(len(d)-1) :
if len(v1) != len(v2) : if len(d[i]) > len(d[i+1]) or \
print( 'Error' ) len(d[i]) == len(d[i+1]) and \
else : d[i] > d[i+1] :
dotp = 0 d[i],d[i+1] = d[i+1],d[i]
for k in range(len(v1)) :
dotp += v1[k]*v2[k] for e in d :
print(dotp) print(e)

152 11 : Solutions to Exercises


บทที่ บทที่
► ขอที ► ขอที
r,c = [int(e) for e in \ d = [ e.count(c) for e in x ]
input().split()]
m = [] ► ขอที
for k in range(r) :
m.append( [int(e) for e in \ แบบแรก
input().split()] ) x = [e for e in x if e >= 0]
if len(m[k]) != c : คือการสร้างลิสต์ใหม่ที่ไม่มีเลขลบ แล้วให้ x อ้างอิงลิสต์ใหม่นี้
m = [[]] ถ้าเขียนอีกแบบ
break x[:] = [e for e in x if e >= 0]
print( m )
คือการสร้างลิสต์ใหม่ที่ไม่มีเลขลบ แล้วน�าค่าในลิสต์ใหม่นี้ไปใส่
► ขอที ในที่เก็บเดิมของลิสต์ x สองวิธีนี้ให้ผลคล้ายกัน ต่างกันตรงที่
infile = open(input().strip()) ถ้าก่อนหน้านีม้ กี ารท�าค�าสัง่ y = x คือให้ y อ้างอิงลิสต์เดียวกับ x
f = [] การท�าแบบแรกจะท�าให้ y อ้างอิงลิสต์เดิม และ x อ้างอิงลิสต์ใหม่
for line in infile : ในขณะที่แบบหลัง y ยังคงอ้างอิงลิสต์เดียวกับ x
usernames = line.split()
f.append( [usernames[0], \
usernames[1:]] ) ► ขอที
infile.close() # t = [ [1,2,3], [33], [3,3,3,4] ]
print( f ) t = sum( [ sum(e) for e in x ] )

► ขอที ► ขอที
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)

11 : Solutions to Exercises 153


► ขอที ► ขอที
n = int(input()) x = int(input())
x = [j for i in range(2, n//2) \ t = ()
for j in range(2*i, n, i)] while x > 0:
x.sort() t = (x%10,) + t
c = [x[i] for i in range(len(x)-1) \ x //= 10
if x[i] != x[i+1] ] print(t)
c.append(x[-1]) หรือ เปลี่ยนมารับสตริง, น�าแต่ละหลักมาเปลี่ยนเป็น int,
เก็บใส่ list, แล้วส่งไปสร้างเป็น tuple
► ขอที x = input().strip()
n = int(input()) print(tuple([int(e) for e in x]))
x = [j for i in range(2, n//2) \
for j in range(2*i, n, i)]
x.sort() ► ขอที
c = [x[i] for i in range(len(x)-1) \ x = input().strip()
if x[i] != x[i+1] ] d = {}
c.append(x[-1]) for e in x:
p = [e for e in range(2,n) if e not in c] if e not in d: d[e] = 1
else: d[e] += 1
print(d)

บทที่ ► ขอที
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

154 11 : Solutions to Exercises


► ขอที ► ขอที
def k(n): MAX = np.max(M,axis=0)
if n==0: return 1 MIN = np.min(M,axis=0)
if n==1: return 2 A = MAX-MIN
if n%2==0:
x = k(n//2) ► ขอที
return x + x%10 Y = (X[:,0]**2+X[:,1]**2)**0.5
return k(n//2-1)*(n//2)
► ขอที
► ขอที k = int(input())
def s(i,k): C = np.zeros((k,k),int)
if i>=k: return 0 C[::2, 1::2] = C[1::2, ::2] = 1
return k + t(i+1,k)
def t(j,k):
if j>=k: return 0 ► ขอที
return j + s(j,k-1) k = int(input())
C = np.zeros((k,k),int)
► ขอที C[::2, ::2] = C[1::2, 1::2] = 1
def is_palindrome(s): C = (C*np.arange(1,k+1)).T
if len(s) <= 1: return True # ใช้ C*(np.arange(1,k+1).T) ไม่ได้ (เพรำะอะไร )
if s[0]!=s[-1]: return False
return is_palindrome(s[1:-1])

บทที่
บทที่ ► ขอที
def __init__(self, name, year, faculty):
► ขอที self.name = name
k = int(input()) self.year = year
M[::k,::k] = 0 self.faculty = faculty

► ขอที def __str__(self):


return self.name + \
' (year ' + str(self.year) + ') ' + \
แบบช้ำ self.faculty
k = int(input())
for i in range(M.shape[0]): def __lt__(self, rhs):
for j in range(M.shape[1]): if self.faculty != rhs.faculty:
if i%k==0 and j%k==0: return self.faculty < rhs.faculty
M[i][j]*=2 if self.year != rhs.year:
return self.year < rhs.year
return self.name < rhs.name
แบบนี้ก็ยังช้ำอยู่
k = int(input())
M = np.array([[2*M[i][j] if i%k==0 \
and j%k==0 else M[i][j] \
for j in range(M.shape[1])] \
for i in range(M.shape[0])])

แบบนี้เร็ว
k = int(input())
N = np.zeros_like(M)
N[::k,::k] = 1
M += M*N

แบบนี้เร็วและสั้น
k = int(input())
M[::k,::k] *= 2

11 : Solutions to Exercises 155


► ขอที ► ขอที
def __init__(self, license, brand, color): def add_value(self, x):
self.license = license self.value += x
self.brand = brand
self.color = color def enter(self, station):
self.report = [] if self.station == '':
self.station = station
def __str__(self): return True
return self.license + ' - ' \ else:
+ self.color + ' ' + self.brand
return False
def __lt__(self, rhs):
return self.license < rhs.license def leave(self, station):
if self.station == '':
def add_report(self, new_report): return (self.value, -2)
self.report.append(new_report) price = Station.get_price \
(self.station, station)
def total_payment(self): if price > self.value:
return sum([r[2] for r in self.report]) return (self.value, -1)
else:
def max_payment(self): self.value -= price
if self.report == []: return [] self.station = ''
max_p = max([r[2] for r in self.report]) return (self.value, 0)
return [r for r in self.report \
if r[2] == max_p] def __lt__(self, rhs):
return self.value < rhs.value
► ขอที
def add_book(self, book, n):
for b in self.books:
if b[0] == book:
b[1] += n
break
else:
self.books.append([book,n])

def delete_book(self, book):


self.books = [[b,n] for [b,n] \
in self.books if b != book]
หรือ
for k in range(len(self.books)):
if self.books[k][0] == book:
self.books.pop(k)
break

def get_total(self):
return sum([b.price*n for \
[b,n] in self.books])

def __lt__(self, rhs):


return self.get_total() < \
rhs.get_total()

156 11 : Solutions to Exercises


Appendix

เวบไ ต์ที่เปนประโยชน์
• 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)

rror ที่สามาร พบได้


แบบขนเปนก ่องขอความ
ขอความ าเ ต แนวทางการแก ข
unexpected EOF while ใส่วงเล็บไม่ครบ เช่น ตรวจสอบวงเล็บให้ครบ
parsing x = (1+(2**3)

EOL while scanning string ใส่อัญประกาศจบสตริงไม่ครบ เช่น เติมอัญประกาศปดสตริงให้ครบ


literal s = 'hello

invalid syntax มีการเขียนโปรแกรมผิดก ของภาษา ตรวจสอบการเขียนโปรแกรม


เช่น ลืม : หลัง if หรือ while ให้เป็นไปตามก ของภาษา
หรือเรียง else มาก่อน if
หรือเปรียบเทียบด้วย = ตัวเดียว
เป็น if x = 1 : หรืออาจจะมี
อักขระพิเศษซ่อนอยู่ ซึ่งมาจากการ
copy-paste ค�าสั่งจากไ ล์ pdf
unexpected indent มีการเยื้องที่ไม่ตรงกัน เช่น จัดการเยื้องให้ตรงกัน
if a>0:
a+=1
a+=2

มายเ ต ควรตรวจสอบข้อผิดพลาดทั้งบรรทัดที่เกิด error และบรรทัดก่อนหน้าบรรทัดที่เกิด error


Appendix 157
แบบขนเปนตัวอัก ร ีแ ง น
ขอความ าเ ต แนวทางการแก ข
name 'x' is not defined ไม่ได้ก�าหนดค่าตัวแปร x ก่อนใช้งาน ก�าหนดค่าตัวแปรก่อนใช้งานให้
เช่น print(x+1) เรียบร้อย
หรือพิมพ์ชื่อ ังก์ชันผิด เช่น ตรวจสอบการพิมพ์ชื่อ ังก์ชัน
pintt('cat') หรือลืม import ท�าการ import ให้เรียบร้อย
ZeroDivisionError: division มีการหารด้วย เช่น print(5/0) แก้ไขตัวหารให้ไม่เป็น
by zero

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))

ValueError: math domain มีการใส่ค่าที่ ังก์ชันไม่รองรับ เช่น ตรวจสอบค่าที่ ังก์ชันนั้นรองรับ


error print(math.asin(1000)) และใส่ค่าที่ถูกต้อง
print(math.log(10,0))

invalid literal for int() มีการใส่คา่ ทีแ่ ปลงไม่ได้ลงไปใน int() ตรวจสอบค่าที่ต้องการแปลง


with base 10 เช่น x = int('cat') ว่าเป็นจ�านวนเต็มหรือไม่
และแก้ไขให้ถูกต้อง
could not convert string to มีการใส่ค่าที่แปลงไม่ได้ลงไปใน ตรวจสอบค่าที่ต้องการแปลง
float float() เช่น x = float('cat') ว่าเป็นจ�านวนทศนิยมหรือไม่
และแก้ไขให้ถูกต้อง
Can't convert 'int' object มีการบวก int กับ string เช่น แก้ไขให้ถูกต้อง อาจใช้ comma
to str implicitly print('cat'+3) แทนเครื่องหมาย
หรือเพิ่มอัญประกาศเป็น '3'
sqrt() takes exactly one ังก์ชัน sqrt() ต้องใส่ข้อมูล 1 ค่า เปลี่ยนให้ใส่ข้อมูลตามจ�านวนที่ ังก์ชัน
argument (3 given) แต่ตอนนี้ใส่ไป 3 ค่า เช่น ก�าหนด
x = sqrt(4,9,16)

ValueError: too many values ค่าที่มีให้ มากกว่าจ�านวนตัวแปร เช่น แก้ไขจ�านวนทั้งสอง ังให้เท่ากัน


to unpack a,b,c = 1,2,3,4,5

ValueError: not enough ค่าที่มีให้ น้อยกว่าจ�านวนตัวแปร เช่น แก้ไขจ�านวนทั้งสอง ังให้เท่ากัน


values to unpack a,b,c = 1,2

TypeError: unorderable มีการเปรียบเทียบจ�านวนกับสตริง แก้ไขประเภทข้อมูลให้ตรงกัน


types: int() < str() เช่น if 9 < '9':
'float' object cannot be มีการใส่ค่า float ในส่วนที่ควรจะ แก้ไขค่าให้เป็นจ�านวนเต็ม
interpreted as an integer เป็นค่า int เช่น
for i in range(2.5):

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'])

FileNotFoundError: No such ต้องการเปดไ ล์ แต่ไม่เจอไ ล์นั้น ตรวจสอบว่ามีไ ล์อยู่จริง และพิมพ์


file or directory ชื่อไ ล์ถูกต้อง
OSError: Invalid argument: พิมพ์ชื่อไ ล์ด้วยเครื่องหมาย \ เช่น พิมพ์ชื่อไ ล์ด้วย \\ แทน เป็น
'D:\x0cile.txt' f = open('D:\file.txt') f = open('D:\\file.txt')

KeyError dict ไม่มี key ที่ต้องการ เช่น ดูว่าใช้ key ถูกต้องหรือไม่


d = {}; print(d[1]) เพิ่ม code เพื่อตรวจสอบว่ามี key
หรือ set ไม่มีสมาชิกที่ต้องการ เช่น อยู่ใน dict หรือไม่
s = {1,2,3}; s.remove(4)

'set' object has no เรียกใช้บริการที่ไม่มีกา� หนดไว้ เช่น แก้ไขการใช้ค�าสั่งให้ถูกต้อง


attribute 'delete' s = {1,2,3}; s.delete(1)
(อาจเกิด error กับ list, ซึ่ง set ไม่มีบริการที่ชื่อว่า delete
string, tuple และ dict ได้ด้วย)

TypeError: unhashable type มีการใช้ list, set, dict เป็น key ตรวจสอบประเภทข้อมูลที่น�ามาใช้
ของ dict หรือเก็บ list, set, ว่าไม่ใช่ list, set, dict
dict ใน set เช่น
d = {}; d[{1}] = 'cat'

unsupported operand type(s) มีการน�า None ไปประมวลผล เช่น return ค่าให้ถูกต้อง


for +: 'NoneType' and 'int' def func(x):
x += 1
print(func(3)+1)
ซึ่งอาจเกิดจากการลืม return
'int' object is not มีการเรียก ังก์ชันด้วยตัวแปร เช่น ตรวจสอบการตั้งชื่อ ังก์ชันและ
callable a = 3 ตัวแปร และแก้ไขให้ถูกต้อง
b = a(5)
อาจเกิดจากการตั้งชื่อ ังก์ชันซ�้ากับ
ตัวแปร
RecursionError: maximum มีการเรียก ังก์ชันตัวเองซ�้ามากเกินไป เติมกรณีพื้น านของการ recursive
recursion depth exceeded อาจเกิดจากการลืมกรณีพื้น านของ และเช็คเงื่อนไขการหยุดท�างานให้
การ recursive เช่น ถูกต้อง
def f(n):
return n*f(n-1)

Appendix 159
ุภเส
Intania 86
์ ชชัย รี

Solutions Engineer, Facebook


และ นายกสมาคมโปรแกรมเมอร์ไทย

ผ มคิดว่าการเรียนเขียนโปรแกรมจะเป็นเหมือนการเรียนภาษาที่ 3 ในอนาคตอันใกล้ ยิ่งเทคโนโลยีแทรกซึมไปใน


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

Intania 95
ั ชยา ี ะ ุภกุ

ตลาดหลักทรัพย์แห่งประเทศไทย

ถ้า เทียบการสร้าง soft are กับการสร้างตึกตึกหนึ่ง programming ก็เหมือนเป็นเสาเข็ม ที่รองรับแรงของทั้งตึก


ให้ตั้งอยู่ได้ และไม่พังทลาย ตราบใดที่ไม่มีเสาเข็ม ก็ไม่สามารถสร้างตึกได้ ดังนั้น programming ก็เป็นเหมือน
ราก านทีส่ า� คัญของ soft are ถ้าเรามีทกั ษะ programming ทีด่ ี เราก็จะสามารถพั นา soft are ทีม่ คี ณ
ุ ภาพได้เช่นกัน
ค�า ังพน าน import math

x = int(input()) รับข้อมูลจ�านวนเต็ม 1 จ�านวน math.exp(x): คืนค่า e ยกก�าลัง x


x,y,z = [float(e) for e in input().split()] math.cos(x): คืนค่า cosine ของ x เรเดียน
รับข้อมูลจ�านวนจริง 3 จ�านวนในบรรทัดเดียวกัน คัน่ ด้วยช่องว่าง math.sin(x): คืนค่า sine ของ x เรเดียน
int(x), float(x), str(x): math.sqrt(x): คืนค่ารากทีส
่ องของ x
คืนค่า x ทีถ่ กู เปลีย่ นประเภทข้อมูลเป็นจ�านวนเต็ม จ�านวนจริง และสตริง math.log(x,base): คืนค่าลอการิทม ึ ของ x าน base
abs(n): คืนค่าสัมบูรณ์ของ n math.degrees(x): แปลงมุม x จากเรเดียนเป็นองศา
round(f): คืนค่าจ�านวนเต็มทีเ่ กิดจากการปัดเศษจ�านวนจริง f math.radians(x): แปลงมุม x จากองศาเป็นเรเดียน
โดยถ้าเศษของ f มีคา่ ตัง้ แต่ 0.5 จะปัดขึน้ ถ้าน้อยกว่า 0.5 จะปัดลง math.pi, math.e: ค่าคงที่ pi และ e
round(f,d): คืนค่าจ�านวนจริงทีเ่ กิดจากการปัดเศษจ�านวนจริง f
string s
โดยปัดให้มจี า� นวนตัวเลขหลังจุดทศนิยม d หลัก
range(start,stop [,step]) หรือ range(stop): s.lower(): คืนสตริงใหม่ทมี่ คี า่ เหมือน s แต่เป็นตัวพิมพ์เล็กทัง้ หมด
คืนค่าเป็นลิสต์ของตัวเลขตามล�าดับตัง้ แต่ start ถึง stop-step และ s.upper(): คืนสตริงใหม่ทมี่ คี า่ เหมือน s แต่เป็นตัวพิมพ์ใหญ่ทงั้ หมด
เพิม่ ขึน้ ทีละ step (ถ้าไม่ระบุ start จะมีคา่ 0 และ step จะมีคา่ 1) s.find(sub): คืน index แรกสุดทีพ ่ บ sub ใน s ถ้าไม่พบคืนค่า -1
enumerate(L): คืนลิสต์ของ tuple (index, element) ของแต่ละ s.find(sub,i): คืน index แรกสุดทีพ ่ บ sub ใน s โดยเริม่ ค้นที่ index i
ข้อมูลในลิสต์ L s.count(sub): คืนจ�านวนครัง้ ที่ sub ปรากฏในสตริง s

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):

D.values(): คืนลิสต์ของ value ทัง้ หมดของดิกชันนารี D คืนอาเรย์ทมี่ คี า่ ของข้อมูลในแต่ละต�าแหน่งเป็นผลจากการเรียก งั ก์ชนั


D.pop(k): ลบข้อมูลใน D ทีม ่ ี key เป็น k และคืนค่า value ของ key นัน้ sine, cosine, sqrt, abs กับข้อมูลในอาเรย์ a ทีต ่ า� แหน่งเดียวกัน
D.update(D1): เพิม่ ข้อมูลจากดิกชันนารี D1 เข้าไปใน D np.max(a,axis), np.min(a,axis): คืนอาเรย์ของค่ามาก/น้อยทีส ่ ดุ
ใน a ตาม axis ทีก่ า� หนด
set S
np.argmax(a,axis), np.argmin(a,axis): คืนอาเรย์ของ index
S.add(e): เพิม่ e ในเซต S ทีม่ คี า่ มาก/น้อยทีส่ ดุ ใน a ตาม axis ทีก่ า� หนด ตัวอย่างเช่น
S.difference(T): คืนเซตใหม่ทเี่ ท่ากับ S-T a = np.array([ [2, 4, 6], [8, 10, 12] ])
S.discard(e): ลบ e ออกจากเซต S ถ้าไม่มี e ใน S ก็ไม่ทา� อะไร np.max(a) คืนค่า 12, np.argmax(a)คืนค่า 5
S.intersection(T): คืนเซตใหม่ทเี่ ท่ากับ S T np.max(a,axis=0) คืนค่า array([8,10,12])
S.union(T): คืนเซตใหม่ทเี่ ท่ากับ S U T np.argmax(a,axis=0) คืนค่า array([1,1,1])
S.issubset(T): ทดสอบว่า S ⊆ T หรือไม่ np.argmax(a,axis=1) คืนค่า array([2,2])
S.issuperset(T): ทดสอบว่า S ⊇ T หรือไม่ np.sum(), np.std(), np.mean(): มีการใช้งานเหมือน np.max()
S.pop(): ลบข้อมูลหนึง่ ตัวออกจากเซต S และคืนข้อมูลทีถ
่ กู ลบ np.ndenumerate(a): คืนลิสต์ของ tuple (position,element) ของ
S.update(T): ให้ S = S U T แต่ละข้อมูลใน a โดย position เป็น tuple ทีเ่ ก็บต�าแหน่งของข้อมูล
Find job opportunities at jobs.exxonmobil.com

You might also like