Upload
others
View
10
Download
0
Embed Size (px)
Citation preview
Python ๑๐๑
ภาควชาวศวกรรมคอมพวเตอร คณะวศวกรรมศาสตร สงหาคม ๒๕๖๐
v1.0.1
ผอานสามารถดาวนโหลดหนงสอรนลาสด
และรวมแสดงความคดเหน/ขอแนะน�าเกยวกบหนงสอเลมนท
www.cp.eng.chula.ac.th/books/python101
ขอบคณครบ
กตตภณ พละการ, กตตภพ พละการ, สมชาย ประสทธจตระกล, สกร สนธภญโญ
Python ๑๐๑ / กตตภณ พละการ, กตตภพ พละการ, สมชาย ประสทธจตระกล, สกร สนธภญโญ
1. การเขยนโปรแกรม (คอมพวเตอร)
2. ไพทอน (คอมพวเตอร)
005.133
ISBN 978-616-407-189-6
พมพครงท 1 จ�านวน 1,000 เลม พ.ศ. 2560
สงวนลขสทธตาม พ.ร.บ. ลขสทธ พ.ศ. 2537/2540
การผลตและการลอกเลยนหนงสอเลมนไมวารปแบบใดทงสน
ตองไดรบอนญาตเปนลายลกษณอกษรจากเจาของลขสทธ
จดพมพโดย
ภาควชาวศวกรรมคอมพวเตอร
คณะวศวกรรมศาสตร จฬาลงกรณมหาวทยาลย
พญาไท กรงเทพฯ 10330
http://www.cp.eng.chula.ac.th
ออกแบบปก : กมลพรรณ ลวประเสรฐ
ออกแบบรปเลม : ภานกร สนทรเวชพงษ
พมพท โรงพมพแหงจฬาลงกรณมหาวทยาลย โทรศพท 0-2218-3549-50 โทรสาร 0-2218-3551
ค�ำน�ำ
วชา ๒๑๑๐๑๐๑ การเขยนโปรแกรมคอมพวเตอร เปนหนงในวชาพนฐานทางวศวกรรมศาสตร ทนสตชนปท ๑
คณะวศวกรรมศาสตร ทกคนตองลงทะเบยนเรยน วตถประสงคหลกของวชานคอ ใหนสตเขาใจหลกการในการใชค�าสงตาง ๆ
ของภาษาโปรแกรม เพอเขยนโปรแกรมคอมพวเตอรใหตรงตามขอก�าหนดทไดรบ การเขยนโปรแกรมเปนความสามารถทตอง
ลงมอฝกฝนฝกปฏบตดวยตนเอง เหมอนกบทกษะอนทางวศวกรรมทจ�าเปนตองฝก ๆ ๆ ใหช�านาญจงจะไดผล ไมสามารถไดมา
ดวยการอาน ๆ ๆ จ�า ๆ ๆ
หนงสอ Python ๑๐๑ เลมนถกจดท�าขน เพอใหนสตใชทบทวนเนอหาหลงชมภาพยนตรบรรยายเนอหาดวยตนเอง
ในแตละบท ใชเตรยมตวกอนเขาเรยน และใชระหวางการเขยนโปรแกรมจรงในหองปฏบตการทจดขนเปนกจกรรมประจ�าทกสปดาห
โดยมระบบ Grader ชวยตรวจสอบความถกตองของผลการท�างานของโปรแกรมอยางอตโนมต นสตจะไดฝกเขยนโปรแกรมตาม
โจทย ฝกหาทผด และฝกตรวจสอบความถกตองของโปรแกรมทพฒนาขน นอกจากน ยงมแบบฝกปฏบตเพมเตมอกมากมายใน
ระบบ Grader ใหนสตไดท�าเสรมอกดวย
ผเขยนตองขอขอบคณ ผศ. ดร. นทท นภานนท ผปรบปรงระบบตรวจโปรแกรมอตโนมต Grader เพอใชประกอบ
การเรยน การสอน และการสอบวชาการเขยนโปรแกรมมาตงแตปการศกษา ๒๕๕๗ ขอขอบคณบคลากรของศนยคอมพวเตอร
คณะวศวกรรมศาสตร ทใหบรการจดเตรยมความพรอมของอปกรณและเครอขายในหองปฏบตการ ขอขอบคณคณาจารยและ
นสตชวยสอนทรวมกนสรางโจทยปญหา สอน และปรบปรงวชา ๒๑๑๐๑๐๑ ตลอดมา ขอขอบคณ ภานกร สนทรเวชพงษ และ
อตคณ ออไอศรย ทชวยจดรปเลม และ กมลพรรณ ลวประเสรฐ ทชวยออกแบบหนาปก ขอขอบคณภาควชาวศวกรรมคอมพวเตอร
ทใหการสนบสนนในสารพดเรอง และทายสดทตองขอบคณทสดกคอ นสตคณะวศวฯ กวาหลายพนคนทขยนหมนศกษาและฝาฟน
อปสรรคในการเรยนวชาพนฐานบงคบทคอนขางไมคนเคยนจนส�าเรจ *
กตตภณ พละการ
กตตภพ พละการ สมชาย ประสทธจตระกล
(ผเรยบเรยงและรวบรวมเนอหา)
สกร สนธภญโญ (ทปรกษา)
ภาควชาวศวกรรมคอมพวเตอร
คณะวศวกรรมศาสตร
จฬาลงกรณมหาวทยาลย
๑๒ สงหาคม ๒๕๖๐
* ภาควชาวศวกรรมคอมพวเตอรขอขอบคณ บรษท เอกซอนโมบล จ�ากด ทใหการสนบสนนคาใชจายส�าหรบการจดพมพใหกบ
นสตทกคนทลงทะเบยนเรยนวชา ๒๑๑๐๑๐๑ ใชประกอบการเรยนในปการศกษา ๒๕๖๐
ขอขอบคณ
คณาจารยคณะวศวกรรมศาสตร จฬาลงกรณมหาวทยาลย
ผศ. ดร. ชยเชษฐ สายวจตร
ศ. ดร. ไพศาล กตตศภกร
รศ. ดร. อาณต เรองรศม
รศ. ดร. พสทธ เพยรมนกล
อ. ดร. กรวก ตนกษรานนท
อ. ดร. พรรณ แสงแกว
รศ. ดร. ณฐชา ทวแสงสกลไทย
อ. ดร. เชษฐา พนธเครอบตร
อ. ดร. สรฐ ขวญเมอง
ผศ. ดร. อนรกษ ศรอรยวฒน
ผศ. ดร. จรวฒน ชวรงโรจน
ผศ. ดร. ณฐวฒ หนไพโรจน
ศษยเกาภาควชาวศวกรรมคอมพวเตอร
คณะวศวกรรมศาสตร จฬาลงกรณมหาวทยาลย
คณวโรรส โรจนะ
คณธนาวฒน มาลาบปผา
คณลสา ตรงประกอบ
คณภทราวธ ซอสตยาศลป
คณวโรจน จรพฒนกล
คณสภชย สตณฑวบลย
คณศภเสฏฐ ชชยศร
คณณฐชยา ลละศภกล
ทกรณาใหความรถงความส�าคญของการเขยนโปรแกรมกบงานทางวศวกรรมในสาขาตาง ๆ
ขอขอบคณภาพประกอบจาก
https://commons.wikimedia.org/wiki/File:WomaBallPython.jpg (ภาพง)
https://pixabay.com/en/snake-python-tree-python-terrarium-1184810/ (ภาพลายหนงง)
https://pixabay.com/en/polygon-background-blue-design-2189646/ (ภาพพนหลงหนาปก)
https://www.python.org/community/logos/ (สญลกษณ Python)
http://www.pythontutor.com (ภาพประกอบค�าอธบายเนอหา)
สำรบญ
00 : Programming in Engineering 1
01 : Data Type, Variable and Expression 5
02 : Selection ( if-elif-else ) 15
03 : Repetition ( while, for ) 29
04 : String 43
05 : File 55
06.1 : List 65
06.2 : Nested List 75
06.3 : List Comprehension 83
07 : Tuple, Dictionary and Set 91
08 : Function and Recursion 109
09 : NumPy 121
10 : Class 133
11 : Solutions to Exercises 149
Appendix 157
คณาจารยวชา ๒๑๑๐๑๐๑ ปการศกษา ๒๕๕๘ - ๒๕๕๙
อ. ดร. ชยรต พงศพนธภาณ
ผศ. เชษฐ พฒโนทย
อ. ดร. ฐต ศรบรณ
อ. ดร. ดวงดาว วชาดากล
ผศ. ดร. ธนารตน ชลดาพงศ
ศ. ดร. ประภาส จงสถตยวฒนา
ผศ. ดร. พรพล เวทกล
รศ. มณฑนา ปราการสมทร
ผศ. ดร. วระ เหมองสน
รศ. ดร. สมชาย ประสทธจตระกล
ผศ. ดร. สกร สนธภญโญ
นสตชวยสอนวชา ๒๑๑๐๑๐๑ ปการศกษา ๒๕๕๘ - ๒๕๕๙
กบล กาญจมาภรณกล
กตตภณ พละการ
กตตภพ พละการ
ไกรฤกษ ตรทพสนทร
คณศร ทองประไพแสง
ชานนท ภทรธยานนท
ณฐชนน ผจงกจพพฒน
ธนานพ กอบชยสวสด
ธรพงศ ปานบญยน
ธรภทร ชนธนกจ
ธราพร ศภกล
ลทธพล จระประดษฐ
วรยทธ วงศนล
สทธพงษ เหลาโกก
สทศไนย หลาธรรม
อรญชย ชวะโนทย
อสรา วชาค�า
ภาควชาวศวกรรมคอมพวเตอร
คณะวศวกรรมศาสตร จฬาลงกรณมหาวทยาลย
00 : Programming in Engineering 1
ศ าสตรของวศวกรรมไฟฟาเปนศาสตรทครอบคลมความหลากหลาย มการ
เปลยนแปลงและมความพลวตอยางมากในปจจบน ในหลายโอกาส การสราง
ตนแบบเสมอนจรงอาจมตนทนสง หรอแทบเปนไปไมไดเลยในชวงเรมตนของโครงการ
ตาง ๆ ความสามารถในการใชทกษะการ Programming เพอวตถประสงคตาง ๆ เชน
การสรางแบบจ�าลองดวยคอมพวเตอรเพอการออกแบบ การศกษาความเปนไปได
ในการใชงาน การทดสอบสมรรถนะ หรอแมกระทงการจ�าลองเพอหาเหตการณท
เกนความคาดหมายของวศวกร จงเปนสงจ�าเปนอยางมากส�าหรบวศวกรไฟฟาทกสาขา
ในปจจบนและอนาคต
ผศ. ดร. ชยเชษฐ สายวจตรภาควชาวศวกรรมไฟฟา
ในทางวศวกรรมโยธา โปรแกรมมใชกนอยางมากเพอใชจ�าลองพฤตกรรมของ
โครงสรางเชน อาคาร สะพาน ฐานราก ภายใตการรบแรงซงจะท�าใหทราบ
แรงทเกดกบโครงสรางเพอทวศวกรโยธาจะท�าการออกแบบโครงสรางใหปลอดภย
และประหยด และในการกอสรางกตองใชโปรแกรมเพอการวางแผนและจดการ
การกอสราง นอกจากนนกมการใชโปรแกรมในการจ�าลองระบบขนสงเพอการออกแบบ
หรอวเคราะหระบบคมนาคมแบบตาง ๆ
รศ. ดร. อาณต เรองรศมภาควชาวศวกรรมโยธา
00 : Programming in Engineering
Programming เปนเครองมอทชวยในการหาค�าตอบเพออธบายปรากฏการณ
หรอพฤตกรรมพลวตของหนวยปฏบตการหรอกระบวนการตาง ๆ นอกจากน
ยงใชประมาณคาตวแปรหรอพารามเตอร และพฒนาไปสการท�านายปรากฏการณหรอ
พฤตกรรมพลวตของหนวยปฏบตการหรอกระบวนการตอไป
ศ. ดร. ไพศาล กตตศภกรภาควชาวศวกรรมเคม
2 00 : Programming in Engineering
Programming มความส�าคญตอการเรยนในสาขาวชาวศวกรรมนวเคลยรคอนขางมาก
การประมวลผลการตรวจวดรงสแบบทเปนจ�านวนนบรงส จ�านวนขอมลการนบรงส
มจ�านวนมากตอการวด เครองตรวจนบรงสตองใชโปรแกรมคอมพวเตอรในการรวบรวม
และประมวลผลขอมลมาสรางเปนแถบสเปกตรมขอมล ส�าหรบการประมวลผลทไดจากภาพ
การฉายรงสแบบภาพคอนทราสขาว-ด�า การถายภาพรงสแบบทะลผานและมสเตปการถาย
หมนรอบวตถนนทเรยกวา CT-scan เมอรวบรวมผลของแตละสเตปมารวมกนจะได
ภาพตดขวางของวตถหรอถามการวดในแนวตงดวยท�าใหไดภาพสดทายเปนภาพ 3D ซงจะได
เปนโมเดลทมรายละเอยดภายในดวย โดยเทคนคนท�าใหไดขอมลภายในของวตถหรอแมแต
ภายในของรางกายมนษยได และยงออกแบบโปรแกรมในการควบคมอปกรณการตรวจวดรงสใหท�างานไดอยางอตโนมต และ
ควบคมไดจากระยะไกล ท�าใหผใชรบปรมาณรงสนอยลง ส�าหรบระบบการควบคมการท�างานทงหมดของโรงไฟฟานวเคลยรนน
ท�าโดยโปรแกรมคอมพวเตอรทงหมด
อ. ดร. พรรณ แสงแกวภาควชาวศวกรรมนวเคลยร
ก ารเขยนโปรแกรมมความส�าคญกบงานทกดานของวศวกรรมส�ารวจ โดยเฉพาะ
อยางยงงานดาน GIS ทตองการการเขยนโปรแกรมในการจดการ ประมวลผล
วเคราะห และแสดงผลขอมล โดยเฉพาะขอมลขนาดใหญทซอฟตแวรพนฐาน
โดยทวไปเชน MS Excel ไมสามารถรองรบได นอกจากน ยงมความส�าคญตอการ
พฒนาซอฟตแวรดานแผนท โดยเฉพาะระบบแผนทบนเวบทตองอาศยการพฒนาดวย
การเขยนโปรแกรม และการเขยนโปรแกรมส�าคญมากทสดกบการศกษาในระดบสง
เนองจากจะตองพฒนาซอฟตแวรใหมขนมาใหมเอง
อ. ดร. กรวก ตนกษรานนทภาควชาวศวกรรมส�ารวจ
ก ารเรยนวศวกรรมสงแวดลอม บอยครง เราตองค�านวณและสรปผลวเคราะห
คาพารามเตอรทางสงแวดลอมซงค�านวณไมงาย และกไมซบซอนถงขนาดตองเรยน
ภาคคอม ฯ การทนสตไดเรยน Programming เบองตน จะสามารถชวยใหนสตสามารถ
ตอยอดความรไปสงานวศวกรรมสงแวดลอมในโลกอนาคตไดอยางงายดาย
รศ. ดร. พสทธ เพยรมนกลภาควชาวศวกรรมสงแวดลอม
00 : Programming in Engineering 3
บทบาทของวศวกรรมอตสาหการ คอ การออกแบบ ด�าเนนการ ปรบปรงและ
สรางสรรคนวตกรรมระบบ ทงการผลต บรการ และ ธรกจ
ทกษะ Programming ชวยใหมตรรกะการคดอยางมเหตผล อกทงยงเปน
เครองมอในการวเคราะหและประมวลผลอยางรวดเรวและแมนย�าตามตวแปรและ
ขอจ�ากดในบรบทหนง ๆ ซงมความซบซอนมากขนในอนาคต
รศ. ดร. ณฐชา ทวแสงสกลไทยภาควชาวศวกรรมอตสาหการ
Programming เปนเครองมอทใชในการสราง ค�านวณและวเคราะหผลของ
แบบจ�าลองทางวศวกรรมของระบบทางกล ความรอน ของแขงและของไหล
นอกจากแบบจ�าลองแลว ยงใชในการควบคมระบบทางกลตาง ๆ เชน ระบบ
อตโนมตหนยนต เปนตน
อ. ดร. สรฐ ขวญเมองภาควชาวศวกรรมเครองกล
วทยาการทางดานวศวกรรมโลหการและวสด เปนความรทเกยวของกบหลกการพนฐาน
ของวสดตาง ๆ กระบวนการแปรรปและขนรปโลหะ สมบตของวสด และการเลอก
และออกแบบวสดทเหมาะสมกบงานทหลากหลาย ดงนน เพอใหสามารถพฒนาวสดใหม
ใหมสมบตตาง ๆ ทดขน Computer Programming จงเขามามบทบาทส�าคญในการ
สรางแบบจ�าลองตาง ๆ เพอเชอมโยงความสมพนธระหวาง กระบวนการผลต - โครงสราง
ของวสด - สมบตของวสด - ความสามารถในการใชงาน ในปจจบนมการน�า Computer
Programming เขามาใชอยางแพรหลายมากขน อาทเชน การท�านายโครงสราง
จลภาคของวสดภายหลงการขนรปดวยกรรมวธตาง ๆ เชน Casting, 3D printing,
Metal Forming จนสามารถท�าใหปรบปรงใหวสดมความแขงแรงทสงขนได หรอมการ
น�ามาใชเพอท�านายการพงเสยหายของวสดจากการเกด Fatigue และ Corrosion ท�าให
สามารถวางแผนการซอมบ�ารงไดอยางเหมาะสมมากขน นอกจากนนยงมการน�า Artificial Intelligence เขามาใชเพอหา
สวนผสมของวสดใหม ๆ ทยงไมเคยมการคนพบอกดวย
อ. ดร. เชษฐา พนธเครอบตรภาควชาวศวกรรมโลหการ
4 00 : Programming in Engineering
ง านทางด านวศวกรรมแหล งน� ามความจ�าเป นทจะต องย ง เกยวกบข อมล
จ�านวนมาก ทงขอมลน�าฝน ขอมลน�าทา ขอมลสภาพพนท ขอมลความตองการการใชน�า
Programming จงเปนเครองมอส�าคญในการชวยจดการ วเคราะห และประมวลผล
ขอมลตาง ๆ อยางมประสทธภาพ
ผศ. ดร. อนรกษ ศรอรยวฒนภาควชาวศวกรรมแหลงน�า
ก ารใชแบบจ�าลองแหลงกกเกบปโตรเลยมเปนสงจ�าเปนในงานวศวกรรมปโตรเลยม
เพอท�าความเขาใจกบพฤตกรรมการผลตในอดตและปจจบน และยงใชท�านาย
การผลตในอนาคตอกดวย นอกจากนปรมาณขอมลการผลตทถกจดเกบอยางตอเนอง
จ�าเปนตองมการบรหารจดการทด เพอใหวศวกรสามารถน�าไปใชประโยชนไดหลากหลาย
รปแบบ ความส�าคญของการเขาใจและสามารถเขยนโปรแกรมเพอใชงานเปนการเฉพาะ
เปนสงจ�าเปนส�าหรบวศวกรปโตรเลยม
ส�าหรบงานวศวกรรมเหมองแรมการน�า Programming ไปใชในการออกแบบ
การท�าเหมองแร เชน การเปดหนาดนเพอน�าแรออกมา การค�านวณเสถยรภาพของ
ชนดน การขนสงวตถดบจากบรเวณหนาเหมอง การใชธรณสถตเพอประกอบการค�านวณ
ปรมาณส�ารอง เปนตน
ผศ. ดร. จรวฒน ชวรงโรจนภาควชาวศวกรรมเหมองแรและปโตรเลยม
ก ารทมนษยเราเปนสตวสงคมทอยรวมกน ท�าใหสงทเราจะเรยนรตงแตเดก ๆ คอภาษา
ทเราใชในการสอสารระหวางกน เพอใหมนษยเราสามารถเขาใจกนไดเปนอยางด
เฉกเชนเดยวกน การทจะเขาใจสงตาง ๆ ในโลกปจจบน ทเปนโลกดจตอล จ�าเปนอยางยง
ทเราจะตองเรยนรภาษาทคอมพวเตอรเขาใจ ดงเชนภาษา Python ซงจะชวยใหเราไดเขาใจ
การท�างานของคอมพวเตอรมากยงขน ดงนน นสตทศกษาในภาควชาวศวกรรมคอมพวเตอร
มความจ�าเปนอยางยงทจะตองเรยนรการเขยนโปรแกรม เพราะไมเพยงแตจะตองเขาใจ
กลไกและกระบวนการท�างานของคอมพวเตอรเทานน แตยงจะตองสามารถเขยนโปรแกรม
เพอควบคมการท�างานของคอมพวเตอรไดอยางเหมาะสมและมประสทธภาพ
ผศ. ดร. ณฐวฒ หนไพโรจนภาควชาวศวกรรมคอมพวเตอร
01 : Data Type, Variable and Expression 5
01 : Data Type, Variable and Expression
สรปเนอหาตวแปรเปนทเกบขอมลในโปรแกรม ตองมชอก�ำกบ
• ชอตวแปรประกอบดวยตวอกษร ตวเลข หรอเครองหมำยขดเสนใต _ ตวองกฤษใหญไมเหมอนตวเลก หำมขนตนชอดวยตวเลข
• อยำตงชอตวแปรซ�ำกบชอฟงกชนใน Python เชน int, str, max, sum, abs, ...(ไมหำมถำจะตงซ�ำ แตไมควรท�ำอยำงยง)
ขอมลใน Python ทน�ำมำประมวลผลมหลำยประเภท ทเรำจะศกษำในบทนมดงตอไปน
int จ�ำนวนเตม -105000011 (Python หามไมใหเขยน 0 น�าหนาจ�านวนเตม เชน 020)
float จ�ำนวนจรง 10.01.23e59 มคาเทากบ 1.23×1059
str ขอควำม 'Programming is easy'"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'
• ขอควรระวง : รควำมแตกตำงของ / กบ // และศกษำล�ำดบกำรท�ำงำนของ operator ใหด ถำไมมนใจ ใสวงเลบ เชน a/2*b เทำกบ (a/2)*b แต a/(2*b) เทำกบ a/2/b
6 01 : Data Type, Variable and Expression
ค�ำสงกำรแสดงขอมลทำงจอภำพ
• 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
01 : Data Type, Variable and Expression 7
ส�ำหรบผทเคยเรยนภำษำ C อยำเผลอเขยนค�ำสง ++k หรอ --k
++k คอกำรตดบวกคำใน k สองครง จงมคำเทำกบ k คำใน k ไมเปลยน--k คอกำรตดลบคำใน k สองครง จงมคำเทำกบ k คำใน k ไมเปลยน
ลม import math เมอใชฟงกชนของ math
y = (-b+math.sqrt(b*b-4*a*c)) / (2*a) จะฟองวำไมรจก math
ใสวงเลบเปดกบปดไมครบ import mathy = 2+(x*abs(y-z/2) วงเลบปดมนอยไปy = -b+math.sqrt(b*b-4*a*c)) / (2*a) ขาดวงเลบเปด
สะกดชอตวแปรผด หรอผดเรองกำรใช ตวองกฤษเลกกบใหญ
count = 0Count = count + 1 Count กบ count เปนคนละตว
ตงชอตวแปรซ�ำกบชอฟงกชนมำตรฐำน ใน IDLE ตวแปรทถกตองมสด�ำ เปนสอนจะสรำงปญหำ
int = 27print( int ) ได 27แตหลงจำกน ใชค�ำสง a = int(input()) เพออำนขอมลจำกแปนพมพ แลวแปลงเปนจ�ำนวนเตมไมไดแลว (IDLE แสดง int ดวยสมวง)
น�ำขอมลทไมใชสตรงมำบวกกบสตรง import matha = math.pi * r**2print('area = '+a) ผดprint('area = '+str(a)) แปลง a เปนสตรงกอนprint('area =',a) แบบน print แปลง a เปนสตรงให
แบบฝกหด
Problem Code
Input: รบจ�ำนวนเตม 3 จ�ำนวนจำกแปนพมพ (บรรทดละจ�ำนวน) เกบในตวแปร h, m และ s ซงแทนจ�ำนวนชวโมง นำท และ วนำทProcess: ค�ำนวณจ�ำนวนวนำทรวมทคดจำก h, m และ sOutput: จ�ำนวนวนำทรวมทงหมดทค�ำนวณได
Input: รบจ�ำนวนจรง 1 จ�ำนวนจำกแปนพมพ เกบใน xProcess: ค�ำนวณ Output: คำ y ทค�ำนวณได
8 01 : Data Type, Variable and Expression
Problem Code
Input: รบจ�ำนวนจรง 1 จ�ำนวนจำกแปนพมพ เกบใน aProcess: ให x มคำเปน 1 จำกนนท�ำค�ำสง x = (x + a/x)/2 จ�ำนวน 4 ครงOutput: คำ x ทไดจำกกำรท�ำงำนขำงบนน
Input: ม 2 บรรทด แตละบรรทดมจ�ำนวนจรง 3 จ�ำนวน คนดวยชองวำง อำนบรรทดแรกเกบใน v1, v2, v3 แทนเวกเตอร v = (v1, v2, v3) อำนบรรทดทสองเกบใส u1, u2, u3 แทนเวกเตอร u = (u1, u2, u3)
Process: ค�ำนวณ dot product ของเวกเตอร v กบ uOutput: คำ dot product ทค�ำนวณได
Input: อำนจ�ำนวนจรง 4 จ�ำนวนคนดวยชองวำงจำกแปนพมพ เกบใน x1, y1, x2 และ y2 คำของ x1, y1 แทนพกดของจดท 1 และ x2, y2 แทนพกดของจดท 2 บนระนำบ x-yProcess: ค�ำนวณระยะหำงสนสดระหวำงจดทงสองOutput: ระยะหำงทหำได
Input: อำนพกดเชงขวของจดบนระนำบ ซงเปนจ�ำนวนจรง 2 จ�ำนวนคนดวยชองวำง เกบในตวแปร r และ theta (เปนเรเดยน)Process: ค�ำนวณคำ x และ y ซงเปนพกดคำรทเซยน ของจด (r, theta) ทอำนเขำมำOutput: คำ x และ y (คนดวยชองวำง)
Input: อำนพกดคำรทเซยนของจดบนระนำบ ซงเปนจ�ำนวนจรง 2 จ�ำนวนคนดวยชองวำง เกบในตวแปร x และ yProcess: ค�ำนวณคำ r และ theta (เปนเรเดยน) ซงเปน พกดเชงขวของจด (x, y) Output: คำ r และ theta (คนดวยชองวำง)
01 : Data Type, Variable and Expression 9
Problem Code
Input: อำนจ�ำนวนจรง 5 จ�ำนวน คนดวยชองวำงProcess: ค�ำนวณคำเฉลยของจ�ำนวนทงหำ Output: คำเฉลยทหำได
Input: รบขอมล 3 ตว a, b กบ c คนดวยชองวำงa และ b เปนตวอกษร สวน c เปนจ�ำนวนเตมOutput: ตวอกษรใน a ตอกบตวอกษรใน b ตอกบ คำของจ�ำนวนเตมใน c ตอกบ ชดของตวอกษรใน a ตอกบตวอกษรใน b ทซ�ำ ๆ กนเปนจ�ำนวน c ชด เชนผใชปอน v o 5 จะแสดง vo5vovovovovo
ตวอยางการแกโจทยปญหา
Triangle จงเขยนโปรแกรมค�ำนวณพนทสำมเหลยมททรำบควำมยำวดำนสองดำน (a กบ b) และมมระหวำงดำนสองดำนนน (C) จำกสตร
► ขอมลน�ำเขำ
บรรทดแรกคอควำมยำวดำน a (หนวยเปนเซนตเมตร) บรรทดทสองคอควำมยำวดำน b (หนวยเปนเซนตเมตร) บรรทดทสำมคอมมระหวำงดำนทงสอง C (หนวยเปนองศำ)
► ขอมลสงออก
พนทของสำมเหลยมทรบเปนขอมลน�ำเขำ (หนวยเปนตำรำงเซนตเมตร) แสดงในรปแบบทแสดงตำมตวอยำงดำนลำง
► ตวอยำง
Input (จากแปนพมพ) Output (ทางจอภาพ)
10.0 10 90.0
area = 50.0 (sq cm)
1e1 2e1 50.5
area = 77.162458338772 (sq cm)
10 01 : Data Type, Variable and Expression
ตวอยางการเขยนโปรแกรม
โปรแกรม ค�าอธบาย
a = input()b = input()C = input()area = 1/2 a*b*sin Cprint(area)
Invalid Syntax ผดทบรรทดท 4ลมเขยน * --> เปลยนเปน area = 1/2*a*b*sin C
a = input()b = input()C = input()area = 1/2*a*b*sin Cprint(area)
Invalid Syntax ผดทบรรทดท 4ลมใสวงเลบ --> เปลยนเปน area = 1/2*a*b*sin(C)
a = input()b = input()C = input()area = 1/2*a*b*sin(C)print(area)
สง run, ใสขอมล, ผดทบรรทดท 4TypeError: can't multiply sequence by non-int of type 'float'แปลวำ ระบบไมสำมำรถคณได เพรำะ a เปนสตรง (b และ C ดวย) จำกบรรทดท 1, 2 และ 3 จงตองแปลงใหเปนจ�ำนวนกอน ในโจทย ไมไดบอกวำควำมยำวดำนและมมเปน int หรอ float แตถำดตวอยำงพบวำใสไดทง int และ float จงตองแปลงสตรงจำก input() ใหเปน float
a = float(input()b = float(input())C = float(input())area = 1/2*a*b*sin(C)print(area)
Invalid Syntax บอกวำผดบรรทดท 2ระบบบอกผดบรรทดใด ใหดบรรทดกอนหนำดวย เพรำะผดกอนหนำ บำงทลำมมำบรรทดถดมำ ในทน เหนไดวำ ลมใสวงเลบปด
a = float(input())b = float(input())C = float(input())area = 1/2*a*b*sin(C)print(area)
สง run, ใสขอมล, ผดทบรรทดท 4NameError: name 'sin' is not definedแปลวำ ระบบไมรจกค�ำวำ sin กเพรำะวำตองเขยน math.sin
a = float(input())b = float(input())C = float(input())area = 1/2*a*b*math.sin(C)print(area)
สง run, ใสขอมล, ผดทบรรทดท 4NameError: name 'math' is not definedแปลวำ ระบบไมรจกค�ำวำ math กเพรำะวำตอง import math
01 : Data Type, Variable and Expression 11
โปรแกรม ค�าอธบาย
import matha = float(input())b = float(input())C = float(input())area = 1/2*a*b*math.sin(C)print(area)
สง run, ใสขอมลตำมตวอยำงแรก101090ไดผล44.699833180027895ไมตรงกบทแสดง ตองไดพนท 50.0 ไดผลผด กนำจะผดทกำรค�ำนวณ ลองค�ำนวณเองด 1/2*10*10*math.sin(90) = 1/2*10*10*1 กนำจะได 50.0 แลวท�ำไมไมใช ไมใกลเคยงดวย ตวทนำสงสยสดกนำจะเปน math.sin(90) เมอเรยกใชฟงกชน เรำตองเขำใจกฎเกณฑของกำรเรยกใชดวย ลองคน python math.sin ในเนต จะพบขอควำมวำ math.sin(x) Return the sine of x radians.แสดงวำ ตองแปลงองศำเปนเรเดยนกอนสงไปให math.sin กตองคดวธแปลง: 180 องศำ เทำกบ , C องศำกเทำกบ C* /180 แลวจะใชคำ เทำไรด จะใช C*(22/7)/180 หรอ C*3.14159/180 แตนำจะรวำ ควรใช math.pi เพรำะระบบเกบคำ
ทละเอยดมำกไวทน ดงนนใช CR = C*math.pi/180 เปลยนเปนเรเดยนกอนแลวคอยไปใช
import matha = float(input())b = float(input())C = float(input())CR = C*math.pi/180area = 1/2*a*b*math.sin(CR)print(area)
สง run, ใสขอมลตำมตวอยำงแรก, ได 50.0 ถกตอง run อกครง, ใสขอมลของอกตวอยำง1e1 2e1 50.5ได 77.162458338772 กถกตองsubmit เขำ Grader ตรวจใหคะแนน --> ได 0, ท�าไม ????ค�ำนวณพนทไดถกตอง แตแสดงผลไมเหมอนกบทโจทยบอก ดทตวอยำงarea = 50.0 (sq cm)แตโปรแกรมแสดงแคพนท แกไขบรรทดสดทำยใหตรงตำมตวอยำง
import matha = float(input())b = float(input())C = float(input())CR = C*math.pi/180area = 1/2*a*b*math.sin(CR)print("area =",area, "(sq cm.)")
สง run, ใสขอมลตำมตวอยำงแรก, ได area = 50.0 (sq cm.)มนใจวำถก, submit เขำ Grader, แตตรวจแลวได 0, ท�าไม ????ใจเยน ๆ ดใหมนใจวำเหมอนทโจทยตองกำรไหม ?area = 50.0 (sq cm)พบวำมจดเกนมำหนงตว กลบจดทง
import matha = float(input())b = float(input())C = float(input())CR = C*math.pi/180area = 1/2*a*b*math.sin(CR)print("area =",area, "(sq cm)")
สง run, ใสขอมลตำมตวอยำงแรก, ได area = 50.0 (sq cm)มนใจวำถก ชวร, submit เขำ Grader ตรวจ ได 100 เตม
สำมำรถใชฟงกชน math.radians(d) ซงรบ d เปนองศำไดผลเปนเรเดยน
12 01 : Data Type, Variable and Expression
ตวอยางโจทยปญหา
แปลงอณหภม สตรในกำรเปลยนคำจำกองศำเซลเซยสไปเปนองศำฟำเรนไฮตและเคลวนมดงน
ใหอำนขอมลอณหภม (หนวยเปนองศำเซลเซยส) จำกนนค�ำนวณหำคำองศำฟำเรนไฮตและเคลวนดวยสมกำรดำนบน เมอ C คอ องศำเซลเซยส F คอ องศำฟำเรนไฮต และ K คอ เคลวน
► ขอมลน�ำเขำ
หนงบรรทดประกอบดวยคำองศำเซลเซยสเปนจ�ำนวนจรง
► ขอมลสงออก
มหนงบรรทดประกอบดวยตวเลขจ�ำนวนจรงสองจ�ำนวน ตวแรกเปนองศำฟำเรนไฮต และตวทสองเปนเคลวน
► ตวอยำง
Input (จากแปนพมพ) Output (ทางจอภาพ)
39.85 103.73 313.0
01 : Data Type, Variable and Expression 13
Triangle 2 จงเขยนโปรแกรมค�ำนวณหำควำมยำวของดำนทสำมของสำมเหลยม เมอเรำทรำบควำมยำวดำนสองดำน (a กบ b) และมมระหวำงดำนสองดำนนน (C) ซงค�ำนวณไดจำก Law of Cosines
► ขอมลน�ำเขำ
บรรทดแรกคอควำมยำวดำน a (หนวยเปนเซนตเมตร) บรรทดทสองคอควำมยำวดำน b (หนวยเปนเซนตเมตร) บรรทดทสำมคอมมระหวำงดำนทงสอง C (หนวยเปนองศำ)
► ขอมลสงออก
ควำมยำวดำนทสำมของสำมเหลยมทรบเปนขอมลน�ำเขำ (หนวยเปนเซนตเมตร) แสดงในรปแบบทแสดงตำมตวอยำงดำนลำง
► ตวอยำง
Input (จากแปนพมพ) Output (ทางจอภาพ)
3 4 90
c = 5.0 cm.
7.0 24.0 90.0
c = 25.0 cm.
10 10 60
c = 9.999999999999998 cm.
3 3 60
c = 2.9999999999999996 cm.
ขนตอนกำรท�ำงำนของโปรแกรม
1. รบขอมลจำกแปนพมพ เปลยนเปนจ�ำนวนจรง แลวเกบในตวแปร a
2. รบขอมลจำกแปนพมพ เปลยนเปนจ�ำนวนจรง แลวเกบในตวแปร b
3. รบขอมลจำกแปนพมพ เปลยนเปนจ�ำนวนจรง แลวเกบในตวแปร D
4. น�ำ D ทมหนวยเปนองศำ แปลงเปน เรเดยน เกบในตวแปร C
5. ค�ำนวณควำมยำวของดำนทสำม ดวยสตร
6. แสดงควำมยำวดำนทค�ำนวณไดทำงจอภำพในรปแบบทแสดงตำมตวอยำง
14 01 : Data Type, Variable and Expression
ISBN ISBN (International Standard Book Number) เปนตวเลขจ�ำนวน 10-13 หลกทใชระบหนงสอแตละเลม โจทยขอนสนใจเฉพำะ ISBN ทม 10 หลก กำรตรวจสอบควำมถกตองของ ISBN จะใชตวเลขหลกสดทำยเปน check digit ในกำรตรวจสอบควำมถกตองของตวเลขอน ๆ โดยวธทใชตรวจสอบคอ
10n1 + 9n
2 + 8n
3 + 7n
4 + 6n
5 + 5n
6 + 4n
7 + 3n
8 + 2n
9 + n
10 จะตองหำรดวย 11 ลงตว
ตวอยำงเชน หำกตวเลข 9 หลกแรกคอ 020131452 จะไดวำ
10*0 + 9*2 + 8*0 + 7*1 + 6*3 + 5*1 + 4*4 + 3*5 + 2*2 + n10 = 83 + n
10 ตองหำรดวย 11 ลงตว
จะไดวำ n10 ตองมคำเทำกบ 5 เพอใหผลรวมเปน 88 ซงหำรดวย 11 ลงตว และได ISBN คอ 0201314525
หำกก�ำหนดตวเลขหลกท 1-9 มำให จงค�ำนวณหำ ISBN ทงสบหลก
► ขอมลน�ำเขำ
มบรรทดเดยว ระบ ISBN หลกท 1-9
► ขอมลสงออก
มบรรทดเดยว แสดง ISBN ทงสบหลก รบประกนวำกรณทดสอบจะไมมกรณท n10 เทำกบ 10
► ตวอยำง
Input (จากแปนพมพ) Output (ทางจอภาพ)
020131452 0201314525
100000000 1000000001
02 : Selection ( if-elif-else ) 15
02 : Selection ( if-elif-else )
สรปเนอหาFlowchart Code
if C1 : P1
if C1 : passelse : P1
if not C1 : P1
if C1 : P1else : P2
if C1 : P1elif C2 : P2elif C3 : P3else : P4
16 02 : Selection ( if-elif-else )
Flowchart Code
if C1 : P1if C2 : P2if C3 : P3else : P4
if C1 : if C2 : P2 if C3 : P3 else : P4else : 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'
02 : Selection ( if-elif-else ) 17
if condition : t = value1 else : t = value2
t = value1 if condition else value2 ใชเฉพาะกรณการใหคากบตวแปร ถาเงอนไขเปนจรงใหคาหนง เปนเทจใหอกคาหนง
if s > a + b % 7 : t = True else : t = False
t = True if s > a+b%7 else False
หรอเขยนสน ๆ t = (s > a + b % 7)
การเปรยบเทยบทใชบอยif a%2 == 0 : a เปนเลขคหรอไมif a%100 == 0 : a หารดวย 100 ลงตวหรอไมif (a//100)%10 == 9 : เลขหลกรอยของ a คอ 9 หรอไม หรอ 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 เยองบรรทดไมตรงกน ผด
ใช tab ผสมกบ blank ในการเยองค�าสง tab ผสมกบ blank กอาจดวาเยองตรงกน แตผด (IDLE จดการเรอง tab กบ blank ให จงไมผด แตถาใช notepad จะผด)
18 02 : Selection ( if-elif-else )
เขาใจผดเกยวกบการเปรยบเทยบสตรงสตรงเปรยบเทยบกนตามล�าดบแบบทเขยนในพจนานกรม โดย'0' < '9' < 'A' < 'Z' < 'a' < 'z'
'abcdegh' < 'b' เปนจรง'1234' < '9' เปนจรงสมมตวาprint(x) ได 1234print(y) ได 9print( x < y ) ได True ถา x = '1234', y = '9'print( x < y ) ได False ถา x = 1234, y = 9
เรองทปรบปรงได
ค�าสงทเหมอนกนทงในกลมหลง if และ กลมหลง else อาจแยกออกมาขางนอกกได
if d > 0 : a = 9 c += d - 5 e = celse: a = 9 c -= d + 7 e = c
a = 9if d > 0: c += d - 5else: c -= d + 7e = c
การใช if-elif-else ทตรวจคาวาตกอยในชวงใด สามารถลดการเปรยบเทยบลงได ถาจดล�าดบการเปรยบเทยบใหเหมาะสม
if s >= 80 : g = 'A'elif 70 <= s < 80 : g = 'B'elif 60 <= s < 70 : g = 'C'elif 50 <= s < 60 : g = 'D'else : g = 'F'
if s >= 80 : g = 'A'elif s >= 70 : g = 'B'elif s >= 60 : g = 'C'elif s >= 50 : g = 'D'else : g = 'F'
02 : Selection ( if-elif-else ) 19
แบบฝกหด
Problem Code
Input: รบจ�านวนเตม 3 จ�านวน คนดวยชองวางProcess: หามธยฐานของจ�านวนทง 3Output: มธยฐานทหาได
Input: รบขอมลของวงกลม 2 วง บรรทดละหนงวง ประกอบดวยจ�านวนจรง 3 จ�านวนคนดวยชองวาง แทนพกด x กบ y ของจดศนยกลาง และรศมของวงกลมProcess: ตรวจวาวงกลมสองวงทรบมาทบกนหรอแตะกนหรอไมOutput: แสดงค�าวา touch เมอขอบของทงสองวงแตะกนพอด แสดงค�าวา overlap เมอสองวงทบกน ถาไมแตะหรอทบ ใหแสดงค�าวา free
Input: รบจ�านวนจรง 2 จ�านวน คนดวยชองวาง แทนพกด (x, y) บนระนาบสองมตProcess: ตรวจวาพกด (x, y) อยบรเวณใดในระนาบOutput: ต�าแหนงของพกด (x, y) วา อยในจตภาคใด หรออยบนแกน x หรอ y หรออยทจดก�าเนด
Input: รบจ�านวนเตม 5 จ�านวน คนดวยชองวางProcess: ตรวจวาล�าดบจากซายไปขวาของจ�านวนทรบมาเรยงจากนอยไปมากหรอไมOutput: ผลการตรวจวา True หรอ False
20 02 : Selection ( if-elif-else )
Problem Code
Input: รบจ�านวนเตม 4 จ�านวน คนดวยชองวางProcess: หาผลรวมของจ�านวนทรบมา โดยไมรวมจ�านวนทมากสดหนงจ�านวน และจ�านวนทนอยสดหนงจ�านวนOutput: ผลรวมทหาได
Input: รบจ�านวนเตมหนงจ�านวนเกบในตวแปร aProcess: ตรวจวามจ�านวนเตม x ทคา x3 เทากบ a หรอไมOutput: ถาม แสดงคาของ x ถาไมม แสดง Not Found
Input: รบจ�านวนเตมแทนรอบอก (หนวยเปนนว)Process: หาขนาดของเสอยดโปโลตามรอบอกดงนนอยกวา 37 นว ขนาด XSตงแต 37 แตไมถง 41 นว ขนาด Sตงแต 41 แตไมถง 43 นว ขนาด Mตงแต 43 แตไมถง 46 นว ขนาด Lตงแต 46 นวเปนตนไป ขนาด XLOutput: ขนาดเสอโปโลตามรอบอกทไดรบ
02 : Selection ( if-elif-else ) 21
a
ตวอยางการแกโจทยปญหา
สลากกนแบง หากเราซอสลากกนแบงเรยงหมายเลขตงแตหมายเลข n1 ตอเนองไปจนถงหมายเลข n2 (เชนหมายเลข 10300 ถง 13999) และงวดนรางวลท 1 คอหมายเลข p1 เลขทายสองตวคอหมายเลข p2 และ เลขทายสามตวคอหมายเลข p3 เราจะไดรางวล รวมเปนเงนเทาไร
ก�าหนดใหสลากกนแบงทขายนเปนรนพเศษ เปนเลข 5 หลก รางวลทหนง 10,000 บาท หนงรางวล รางวลเลขทาย สองตวหนงหมายเลข 25 บาท และรางวลเลขทายสามตวหนงหมายเลข 100 บาท
► ขอมลน�าเขา
หนงบรรทดประกอบดวยจ�านวนเตม 5 จ�านวน p1 p2 p3 n1 n2 คนดวยชองวาง
► ขอมลสงออก
เงนรางวลรวมทไดรบ
► ตวอยาง
Input (จากแปนพมพ) Output (ทางจอภาพ)
01234 11 811 01000 01250 10075
99999 99 999 99950 99999 10125
19999 13 001 09015 13000 1275
ตวอยางการเขยนโปรแกรม
โปรแกรม ค�าอธบาย
p1,p2,p3,n1,n2 = \ [int(e) for e in input().split()]s = 0if n1 <= p1 <= n2 : s += 10000if n1 <= p2 <= n2 : s += 25if n1 <= p3 <= n2 : s += 100print(s)
บรรทดแรกรบขอมลใสตวแปร p1, p2, p3, n1 และ n2 ใหตวแปร s เกบเงนรางวลรวม เรมดวยการตรวจวา หมายเลขของรางวลท 1 อยในชวงหมายเลขทซอหรอไม (n1 <= p1 <= n2) ถาใชกเพมเงนรางวล 10,000 บาท ตามดวยการตรวจรางวลเลขทายสองตว แลวกสามตว ในลกษณะเดยวกนสง run, ใสขอมลตามตวอยาง01234 11 811 01000 01250, ได 10000 บาทไมตรงตามตวอยาง ไดแครางวลทหนง เลขทายตรวจไมพบ
22 02 : Selection ( if-elif-else )
โปรแกรม ค�าอธบาย
p1,p2,p3,n1,n2 = \ [int(e) for e in input().split()]s = 0if n1 <= p1 <= n2 : s += 10000print(s)
การเขยนโปรแกรมทมหลาย ๆ กรณ ควรแยกทดสอบ หากเขยนรวดเดยว จะหาทผดล�าบาก ใจเยน ๆ ขอเขยนและทดสอบกรณรางวลทหนงกอน สง run, ใสขอมล 12345 00 000 12000 13000 ได 10000 ถกตอง (ทดสอบกรณอยระหวาง)สง run, ใสขอมล 12345 00 000 12345 13000 ได 10000 ถกตอง (ทดสอบกรณอยทขอบลาง)สง run, ใสขอมล 12345 00 000 12000 12345 ได 10000 ถกตอง (ทดสอบกรณอยทขอบบน)สง run, ใสขอมล 12345 00 000 12345 12345 ได 10000 ถกตอง (ทดสอบกรณแคใบเดยวและถกรางวล)สง run, ใสขอมล 12345 00 000 12346 14000 ได 0 ถกตอง (ทดสอบกรณอยนอกชวงทางซาย)สง run, ใสขอมล 12345 00 000 12000 12344 ได 0 ถกตอง (ทดสอบกรณอยนอกชวงทางขวา)สรปวา กรณรางวลทหนง ถกตอง
p1,p2,p3,n1,n2 = \ [int(e) for e in input().split()]s = 0#if n1 <= p1 <= n2 : # s += 10000if n1%100 <= p2 <= n2%100 : s += 25print(s)
คราวนสนใจกรณเลขทายสองตว จะ comment ค�าสงตรวจรางวลทหนงออก ถากลบไปดโปรแกรมแรกทเขยน ค�าสง if n1 <= p2 <= n2 ตรวจเลขทายไมครบทกกรณ เชนซอหมายเลข 10000 ถง 10099 เลขทาย p2 = 50 การทดสอบ n1 <= p2 <= n2 เปนเทจ แตความจรงแลวถกเลขทายสองตว จงตองเปลยนเปนทดสอบเฉพาะสองหลกขวาเทานน ดวยค�าสง if n1%100 <= p2 <= n2%100สง run, ใส 00000 50 000 10000 10099 ได 25 ถกตองสง run, ใส 00000 50 000 10000 10199 ได 25 ผด นาจะได 50สง run, ใส 00000 50 000 10000 10299 ได 25 ผด นาจะได 75
02 : Selection ( if-elif-else ) 23
โปรแกรม ค�าอธบาย
p1,p2,p3,n1,n2 = \ [int(e) for e in input().split()]s = 0#if n1 <= p1 <= n2 : # s += 10000if n1//100 == n2//100 : if n1%100 <= p2 <= n2%100 : s += 25else: s += 25*(n2//100 - n1//100 + 1)print(s)
ค�าสง if n1%100 <= p2 <= n2%100 : s += 25 ใชไดเฉพาะ กรณท 3 หลกแรกของ n1 และ n2 เทากนเทานน (เมอ n//100 มคาเทากบ n2//100) จงขอจดการเปนสองกรณคอ A. กรณ 3 หลกแรกเทากน เชน 10000 ถง 10099 ท�าเหมอนเดมB. กรณ 3 หลกแรกไมเทากน เชน 10000 ถง 10299 เมอน�า 102 - 100 = 2 แสดงวา ถกเลขทายสองตว 2 หมายเลข กคณดวย 25 สง run, ใส 00000 50 000 10000 10199 ได 50 ถกตองสง run, ใส 00000 50 000 10000 10299 ได 75 ถกตองสง run, ใส 00000 50 000 10060 10680 ได 175 ผด นาจะได 150
p1,p2,p3,n1,n2 = \ [int(e) for e in input().split()]s = 0#if n1 <= p1 <= n2 : # s += 10000if n1//100 == n2//100: if n1%100 <= p2 <= n2%100 : s += 25else:
if n1%100 <= p2 : # ชวง 1 s += 25
if p2 <= n2%100 : # ชวง 3 s += 25
s += 25*((n2//100-1) - \ # ชวง 2 (n1//100+1) + 1)print(s)
กรณของ p2 = 50, n1 = 10060 และ n2 = 10680 การตรวจสอบนาจะซบซอนเลกนอย แบงเปนสามชวง คอ
ชวงท 1 ชวงท 2 ชวงท 3
10060 - 10099
10100 - 10599
10600 - 10680
3 หลกซายเทากน ดเฉพาะ 2 หลกขวา
2 หลกขวา 00 ถง 99ถกเลขทายแนนอนดเฉพาะสามหลกซาย
3 หลกซายเทากน ดเฉพาะ 2 หลกขวา
n1%100<=p2 p2<=n2%100
60<=50 เทจ ไมถกเลขทาย
จาก 101
ถง 105
ถกรางวล
(105-101+1)
ครง
50<=80 จรงถก 1 ครง
สง run, ใส 00000 50 000 10000 10299 ได 75 ถกตองสง run, ใส 00000 50 000 10060 10680 ได 150 ถกตอง
24 02 : Selection ( if-elif-else )
โปรแกรม ค�าอธบาย
p1,p2,p3,n1,n2 = \ [int(e) for e in input().split()]s = 0#if n1 <= p1 <= n2 : # s += 10000
if n1%100 <= p2 : #ชวง 1 s += 25
if p2 <= n2%100 : #ชวง 3 s += 25
s += 25*((n2//100-1) - \ #ชวง 2 (n1//100+1) + 1)print(s)
แตถาพจารณาใหละเอยด จะพบวา ค�าสงทพจารณาทง 3 ชวงนน ครอบคลมกรณ if n//100 == n2//100 ทเราเขยนไวตอนตน คอกรณทสามหลกซายมคาเทากน จงลบทงไดกลายเปนโปรแกรมขางซายน สง run, ใส 00000 50 000 10000 10299 ได 75 ถกตองสง run, ใส 00000 50 000 10060 10680 ได 150 ถกตอง
p1,p2,p3,n1,n2 = \ [int(e) for e in input().split()]s = 0if n1 <= p1 <= n2 : s += 10000 if n1%100 <= p2 : s += 25 if p2 <= n2%100 : s += 25s += 25*(n2//100 - n1//100 - 1)
if n1%1000 <= p3 : s += 100if p3 <= n2%1000 : s += 100s += 100*(n2//1000 - n1//1000 - 1)print(s)
การตรวจเลขทาย 3 ตวกคลายกบเลขทาย 2 ตว สามารถท�าในลกษณะเดยวกน โปรแกรมทางขวาเพมการตรวจเงนรางวล ทงรางวลท 1 เลขทาย 2 และ 3 ตว คราวนกสงทดสอบการท�างานดวยตวอยางทโจทยใหมาสง run, ใส 01234 11 811 01000 01250 ได 10075 ถกตองสง run, ใส 99999 99 999 99950 99999 ได 10125 ถกตองสง run, ใส 19999 13 001 09015 13000 ได 1275 ถกตอง
02 : Selection ( if-elif-else ) 25
ตวอยางโจทยปญหา
Days in Month ใหเขยนโปรแกรมเพอรบคาเดอนและปเปนพทธศกราช จากนนหาวาในเดอนของปนน จะมจ�านวนวนทงสนกวน
ตวชวย: เดอนกมภาพนธม 29 วน กตอเมอ (ป ค.ศ. หารดวย 4 ลงตว แตหารดวย 100 ไมลงตว) หรอ (ป ค.ศ. หารดวย 400 ลงตว)
► ขอมลน�าเขา
ม 1 บรรทด ประกอบดวยจ�านวนเตม 2 ตว คอ เดอนและปเปนพทธศกราช
► ขอมลสงออก
จ�านวนวนของเดอนและปของขอมลน�าเขา
► ตวอยาง
Input (จากแปนพมพ) Output (ทางจอภาพ)
10 2557 31
2 2557 28
4 2556 30
2 2547 29
26 02 : Selection ( if-elif-else )
ตดเกรด การตดเกรดของวชานเปนไปตามตารางดานลาง ใหเขยนโปรแกรมเพอตดเกรดตามเกณฑทระบ โดยในกรณทคะแนน มขอผดพลาด ใหแสดงผลวา ERROR
คะแนนรวม ( x ) เกรด
80 ≤ x ≤ 100 A
75 ≤ x < 80 B+
70 ≤ x < 75 B
65 ≤ x < 70 C+
60 ≤ x < 65 C
55 ≤ x < 60 D+
50 ≤ x < 55 D
0 ≤ x < 50 F
กรณอน ๆ ERROR
► ขอมลน�าเขา
มบรรทดเดยว แทนคะแนนทจะตดเกรด เปนจ�านวนจรง
► ขอมลสงออก
มบรรทดเดยว ระบเกรดทไดรบ โดยในกรณทคะแนนมขอผดพลาด ใหแสดงผลวา ERROR
► ตวอยาง
Input (จากแปนพมพ) Output (ทางจอภาพ)
87.25 A
69.95 C+
120 ERROR
02 : Selection ( if-elif-else ) 27
คดคาทจอดรถ ใหรบเวลาเขาและออกของรถคนหนง (เปดบรการตงแต 7:00 - 23:00) จากนนค�านวณคาทจอดรถทตองจาย โดยหลกเกณฑการค�านวณมดงน
1. จอดรถไมเกน 15 นาท ไมคดคาบรการ
2. จอดรถเกน 15 นาท แตไมเกน 3 ชวโมง คดคาบรการชวโมงละ 10 บาท เศษของชวโมงคดเปนหนงชวโมง
3. จอดรถตงแต 4 ชวโมง ถง 6 ชวโมง คดคาบรการชวโมงท 4-6 ชวโมงละ 20 บาท เศษของชวโมงคดเปนหนงชวโมง
4. จอดรถเกน 6 ชวโมงขนไป เหมาจายวนละ 200 บาท
► ขอมลน�าเขา
ม 4 บรรทด แตละบรรทดมจ�านวนเตมหนงจ�านวน โดยบรรทดท 1-2 เปนชวโมงและนาทของเวลาเขา และบรรทดท 3-4 เปนชวโมงและนาทของเวลาออก
► ขอมลสงออก
มบรรทดเดยว เปนคาทจอดรถทตองจาย ใหแสดงผลลพธเปนจ�านวนเตม
► ตวอยาง
Input (จากแปนพมพ) Output (ทางจอภาพ)
7 0 7 15
0
7 0 7 16
10
7 30 10 30
30
7 30 10 31
50
7 30 13 31
200
วโรรส โรจนะ Intania 85
CEO & Co-Founder Dek-D Interactive co., ltd.
Programming จ�ำเปนมำกในกำรเรมกจกำรดำน IT เพรำะกจกำรสวนใหญทสำมำรถอยรอดได ผกอตงซงเปน
ผทเขำใจผลตภณฑทจะสรำงมำกทสด ตองมสวนรวมในกำรพฒนำระบบเอง ถงจะสำมำรถถำยทอดควำมคด และ
ผลกดนผลตภณฑทดออกมำได เรยกวำมเงนมำกแคไหน ถำตองไปจำงใหคนอนมำเขยนโปรแกรมแทนใหยงไงกส
คนทมทงไอเดย และทกษะลงมอเขยนโปรแกรมเองไดยำก
นอกจำกน Programming ยงเปนกำรฝกวธคดแกปญหำอยำงเปนขนตอน ท�ำใหผเรยนมระบบกำรคดซงสำมำรถ
ประยกตไปแกปญหำไดในหลำยแขนงอยำงทผเรยนคำดไมถงอกดวย (เทพในหลำย ๆ วงกำรจบวศวฯ คอม)
03 : Repetition ( while, for ) 29
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 : if not C2 : break P2
while C2 : P2
30 03 : Repetition ( while, for )
Flowchart Code
while C1 : P1 while C2 : P2 P3
ใหสงเกตวา ภายในวงวน while ควรมค�าสงทเปลยนแปลงเงอนไขของ while ไมเชนนนจะวนท�างานไมสนสด เชน while i < j :
...
i += 2
เงอนไข i < j ขางบนนจะเปนเทจได (เพอใหออกจากวงวน) กดวยการทคาของ i เพมขน หรอคาของ j ลดลง ค�าสง i += 2 ในตวอยางขางบนสรางความมนใจวา วงวนนท�างานแลวจะมจดสนสดและออกจากวงวน
Flowchart Code Flowchart Code
k = 0while k < n : P1 k += 1
for k in range(n) : P1
for p in range(m) : for k in range(n) : P1
Done
Not Done
Not Done
Not Done
Done
Done
03 : Repetition ( while, for ) 31
Flowchart Code
for k in range(m) : P1 if C : P3 break P2else: P4
จะมาท�าหลง else ของ for กเมอท�าครบทกรอบ หลงท�ารอบท k = m-1 เสรจ กมาท�าท P4 กอนออกจากวงวน
while C1 : P1 if C2 : P3 break P2else: 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
Not Done
Done
32 03 : Repetition ( while, for )
วงวนทพบบอยเมอตองการท�าอะไรบางอยางซ�ากน n ครง
ใช for k in range(n)
เชน ตองการอานขอมลจ�านวน 10 ตว เพอหาคาเฉลยs = 0for k in range(10) : # เปนแคค�ำสงควบคมจ�ำนวนรอบกำรท�ำซ�ำ a = float(input()) s += aprint('average =', (s/10))
เมอตองการน�าคาทสรางจาก range(start, stop, step) มาใชในการประมวลผล
ใช for k in range(...)
เชน ตองการหาวา q เปนจ�านวนเฉพาะหรอไม ใชวงวน for หาวาจ�านวนเตมมากกวาหนงขนาดเลกสดอะไร ทหาร q ลงตว
for k in range(2, q+1) : # k = 2,3,...,q if q % k == 0 : break # มกำรน�ำ k มำใชif k == q : print(q,'is prime')else: print(q, '=', k, 'x', q//k)
เมอตองการประมวลผลชดค�าสงซ�า ๆ จนกวาเงอนไขหนงจะเปนจรง
ใช while หรอใช if break ในวงวน
เชน ตองการหาคาเฉลยจากชดขอมลทผใชปอนเขามาเรอย ๆ จนกวาจะรบจ�านวนตดลบ
s = 0n = 0while True : t = float(input()) if t < 0 : break s += t n += 1if n == 0 : print('No Data')else : print('avg =',(s/n))
s = 0n = 0t = float(input())while t >= 0 : s += t n += 1 t = float(input())if n == 0 : print('No Data')else : print('avg =',(s/n))
เมอตองการแจกแจงวธการเลอกหมายเลขจากหมายเลข 0 ถง n-1 จ�านวน 2 หมายเลข แบบเลอกแลว ไมเลอกอก (คอแจกแจงการเลอกหมายเลขออกมาทละค)for i in range(n) : for j in range(i+1, n) : ได i<j ทก ๆ กรณ
หรอถาตองการให i = j ดวย กเปนfor i in range(n) : for j in range(i, n) : ได i≤j ทก ๆ กรณ
เชน จงหาวามจ�านวนเตม x y และ z อะไรบางทท�าใหสมการ z3 = x2 + y2 เปนจรง (x กบ y มคา 0 ถง 19) เชน 53 = 52+102
แตเราไมตองการค�าตอบ 53 = 102+52 เพราะซ�า จงตองก�าหนดวา x < y แตถาเราตองการค�าตอบ 83 = 162+162 ดวย กตองให x <= y โดย ให y มคาเรมท x เปนตนไป ดวย for y in range(x,n) ขางลางนn = 20for x in range(1,n) : for y in range(x,n): t = x**2 + y**2 z = int(round(t**(1/3),0)) # หำรำกทสำมแลว # ปดเศษ if z**3 == t : print( z,x,y )
03 : Repetition ( while, for ) 33
เรองผดบอย
เขาใจผดเรองตวสดทายของ range for k in range(1,5) k = 1,2,3,4 (ไมรวม 5)
ใชวงวน ท�าอะไรบางอยาง เพอสรปวา เปน A หรอ เปน B โดยจะเปน A เมอเงอนไข C เปนจรง อยางนอยหนงครง แตจะเปน B เมอ C ตอง ไมเปนจรงทกครงทกรอบ ถาเขยนfor k in range(...) : if C : print('A') else : print('B')
แบบนผด เพราะสรปวาเปน B เรวไป ยงตรวจ ไมครบทกรอบทกกรณ แกไขดวยการใชตวแปร เกบสภาวะการตรวจfound = Falsefor k in range(...): if C : print('A') found = True breakif not found : print('B')
หรอใช for-else กงายกวาfor k in range(...): if C : print('A') breakelse: print('B')
เชน ตองการหาวา q เปนจ�านวนเฉพาะหรอไมfor k in range(2, q) : if q % k == 0 : print(q,'is composite') # สรปถก เพรำะ # หำตวหำรพบ else : print(q,'is prime') # ผด สรปเรวไป # ตองวนทดสอบตอ
แกโดยใชตวแปรเกบสภาวะการตรวจ เปนดงน
iscomposite = Falsefor k in range(2,q) : if q % k == 0 : print(q,'is composite') iscomposite = True breakif not iscomposite : print(q,'is prime')
หรอใช for-else กงายกวา
for k in range(2,q) : if q % k == 0 : print(q,'is composite') breakelse : print(q,'is prime')
วงวน ท�าจ�านวนรอบนอยไปหรอมากไปกวาทตองการ (โดยทวไปมกขาดหรอเกนไปหนงรอบ)
เชน จากชดค�าสงตรวจสอบจ�านวนเฉพาะขางบนน ถาเขยนfor k in range(2,q+1): # เขยน q+1 แทนทจะเปน q if q % k == 0 : print(q,'is composite') breakelse : print(q,'is prime')
แบบนเกนไปรอบ ท�าใหผลออกมาเปน composite เสมอ เพราะอะไร ?หรอ อยากหาคาของ ถาเขยนs = 0for k in range(1,n): s += k**3print(s)
กจะพบวาขาดไปรอบ
34 03 : Repetition ( while, for )
ลมปรบคาของตวแปรทใชในเงอนไขของ while หรอไมกปรบคาผด ความผดพลาดแบบนอาจท�าใหวนท�างานไมสนสด
เชน ตองการวนรบจ�านวนจากผใช มาหาคาเฉลยจนกวาจะพบจ�านวนลบs = n = 0t = float(input())while t >= 0 : s += t n += 1print('avg =', (s/n))
ใช t ในการตรวจสอบเงอนไขของ while แตคา t ไมไดเปลยนแปลงเลยในวงวน ถาหลดเขามาในวงวนไดจะเกดอะไรขน ?ควรแกเปนs = n = 0t = 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 += 1print('avg =', (s/n)) จะเกดอะไรขน ?
เรองแปลกของ for ใน Python
หลงจากวนท�างานใน for k จนเรยบรอยแลว คา k หลงออกจากวงวน จะมคาเทากบ คาสดทายทท�างานในวงวน
for k in range(1,5): ...print(k) # ได 4 เพรำะเปนคำสดทำยทท�ำในวงวน
for m in range(4,10): if m % 3 == 0 : break ...print(m) # ได 6 เพรำะคำสดทำยในวงวนคอ 6 กอนจะ break ออก
for w in range(10,10): ...print(w) # ผด เพรำะไมไดเขำไปท�ำในวงวน, w จงไมมคำ
03 : Repetition ( while, for ) 35
การปรบคา k ภายในวงวน for k in range(...) จะไมมผลตอการเปลยนคา k ในรอบถดไป
เพราะฉะนน ถาตองการปรบคาของ k ในวงวน ตองใชวงวน while แทน
for k in range(1, 4) : print(k) k += 2 print(k) # ไดผลตำมทำงขวำบน
ถาตองการเปลยน k ตองใช whilek = 1while k < 4 : print(k) k += 2 print(k)
132435
1335
แบบฝกหด
Problem Code
Input: ไมมProcess: หาจ�านวนเตมบวก k ทมคานอยสดทท�าให ม
คาไมเทากบ 1 (เนองจากความไมแมนย�า 100% ของจ�านวนจรงในคอมพวเตอร)Output: จ�านวนเตม k ทหาได
Input: ไมมProcess: หาจ�านวนเตมบวก k ทมคานอยสดทท�าให
เปนจรงOutput: จ�านวนเตม k ทหาได
Input: ไมมProcess: ค�านวณคาประมาณของ จากสตร
Output: คาประมาณของ ทหาได
Input: อานจ�านวนเตม 2 จ�านวน a กบ bProcess: ค�านวณคาจากสตร
Output: คาทค�านวณได
Input: อานจ�านวนเตม 2 จ�านวน a กบ bProcess: ค�านวณคาจากสตร
Output: คาทค�านวณได
36 03 : Repetition ( while, for )
Problem Code
Input: บรรทดแรกรบจ�านวนเตมเกบในตวแปร n (n จะมคามากกวา 0) และอก n บรรทด เปนจ�านวนเตมบรรทดละจ�านวนProcess: หาผลตางของคามากสดกบคานอยสด และหาวามกจ�านวนทเปนเลขลบOutput: ผลตาง และจ�านวนเลขลบทหาได
Input: จ�านวนเตมเกบในตวแปร n Process: หาจ�านวนเตมบวก w, x, y และ z ทงหมดทw3 = x2 + y2 + z2 โดยท 1 ≤ x ≤ y ≤ z ≤ n Output: คาของ w, x, y และ z ทหาได
ตวอยางการแกโจทยปญหา
Approximation of sine คาของ sin(x) ค�านวณไดดวยอนกรมเทยเลอร ดงแสดงขางลางน
จงเขยนโปรแกรมรบคาของ x เพอค�านวณคา sin(x) ใหไดความแมนย�ามากทสดเทาทจะมากได ดวยสตรขางบนน
► ขอมลน�าเขา
หนงบรรทดประกอบดวยจ�านวนจรง x (หนวยเปนองศา)
► ขอมลสงออก
คาประมาณของ sin(x) จากสตรขางตน
► ตวอยาง
Input (จากแปนพมพ) Output (ทางจอภาพ)
45 0.7071067811865475
36045 0.7071067811865475
03 : Repetition ( while, for ) 37
ตวอยางการเขยนโปรแกรม
โปรแกรม ค�าอธบาย
import math
x = math.radians(float(input()))n = 30s = 0for k in range(n+1): # k=0,1,...,n s+=(-1)**k*x**(2*k+1) \ /math.factorial(2*k+1)print(s)
เรมดวยการรบขอมล, แปลงเปน float, แลวเปลยนเปนเรเดยนสตรการค�านวณมลกษณะเปนการบวกซ�า ๆ กนหลาย ๆ พจนทใชคาของk ทเรมจาก 0 เพมขนทละ 1 ไปเรอย ท�าใหคดถงการใชวงวน for ปญหาคอจะตองหมนค�านวณกรอบ กพจน จงจะละเอยดสด ๆ ตามทโจทยตองการ
ขอลองตงให n = 30 มตวแปร s เกบผลลพธ ค�านวณคาของพจน ตรงไปตรงมาตามสตร ซงมการยกก�าลงดวย ** และการหาคา แฟกตอเรยลดวย math.factorialสง run, ใส 45 เปนขอมล, ไดผลเปน 0.7071067811865475 ถกตอง
import math
x = math.radians(float(input()))n = 100s = 0for k in range(n+1): # k=0,1,...,n s+=(-1)**k*x**(2*k+1)\ /math.factorial(2*k+1)print(s)
อยากใหละเอยดกวาน ลองตง n = 100 ดสง run, ใส 45 เปนขอมล, ไดผลผดทบรรทดทมการค�านวณOverflowError: int too large to convert to floatแปลวา มการแปลงจ�านวนเตมเปน float แตจ�านวนเตมมขนาดใหญเกนท float จะรบได แลวจะรไดอยางไรวา ผดตรงไหนหาก run ดวย IDLE เมอเกดขอผดพลาดแลว เราสามารถขอดตวแปร ตาง ๆ ได เชน อยากรคา k เมอเกดความผดพลาด กใสค�าสง print(k) ท Python shell จะแสดงวา ผดตอนท k มคาเปน 85 กลองค�านวณ คาตาง ๆ ในสตร ดวาผดทใด>>> print(k)85>>> print((-1)**k)-1>>> print(x**(2*k+1))1.1491314574538792e-18>>> print(math.factorial(2*k+1))1241018070217667823424840524103103992616605577501693185388951803611996075221691752992751978120487585576464959501670387052809889858690710767331242032218484364310473577889968548278290754541561964852153468318044293239598173696899657235903947616152278558180061176365108428800000000000000000000000000000000000000000>>>
กไมมอะไรผด แตจากทบอกวาผดเพราะแปลงจ�านวนเตมทใหญเกนไปเปน float ท�าใหวเคราะหไดวา ผลของการหาคาแฟกตอเรยลตองแปลงเปน float เพอไปเปนตวหารในสตร หากลองค�าสงนท Python shell>>> print(1/math.factorial(2*k+1))กพบวาผดดวยเหตผลเดยวกน
38 03 : Repetition ( while, for )
โปรแกรม ค�าอธบาย
import math
x = math.radians(float(input()))n = 100s = f = xfor k in range(1,n+1): f *= (-1)*x**2/((2*k)*(2*k+1)) s += fprint(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!) ...
ดวยแนวคดนเขยนโปรแกรมไดดง code ทางซาย สง run, ใส 45 เปนขอมล, ไดผลเปน 0.7071067811865475 ถกตองถาลองเพมค�าสง print(k, s) ในวงวน for จะพบวา คา s มคาไมเปลยนแปลงตงแต k = 8 เปนตนไป แสดงวาการค�านวณตงแตรอบท 8 เปนตนไป ไมมประโยชนเลย แตถาใส x = 180 เปนขอมลน�าเขา พบวา k = 22 เปนตนไปจะไมเปลยนแปลง
import math
x = math.radians(float(input()))s = f = xk = 1while f != 0: f *= (-1)*x**2/((2*k)*(2*k+1)) s += f k += 1print(s)
จงควรปรบการท�างานของโปรแกรมใหตรวจสอบวา หากคาในตวแปร s ไมเปลยนแปลง หรอใชวธตรวจสอบวา เมอ f เปน 0 กสามารถหยดการค�านวณได โดยเปลยนจากการใช วงวน for เปนวงวน while จะเหมาะสมกวาโดยมเงอนไข while f != 0 เปนตวก�าหนดวา ตองท�าตอในวงวนเมอ f ยงไมเทากบ 0 ตวแปร k เรมตนท 1 ในรอบแรก และ เพมทละ 1 ในรอบถด ๆ ไปสง run, ใส 45 เปนขอมล, ไดผลเปน 0.7071067811865475 ถกตองและถาลอง print(k) ดใน Python shell จะพบวา k = 8 เมอออกจากวงวน ดวยวธนเราไมตองก�าหนดจ�านวนรอบใหกบวงวนมาลองตวอยางท 2 สง run, ใส 36045 เปนขอมล, ไดผลเปน 2.541635699930208e+252 ผด เกดอะไรขน ?
03 : Repetition ( while, for ) 39
โปรแกรม ค�าอธบาย
import math
x = float(input())x = math.radians(x%360)s = f = xk = 1while f != 0: f *= (-1)*x**2/((2*k)*(2*k+1)) s += f k += 1print(s)
คา 36045 เมอแปลงเปนเรเดยนแลว x มคามาก การค�านวณคา f ในวงวนจะลดความแมนย�าลงดวยเหตทจ�านวนจดหลงทศนยมของ float มจ�านวนจ�ากด ท�าใหการค�านวณผดพลาด ดวยคณสมบต
ของฟงกชน sin ทเปนเชงคาบ เราควรลดขนาดของคา x ลงดวยการเปลยนคา 36045 องศาเปน 36045 % 360 = 45 องศา กอนเปลยนเปนเรเดยน จะเพมความแมนย�าและลดความผดพลาด ในการค�านวณ ไดผลดง code ทางซาย
ตวอยางโจทยปญหา
Multiples of 3 or 5 จงเขยนโปรแกรมทค�านวณหาผลรวมของจ�านวนเตมบวกทกจ�านวนทมคาต�ากวาจ�านวนทเปนขอมลน�าเขาและ ม 3 หรอ 5 เปนตวประกอบ เชน หากขอมลน�าเขาคอ 20 ค�าตอบทเราตองการจะเทากบ 3 + 5 + 6 + 9 + 10 + 12 + 15 + 18 = 78 (สงเกตวาค�าตอบของเราไมรวมคา 20 เนองจากเราสนใจเฉพาะจ�านวนทมคาต�ากวา 20)
► ขอมลน�าเขา
มบรรทดเดยว เปนจ�านวนเตมบวก
► ขอมลสงออก
มบรรทดเดยว แสดงผลรวมของจ�านวนเตมบวกทกจ�านวนทมคาต�ากวาจ�านวนทเปนขอมลน�าเขาและม 3 หรอ 5 เปนตวประกอบ
► ตวอยาง
Input (จากแปนพมพ) Output (ทางจอภาพ)
20 78
25 143
3 0
40 03 : Repetition ( while, for )
Average until -1 ใหอานขอมลจากแปนพมพทเปนจ�านวนจรงจนกวาจะพบคา -1 เพอหาคาเฉลยของจ�านวนเหลานนทงหมด (ไมรวม -1)
► ขอมลน�าเขา
จ�านวนจรงบรรทดละ 1 จ�านวนหลายบรรทด บรรทดสดทายคอ -1
► ขอมลสงออก
มบรรทดเดยว แสดงคาเฉลยของจ�านวนทงหมด (ไมรวม -1) ออกทางหนาจอ ในกรณทมจ�านวนขอมลเปน 0 ใหแสดง No Data
► ตวอยาง
Input (จากแปนพมพ) Output (ทางจอภาพ)
2295.498850599365 8502.139421733784 515.0100470901091 3705.6829835190097 8722.343211974356 4446.712951812571 6375.086965715 3801.511489785674 7638.911577747659 -1
5111.43305555306
-1 No Data
03 : Repetition ( while, for ) 41
สามเหลยมมมฉาก โจทยนสนใจเฉพาะสามเหลยมมมฉากทความยาวดานทกดานเปนจ�านวนเตม
จงเขยนโปรแกรมอานคาความยาวเสนรอบรปจากแปนพมพ เพอหาจ�านวนเตมมากสดทเปนความยาวของดานตรงขามมมฉากของสามเหลยมมมฉากทมความยาวเสนรอบรปตามทไดรบ เชน ใหเสนรอบรปของสามเหลยมยาว 90 จะมสามเหลยมมมฉากตามขอก�าหนดอยสองรปคอ 15, 36, 39 และ 9, 40, 41 ค�าตอบทตองการคอ 41 เพราะเปนความยาวดานตรงขามมมฉากทยาวสดของสามเหลยมมมฉากตามขอก�าหนด และมเสนรอบรปยาว 90
► ขอมลน�าเขา
มบรรทดเดยวเปนจ�านวนเตมบวก แทนความยาวเสนรอบรปของสามเหลยมมมฉากตามขอก�าหนด (รบประกนวา มสามเหลยมมมฉากทมความยาวเสนรอบรปเทากบจ�านวนทเปนขอมลน�าเขา)
► ขอมลสงออก
มบรรทดเดยวแสดงความยาวของดานตรงขามมมฉากทยาวทสดของสามเหลยมมมฉากตามขอก�าหนด
► ตวอยาง
Input (จากแปนพมพ) Output (ทางจอภาพ)
30 13
90 41
ธนาวฒน มาลาบปผา Intania 84
CEO & Co-Founder of Priceza
Programming เปนหนงในวชำทผมชอบเรยนมำกทสดวชำนงเลยตอนป 1 เหตผลเพรำะวำมนชวยใหผมม
กระบวนกำรคดและกำรแกปญหำตำง ๆ อยำงเปนระบบ จนมำถงตอนทอยำกท�ำ Startup สรำง Priceza ขนมำ
ดวยควำมเขำใจใน Programming ท�ำใหผมมพนฐำนวธคดในกำรศกษำพฒนำระบบตำง ๆ ทเรำไมเคยพฒนำ
ขนมำกอน และท�ำใหเรำศกษำและวจยตงแตตน จนพฒนำมนขนมำไดในทสด
Programming ท�ำใหเรำรจกคดและรจกสอสำร และไมใชกำรคดและกำรสอสำรแบบทว ๆ ไป แตเปน
กำรคดอยำงเปนระบบ คดอยำงรอบคอบ คดในทก ๆ ควำมเปนไปได และเปนกำรสอสำรทตองชดเจนททง
ผสงสำรและผรบสำรตองเขำใจไปในทำงเดยวกน ถำมอะไรผดพลำดแมเพยงนดเดยว ลมคดไปนดนง สอสำรผดไป
เลกนอย ผลกจะออกมำไมไดอยำงทวำงแผนไว กำรคดและกำรสอสำรแบบนสำมำรถน�ำไปใชกบอะไรกได และสำมำรถ
สรำงผลลพธเปนอะไรกไดตำมแตทใจเรำอยำกใหเปน
ลสา ตรงประกอบ Intania 81
Google Inc.
04 : String 43
04 : String
สรปเนอหา สตรง (string) เกบอกขระ (character) ตงแตศนยตวขนไป เรยงจากซายไปขวาตอกนไป แตละตวมเลข index ระบต�าแหนง โดย index ของตวซายสดคอ 0 อกขระแตละตวในสตรงเปนไดทงตวอกษร ตวเลข และสญลกษณพเศษตาง ๆ การเขยนสตรงท�าไดหลายแบบดงน
• เขยนครอบดวย อญประกาศเดยว '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"
• อยาลมวา index ของสตรง s ตองอยในชวง 0 ถง len(s)-1 จากซายไปขวา และ -1 ถง -len(s) ถอยจากขวามาซาย
ดงนนเราเขยน s[k] ได โดยท -len(s) ≤ k ≤ (len(s)-1) เพราะฉะนน "01234"[-6] กบ "01234"[5] ผด
• s เหมอน s[:] เหมอน s[0:] เหมอน s[:len(s)] เหมอน s[::] เหมอน s[::1]
• s[::2] หยบตวท index คได "ACEG", s[1::2] หยบตวท index คได "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) คน index นอยสดทพบ c ใน s เรมคนตงแต index 0 ถาไมพบ จะไดผลเปน -1 k = "engineering".find("ng") ได k เกบ 1 เพราะ "ng" ปรากฏเรมท index 1 ใน "engineering" ค�าสง if c in s กเหมอนกบ if s.find(c) >= 0
• k = s.find(c,j) คน index นอยสดทพบ c ใน s เรมคนตงแต index j เปนตนไป
• น�าสตรงบวกกน คอน�าสตรงมาตอกน เชน '12'+'23' คอ '1223'
• สตรงคณกบจ�านวนเตม คอน�าสตรงนนมาตอกนเปนจ�านวนครงเทากบคาของจ�านวนเตมนน เชน '12'*3 คอ '121212'
44 04 : String
ตวอยางการจดการสตรงท�า 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 = 0for e in s : if '0' <= e <= '9' : c += 1
ตองการหยบทละตว พรอมกบ index ของตวนน ๆ
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 = 0for k in range(len(s)-1) : # ตองการตวตดกน จงวนถงตวรองสดทาย if '0' <= s[k] <= '9' and '0' <= s[k+1] <= '9' : c += 1
04 : String 45
ถาตองการนบวาม t ปรากฏอยใน s กครง
c = 0while t in s : c += 1
แบบนผด ถา ม t ใน s เงอนไข t in s จะเปน True ตลอด กจะวนไมรจบ
c = 0 k = s.find(t) while k >= 0 : c += 1 k = s.find(t,k+1) # 'aaaaaa' ม 'aaa' 4 ครง
หรอc = 0for i in range(len(s)-len(t)+1) : if s[i:i+len(t)] == t : c += 1
ใชสตรงสะสมขอมลเพอน�ามาแสดงทหลง
หาจ�านวนเฉพาะทมคานอยกวา 30result = ""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' )
ใชสตรงสองสายเปนทเกบขอมลเพอการแปลงขอมลจากสตรงหนงเปนอกสตรงหนง
หาชอยอสกลเงน (3 ตวอกษร) จากชอยอประเทศ (2 ตวอกษร)c = input().strip().lower() # country code# USA, Thailand, Japan, China, Singaporecountries = "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' )
46 04 : String
เรองผดบอย
เครองหมายเปดปดสตรงไมครบ ไมตรงกน หรอใสซอนภายในโดยไมน�าหนาดวย \
s = "Strings = String's = "string's = "You shouted "Hey!" very loudly yesterday"
ถาตองการรบสตรงจาก แปนพมพ ควร strip ดวย เพราะผใชอาจเผลอเพมชองวางทางซายหรอขวาเพมเตม
ค�าสงขางลางน ถาผใชปอน ok ตามดวยชองวางแลวกด enter การเปรยบเทยบกจะไมเทา 'ok' s = input()if s == 'ok' : print('OK')
จงควรเขยน s = input().strip() (ยกเวนกรณทเราตองการคงทกสงทผใชปอนทงหมด)
ใช index ทเกนชวงทใชไดของสตรง อยาลมวา index ของสตรง s อยในชวง 0 ถง len(s)-1 จากซายไปขวา และ -1 ถง -len(s) ถอยจากขวามาซาย
s = input().strip()t = ""for i in range(10): t = s[i] + t # ถา len(s) < 10 กผดแน
เลข 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)
04 : String 47
แบบฝกหด
Problem Code
Input: รบสตรงหนงบรรทดProcess: สรางสตรงใหมททกอกขระในสตรงทรบเขามาปรากฏซ�า อกตว เชน รบ 'pypy' จะไดสตรง 'ppyyppyy'Output: สตรงผลลพธ
Input: รบสตรงหนงบรรทดProcess: สรางสตรงใหมททกอกขระในสตรงทรบเขามาปรากฏซ�า อกตว แตถามตวซ�าตดกนอยแลว กไมตองท�าซ�า เชน รบ 'pythonnnaa' จะไดสตรง 'ppyytthhoonnnaa'Output: สตรงผลลพธ
Input: รบสตรงหนงบรรทดProcess: ตรวจวาสตรงนเปน palindrome(ซงคอสตรงทกลบล�าดบแลวคอสตรงเดม) หรอไมOutput: ถาเปน กแสดง Y ถาไมเปน กแสดง N
Input: รบจ�านวนเตมบวกสองจ�านวนเกบใส d กบ nProcess: สรางสตรงใหมจากจ�านวน d ทม n หลก โดยถา d มไมครบ n หลก กตองเตมเลข 0 ไวทางซายใหครบ n หลก แตถา d มจ�านวนหลก ≥ n หลก กใหเปนสตรงของ d เดมOutput: สตรงใหมทตองการ
48 04 : String
Problem Code
Input: รบเลขฐานสบหก 1 หลกProcess: แปลงเปนจ�านวนในฐานสบOutput: จ�านวนในฐานสบทแปลงได
Base 16 : 0, 1,..., 9, A, B, C, D, E, FBase 10 : 0, 1,..., 9,10,11,12,13,14,15
Input: รบสตรงมาหนงบรรทดProcess: นบจ�านวนตวเลขคทปรากฏในสตรงทรบเขามาOutput: จ�านวนทนบได
Input: รบสตรงมาหนงบรรทดProcess: นบวามตวอกษรตดกนกคทเปนสระภาษาองกฤษOutput: จ�านวนทนบได
Input: รบสตรงทมแตเลข 0 กบ 1 Process: แปลงสตรงเลขฐานสองทไดรบใหเปนจ�านวนเตมในฐานสบ (คอ int นนเอง) ตวอยางเชน"01101" = 0×24 + 1×23 + 1×22 + 0×21 + 1×20 = 13Output: จ�านวนเตมทได
04 : String 49
ตวอยางการแกโจทยปญหา
ตรวจสอบเลขซ�า จงเขยนโปรแกรมทรบสตรง เพอตรวจสอบวาสตรงนมเลขซ�ากนหรอไม เชน ถารบ ...102...89..3.. แบบน ไมมเลขซ�า แตถารบ ...102...89..2.. แบบนมเลขซ�า (มเลข 2 ซ�า)
► ขอมลน�าเขา
รบสตรงหนงบรรทด
► ขอมลสงออก
ถาสตรงทรบมามเลขซ�า แสดง True แตถาไมมเลขซ�า แสดง False
► ตวอยาง
Input (จากแปนพมพ) Output (ทางจอภาพ)
..125.9.0. False
..125.9.2. True
ตวอยางการเขยนโปรแกรม
โปรแกรม ค�าอธบาย
t = ''for e in input().strip() : if '0' <= e <= '9' : t += eprint(t)
อาจเรมดวยการลบอกขระทไมใชตวเลขออกจากสตรงทรบมากอน หลงจากนนคอยหาวธตรวจสอบอกขระซ�า แตเราเรยนมาวา ไมสามารถเปลยนแปลงอกขระในสตรงได ดงนนตองใชวธการสรางสตรงใหม เชน ถาจะลบอกขระตวท index 2 ออก กใชการสรางใหมแลวทบตวเดมดวยค�าสง s = s[:2]+s[3:] วธนคอนขางยง จงขอเปลยนเปนการเลอกเฉพาะตวเลขในสตรงทรบมา เพมใสสตรงใหมอกตวหนง จะงายกวาโปรแกรมทางซาย เรมดวยสตรงวาง t จากนนวนหยบอกขระออกมาทละตวจากสตรงทรบเขามา ถาอกขระนนเปนตวเลข กเพมใส tสง run, ใส 12a34bce5, ไดผลเปน 12345, ถกตอง
t = ''for e in input().strip() : if '0' <= e <= '9' : t += eb = ''for e in t : if e in b : break b += e
เราได t เกบสตรงทมตวเลขอยางเดยว กมาถงขนตอนตรวจวา t ไมมเลขซ�าหรอไม ? จะท�าอยางไร ? ถาเราคอย ๆ ดอกขระทละตวในสตรง กตองตรวจวาอกขระตวใหมนปรากฏในอกขระทดผานมาหรอไม ถาเราใชวงวน for e in t กจ�าตวทผานมาดวยการใชตวแปรใหม b เรมดวยสตรงวาง ถาตวใหมไมมใน b เพมตวใหมตอทายเขาใน b ดง code ทางซายน เมอใดพบวา e in b เปนจรง คอตวใหมซ�ากบตวทผานมา ก break ออกจากวงวนได (คอรวามเลขซ�าแลว)
50 04 : String
โปรแกรม ค�าอธบาย
t = ''for e in input().strip() : if '0' <= e <= '9' : t += eb = ''for e in t : if e in b : print(True) break b += eelse: print(False)
แตการ break ออกจากวงวนทนททพบตวซ�านน พอออกจากวงวนแลว เราจะไมทราบวา การหลดออกจากวงวนมาจากกรณ break หรอมาจากกรณทวนครบทกอกขระแลว ในโจทยบอกวา ถาพบวาซ�า ใหแสดง True ถาไมซ�าเลย ใหแสดง False ดงนนควร print(True) เลยเมอพบวาซ�า แลว break ออกจากวงวน สวนการตรวจวาไดวนครบทกตวโดยไม break กท�าไดโดย เพมค�าสง print(False) หลง else ของ for นนแสดงวาวนครบทกตวแลวไมพบเลขซ�าเลย ได code ทางซายสง run, ใส ..125.9.0., ไดผลเปน False, แสดงวาไมมซ�า, ถกตองสง run, ใส ..125.9.2., ไดผลเปน True, แสดงวามซ�า, ถกตอง
t = ''for e in input().strip() : if '0' <= e <= '9' : t += efor k in range(len(t)) : if t[k] in t[:k] : print(True) breakelse: print(False)
ถาคดอกนด พบวา หากเราวนถงรอบท k การตรวจวาตวท k ซ�ากบตวท ผานมาหรอไม สามารถดตวทผานมาจากสวนทางซายของ t ไมเหนจ�าเปนตองสราง b ในแบบทท�ามา ดวยค�าสง if t[k] in t[:k] จงเปลยนจาก for e in t เปน for k in range(len(t)) ไดดง code ทางซายสง run, ใส ..125.9.0., ไดผลเปน False, แสดงวาไมมซ�า, ถกตองสง run, ใส ..125.9.2., ไดผลเปน True, แสดงวามซ�า, ถกตอง
t = input().strip()for k in range(len(t)) : if '0'<=t[k]<= '9' and \ t[k] in t[:k] : print(True) breakelse: print(False)
เราสามารถปรบปรงตอไดอก โดยยบรวมวงวน for สองวงวนเขาดวยกน for แรกขจดอกขระทไมใชตวเลข for หลงตรวจเรองตวซ�า เรากยบรวมใหม for เดยว ดไลไปทละตว ถาไมใชตวเลขกขามไป ถาใชกตรวจวาซ�ากบ ทผานมาหรอไมในท�านองเดยวกบทท�ามา ได code ทางซายสง run, ใส ..125.9.0., ไดผลเปน False, แสดงวาไมมซ�า, ถกตองสง run, ใส ..125.9.2., ไดผลเปน True, แสดงวามซ�า, ถกตอง
t = input().strip()for k,e in enumerate(t) : if '0' <= e <= '9' and \ e in t[:k] : print(True) breakelse: print(False)
หรอจะเปลยนมาใช for k,e in enumerate(t): กเปนแบบทนยมกวา แบบบน for แบบนจะไดทง index (เกบใน k) และตวขอมล (เกบใน e) มาใชงานในวงวนสง run, ใส ..125.9.0., ไดผลเปน False, แสดงวาไมมซ�า, ถกตองสง run, ใส ..125.9.2., ไดผลเปน True, แสดงวามซ�า, ถกตอง
04 : String 51
ตวอยางโจทยปญหา
แปลงวนท ใหอานวนเดอนปในรปแบบ เดอน/วนท/ป (mm/dd/yyyy) โดยรบคาทางแปนพมพ และแปลงวนททไดรบเปนรปแบบ วนท เดอน ป (dd MMM yyyy) คาของเดอนทรบมาเปนตวเลขจ�านวนเตม ตองแปลงใหอยในรปตวยอภาษาองกฤษของเดอนท รบเขามา
► ขอมลน�าเขา
ม 1 บรรทด เปนขอความสตรง แทนวนทในรปแบบ เดอน/วนท/ป (mm/dd/yyyy)
► ขอมลสงออก
ม 1 บรรทด เปนวนทในรปแบบ วนท เดอน ป (dd MMM yyyy)
► ตวอยาง
Input (จากแปนพมพ) Output (ทางจอภาพ)
08/27/2014 27 AUG 2014
02/01/2018 01 FEB 2018
52 04 : String
นบตวอกษรพมพใหญ ใหเขยนโปรแกรมอานขอมลทเปนสตรงเขามาหนงบรรทด ประกอบดวยอกขระอะไรกได เวนวรรคกได จากนนใหนบเฉพาะตวอกษรทเปนตวใหญเทานน และแสดงผลลพธออกมาทางหนาจอ
► ขอมลน�าเขา
ม 1 บรรทด ประกอบดวยสตรงทประกอบไปดวยตวอกขระอะไรกได เวนวรรคกได
► ขอมลสงออก
ม 1 บรรทด แสดงจ�านวนตวอกษรทเปนตวใหญทงหมดทนบไดจากขอมลน�าเขา
► ตวอยาง
Input (จากแปนพมพ) Output (ทางจอภาพ)
HelLo WoRLd 5
PYTHON123 6
yes! 0
04 : String 53
กลมสระ ค�าภาษาองกฤษประกอบดวยพยญชนะและสระ (a, e, i, o, u) ขอเรยกสระทอยตดกนวาเปน กลมสระ เชน beautiful มกลมสระ eau, i, และ u จงมกลมสระ 3 กลม, vowel มกลมสระ 2 กลม, group มกลมสระ 1 กลม และ rhythm มกลมสระ 0 กลม
ใหเขยนโปรแกรมเพอนบจ�านวนกลมสระในค�าภาษาองกฤษ
► ขอมลน�าเขา
ม 1 บรรทด แทนค�าภาษาองกฤษ ประกอบดวยอกษรตวพมพเลกเทานน
► ขอมลสงออก
ม 1 บรรทด แสดงจ�านวนกลมสระของค�าทก�าหนด
► ตวอยาง
Input (จากแปนพมพ) Output (ทางจอภาพ)
beautiful 3
vowel 2
group 1
rhythm 0
วรวร สตยวนจ (Product Manager) ภทราวธ ซอสตยาศลป (CTO) ยอด ชนสภคกล (CEO) ศภฤทธ กฤตยาเกยรณ (Software Architect) เอกลกษณ วรยะโกวทยา (COO)(จากซายไปขวา)
Intania 84Wongnai
ไมวำคณจะเรยนคณะอะไรหรอภำคอะไร Computer Programming ไดกลำยมำเปนควำมรททกคนจ�ำเปน
ตองมไปแลว เพรำะเทคโนโลยเกดใหมในธรกจและอตสำหกรรมตำง ๆ ไมวำจะทำงดำนกำรคำขำย ธนำคำร
กำรแพทย โฆษณำ บนเทง กฬำ เครองจกรและหนยนต ฯลฯ ลวนแลวแตตองใชควำมรดำน Computer
Programming มำชวยพฒนำผลตภณฑหรอบรกำรใหดขนกวำเดม โดยควำมตองกำรนจะยงมำกขนมำกในอนำคต
เมอผลตภณฑ บรกำร หรอแมกระทงเงนทเรำใชซอสนคำตำง ๆ ถกแปลงไปอยในรปแบบดจตอล จงเปนเรองส�ำคญมำก
ทเรำจะใสใจกบควำมรดำน Computer Programming เพรำะมนคอ “ทกษะทจ�ำเปน” ของคนทจะสำมำรถรบมอ
กบควำมเปลยนแปลงของโลกดจตอล และพรอมเกบเกยวโอกำสทจะมำพรอมกบคลนยกษลกใหมในอนำคตอนใกลน
05 : File 55
05 : File
สรปเนอหา การอานขอมลทเกบในแฟมขอมลเขามาประมวลผลท�าไดหลายวธหลายค�าสงวชานใชวธงายสดๆคออานแฟมขอความ(textfile)ทละบรรทดมาเกบในสตรงมรปแบบดงน
อานแฟมขอความทละบรรทดใชreadlineinfile = open(filename, 'r') first_line = infile.readline()second_line = infile.readline() for line in infile : # ค�ำสง for อำนจำก infile รอบละหนงบรรทด # มำเกบเปนสตรงใน line จนหมดแฟม ...infile.close() # ไมอำนแลว กปดแฟม
ถาบรรทดทอานเขามาเปนบรรทดวางๆเกบในt จะไดt = '\n'หรอlen(t)เปน1แตถาอานตอนทแฟมไมมขอมลใหอานแลว จะไดt = ''หรอlen(t)เปน0
for line in infile : ...
เหมอนกบ
line = infile.readline()while len(line) > 0 : ... line = infile.readline()
อานขอมลในแฟมมาหาคาเฉลยแตละบรรทดเกบรหสกบคะแนนinfile = open('c:/temp/data.txt', 'r')n = 0s = 0for line in infile : sid, sc = line.strip().split() s += float(sc) n += 1infile.close()print('average =', (sc/n))
อกแบบอานขอมลในแฟมมาหาคาเฉลยแตละบรรทดเกบ รหสกบคะแนนบรรทดแรกบอกจ�านวนบรรทดทตองอาน
infile = open('c:/temp/data.txt', 'r')n = int(infile.readline()) # อำนบรรทดแรกs = 0for k in range(n) : sid, sc = infile.readline().strip().split() s += float(sc)infile.close()print('average =', (sc/n))
การอานจากแฟมหนงบรรทดอาจมรหสขนบรรทดใหม\nอยทปลายบรรทด(กรณอานบรรทดสดทายของแฟมอาจไมมรหสน) ถาไมตองการรหส\nกอยาลมลบทงแตถาอานมาแลวมการstrip() รหส\nจะถกขจดไปดวยไมตองท�าอะไรเพม
f = open('data.txt', 'r')t = f.readline()if len(t)>0 and t[-1]=='\n' : t = t[:-1]
for line in f : if line[-1] == '\n' : line = line[:-1] ...
56 05 : File
บนทกขอมลลงแฟมขอความ
outfile = open('c:/temp/out.txt','w')outfile.write(any_string)outfile.write(any_string + '\n')...outfile.close()
อยาลม:writeไมไดเพมรหส'\n' เพอขนบรรทดใหมใหตองเพมเองเมอตองการ
หาจ�านวนเฉพาะทมคานอยกวาm บนทกลงแฟม บรรทดละ5ตว
m = int(input())outfile = open('D:/primes.txt','w')c = 0result = ""for n in range(2,m): for k in range(2,n): if n % k == 0: break 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()
เรองผดบอย
เมออานขอมลจากแฟมมาหนงบรรทด ลมลบรหส\n ท�าใหการประมวลผล ผดพลาด
t = input().strip()f = open('names.txt', 'r')for line in f : if line == t : # ผด เพรำะ line อำจมรหส \n print(t, ': found in names.txt') breakelse : print(t, ': not found')
ชอแฟมมเครองหมาย \ แตใสแคตวเดยว of = open('c:\temp\data.txt', 'w')ผดเพราะ\tคอtabตองเปน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() )
05 : File 57
พมพreadline เปนreadlines readlines อานทเดยวหมดแฟม(อานเสรจแลวไดเปนlist of strings ทยงไมไดน�าเสนอจงขอไมลงในรายละเอยด)
infile = open('c:/temp/data.txt')first_line = infile.readlines() # ระวงsecond_line = infile.readline() # ควรใชแบบบรรทดน
แบบฝกหด
Problem Code
Input:หนงบรรทดเปนชอแฟมProcess:อานขอความในแฟมมากลบล�าดบบรรทดOutput:แสดงขอความในแฟมแบบกลบล�าดบบรรทดออกทางจอภาพเชน
ขอมลในแฟม ผลลพธ (ออกทางจอ)
line1 line2 line3
line3line2line1
Input:หนงบรรทดเปนชอแฟมProcess:อานขอความในแฟมแลวกลบล�าดบบรรทด แตมเงอนไขวาจะไมเอาบรรทดทวางๆหรอมแตblankOutput:บนทกขอความแบบกลบล�าดบบรรทดลงแฟมชอreverse.txt
Input:หนงบรรทดเปนชอแฟมProcess:แสดงหวขอขาวทงหมดในแฟมหวขอขาวเปนขอความทอยระหวาง<headline> กบ </headline>ในแฟมน(ทง <headline>กบ </headline>อยในบรรทดเดยวกนแนๆและแตละบรรทดมไมเกน1หวขอขาว)Output:บรรทดละหนงหวขอออกทางจอภาพใหครบทกหวขอ
58 05 : File
Problem Code
Input:สองบรรทดแตละบรรทดเปนชอแฟมProcess:เปรยบเทยบวาสองแฟมนมคาเหมอนกนหรอไมOutput:ถาแฟมทงสองมขอมลเหมอนกนแสดงTrue ตางกนกแสดงFalse
ตวอยางการแกโจทยปญหา
ตรวจค�าตอบ จงเขยนโปรแกรมอานแฟมเกบค�าตอบแบบปรนยของนกเรยนมาตรวจใหคะแนน
► ขอมลน�าเขา
ขอมลจากแฟมc:\t\answers.txtรปแบบแฟมเปนดงน บรรทดแรกเกบเฉลยเปนสตรงของตวอกษรA, B, CหรอD บรรทดตอมาจนหมดแฟมแตละบรรทดเกบเลขประจ�าตวนกเรยนตามดวยชองวางหนงชองตามดวยค�าตอบแบบปรนยซงเปนสตรงของตวอกษรA,B,C,Dหรอเปนชองวาง(กรณไมตอบขอนน)หรอเปนตวอน(กรณกรอกมากกวาหนงค�าตอบ)
► ขอมลสงออก
แฟมใหมc:\t\results.txtเกบผลการตรวจแตละบรรทดประกอบดวยเลขประจ�าตวนกเรยนตามดวยคะแนนทไดคนดวยเครองหมายจลภาค(comma)
► ตวอยาง
Input (อานจากแฟม) Output (บนทกลงแฟม)
AABBCCCBBCCDDDABABDDCCDDCC5630120421 AABBCCCBBCCDDDABABDDCCDDCA5631010121 A BBCD BDBAAABA ABDBCCCDCC563102121 ABABCCNNAADDDABAB CCDDAC5630121821 AABBCCCBBCCDDDABABDDCCDD
5630120421,255631010121,14563102121,165630121821,24
05 : File 59
ตวอยางการเขยนโปรแกรม
โจทยก�าหนดใหอานขอมลจากแฟมและบนทกผลการท�างานลงแฟม เพอใหการเขยนโปรแกรมและหาทผดไดงายขน จะขอเขยนแบบแสดงผลออกหนาจอกอนเมอทกอยางถกตองคอยเปลยนใหบนทกลงแฟม
โปรแกรม ค�าอธบาย
fin = open('c:\t\answers.txt', 'r')soln = fin.readline().strip()for line in fin: sid,ans = line.strip().split() point = 0 for k in range(len(soln)): if ans[k] == soln[k]: point += 1 print(sid, point)fin.close()
เรมดวยการเปดแฟม,ใชreadlineหลงเปดแฟมทนทจะไดบรรทดแรกของแฟมซงคอเฉลย(stripเพอลบชองวาง ซายขวาและรหสขนบรรทดใหม)จากนนใชforอานบรรทดทเหลอใชsplitแยกเลขประจ�าตวกบค�าตอบออกจากกนแลวใชอกforน�าค�าตอบทละตวเปรยบเทยบกบเฉลย(เราใชforแบบเปลยนคาkเปนindexของทงค�าตอบกบเฉลย)ถาตรงกนกเพมคะแนนวนตรวจครบทกขอกแสดงผลทางจอภาพวนครบทกบรรทดกปดแฟมดงcodeทางซายกอนสงท�างานกตองสรางแฟมanswers.txtจากนนสงrun,ได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 for k in range(len(soln)): if ans[k] == soln[k]: point += 1 print(sid, point)fin.close()
ถายงจ�าไดเครองหมาย\ทปรากฏในสตรงจะถกตความหลายแบบถาตองการสญลกษณ\ในสตรงตองเขยน\\ แกใหถกตองสงrun,ได5630120421 25,ผดบรรทดท4ของโปรแกรมValueError: too many values to unpack (expected 2)
แปลวาหลงsplitแลวไดสตรงมากกวาตวแปรทจะมารบผลซงนาจะเกดหลงอานบรรทดท3ของแฟม5631010121 A BBCD BDBAAABA ABDBCCCDCC
บรรทดนมชองวางในค�าตอบ(ชองวางแปลวาขอนนไมตอบ)จงท�าใหsplitแลวไดสตรงมากกวา2สตรงจงตองหาทางแยกบรรทดใหเปนสองสตรงเลขประจ�าตวกบค�าตอบทงหลาย
60 05 : File
โปรแกรม ค�าอธบาย
fin = open('c:\\t\\answers.txt','r')soln = fin.readline().strip()for line in fin: line = line.strip() j = line.find(' ') if j > 0 : sid = line[:j] ans = line[j:] point = 0 for k in range(len(soln)): if ans[k] == soln[k] : point += 1 print(sid, point)fin.close()
เราไมควรแกปญหานโดยคดวาเลขประจ�าตว ม10หลกกแยกดวยsid = line[:10]ans = line[10:]เพราะถาดในแฟมพบวาเลขประจ�าตวบางคนมนอยกวา 10หลกจงควรใชวธหาชองวางแรกจากทางซายดวยบรการfindของสตรง(แตตองอยาลมstripกอนไมเชนนนถาlineเรมดวยชองวางกจะผด)เมอหาชองวางพบทindexj กแยกไดดวยsid = line[:j]ans = line[j:] แลวกตรวจค�าตอบดวยวธทท�ามาสงrun,ได5630120421 125631010121 7563102121 6แลวเกดขอผดพลาดทค�าสงif ans[k] == soln[k]IndexError: string index out of rangeถาดผลคะแนนทไดกอนเกดขอผดพลาดจะพบวาไดคะแนนรวมผดดวย
fin = open('c:\\t\\answers.txt','r')soln = fin.readline().strip()for line in fin: line = line.strip() j = line.find(' ') if j > 0 : sid = line[:j] ans = line[j:].strip() point = 0 for k in range(len(soln)): if ans[k] == soln[k] : point += 1 print(sid, point)fin.close()
ผลทผดไดคะแนนลดลงมากเหมอนกบวาค�าตอบผดมมากผดปกตถาแทรกค�าสงprint(ans)กบprint(soln) ออกมาดเทยบกนจะได(ขอตดมาใหดแค2บรรทดแรก) AABBCCCBBCCDDDABABDDCCDDCAAABBCCCBBCCDDDABABDDCCDDCC เหนไดวาบรรทดบนansมนเลอนไปทางขวา เพราะวามชองวางทางซายแกปญหานดวย ans = line[j:].strip()เพอตดชองวางออก สงrun,ได5630120421 255631010121 14แลวเกดขอผดพลาดทค�าสง if ans[k] == soln[k]IndexError: string index out of rangeท�างานผดเหมอนครงทแลวแตไดคะแนนรวมถกตองสวนทท�างานผดพลาดกลายมาเกดกบบรรทดท4ในแฟมซงมขอมล563102121 ABABCCNNAADDDABAB CCDDAC
05 : File 61
โปรแกรม ค�าอธบาย
fin = open('c:\\t\\answers.txt','r')soln = fin.readline().strip()for line in fin: line = line.strip() j = line.find(' ') if j > 0 : sid = line[:j] ans = line[j+1:] point = 0 for k in range(len(soln)): if ans[k] == soln[k] : point += 1 print(sid, point)fin.close()
เนองจากโจทยก�าหนดวาเลขประจ�าตวกบค�าตอบคนดวย ชองวาง1ชองแตในบรรทดท4หางกน2ชองแสดงวา ชองวางตวท2นนแทนค�าตอบ(ทไมม)ของขอท1 ค�าสงline[j:].strip()จะลบชองวางออกหมดท�าใหประมวลผลผดท�าใหมขอมลไมครบและท�าใหเมอน�าans[k]มาเทยบค�าตอบกผดเพราะkมคาเกนชองในสตรงจงแกไขค�าสงline[j:].strip()เปนline[j+1:] สงrun,ได 5630120421 255631010121 14 563102121 16 แลวเกดขอผดพลาดทค�าสง if ans[k] == soln[k]IndexError: string index out of range ไมผดบรรทดท4ของแฟมขอมลแลวแตผดบรรทดท5ของแฟม
fin = open('c:\\t\\answers.txt','r')soln = fin.readline().strip()for line in fin: line = line.strip() j = line.find(' ') if j > 0 : sid = line[:j] ans = line[j+1:] if len(ans) < len(soln) : ans += ' '*(len(soln)-len(ans)) point = 0 for k in range(len(soln)): if ans[k] == soln[k] : point += 1 print(sid, point)fin.close()
index out of rangeแปลวาคาของindexอยนอกชวงทถกตองค�าสงans[k] == soln[k]ผดไดทans[k] หรอไมกทsoln[k]ค�าสงsoln[k]ไมนาผดเพราะk มคาในrange(len(soln))แตans[k]อาจผดไดถาansมขนาดนอยกวาsolnถากลบไปดทบรรทดท5ในแฟมพบวาค�าตอบมไมครบนกเรยนไมตอบค�าตอบทายๆจะเปนชองวางและถกstripทง
วธแกไขกแคตรวจวาถาlen(ans) < len(soln)จะเตมชองวางตอทางขวาของansเปนจ�านวนเทากบผลตางของความยาวทงสองสตรงสงrun,ได5630120421 255631010121 14563102121 16 5630121821 24 ถกตองภาระทเหลอกแคเปลยนจากการแสดงผลออกหนาจอเปนการบนทกลงแฟมซงขอใหผอานลองเขยนตอเอง
62 05 : File
ตวอยางโจทยปญหา
คะแนนเฉลยของตอนเรยน จงเขยนโปรแกรมเพออานแฟม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มขอความขางตน
Input (จากแปนพมพ) Output (ทางจอภาพ)
1 56.6
2 88.66666666666667
3 Not Found
05 : File 63
Find Student's Grade ใหเขยนโปรแกรมเพออานแฟม score.txt ซงมรหสนสตและเกรดของนสตแตละคน (0-4) คนดวยชองวาง และ รบคารหสนสตจากแปนพมพแลวแสดงเกรดของนสตคนนนหากไมพบรหสนสตในแฟมใหแสดงNot Found
► ขอมลน�าเขา
ม1บรรทดรบรหสนสตเปนจ�านวนเตม
► ขอมลสงออก
ม1บรรทดแสดงเกรดของนสตเปนจ�านวนเตมหากไมพบรหสนสตในแฟมใหแสดงค�าวาNot Found
► ตวอยาง
ขอมลในแฟม score.txt Input (จากแปนพมพ) Output (ทางจอภาพ)
1111 3 12345 2 9999 4 89431 0 76238 1
12345 2
9999 4
1234 Not Found
64 05 : File
รหสลบ จงเขยนโปรแกรมอานขอมลรหสลบจากแฟมหนง ซงระบวา จะตองใชรหสตามล�าดบอยางไร จงจะสามารถปลอยอาวธอานภาพรนแรงได วธการถอดรหสจากแฟมนคอ ตองรบอนพตเปนตวอกษรสามตว จากนนนบวา ตวอกษรทงสามตวนน ปรากฏเปนจ�านวนเทาใดในแฟม แลวจงเรยงล�าดบตวอกษรทงสามตามจ�านวนครงทปรากฏในแฟมจากมากทสดไปนอยทสด โดยถอวา ตวอกษรตวพมพใหญกบตวพมพเลก ไมเหมอนกน (case sensitive) และจ�านวนตวอกษรทงสามตวนนจะไมเทากน ตวอยางเชน หากมแฟมdata.txtเปนอนพตดงดานลาง
agAbggggDf ffgFFFaaD DaADDFF FFDFFF
จะเหนวาตวอกษรaม4ตว,Aม2ตว,bม1ตว,Dม6ตว,fม3ตว,Fม10ตวและgม6ตว หากอนพตเปนa b fจะไดผลลพธเปนafb หากอนพตเปนF A fจะไดผลลพธเปนFfA
► ขอมลน�าเขา
ขอความสบรรทดบรรทดแรกแทนชอแฟมอกสามบรรทดถดมาแทนตวอกษรสามตวบรรทดละหนงตว
► ขอมลสงออก
แสดงขอความผลลพธตามตองการ
► ตวอยาง
Input (จากแปนพมพ) Output (ทางจอภาพ)
data.txt a b f
Afb
data.txt F A f
FfA
06.1 : List 65
06.1 : List
สรปเนอหารายการหรอลสต (list) เปนทเกบกลมของขอมลทมล�าดบ แตละตวมเลข index ก�ากบล�าดบ ตวซายสดม index 0
• การสราง list
o x = [] หรอ x = list() ไดลสตวาง ๆ ม len(x) เปน 0
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 ไวท index i ของลสต x
• x.pop(i) ลบขอมลตวท index 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) คน index นอยสดทพบ 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
66 06.1 : List
ตวอยางการเขาใชขอมลและลสตยอยในลสต (สมมตให x = [11,12,13,14,15])
• มวธการเขาใชและการเลอกลสตยอยดวย index เหมอนกบวธของสตรง
• ใช 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] ได โดยท -len(x) ≤ k ≤ (len(x)-1) เพราะฉะนน x[-6] กบ x[5] ผด
• x[a:b] (slice ของลสต) ไดลสตเสมอ
• เขยน 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] ไดลสตยอยเฉพาะ index ค x[1::2] ไดลสตยอยเฉพาะ index ค
• 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 มสมาชกเพมอก 2 ตวคอ 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
06.1 : List 67
รปแบบการประมวลผลลสตทพบบอยใชลสตเกบขอมลเพอน�ามาใชภายหลง อานขอมลเขามา n ตว
n = int(input())data = []for k in range(n): data.append( float(input()) )
ตองการหยบขอมลในลสตจากซายไปขวามาประมวลผลทละตว
ใช for e in x
ตองการนบวาลสต x มขอมลเทากบ e กตวc = 0 for d in x : if d == e : c += 1
หรอแบบสน ๆ c = x.count(e)
ตองการหยบขอมลของลสตในชวงทสนใจมาประมวลผล
ใช for e in x[a:b:c]
ตองการหาผลรวมของคะแนนทเกบในลสต x โดยขอไมรวมคะแนน ทนอยสดและมากสด (ตดออกอยางละหนงตว)s = 0 for d in sorted(x)[1:-1] : s += d
หรอแบบสน ๆ s = sum( sorted(x)[1:-1] )
ตองการปรบเปลยนคาในลสต ใช for i in range(len(x)) : x[i] = ...
x เปนลสตเกบคะแนน ตองการปรบชองทมคานอยกวา 30 ใหมคาเพมอก 10%for i in range(len(x)) : if x[i] < 30 : x[i] += 0.1*x[i]
เขยนแบบขางลางนไมได เพราะ e ทแจงออกมาเปนทเกบคนละทกบทอยในลสตfor e in x : if e < 30 : e += 0.1*e
ตองการหยบขอมลแตละตว พรอมกบ index ของตวนน ๆ
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] ...
68 06.1 : List
ตองการหยบขอมลในลสตมาประมวลผลจนกวาเงอนไขหนงจะเปนจรง
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") breakelse: print("True")
ตองการหยบขอมลทก ๆ คในลสต (ไมจ�าเปนตองตดกน) มาประมวลผล
ตองการนบวา มขอมลกคในลสตทตวทางซายมคามากกวาตวทางขวา (ไมจ�าเปนตองอยตดกน)c = 0for i in range(len(x)) : for j in range(i+1,len(x)) : if x[i] > x[j] : c += 1print(c)
เรยงล�าดบขอมลในลสต (ดวยวธ bubble sort)
# ตองกำรเรยงล�ำดบขอมลในลสต 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]
เรองผดบอย
ใช index ทเกนชวงทใชไดของลสตอยาลมวา index ของลสต x อยในชวง0 ถง len(x)-1 จากซายไปขวา และ -1 ถง -len(x) ถอยจากขวามาซาย
x = [2,3,5,7,11,13,17,19,23]s = 0for i in range(len(x),0,-1): s += i*x[i] # ผด คำแรกของ i คอ len(x) อยนอกชวง
เลข index ทใชกบลสตไมใชจ�านวนเตม print( x[n/2] ) # ผด เพรำะ n/2 ไดจ�ำนวนจรง
06.1 : List 69
เมอ x เปนลสต อยาสบสนระหวาง x.append(y) กบ x+=y ซงไดผล ไมเหมอนกน
x = [1,2,3,4]; x.append( [5] ) # ได [1,2,3,4,[5]]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 ตองเลอกวาจะใช y = x หรอ y = list(x) ปกตไมคอยนาจะใช y = x
x = [1,2,3]y = x # y เปนลสตเดยวกบ xx[2] = 0 # y[2] กเปลยนเปน 0 ดวย
เขยน x = list(str) เปนการสรางลสตทประกอบดวยแตละอกขระใน str
x = list('abc')ได x = ['a','b','c'] ไมใช x = ['abc']
น�าขอมลในลสตมา join กนใหเปนสตรง แตลมไปวาขอมลในลสตนนตองเปนสตรง ถงจะ join ได
x = [1,2,3]s = ','.join(x) # ผด เพรำะ 1,2,3 ไมใชสตรงt = []for e in x : t.append( str(e) )s = ','.join(t) # ใชได เพรำะ t เปนลสตของสตรง
สบสนค�าสง x.sort() กบ sorted(x)x.sort() เรยงล�าดบขอมลในลสต x ค�าสงนไมคนผลใด ๆ ในขณะท sorted(x) น�าขอมลทไดจาก x มาเรยงล�าดบแลวคนลสตใหมทมขอมลเหมอนใน x แตเรยงล�าดบแลว โดยท x ไมเปลยนแปลง
x = [9,2,0,4]x = x.sort() # ผด แบบนท�ำให x เกบคำ None # เพรำะ x.sort() ไมคนผลใด ๆfor e in x.sort() : ... # ผด x.sort() ไมคนผล ไมมอะไรให e
ถาตองการเรยงล�าดบขอมลใน 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)
จะไมไดผลตามทคาด และเกดขอผดพลาดระหวางการท�างานดวย (ลอง run ด)ควรใชการสรางลสตชวคราวกอน แลวคอยน�ากลบไปใสในลสตเดมt = []for e in x : if e%2 != 1 : t.append(e)x[:] = t
ใหสงเกตวาค�าสงสดทายคอ x[:] = t แทนทจะเปน x = t เพราะตองการเปลยนขอมลในลสต x ใหเหมอน t ไมไดตองการให x ไปอางองลสตเดยวกบ t
70 06.1 : List
แบบฝกหด
Problem Code
Input: ม 2 บรรทด แตละบรรทดเกบสมาชกของเวกเตอรซงเปนจ�านวนจรงหลายจ�านวนคนดวยชองวาง อานทงสองบรรทดเกบในลสต v1 และ v2 Process: ค�านวณ dot product ของเวกเตอร v1 กบ v2Output: แสดงค�าวา Error ถา v1 และ v2 มขนาด ไมเทากน แตถาเทากน แสดงคา dot product ทค�านวณได
Input: บรรทดแรกเปนจ�านวนเตม n และมอก n บรรทดแตละบรรทดเปนจ�านวนเตม 1 จ�านวนProcess: เรยงล�าดบจ�านวนเตมทง n ตวจากนอยไปมาก Output: จ�านวนเตมทง n ทเรยงจากนอยไปมากบนบรรทดเดยวกนเรยงจากซายขวา คนดวยจลภาค ,
Input: หนงบรรทดเปนชอแฟม แฟมนเกบจ�านวนเตมบรรทดละจ�านวนProcess: หาวาจ�านวนเตมใดในแฟมปรากฏซ�ากนมากสด ถามซ�ากนมากสดหลายตว ใหหาทกตวOutput: ขอมลทกตวทปรากฏซ�ากนมากสดในแฟม เรยงตามล�าดบทปรากฏในแฟม
06.1 : List 71
Problem Code
Input: หนงบรรทดเปนชอแฟมProcess: แสดงหวขอขาวทงหมดในแฟม หวขอขาว เปนขอความทอยระหวาง <headline> กบ </headline> ในแฟมน (ทง <headline> กบ </headline> อยในบรรทดเดยวกนแน ๆ และแตละบรรทดมไมเกน 1 หวขอขาว)Output: หนงบรรทดหนงหวขอ ใหครบทกหวขอ โดยแสดงเรยงหวขอตามตวอกษรจากนอยไปมาก
Input: หนงบรรทดเปนชอแฟม แฟมนเกบชอ บรรทดละหนงชอProcess: เรยงล�าดบชอทอานจากแฟม โดยเรยงล�าดบตามความยาวของชอจากนอยไปมาก ถามความยาวเทากน ใหเรยงตามตวอกษรแบบในพจนานกรมOutput: ล�าดบของชอตามทเรยงได
72 06.1 : List
ตวอยางการแกโจทยปญหา
ขจดคนเลว ก�าหนดให n เปนจ�านวนเตม หากเราน�าคนด n คน กบคนเลว n คน มายนเรยงเปนวงกลม โดยใหคนดยนเรยงตดกนตงแตต�าแหนงท 0 ถง n-1 และคนเลวยนเรยงตอไปตงแตต�าแหนง n ถง 2n-1 จงหาจ�านวนเตมบวก d ทมคานอยสด ทเมอน�าคนทงหมดมาใชกบปญหา Josephus แลวจะเหลอคนดเปนคนสดทาย
ปญหา Josephus เปนดงน : ขอมลน�าเขาคอจ�านวนเตม m กบ d ใหมคน m คนยนเรยงเปนวงกลม เรมคนท 0 นบไปอก d คน กใหคนนนออกจากวง แลวกเรมจากคนถดไปนบไปอก d คน กใหคนนนออก ท�าเชนนไปเรอย ๆ จนเหลอคนสดทาย คนนนเปนผชนะ เชน ให m = 6 และ d = 2 การเปลยนแปลงของคนทยนในวงกลมแสดงไดดงรปขางลางน หมายเลข 0 เปนผชนะ
ดงนนถาให n = 3 จะไดคา d = 2 เปนคาทเมอขจดคนออกแลว จะไดคนดเปนคนสดทาย (G แทนคนด, B แทนคนเลว)
► ขอมลน�าเขา
จ�านวนเตมบวก 1 จ�านวน แทนคา n ขางตน
► ขอมลสงออก
คา d ทเปนจ�านวนบวกนอยสดทท�าใหขจดคนออกแลวเหลอคนสดทายเปนคนด ดงทอธบายไวขางตน
► ตวอยาง
Input (จากแปนพมพ) Output (ทางจอภาพ)
1 1
3 2
6 3
13 4
14 6
06.1 : List 73
ตวอยางการเขยนโปรแกรม
โปรแกรม ค�าอธบาย
n = int(input())for d in range(1,2*n): q = ['G']*n + ['B']*n m = 2*n
# solve Josephus problem
if len(q)==1 and q[0]='G': print(d) breakelse: print('Not found')
เนองจากคอมพวเตอรท�างานไดรวดเรว ขอแกปญหานดวยการจ�าลองการคอย ๆ ขจดคนในวงกลมออกตามกฎเกณฑทก�าหนดไว โดยใชลสตเกบคนทยนในวงกลม แลวคอย ๆ ลบขอมลในลสตออก โปรแกรมทางซายนรบคา n จากนนลยทดสอบการขจดคนดวยคา d ตาง ๆ เรมท 1 ไปถง 2n-1 ภายในแตละรอบของ for จะสรางลสตของตวอกษร G จ�านวน n ตวตามดวยตวอกษร B อก n ตว ('G' แทนคนด, 'B' แทนคนเลว) แลวกเรมขนตอนการแกปญหา Josephus ดวย m = 2*n และ d ตามคาของ for หากผลการขจดคนในวงกลมของปญหา Josephus เหลอคนสดทายเปนคนด กแสดงคา d และ break ออกจาก for ไดเลย ถาไมไดคนดเปนคนสดทาย กวนกลบไปเพมคา d เพอท�ารอบตอไปของ for
m = int(input())d = int(input())q = list(range(m))k = 0while len(q) > 1 : k += d if k >= len(q) : k -= len(q) q.pop(k)print(q[0])
ขอเกบโปรแกรมขางบนนไวกอน และมาเขยนโปรแกรมส�าหรบปญหา Josephus ทางซายน ทรบคาจ�านวนเตม m กบ d แลวสรางลสตทเกบหมายเลข 0 ถง m-1 ดวยค�าสง list(range(m)) จากนนเขาสวงวน while ทจะวนท�างานตราบเทาทลสต q ยงมขอมลมากกวาหนงตว มตวแปร k เกบ index ของลสตมคาเรมท 0 ในแตละรอบจะลบขอมลตวทถดจาก k ไปอก d ตว ซงคอเพมคา k อก d ถาคา k เกนหรอเทากบขนาดของลสต กตองวนกลบมาดานซายของลสต ซงกคอการลดคาของ k ดวยขนาดของลสต เชน 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] สง run, ใส m เปน 6, d เปน 2, ไดผลเปน 0 ถกตองสง run, ใส m เปน 4, d เปน 3, ท�างานผดIndexError: pop index out of rangeทค�าสง q.pop(k) แปลวา k เกบ index ทมคาเกนชวงทลสต q มใหลบ ถาลองแทรกค�าสง print(k, len(q)) จะได 3 3 นนคอลสตทม 3 ตว ลบตวท index 3 ไมได เพราะมใหใชแค index 0 ถง 2 เทานน
m = int(input())d = int(input())q = list(range(m))k = 0while len(q) > 1 : k = (k + d) % len(q) q.pop(k)print(q[0])
แกปญหาขางตนไดดวยการใชค�าสง k = (k + d) % len(q) เพอค�านวณ index ทถดจาก k ไปอก d ชอง กรณท index เลยไปทางขวาของลสต การ mod ดวยขนาดของลสต จะไดผลวนกลบมาทางซาย เชน ถาลสตมขนาด 4 ตว ถดจากต�าแหนง 3 ไปอก 5 ต�าแหนงกคอ (3+5) % 4 = 0 สง run, ใส m เปน 6, d เปน 2, ไดผลเปน 0 ถกตองสง run, ใส m เปน 4, d เปน 3, ไดผลเปน 1 ลองจ�าลองการท�างานได 0,1,2,3 -> 0,1,2 -> 1,2 -> 1 ถกตอง
74 06.1 : List
โปรแกรม ค�าอธบาย
n = int(input())for d in range(1,2*n) : q = ['G']*n + ['B']*n k = 0 while len(q) > 1 : k = (k + d) % len(q) q.pop(k) if q[0] == 'G' : print(d) breakelse: print('Not found')
น�าชดค�าสงในการหาค�าตอบของปญหา Josephus ขางตนไปแทรกในโปรแกรมตอนแรกทเขยน ไดโปรแกรมทางซายนสง run, ใส 1, ได 1, ถกตองสง run, ใส 3, ได 2, ถกตองสง run, ใส 6, ได 3, ถกตองสง run, ใส 13, ได 4, ถกตองสง run, ใส 14, ได 6, ถกตอง
06.2 : Nested List 75
06.2 : Nested List
สรปเนอหา ลสตเกบอะไรกได จ�ำนวนเตม จ�ำนวนจรง สตรง หรอ อน ๆ หรอแมกระทงลสต กได ให x เปนลสต และถำ x[k] กเปนลสต จะได x[k][j] คอขอมลตวท index 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)
76 06.2 : Nested List
ใชลสตซอนลสต สรำงเมทรกซ ถำตองกำรเมทรกซขนำด m × n กสรำงลสต A ท len(A) มคำเทำกบ m (จ�ำนวนแถว) และ len(A[0]) = len(A[1])= ... = len(A[m-1]) = n
(จ�ำนวนคอลมน) เชนสรำงเมทรกซ ทมคำ 0 หมดขนำด 5 × 3 A = [] for k in range(5): A.append( [0]*3 )
ตวอยำงกำรหำผลบวกของเมทรกซ A กบ B
A = [ [1,2], [1,1] ]B = [ [0,1], [4,3] ]C = []for i in range(len(A)) : C.append([0]*len(A[i])) for j in range(len(A[i])) : C[i][j] = A[i][j] + B[i][j]
ใชลสตซอนลสต โดยทลสตขำงในเกบขอมลทไมจ�ำเปนตองมขนำดเทำกน
ใชลสตซอนลสต เกบขอมลทประกอบดวย username (ทชอง 0), และลสตของ usernames รำยอนทขอตดตำมขำวสำร (ทชอง 1 โดยลสตนไมจ�ำเปนตองมขนำดคงตว) (ตวอยำงนซอนตงสำมชน) เชนf = [ ['noon',['pat','koi']], ['wii',['noon','koi']], ['pat',['koi','noon','wii']], ['koi',[]] ]
ตองกำรหำวำ username ใดมคนตดตำมเปนจ�ำนวนมำกสดmaxindex = 0for k in range(1,len(f)) : if len(f[k][1]) > len(f[maxindex][1]) : maxindex = kprint(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 = followersprint(max_username,'has max.# of followers :', \ ', '.join(max_followers))
06.2 : Nested List 77
ใชลสตซอนลสตเปนทเกบขอมลชวครำวเพอน�ำไป sort ตำมขอก�ำหนดทตองกำร โดยสรำงลสต ขำงในใหมสมำชกตวแรกเปนเกณฑทใชในกำร sort
หมำยเหต : กำร sort ลสตซอนลสต จะเปรยบเทยบควำมนอยกวำของขอมลของลสตขำงในทละตวจำกซำยไปขวำ เชนx=[[3,2],[3,1],[9],[2,5],[3]]x.sort() จะได x เปลยนเปน[[2,5],[3],[3,1],[3,2],[9]]
นนคอ [2,5] < [3] < [3,1] < ...
จำกตวอยำงกอนหนำน เมอม f แลว ถำตองกำรเรยงล�ำดบ usernames ทงหลำยตำมจ�ำนวนผตดตำม กใชc = []for [username,followers] in f : c.append([len(followers),username])c.sort()for [x,username] in c : print(username)
จำกตวอยำงบนf = [ ['noon',['pat','koi']], ['wii',['noon','koi']], ['pat',['koi','noon','wii']], ['koi',[]] ] จะได c = [[2,'noon'],[2,'wii'],[3,'pat'],[0,'koi']]c.sort() ได [[0,'koi'],[2,'noon'],[2,'wii'],[3,'pat']]
หำกตองกำรให sort ดวยเกณฑทซบซอนขน เชน ใหเรยงตำมจ�ำนวนผตดตำมจำกนอยไปมำก และในกรณทจ�ำนวนผตดตำมเทำกน ใหเรยงตำม username จำกนอยไปมำกเชนกน แบบทตองกำรนทงสองขอมลยอยในลสตเรยงแบบนอยไปมำก สำมำรถใช 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.append(a) ไมใช x = x + a หรอ x += a
x = [[2,3],[3,4]]
ไดมำจำกกำร append [2,3] กบ [3,4] เขำ xx = []x.append( [2,3] ) x.append( [3,4] )
แตไมเหมอนค�ำสงขำงลำงนx = []x = x + [2,3] + [3,4] # ได [2,3,3,4]
78 06.2 : Nested List
อยำสรำงลสตซอนลสตดวย * อยำเขยน [a]*n เมอ a เปนลสต
ตองกำรสรำงเมทรกซทแทนดวยลสตซอนลสต ทมขนำด 3×3 มคำเปน 0 หมด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 = 3x = []for i in range(n) : x.append( [0]*n )
สรปคอ เมอใดเขยน [a]*n ตองระวง ถำ a เปนลสต ใหใชวงวนสรำงแทน
แบบฝกหด
Problem Code
Input: บรรทดแรกมจ�ำนวนเตม r กบ c ตำมดวยอก r บรรทด แตละบรรทดมจ�ำนวนเตม c ตวProcess: สรำงเมทรกซดวยลสตซอนลสต ถำมบรรทดท มขอมลไมใช c ตว ใหแสดงผลเปนลสตซอนลสตวำง [[]] Output: เมทรกซลสตซอนลสตทสรำงได
Input: หนงบรรทดเปนชอแฟม แฟมนมหลำยบรรทดเทำกบจ�ำนวน username แตละบรรทดประกอบดวย username ตำมดวย usernames อน ๆ ทตดตำมขำวสำรของ username แรกตนบรรทด เชนnoon pat koi wii noonpat koi noon wiikoi
Process: สรำงลสตซอนลสตทมรปแบบตำมตวอยำงน f = [['noon',['pat','koi']], ['wii', ['noon']], ['pat', ['koi','noon','wii']], ['koi', []] ]
Output: ลสตทสรำงได
06.2 : Nested List 79
Problem Code
Input: จำก f ทไดมำในขอทแลวProcess: ตองกำรรวำ ใครบำงทไมมใครตดตำมเลย Output: รำยชอของผทไมมใครตดตำมเลย
Input: บรรทดแรกมจ�ำนวนเตม n และอก n บรรทดท ตำมมำเปนสตรงProcess: เรยงล�ำดบสตรงทอำนเขำมำ จำกนอยไปมำกตำมควำมยำวสตรง ถำสตรงยำวเทำกนใหเรยงตำมตวสตรงเอง เชน 'xyz','xy','abc' เรยงแลวได 'xy','abc','xyz'Output: สตรงทเรยงแลว บรรทดละสตรง
ตวอยางการแกโจทยปญหา
เรยงตามคะแนนรวม จงเขยนโปรแกรมรบรหสนกเรยนและรำยกำรของคะแนนกำรสอบยอยตำง ๆ ของนกเรยนจ�ำนวนหนง มำประมวลผลเพอแสดงรหสนกเรยนและคะแนนรวมตำมล�ำดบคะแนนรวมจำกมำกไปนอย
► ขอมลน�ำเขำ
บรรทดแรกมจ�ำนวนเตมบวก n กบ m (คนดวยชองวำง) n คอจ�ำนวนนกเรยน และ m คอจ�ำนวนกำรสอบยอยของนกเรยนแตละคนn บรรทดตอมำ แตละบรรทดประกอบดวย รหสนกเรยนตำมดวยรำยกำรของคะแนนยอย คนดวยชองวำง
► ขอมลสงออก
ถำมบรรทดทจ�ำนวนคะแนนยอยไมตรงกบ m ใหรวบรวมรหสนกเรยนมำแสดงตำมตวอยำง (เรยงตำมทไดรบจำกขอมลน�ำเขำ)
ถำทกบรรทดมคะแนนครบจ�ำนวนทกคน ใหแสดงรหสนกเรยนตำมดวยคะแนนรวมของนกเรยนบรรทดละคน เรยงล�ำดบตำม คะแนนรวมจำกมำกไปนอย ในกรณทมคะแนนรวมเทำกน ใหเรยงตำมรหสนกเรยนจำกนอยไปมำก
► ตวอยำง
Input (จากแปนพมพ) Output (ทางจอภาพ)
3 2A 3.0 2.0B 4.0 5.0C 2.0 3.0
B 9.0A 5.0C 5.0
3 3AA 4.0B 9.0 8.0 7.0AC 8.0 5.0
Invalid data:AAAC
80 06.2 : Nested List
ตวอยางการเขยนโปรแกรม
ขอเกบขอมลในลสต แบบลสตซอนลสต ลสตขำงในแตละลสตเกบรหสนกเรยนทชอง 0 ตำมดวยคะแนนตงแตชองท 1 ถง m[ [รหสนกเรยน, คะแนน, ..., คะแนน], [รหสนกเรยน, คะแนน, ..., คะแนน], ... ]
ขอแบงกำรประมวลผลเปนขนตอนทละขนดงน
1. อำนขอมลน�ำเขำเกบเปนลสตซอนลสต เนองจำกขอมลทเขำมำ รหสเปนสตรง สวนคะแนนตองกำรเกบเปนจ�ำนวนจรง แตขอเรมดวยกำรอำนเขำมำเปนสตรงใหหมดกอน ถำใชขอมลน�ำเขำของตวอยำงทสอง ไดd0 = [['AA','4.0'],['B','9.0','8.0','7.0'],['AC','8.0','5.0']]
2. น�ำ d0 มำหำวำรหสนกเรยนใดทมจ�ำนวนคะแนนไมเทำกบจ�ำนวนทก�ำหนดให (ตวอยำงทสองระบวำตองม 3 ขอ)ได err = ['AA','AC']
3. ถำ err มขนำดเกน 0 กแสดงวำมทผด จงแสดง Invalid data ตำมดวยรหสนกเรยนทเกบใน err
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']]
4.3. น�ำขอมลใน d1 มำแสดงเปนผลลพธ
โปรแกรม ค�าอธบาย
n,m = [int(e) for e in input().split()]d0 = list()for k in range(n) : d0.append(input().split())
ขนตอนท 1 : อำนคำ n (จ�ำนวนนกเรยน) กบ m (จ�ำนวนคะแนนตอคน) ใชวงวน for วนจ�ำนวน n รอบ อำนจำกแปนพมพแลว split ไดเปนลสตของสตรงเพมแตละลสตทไดเขำในลสต d0 สง run, ใสขอมลตำมตวอยำงทสอง, แลว print(d0) ได [['AA','4.0'], [B','9.0','8.0','7.0'], ['AC','8.0','5.0']]
err = list()for x in d0 : if len(x[1:]) != m : err.append( x[0] )if len(err) > 0 : print('Invalid data: ') for sid in err : print(sid)
ขนตอนท 2, 3 : น�ำแตละลสต x ขำงในลสต d0 จำกขนตอน ทแลว มำตรวจ ถำ x[1:] มขนำดไมเทำกบ m คอม จ�ำนวนคะแนนไมเทำกบทก�ำหนด จะน�ำ x[0] ใสเพมในลสต err หลงจำกสรำงเสรจ ถำ err มขนำดเกน 0 กแสดง รหสนกเรยนทมควำมผดพลำดสง run, ใสขอมลตำมตวอยำงทสอง, ได Invalid data:AAAC
else : d1 = list() for x in d0 : s = 0 for e in x[1:] : s += float(e) d1.append( [s, x[0]] )
ขนตอนท 4.1 : เปนกรณทมคะแนนครบ แจงลสต x ขำงใน d0 สวนทเกบคะแนน ซงคอ x[1:] มำหำผลรวม โดยตองแปลงเปน float กอน จำกนนน�ำผลรวมมำตอกบ x[0] ไดลสตยอยเกบใสลสตใหม d1สง run, ใสขอมลตำมตวอยำงแรก, แลว print(d1) ได [[5.0,'A'], [9.0,'B'], [5.0,'C']]
06.2 : Nested List 81
โปรแกรม ค�าอธบาย
for k in range(len(d1)-1) : for i in range(len(d1)-1) : 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[i],d1[i+1] = \ d1[i+1],d1[i] for [total,sid] in d1 : print( sid, total )
ขนตอนท 4.2 และ 4.3 : ตองกำรเรยงล�ำดบตำมคะแนนรวม แตใชค�ำสง d1.sort() ไมได เพรำะจะเรยงขอมลจำกนอยไปมำก สงทโจทยตองกำรคอเรยงตำมคะแนนจำกมำกมำนอย แตกใชค�ำสง d1.sort(reverse=True) ไมได เพรำะถำกรณทคะแนนเทำกน จะเรยงรหสนกเรยนจำกมำกมำนอย ซงไมตรงทโจทยตองกำร จงขอเขยนกำรเรยงล�ำดบเอง (ดวยวธ bubble sort ทเรยนมำ) โดยปรบค�ำสงกำรเปรยบเทยบ คอ จะสลบขอมลสองตวทตดกนเมอ
• คะแนนรวมของตวซำยนอยกวำคะแนนรวมของตวขวำ หรอ
• ถำคะแนนรวมของทงสองตวเทำกน รหสนกเรยนของตวซำยมำกกวำรหสนกเรยนของตวขวำ
เมอเรยงล�ำดบเสรจ กน�ำขอมลใน d1 มำแสดงตำมทโจทยก�ำหนด สง run, ใสขอมลตำมตวอยำงแรก, ไดผลถกตองB 9.0A 5.0 C 5.0
else : d1 = list() for x in d0 : s = 0 for e in x[1:] : s += float(e) d1.append( [-s, x[0]] ) d1.sort() for sumsc,sid in d1 : print( sid, -sumsc )
ส�ำหรบขนตอนท 4.1 ถง 4.3 เรำอำจเปลยนกำรจดเกบขอมลของ d1 คอแทนทลสตขำงในจะเปน [คะแนนรวม, รหสนสต] เปลยนมำเกบเปน [-คะแนนรวม, รหสนสต] แลวใชค�ำสง d1.sort()เพอเรยงขอมลจำกนอยไปมำก เมอคะแนนรวมมคำมำก ตดลบคะแนนรวมจะมคำนอย กลำยเปนตองกำรเรยงคะแนนรวมจำกมำกไปนอย และถำเทำกน กเรยงรหสนสตจำกนอยไปมำก ตำมตองกำร ตอนแสดงคะแนนรวม กตองแสดงคำตดลบของคำทเกบดวย (เพรำะทเกบเปนคำตดลบ)
ลองเขยนโปรแกรมนใหม ถำเรำเปลยนกำรจดเกบขอมลจำก[ [รหสนกเรยน, คะแนน, ..., คะแนน], [รหสนกเรยน, คะแนน, ..., คะแนน], ... ]
เปน[ [รหสนกเรยน, [คะแนน, ..., คะแนน] ], [รหสนกเรยน, [คะแนน, ..., คะแนน] ], ... ]
ดร.วโรจน จรพฒนกล
Intania 87
กรรมการผจดการ บรษท สคลดโอ จ�ากด, อดตนกวทยาศาสตรขอมล (Data Scientist) ท Facebook
ควำมสำมำรถในการเขยนโปรแกรมเปนเหมอนพลงวเศษทชวยเพมขดควำมสำมำรถในกำรท�ำงำนของเรำ
ไมวำจะเปนกำรแกปญหำทำงวศวกรรมทซบซอน (simulation, optimization) กำรสงใหคอมพวเตอรท�ำงำน
ทซ�ำซำกนำเบอแทนเรำ (automation) กำรสอนใหคอมพวเตอรมควำมเฉลยวฉลำดและชวยเรำตดสนใจได
(artificial intelligence) รวมไปถงกำรสรำงเวบหรอแอปทเปนประโยชนกบผคนในวงกวำง เรยกไดวำเปนทกษะท
ขำดไมไดส�ำหรบนวตกรในยคน
06.3 : List Comprehension 83
06.3 : List Comprehension
สรปเนอหา Listcomprehensionเปนวธการสรางลสตทเขยนไดสนและท�างานไดรวดเรว
รปแบบการสรางลสตดวย list comprehension ทพบบอยสรางลสตดวยวงวนเพมขอมล สรางสสตดวย list comprehension
map:น�าขอมลจากลสตหนงมาประมวลผลเกบใสอกลสตเชนสรางลสตbเกบเฉพาะหลกหนวยของจ�านวนในลสตa b = []for e in a : b.append( e%10 )
map:
b = [ e%10 for e in a ]
filter:เลอกขอมลจากลสตหนงมาใสอกลสตเชนสรางลสตbเกบสตรงจากลสตaเฉพาะตวทยาวเกน5 b = []for e in a : if len(e) > 5 : b.append( e )
filter:
b = [e for e in a if len(e)>5]
map & filter:ผสมการประมวลผลสองแบบเชน น�าขอมลความสง(เปนนว)ทเกน10ในลสตaมาแปลงเปนเซนตเมตรเกบใสลสตbb = []for e in a : if e > 10 : b.append( 2.54*e )
map & filter:
b = [2.54*e for e in a if e>10]
สรางลสตทมการแจกแจงดวยหลายวงวนซอนกนกไดเชนเลอกจ�านวนเตมทมคาระหวาง0ถง20สองตวทมผลรวมเทากบผลคณc = []for a in range(0,21) : for b in range(a,21) : if a+b == a*b : c.append( [a,b] )
c = [[a,b] for a in range(0,21) \ for b in range(a,21) \ if a+b == a*b ]
ตวอยาง list comprehensionx = [e for e in a]เหมอนกบx = list(a) ไดลสตxเปนลสตใหมมคาภายในเหมอนกบของa xกบaเปนลสตคนละตวกนแตมคาเหมอนกน แตถาเขยนx = aจะไดxกบaเปนลสตเดยวกนการเปลยนคาในลสตxจะท�าใหaเปลยนดวย หรอการเปลยนคาในลสตaกเปลยนxเชนกน
84 06.3 : List Comprehension
x = [int(e) for e in input().split()] อานสตรงจากแปนพมพดวยinput()แยกออกเปนลสตของสตรงดวยsplit() น�าแตละสตรงในลสตมาเปลยนเปนจ�านวนเตมเกบใสลสตx
t = ','.join( [str(e) for e in x] ) ใชlistcomprehensionสรางลสตของสตรงทน�าขอมลจากลสต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ลสตชวคราวนซงคอการเรยงล�าดบตามระยะหางจากนอยไปมาก ปดทายดวยการใชlistcomprehensionหยบขอมลตามล�าดบในaมาสรางลสตใหมทมแตพกดx, yเกบใสd
06.3 : List Comprehension 85
เรองผดบอย
ไมควรใชlistcomprehensionเพอใหท�างานแบบวงวนแตไมไดน�าผลจากการสรางลสตดวยlistcomprehensionไปใชงานเลย
ไมควรเขยน[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ของ listcomprehensionมาใชงานนอกค�าสง อาจท�าใหสบสน
x = [e for e in range(10)]print(e) # ผด เพราะ e ไมมคา
แตถาเขยนx = []for e in range(10) : x.append(e)print(e) # ได 9
แตถาแบบนe = 99x = [e for e in range(10)]print(e) # ได 99
แบบฝกหด
Problem Code
Input:มลสตxเกบสตรงและตวแปรcเกบตวอกษรProcess:สรางลสตdเกบจ�านวนครงทตวอกษรในcปรากฏใน แตละสตรงของลสตx เชนx = ['abba','babana','ann']; c = 'a' จะได d = [2,3,1]
Input:ลสตxเกบจ�านวนเตมProcess:ลบจ�านวนเตมในxทกตวทตดลบ
86 06.3 : List Comprehension
Problem Code
Input: xเปนlistoflistsofintegersProcess:หาผลรวมของจ�านวนเตมในx
Input:รบหนงบรรทดมจ�านวนเตมหลายจ�านวน(คนดวยชองวาง) จากแปนพมพProcess:หาวาทรบมามจ�านวนตดลบกจ�านวน
Input:รบขอความหนงบรรทดจากแปนพมพProcess:ตดอกขระทกตวในขอความทรบมาทไมใชพยญชนะภาษาองกฤษ
Input:รบหนงบรรทดมจ�านวนเตมหลายจ�านวน(คนดวยชองวาง)ชดหนงเกบใสลสตxและรบอกหนงบรรทดเกบใสลสตyในท�านองเดยวกน โดยลสตทงสองมจ�านวนขอมลเทากนProcess:สรางลสตzโดยทz[i]มคาเทากบx[i]+y[i]
Input:เมทรกซmแทนดวยlistoflistsofintegersProcess:แปลงmใหกลายเปนlistofintegersเชนจาก m = [[1,2,3],[4,5,6]] กลายเปน[1,2,3,4,5,6]
Input:รบหนงบรรทดมจ�านวนเตมหลายจ�านวน(คนดวยชองวาง) เกบใสลสตxProcess:สรางลสตใหมจากขอมลในxแตไมมตวซ�าโดย
1. เรยงล�าดบขอมลในxจากนอยไปมาก2. สรางลสตใหมโดยน�าขอมลในลสตตวทตดกนมาพจารณาจาก
ซายไปขวาถาคาของตวตดกนตวซายไมเทากบตวขวาใหน�า ตวซายเกบใสลสตใหม
3. น�าตวขวาสดในxเพมตอทายลสตใหมน ลสตใหมนกจะเกบขอมลในxทไมมตวซ�า
Input:รบจ�านวนเตมnProcess:สรางลสต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แตไมมตวซ�า (ใชวธทเขยนในขอทแลว)
06.3 : List Comprehension 87
Problem Code
Input:รบจ�านวนเตมnProcess:สรางลสตทเกบจ�านวนเฉพาะทมคานอยกวาnโดย
1. สรางลสตทเกบจ�านวนประกอบทมคานอยกวาn
2. สรางลสตทเกบจ�านวนเตมจาก2ถงn-1แตไมเอา จ�านวนประกอบทสรางไวในขนตอนท1
ตวอยางการแกโจทยปญหา
เรยงตามคะแนนรวม ขอใชปญหาเรยงคะแนนรวมในหวขอลสตซอนลสต มาเปนตวอยาง โดยน�าโปรแกรมทไดเขยนไปแลวมาปรบปรงโดยใชlistcomprehension
ตวอยางการเขยนโปรแกรม
โปรแกรมเดม โปรแกรมปรบปรงแบบใช list comprehension
n,m = [int(e) for e in \ input().split()]d0 = list()for k in range(n) : d0.append(input().split())err = list()for x in d0 : if len(x[1:]) != m : err.append(x[0])if len(err) > 0 : print('Invalid data: ') for sid in err : print(sid)else : d1 = list() for x in d0 : s = 0 for e in x[1:] : s += float(e) d1.append( [-s, x[0]] ) d1.sort() for ntotal,scode in d1 : print( scode, -ntotal )
n,m = [int(e) for e in \ input().split()]d0 = [input().split() for k in range(n)]
err = [x[0] for x in d0 if len(x[1:]) != m]
if len(err) > 0 : print('Invalid data: ') print('\n'.join(err))
else : # list comprehension ซอนใน # list comprehension อกชน d1 = [[-sum([float(e) for e in x[1:]]), \ x[0]] for x in d0]
d1.sort() for ntotal,scode in d1 : print( scode, -ntotal )
88 06.3 : List Comprehension
ตวอยางโจทยปญหา
Minus All โจทยขอนใหนสตเขยนโปรแกรมรบชดตวเลขจ�านวนเตมชดหนง ซงจะจบดวยเลขทมคาตดลบ จากนนใหแสดงผล ชดตวเลขใหม(ไมรวมตวเลขทตดลบ)ทสมาชกแตละตวมคาเทากบคาเดมรวมกบคาทตดลบนน
► ขอมลน�าเขา
เปนชดของตวเลขแตละบรรทดจะประกอบดวยตวเลขจ�านวนเตมทไมตดลบ1จ�านวนและบรรทดสดทายจะจบดวยตวเลขจ�านวนเตมทมคาตดลบ(รบประกนวาจะมตวเลขจ�านวนเตมทไมตดลบอยางนอย1จ�านวน)
► ขอมลสงออก
ใหแสดงชดตวเลขใหม(ไมรวมตวเลขทตดลบ)ทสมาชกแตละตวมคาเทากบคาเดมรวมกบคาทตดลบโดยแสดงผลบรรทดละ1จ�านวน
► ตวอยาง
Input (จากแปนพมพ) Output (ทางจอภาพ)
1 10 2 -5
-4 5 -3
100 0 -1
99 -1
3 -3
0
06.3 : List Comprehension 89
ค�านวณหา rank จงเขยนโปรแกรมเพอค�านวณหาrankของรหสนสตทก�าหนดเมอเรยงล�าดบตามคะแนน(rank1คอมคะแนนมากทสด)
► ขอมลน�าเขา
แตละบรรทดจะระบขอมลนสตแตละคนประกอบดวยรหสนสตตามดวยคะแนนเปนเลขทศนยมบรรทดสดทายระบรหสนสตทตองการค�านวณหาrankในการค�านวณrankหากมนสตทไดคะแนนเทากนใหเรยงล�าดบตามรหสนสต(เรยงแบบจ�านวนเตม)
► ขอมลสงออก
มบรรทดเดยวแสดงrankของนสตทตองการคนหาหากไมพบรหสนสตดงกลาวใหแสดงวาNot Found
► ตวอยาง
Input (จากแปนพมพ) Output (ทางจอภาพ)
5931111121 87.255932222221 77.005933333321 82.505934444421 69.755935555521 66.005934444421
4
111 10013 961234 96555 992121 9699 991234
5
429801 78359124 89902316 91.25773842 45.75264336
Not Found
90 06.3 : List Comprehension
ความถเกนครง ใหเขยนโปรแกรมเพอหาขอมลทมความถมากกวาครงหนงของจ�านวนขอมลทงหมดทรบเขามา โดยอานคาจ�านวนเตม จนกระทงพบ-1
► ขอมลน�าเขา
ใหอานขอมลจ�านวนเตมบรรทดละ1จ�านวนจนกระทงพบคา-1
► ขอมลสงออก
มบรรทดเดยว แสดงขอมลทมความถมากกวาครงหนงของขอมลทงหมด (ไมรวม -1) ถาไมมขอมลทมความถมากกวาครงหนงเลยใหแสดงNot found
► ตวอยาง
Input (จากแปนพมพ) Output (ทางจอภาพ)
4 5 5 10 -1
Not found
4 5 5 -1
5
10 5 5 3 5 -1
5
2 4 2 4 2 4 -1
Not found
07 : Tuple, Dictionary and Set 91
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 ทมตวเดยว (สงเกตท comma)
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
เครองหมาย * ใชตอ tuple หลายครง
a = (2, 3, 5)
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:]
ระบบจะแปลงสงทม comma คน
ใหกลายเปน tuple เชน t = 1,2,3
เมอ print(t) ได (1, 2, 3)
a,b,c = (1,2,3) ได a = 1, b = 2, c = 3
x,y = 'A','Z' ได x = 'A', y = 'Z'
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
92 07 : Tuple, Dictionary and Set
สามารถสราง 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]
tuple1 += (0,) เหมอน
tuple1 = tuple1 + (0,)
จะสราง tuple ใหม (ท�างานชา)
ในขณะท list1 += [0]
ไมเหมอนกบ list1 = list1 + [0]
แตจะเหมอนกบ list1.append(0)
เปนการเพม 0 ตอทายลสต ไมสรางลสตใหม
จะท�างานไดเรวกวา
ลองสงท�างานโปรแกรมทางขวาน แลวสงเกตเวลาการท�างาน
import timen = 100000
t0 = time.time()list1 = []for k in range(n): list1 += [0]print(time.time()-t0)
t0 = time.time()tuple1 = tuple()for k in range(n): 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
โดยการอางถงดวย key
D = {'Name':'Sarah'}
print(D['Name']) ได Sarah
D['Age'] = 20 เปนกำรเพมขอมล ('Age',20)
D['Name'] = 'Somsri' เปนกำรแกขอมลใหเปน ('Name','Somsri')
07 : Tuple, Dictionary and Set 93
key ของ dict อาจเปนจ�านวนเตม
จ�านวนจรง สตรง หรอ tuple กได
แตหามเปน list, dict หรอ set สวน
value ทคกบ key จะเปนประเภทใดกได
my_dict = {}my_dict[1] = 8.00my_dict[3.75] = [3, 7, 5]my_dict['Hello'] = 'World'my_dict[(2,99)] = 999my_dict[[1,2,3]] = '123' ผด หำมใช list เปน key
มบรการ keys(), values(),
items() ซงใชกบ for...in ได
d = {1:7, 2:8, 3:9}
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() และ
items() ไมไดผลเปน list แตเปน
อะไรบางอยางทคลาย list น�าไปใชกบ
for...in ได แตใช index เพอหยบ
ขอมลไมได
d = {'aka':'as known as', 'so':'significant other'}x = d.keys()
print(x[1]) ผด ท�ำไมได เพรำะ x ไมใชลสต
ถาตองการขอ key ทงหมดใหเปนลสตจรง ๆ ตองเขยน
x = list( d.keys() ) ได x เปนลสต ใช x[1] ได
print(x[1]) ท�ำได (แตไมรวำได 'aka' หรอ 'so')
บรการ d.update(d1) เปนการเพม
ขอมลใหมจาก dict d1
เขาใน d ถาม key ใน d1 ซ�ากบใน d
จะเปนการแกไข value เดม
A = {1:'one', 2:'two'}B = {1:'nueng', 3:'sarm'}
A.update(B) ได A เปน {1:'nueng', 2:'two', 3:'sarm'}
สวน B ไมเปลยนแปลง
บรการ pop(key) เปนการลบคขอมล
ทม key นนออก ถาไมม key อย
จะเกด error
C = {1: 'one', 2: 'two', 3: 'three'}
x = C.pop(1) ได x = 'one', C = {2:'two', 3:'three'}
y = C.pop(4) เกด error
การใช in เพอตรวจสอบวาม key หรอ
value หรอ ค (key,value) ใน
dict อยหรอไม โดยการตรวจ value
จะไมเรวเทากบอกสองกรณ
D = {1: 'one', 2: 'two', 3: 'three'}
x = 1 in D ได x = True
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 ไมเรวเทา
94 07 : Tuple, Dictionary and Set
Set• เหมอนกบเซตทางคณตศาสตร เซตไมเกบขอมลซ�า สามารถ union, intersect ได
• เหมอนกบ dict แบบทเกบแค key ไมม value (เพราะ key ไมซ�ากน)
• การคนดวย in สามารถท�าไดเรวมาก ๆ
การสรางเซต สามารถสรางเซตจากขอมล
ใน string, tuple, list, set หรอ
dict ได
set_1 = set() ไดเซตวำง
set_2 = {1, 2, 3} ไดเซตทมสมำชกเปน 1, 2, 3
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 ตว
ถาเพมตวทซ�ากบทมอยใน set กไมเพมให
S = {1}
S.add((2, 3)) ได {1, (2, 3)}
S.add('Hello') ได {1, (2, 3), 'Hello'}
บรการ update(t) ใชเพมขอมลทแจกแจง
ไดจาก t ทเปนกลมขอมล ซงเปนไดทง
string, tuple, list, set และ
dict (ในกรณของ dict จะเพม key)
ค�าสง s.update(t) ท�างานเหมอนค�าสง
for e in t : s.add(e)
S = {1}
S.update([2, 3]) ได {1,2,3}
S.update('Hello') ได {1,2,3,'H','e','l','o'}
S.update(6) เกด error
การใช e in S เพอตรวจสอบความเปน
สมาชกของ e ในเซต S
S = {1, 2, 3, 'H', 'e', 'l', 'o'}
x = 1 in S ได x = True
y = 'h' in S ได y = False
บรการ remove(e) และ discard(e)
เพอลบขอมล ถาไมมขอมลทตองการจะลบ
remove() จะเกด error
ดงนนควรใช discard()
S = {1, 2, 3, 'H', 'e', 'l', 'o'}
S.discard(1) เหลอ {2, 3, 'H', 'e', 'l', 'o'}
S.discard(4) เหลอเทำเดม ไมเกด error
S.remove('e') เหลอ {2, 3, 'H', 'l', 'o'}
S.remove('h') เกด error เพรำะไมเจอ 'h'
07 : Tuple, Dictionary and Set 95
การด�าเนนการของ set
union() หรอใชสญลกษณ |
intersection() หรอใชสญลกษณ &
difference() หรอใชสญลกษณ –
(A B) – (A B) หรอใชสญลกษณ ^
โดยเซตทมากระท�ากน จะไมเปลยนแปลง
a = {1, 2, 3}b = {2, 3, 4}
c = a.union(b) หรอ c = a | b
ได c = {1, 2, 3, 4}
c = a.intersection(b) หรอ c = 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() และ
issuperset() ใชตรวจสอบความเปน
subset และ superset
a = {1, 2, 3}b = {1, 2}
a.issubset(b) ได False
b.issubset(a) ได True
a.issuperset(b) ได True
b.issuperset(a) ได False
96 07 : Tuple, Dictionary and Set
สรปการใชงาน 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, float, str, tuple, boolสวน value เปนอะไรกได
int, float, str, tuple, bool
การ
เขาถง
ขอมล
ใชจ�านวนเตมระบ
ต�าแหนงหรอชวง
x[i]
x[a:b:c]
ใชจ�านวนเตมระบ
ต�าแหนงหรอชวง
t[i]
t[a:b:c]
ใช key ระบต�าแหนง
d[key]
ได value ทคกน
ไมมแบบรบ value
แลวได key
ไมม
การ
แจกแจง
ขอมล
for e in x
ไดล�าดบจากซายไปขวา
for e in t
ไดล�าดบจากซายไปขวา
for k in dfor k in d.keys()for v in d.values()for k,v in d.items()
ไดล�าดบไมแนนอน
for e in s
ไดล�าดบไมแนนอน
การคน
ดวย in,
not in
คนจากซายไปขวา (ชา)
ใช x.index(e) หา
index ของ e ใน x
คนจากซายไปขวา (ชา)
ใช x.index(e) หา
index ของ e ใน x
คน key เรวมาก คนขอมลเรวมาก
07 : Tuple, Dictionary and Set 97
list tuple dict set
การสราง x = [1,2,3,4]x = list()x = []x = list(q)
เมอ q เปนสงทใชกบ
for in ได
t = (1, 2, 3, 4)t = (5,)t = tuple()t = ()t = tuple(q)
เมอ q เปนสงทใชกบ
for in ได
d = {'k1':1,'k2':2}d = dict()d = {}
s = {1, 2, 3, 4}s = set()
s = set(q)
เมอ q เปนสงทใชกบ
for in ได
ใช x = list(x1)
เมอ x1 เปน list
ไมควรเขยน x = x1
จะเปน list ตวเดยวกน
ใช t = t1 ได
เมอ t1 เปน tuple
เพราะ tuple
ไมเปลยนคา
ใช d = dict(d1)
เมอ d1 เปน dict
ไมควรเขยน d = d1
จะเปน dict ตวเดยวกน
ใช s = set(s1)
เมอ s1 เปน set
ไมควรเขยน s = s1
จะเปน set ตวเดยวกน
การเพม
ขอมล
x.append(9)x.insert(1,9)
ตองสรางตวใหมt=t + (9,)t=t[:1]+(9,)+t[1:]
d['k3'] = 9d.update({'k3':9})
s.add(9)s.update({9})
การลบ
ขอมล
x.pop(2) ตองสรางตวใหมt = t[:2] + t[3:]
d.pop('k3') s.discard(99)
การแกไข
ขอมล
x[2] = 7 ตองสรางตวใหมt=t[:2]+(7,)+t[3:]
d['k3'] = 7 ตองลบแลวเพม
การใช tuple, dict, set ทพบบอย
ใช dict เพอจบคขอมล หรอสรางความ
สมพนธระหวางคขอมล key กบ value
โดยหวงจะขอ value จากคา key
month = {'JAN':1, 'FEB':2, 'MAR':3}
ใช month[k] เพอขอเลขเดอนจากชอยอเดอนทเกบในตวแปร k
num2en = {11:'eleven', 2:'two', 3:'three'}
ใช num2en[a] เพอขอค�าภาษาองกฤษจากจ�านวนเตมในตวแปร a
ใช set เพอเกบกลมขอมลทไมซ�า ตองการ
คนขอมลวามอยหรอไมในเซตอยางรวดเรว
หรอตองการบรการ intersection,
union, issubset และอน ๆ ของ set
ตองการหาจ�านวนประกอบทมคา ระหวาง 2 ถง 12n = 13; c = set()
for i in range(2, n//2) :
for j in range(2*i, n, i) :
c.add(j) # มกำรเพม j ทซ�ำกน แต add ไมเพมขอมลซ�ำ # c = {4, 6, 8, 9, 10, 12}
98 07 : Tuple, Dictionary and Set
ใช tuple เมอตองการเกบขอมลมล�าดบ
คลาย list แตมนใจวาหลงสรางแลวจะ
ไมเปลยนคาภายใน tuple ประหยด
หนวยความจ�า
ใชค�าสง t1 = t2 ไดโดยไมตองหวงเรอง
การใช tuple รวมกน (เพราะคาภายใน
เปลยนไมได) และสามารถใชเปน key ของ
dict และเปนขอมลทเกบใน set ได
มพกด x, y, z จ�านวนหนงทตองเกบ ถาตองการหา z จาก x,y ท
ก�าหนดใหบอย ๆ กไมควรเกบเปน list of tuples (x,y,z) เชน
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 : print('z =', z) breakelse: print('Not Found')
ควรใช 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
หรอเรยงตาม value จากนอยไปมาก
d = {2:8, 1:8, 3:9}for k in sorted(d.keys()): 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 ท
ม value เปน list หรอ set
d = {}n = int(input())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 เปนสตรง (เพราะอะไร ?)
07 : Tuple, Dictionary and Set 99
สรางลสตของ 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
ตองการสรางอก dict ทกลบลกษณะ
การจดเกบคอม key เปน b, value เปนเซต
ของ a
c เปน dict ท key เปนรหสนสต สวน value เปนเซตของรหสวชา
จงใช c ตอบค�าถามวารหสนสต sid เรยนวชาอะไร ไดอยางรวดเรว ถา
อยากรดวยวา รหสวชา cid มรหสนสตใดเรยนบาง กตองสรางอก dict
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
หรอ list จะท�าให a กบ b เปนตวแปร
ของทเกบขอมลทเดยวกน ถาตองการเปน
คนละตว แตเกบขอมลเหมอนกน ตองใช
a = set(b) หรอ a = dict(b)
หรอ a = list(b)
A = {1:'one', 2:'two', 3:'three', 10:'ten'}B = AB[4] = 'four'
จะเปนการแกทง A และ B เพราะเปน dict เดยวกน
ถาใชค�าสง C = dict(A) จะได A และ C เปนคนละ dict กน
แตมขอมลเหมอนกน
ไมสามารถใช d.sort() เมอ d เปน
tuple, dict หรอ set ได แตสามารถ
ใช sorted(d) ได โดย d คอ tuple,
dict, set หรอ list
S = {3, 1, 2}; D = {'A':5, 'C':2, 'B':7}
S.sort() ผด เพรำะ set ไมมบรกำร sort
L = sorted(S) ได L = [1, 2, 3]
L = sorted(D) ได L = ['A', 'B', 'C']
L = sorted(D.values()) ได L = [2, 5, 7]
100 07 : Tuple, Dictionary and Set
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 แกขอมลไมได
tuple ไมมบรการ append, insert, add, pop, remove, discard
my_tuple[3] = 'B' ผด
ถาจะแกขอมล ตองสรางใหมmy_tuple = my_tuple[:3] + ('B',) + my_tuple[4:]
การอางถงขอมลใน dict ทไมมมากอน
จะผด
D = {'Name':'Tom', 'Age':39}
print(D['Gender']) ผดเพราะอางไดแค 'Name' และ 'Age'
หรอ ตองการนบจ�านวนตวอกษรภาษาองกฤษแตละตววาปรากฏกครงในสตรง tc = 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
หรอ set
my_dict = {}
my_dict[[1,2,3]] = 'list' ผด
เพรำะ [1,2,3] ใชเปน key ไมได
การเกบคอนดบใน dict อาจจะไมเรยง
ล�าดบตามล�าดบการใสขอมล
D = {}D[1] = 1.00; D[2] = 2.00for k in D.keys():
# อำจได 1 แลว 2 หรอ 2 แลว 1 กได ไมแนนอน
ใชวงวนหา key เพอใหได value ทคกน
ท�าแบบนไมไดใชความสามารถของ dict เลย
ตองการหา value ของ key ทมคาเทากบ key1 ใน d
ไมควรเขยนแบบขางลางน
for k,v in d.items() : if k == key1 : print('value =', v) breakelse : print('Not found')
for k in d.keys() : if k == key1 : print('value =', d[k]) breakelse : print('Not found')
เขยนแบบขางลางนงายกวา และเรวกวามากif key1 in d : print( 'value =', d[key1] )else : print('Not found')
07 : Tuple, Dictionary and Set 101
วงเลบปกกาวาง คอ 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 ไมได
เพราะขอมลใน set ไมมล�าดบ ไมม index
A = {'one', 'two', 'three'}for i in range(len(A)) : 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) อยากนบวาหมายเลขโทรศพทสวนใหญลงทายดวยเลขอะไร
102 07 : Tuple, Dictionary and Set
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'}
07 : Tuple, Dictionary and Set 103
ตวอยางการแกโจทยปญหา
ทะเบยนนสต จงเขยนโปรแกรมรบรายการของขอมล ซงประกอบดวยชอของนสตและคณะทนสตคนนนอย จากนนจะก�าหนดชอคณะ
มาใหจ�านวนหนง ใหตอบวานสตในคณะเหลานนมชออะไรบาง ถามชอซ�ากน ใหตอบเพยงครงเดยว
► ขอมลน�าเขา
บรรทดแรกมจ�านวนเตมบวก n คอจ�านวนรายการขอมลทงหมด
n บรรทดตอมา แตละบรรทดประกอบดวย ชอของนสตและคณะทนสตอย โดยคนดวยชองวาง
บรรทดสดทายจะเปนรายชอคณะทตองการถาม ถามหลายชอจะคนดวยชองวาง
► ขอมลสงออก
แสดงชอนสตในคณะเหลานน โดยเรยงตามตวอกษร ใหคนแตละชอดวยชองวาง ถามชอซ�ากน ใหตอบเพยงครงเดยว
► ตวอยาง
Input (จากแปนพมพ) Output (ทางจอภาพ)
3Tom EngineeringPam ArtsJim EngineeringEngineering
Jim Tom
5Tom EngineeringPam ArtsJim EngineeringTom ArtsJenny ScienceEngineering Arts
Jim Pam Tom
ตวอยางการเขยนโปรแกรม
เนองจากโจทยจะก�าหนดชอคณะมาให และใหเราหาชอนสตทอยในคณะเหลานน ดงนนเราควรเกบขอมลโดยใช dict
ซงม key คอชอคณะ และ value เปน set ของชอนสต (เพราะในแตละคณะ มนสตไดหลายคน) ตวอยางการเกบขอมล เชน
{ 'Engineering' : {'Tom', 'Jim'}, 'Arts' : {'Pam', 'Tom'}, 'Science' : {'Jenny'}
}
104 07 : Tuple, Dictionary and Set
ขอแบงการประมวลผลเปนขนตอนทละขนดงน
1. อานขอมลน�าเขาเกบเปน dict
2. รบรายการของชอคณะทตองการถาม มาเกบเปน list
3. เนองจากเราตองการพมพชอทไมซ�ากน ดงนนเราจะใช set มาชวย ใหสราง set ค�าตอบเรมตนเปนเซตวาง
4. วนลปทละคณะทตองการถาม ใหน�าชอนสตของคณะนนไปรวมกบเซตค�าตอบทมอยเดม
5. พมพค�าตอบ โดยเรยงล�าดบชอตามตวอกษร
โปรแกรม ค�าอธบาย
ขนตอนท 1
n = int(input())fac2name = {}
for i in range(n): fac,name = input().split() fac2name[fac] = {name}
อานคา n ซงเปนจ�านวนขอมลเขามา
สราง dict วาง ๆ ชอ fac2name ซงจะใชเกบวา คณะน
มนสตชออะไรบาง จากนนวนลป n รอบ เพอเกบขอมลค
(key, value) คอ ชอคณะและ set ของชอนสต
แตตวอยางนผด เพราะแตละ key ของ dict จะเกบ value
ไดแคคาเดยว ถาใสคาแบบนจะท�าใหคาทเกบใหมไปทบคาเดม
n = int(input())fac2name = {}
for i in range(n): fac,name = input().split() fac2name[fac].add(name)
เปลยนมาใช add เพมใน value ของ dict แตการเกบคา
แบบนยงผดอย เพราะไมไดตงคาเรมตนของ dict ไวกอน
จงท�าให add ไมได
n = int(input())fac2name = {}
for i in range(n): fac,name = input().split() if fac in fac2name: fac2name[fac].add(name) else: fac2name[fac] = {name}
แบบทถกตอง ตองมการตรวจสอบกอนวา dict ของเราม
key นเกบไวหรอยง ถายงไมม ใหสราง set ขนมากอน แต
ถามแลว จะสามารถใหค�าสง add เพมได
ขนตอนท 2
ask_fac = input().split() รบขอมลรายชอคณะทตองการถาม มาเกบไวใน list ชอ
วา ask_fac
ขนตอนท 3
ans_set = {} สรางเซตค�าตอบเรมตนเปนเซตวาง
แตแบบนผด เพราะจะไดเปน dict วางแทน
ans_set = set() สรางแบบนถงจะไดเซตวางทถกตอง
07 : Tuple, Dictionary and Set 105
โปรแกรม ค�าอธบาย
ขนตอนท 4
for f in ask_fac: ans_set.union(fac2name[f])
น�าชอนสตในคณะมาเพมในเซต ans_set แบบ union
แตแบบนผด เพราะการใชค�าสง union แบบนไมไดท�าใหคา
ของ ans_set เปลยนไปดวย
for f in ask_fac: ans_set = ans_set.union(fac2name[f])
การใชค�าสง union แบบนจะท�าใหคาใน
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)ans_list.sort()print(' '.join(ans_list))
ตองแปลงเปน list เกบใสในตวแปร แลวคอยเรยก sort
กบตวแปร แลวสงตวแปรนนให join ไปใช
print(' '.join(sorted(ans_set))) หรอใช sorted แทน เพราะ sorted รบ set ได และให
ผลเปนลสตทเรยงล�าดบแลวกลบคนมาสงให join
106 07 : Tuple, Dictionary and Set
ตวอยางโจทยปญหา
Union & Intersection เขยนโปรแกรมเพอหา union และ intersection ของเซตทก�าหนด
► ขอมลน�าเขา
บรรทดแรก ระบจ�านวนเตม n แทนจ�านวนเซต
n บรรทดถดมา ระบเซตของจ�านวนเตมบรรทดละ 1 เซต โดยระบจ�านวนเตมทอยในเซต คนดวยชองวาง
► ขอมลสงออก
บรรทดแรก แสดงขนาดของเซตทเกดจากการ union ทกเซต
บรรทดท 2 แสดงขนาดของเซตทเกดจากการ intersect ทกเซต
► ตวอยาง
Input (จากแปนพมพ) Output (ทางจอภาพ)
3 1 2 1 2 3 1 2 1 2 1 2 3 2 5 4 3
5 2
6 100 1000 101 123 200 201 -1 -2 -3
9 0
6 -1 0 1 -1 1 0 0 -1 1 0 1 -1 1 -1 0 1 0 -1
3 3
07 : Tuple, Dictionary and Set 107
อกษรสองตวหนาทพบมากในประเภทของค�าภาษาองกฤษ จากขอมลค�าศพทภาษาองกฤษแยกตามประเภทของค�า จงเขยนโปรแกรมเพอหาตวอกษรสองตวแรกยอดฮตของค�าศพท
ทเปนขอมลน�าเขา จ�านวนค�าศพท และรายการค�าศพททขนตนดวยอกษรสองตวแรกยอดฮตน
► ขอมลน�าเขา
บรรทดแรก บอกจ�านวนรายการขอมลทตองอานเขามา
บรรทดทเหลอ เปนรายการขอมล โดยขอมลแรกเปนประเภทของค�าศพท ขอมลทสองเปนค�าศพท คนดวยเครองหมายแทบ
► ขอมลสงออก
ใหพมพอกษรสองตวหนายอดฮต จ�านวนค�าศพท และรายการค�าศพททขนตนดวยตวอกษรสองตวหนายอดฮตน พรอมประเภทของ
ค�าศพท คนดวยเวนวรรค โดยเรยงล�าดบค�าตามล�าดบเดยวกนกบขอมลน�าเขา ถามอกษรสองตวทปรากฏบอยมากทสดเทากน
ใหเลอกอกษรสองตวแรกทมากอนเรยงตามพจนานกรม
► ตวอยาง
Input (จากแปนพมพ) Output (ทางจอภาพ)
10 Adjective good Noun goose Verb wrap Verb write Noun wrinkle Noun wreck Noun wrangler Noun hall Adjective happy Noun hobby
wr 5 wrap Verb write Verb wrinkle Noun wreck Noun wrangler Noun
6 Adjective good Verb wrap Verb write Noun hall Noun hobby Noun goose
go 2 good Adjective goose Noun
108 07 : Tuple, Dictionary and Set
ใครเรยนอะไร ใหอานขอมลจากแปนพมพ โดยอานขอมลเปนบรรทด แตละบรรทดมรหสนกเรยนคนดวยเวนวรรค ตามดวยรหสวชา
(อาจมมากกวา 1 วชา) เมอพบวา รหสนกเรยนเปน -1 ใหหยดอาน จากนนใหอานรหสวชาสองรหสวชา แลวใหแสดงจ�านวนนกเรยน
ทเรยนทงสองวชานน จ�านวนนกเรยนทเรยนวชาเดยวเทานน และจ�านวนนกเรยนทงหมดซงเรยนวชาใดวชาหนงหรอทงสองวชา
► ขอมลน�าเขา
รหสนกเรยนคนดวยเวนวรรค ตามดวยรหสวชา (อาจมมากกวา 1 วชา คนดวยเวนวรรค)
รบประกนวาจะไมมนกเรยนทรหสซ�ากน และนกเรยน 1 คนจะไมมรหสวชาซ�ากน
เมอใสขอมลนกเรยนครบทกคนแลว บรรทดตอไปจะเปนขอมล -1
บรรทดสดทายเปนรหสวชาสองรหสวชา คนดวยเวนวรรค
► ขอมลสงออก
ม 3 จ�านวนคนดวยเวนวรรค เรยงล�าดบดงน
จ�านวนนกเรยนทเรยนทงสองวชานน
จ�านวนนกเรยนทเรยนวชาใดวชาหนงเทานน
จ�านวนนกเรยนซงเรยนวชาใดวชาหนงหรอทงสองวชา
► ตวอยาง
Input (จากแปนพมพ) Output (ทางจอภาพ)
001 c001 c002 c003 002 c002 c003 c004 003 c003 c005 -1 c002 c003
2 1 3
5931111121 2110101 2109101 5932222221 2109101 -1 2110101 5500101
0 1 1
► ค�าแนะน�า (ถารวธท�าแลว ไมตองอานกได)
ควรเกบขอมลดวย dict ทม key คอรหสวชา และ value เปนเซตของนกเรยน (ลองคดดวาท�าไม) เชน ตวอยางท 1
จะได dict ดงน
{ 'c001':{'001'}, 'c002':{'001', '002'}, 'c003':{'001', '002', '003'}, 'c004':{'002'}, 'c005':{'003'}
}
08 : Function and Recursion 109
08 : Function and Recursion
สรปเนอหาการใชงานฟงกชน
• อาจเรยกวา subprogram หรอ subroutine
• เปนการแยกสวนค�าสงทซ�า ๆ กน หรอเขาใจยาก ออกมาจากโปรแกรมหลก
• ท�าใหโปรแกรมอานงาย เขาใจงาย
• ท�าใหโปรแกรมหลกเรยกใชฟงกชนได โดยไมตองเขยนค�าสงหลายรอบ
• ฟงกชนควรมหนาทการท�างานชดเจน เชน ฟงกชนหาคาเฉลยของจ�านวนในลสต ฟงกชนกลบสตรง เปนตน
• ตองเขยนฟงกชนไวกอนสวนทจะเรยกใช
องคประกอบของฟงกชน
• ชอฟงกชน มขอก�าหนดเหมอนการตงชอตวแปร
• คาทรบเขามา หรอ "พารามเตอร" (ไมจ�าเปนตองมกได)
• การคนคาจากฟงกชนดวยค�าสง return (ไมจ�าเปนตองมกได)
การคนการท�างานจากฟงกชนและการคนคาจากฟงกชน
• สามารถใชค�าสง return ไดหลายทในฟงกชน
• เมอท�าค�าสง return แลว จะหยดการท�างานของฟงกชนทนท และกลบไปท�างานตอหลงจดทเรยกใชฟงกชน
• ฟงกชนคนคาได 1 คาเทานน ถาตองการคนหลายคา ใหใช tuple เชน return (answer1, answer2)
• หากค�าสงสดทายของฟงกชนไมใช return ระบบจะเพมค�าสง return (ไมคนคาใด ๆ) ททายฟงกชน
• ค�าสง return ทไมไดก�าหนดใหคนคาใด ๆ ระบบจะคนคา None (None เปนคาพเศษในระบบ ไมใชสตรง 'None')
ตวแปรในฟงกชน (local variables)
• ตงชอซ�ากบตวแปรในฟงกชนอนได ถอวาเปนคนละตวแปรกน
• เรยกใชตวแปรในฟงกชนอนไมได
• หากสงตวแปรประเภท int, float, string, boolean เขามาในฟงกชน จะถอวาเปนคนละตวกน
• หากสงตวแปรประเภท list, dict, set เขามาในฟงกชน
ถามการแกคาในฟงกชน ตวแปรเดมของผเรยกฟงกชนจะเปลยนคาดวย
def average3(x,y,z): s = x+y+z return s/3
110 08 : Function and Recursion
ฟงกชนเวยนเกด
• ฟงกชนเวยนเกดม 2 สวนคอ สวนการค�านวณแบบพนฐาน
และสวนทมการเรยกซ�า
• บางครงเขยนงายกวา loop เหมาะกบการท�าซ�าทไมรจ�านวนรอบ
• ท�างานชากวา loop และใชหนวยความจ�ามากกวา
การแปลงความสมพนธทางคณตศาสตรเปนฟงกชนเวยนเกด
• เขยนกรณพนฐานกอน คอกรณทรค�าตอบทนท ไมมการเรยกซ�า
• แลวคอยเขยนกรณทตองเรยกซ�า
เรองผดบอย
เขยนฟงกชนไวหลงสวนทเรยกใช 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 เปนฟงกชนทรบ 2 ตวแปร return (x+y)/2
def average(x,y,z): average กลายเปนฟงกชน return (x+y+z)/3 ทรบ 3 ตวแปร
print(average(1,2,3)) ยงเรยกไดอย
print(average(4,5)) ผด เพราะตองใชแบบ 3 พารามเตอร average = 0 average กลายเปนตวแปรแลว print(average(1,2,3)) ผด เพราะ average เปนตวแปรแลว
def factorial(n): if n < 2: return 1 return n * factorial(n-1)
def f(n): if n == 0: return 0 if 1 <= n <= 2: return 1 return f(n-1) + f(n-2)
08 : Function and Recursion 111
ถาพารามเตอรของฟงกชนเปน list, set
หรอ dict การเปลยนแปลงขอมลทเกบ
ในพารามเตอรน จะสงผลใหขอมลทเกบ
ในตวแปรของผเรยกทสงมาใหพารามเตอร
เปลยนแปลงดวย (เพราะเปนทเกบตวเดยวกน)
def f(x) : ... # ลสต x เปลยนแปลง ลสต y จะเปลยน x.append(e) x[i] = e x[:] = [0,0,0] x.pop(0) ...
f(y)
def sum_double(x): for i in range(len(x)): x[i] *= 2 # x เปนทเกบเดยวกบตวแปรทสงให x return sum(x)
y = [1, 2, 3]print(sum_double(y)) ได 12print(y) ได [2, 4, 6]
ถาตงคาใหมใหกบพารามเตอรของฟงกชน
จะไมสงผลถงตวแปรของผเรยกทสงมาให
พารามเตอร
def f(x) : ... # ตวแปร x เปลยนคา ลสต y ไมเปลยน x = [1,2,3] ...
f(y)
def double(x) : x *= 2
def sum_double(x): x = [2*e for e in x] # x ถกเปลยนเปนลสตตวใหมแลว return sum(x)
a = 8double(a)print(a) ได 8 เหมอนเดม ไมใช 16y = [1, 2, 3]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() ถกตอง
112 08 : Function and Recursion
สงคาหรอตวแปรทเกบคาผดประเภทใหกบ
พารามเตอรของฟงกชน
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 ไป จะท�างานผดในฟงกชน fc = 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 ค�านวณครงเดยว จะท�างานเรวกวา
แบบฝกหด
Problem Code
ชอฟงกชน: f1
Parameter: รบขอมล a เปนสตรง และ รบ b เปนจ�านวนเตม
Process: พมพ a ออกทางหนาจอจ�านวน b บรรทด
Return: ไมตองคนคา
ชอฟงกชน: f2
Parameter: รบขอมล a เปนสตรง และ รบ b เปนจ�านวนเตม
Process: สรางลสตทเกบสตรง a จ�านวน b ตว
Return: ลสตทสราง
08 : Function and Recursion 113
Problem Code
ชอฟงกชน: g
Parameter: รบจ�านวนจรงสจ�านวน m b n และ c
Return: คนคาจดตดของเสนตรง y = mx+b และ y = nx+c
เปน tuple ของจดตด (x,y)
หากเปนเสนตรงทขนานกน ใหคนคาจ�านวนเตม 1
หากเปนเสนตรงเดยวกน ใหคนคาจ�านวนเตม 2
ชอฟงกชน: h
Parameter: รบลสตของจ�านวนเตม x
Return: คนลสตใหม ทมสมาชกจาก x เฉพาะทเปนเลขคเทานน
โดยหามแกไขคาในลสต x
เขยนฟงกชนเวยนเกดเพอค�านวณคาดงน
เขยนฟงกชนเวยนเกดเพอค�านวณคาดงน
k(2n) = k(n)+(k(n)%10) if n > 0k(2n+1) = k(n-1)*n if n > 0 k(0) = 1k(1) = 2
เขยนฟงกชนเวยนเกดเพอค�านวณคาดงน
ชอฟงกชน: is_palindrome
Parameter: รบขอมล s เปนสตรง
Process: เขยนฟงกชนเวยนเกดเพอตรวจสอบวา s เปน
palindrome (อานจากหนาไปหลงเหมอนหลงไปหนา) หรอไม
Return: ถา s เปน palindrome ใหคนคา True ถาไมเปน
ใหคนคา False
114 08 : Function and Recursion
ตวอยางการแกโจทยปญหา
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 20181 1 2020
731
25 12 19999 3 2000
76
08 : Function and Recursion 115
โปรแกรมเรมตน
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 และป BC = 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)
116 08 : Function and Recursion
ตวอยางการเขยนโปรแกรม
โปรแกรม ค�าอธบาย
ฟงกชน is_leap_year
จากโปรแกรมในกลองเสนประ สามารถเขยนเปนฟงกชนไดดงนdef is_leap_year(y): if y%4==0 and (y%100!=0 or y%400==0): return True else: return False
ฟงกชน is_leap_year จะตรวจสอบวาเปน
ปอธกสรทนหรอไม ตามเงอนไขในกลองเสนประ
ถาตรงตามเงอนไขใหคนคา True แตถาไมตรงให
คนคา False
หรอสามารถเขยนใหสนลงไดเปนแบบนdef is_leap_year(y): if y%4==0 and (y%100!=0 or y%400==0): return True return False
ปรบปรง : ในกรณน เราสามารถตดค�าวา else ออก
ได เนองจากถาเงอนไขเปนจรงแลวจะ return True
และจบการท�างานฟงกชนทนท จะไมมาท�างานทบรรทด
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): D[1] += 1 A = 0 for i in range(m-1) A += D[i] A += d
คดลอกโปรแกรมจากกลองเสนไขปลา
อยาลมเปลยนชอตวแปรดวย
(d1,m1,y1 เปน d,m,y)
แตฟงกชนนยงไมถกตองเพราะลมคนคา
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): D[1] += 1 A = 0 for i in range(m-1) A += D[i] A += d return A
เตมค�าสง return A ท�าใหฟงกชนท�างาน
ไดถกตองแลว
08 : Function and Recursion 117
โปรแกรม ค�าอธบาย
def day_of_year(d,m,y): 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
ปรบปรง: น�าฟงกชน is_leap_year ทเขยนไวแลว
มาใชได
ฟงกชน 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): if is_leap_year(y): return 366 else: return 365
ปรบปรง: น�าฟงกชน is_leap_year ทเขยนไวแลว
มาใช
def days_in_year(y): return day_of_year(31,12,y)
ปรบปรง: น�าฟงกชน day_of_year ทเขยนไวแลว
มาใช โดยขอล�าดบของวนท 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 = 0for i in range(y1+1,y2): C += days_in_year(i)
print(days_in_year(y1) - A + 1 + C + B)
เปลยนกลองตาง ๆ เปนการเรยกฟงกชนและสงคาไป
ใหแตละฟงกชนใหถกตอง
118 08 : Function and Recursion
ตวอยางโจทยปญหา
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()) # ตองมบรรทดนเมอสงไป Grader
► ขอมลน�าเขา
ค�าสงในการทดสอบฟงกชนทเขยน
► ขอมลสงออก
ผลทไดจากค�าสงทปอนเปนขอมลน�าเขา
► ตวอยาง
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
08 : Function and Recursion 119
Recursive C(n,k) เราสามารถหาคาของจ�านวนวธในการเรยงสบเปลยน C(n,k) ไดจากสมการดานลาง จงใชสมการตอไปนในการเขยนโปรแกรม
แบบ recursive เพอค�านวณคา C(n,k)
► ขอมลน�าเขา
ม 2 บรรทด ประกอบดวยจ�านวนเตม n และ k
► ขอมลสงออก
ม 1 บรรทด แสดงคา C(n,k) ทค�านวณได
► ตวอยาง
Input (จากแปนพมพ) Output (ทางจอภาพ)
6 2
15
10 8
45
0 1
0
3 7
0
10 10
1
120 08 : Function and Recursion
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
09 : NumPy 121
09 : NumPy
สรปเนอหา• NumPy เปนคลงค�ำสงทใหบรกำรมำกมำยเกยวกบกำรค�ำนวณทำงวทยำศำสตร
โดยมทเกบขอมลทเรยกวำ อำเรย n มต (ndarray) มไวเกบขอมลเพอกำรประมวลผลทมประสทธภำพมำก ๆ
• อำเรยมลกษณะคลำยลสต แตสรำงแลวเปลยนขนำดไมได
• คำในอำเรยทกชองตองเปนประเภทเดยวกนทงหมด เชน เปน int ทกชอง หรอ float ทกชอง (ผสมกนไมได ถำเปนลสตผสมได)
• เรำสรำง เวกเตอร ไดดวยอำเรย 1 มต และสรำง เมทรกซ ไดดวยอำเรย 2 มต
การสรางอาเรยดวยฟงกชน
สรำงอำเรยจำก
ลสต L
np.array(L) หำขนำดของ
อำเรย M
M.shape
[1 0 2 3 -1] np.array([1,0,2,3,-1]) [[2 3] [4 1] [7 5]]
np.array([[2,3],[4,1],[7,5]])
[[0. 0. 0.] [0. 0. 0.]]
np.zeros((2,3)) [[1 1] [1 1] [1 1]]
np.ones((3,2),int)
[[1 0 0 0] [0 1 0 0] [0 0 1 0] [0 0 0 1]]
np.identity(4,int) [[1. 0. 0.] [0. 1. 0.] [0. 0. 1.]]
np.identity(3)
สรำงอำเรยท มขนำดเทำกบ อำเรย x และเปน 0 (int) ทกชอง
np.zeros_like(x,int) (x อำจเกบ int หรอ float กได)
สรำงอำเรยท มขนำดเทำกบ อำเรย y และเปน 1.0 ทกชอง
np.ones_like(y,float) (y อำจเกบ int หรอ float กได)
[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)
import numpy as np
122 09 : NumPy
Element-wise operations, Broadcasting และ Indexing
• เปนสำมแนวคดของ NumPy (ทตองรในวชำน) ทชวยใหกำรประมวลผลอำเรยท�ำไดสะดวก
• กำรด�ำเนนกำรอำเรยกบอำเรย (เชน A+B) กำรด�ำเนนกำรหรอท�ำฟงกชนกบอำเรย จะเปนแบบชองตอชอง (element-wise) เชน 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 ของ NumPy)
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] ไมเกดกำรเปลยนแปลงใด ๆ
09 : NumPy 123
o กำรอำงองขอมลในอำเรย 2 มต
• สำมำรถอำงองถงตวขอมล, อำเรย 1 มตทแทนแถว (row) ของขอมล, อำเรย 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 x = np.array([ 1, 2, 3, 4]) y = np.array([ 0, -1, 1, 2]) x.dot(y) ไดคำเทำกบ y.dot(x) เทำกบ 1*0 + 2*(-1) + 3*1 + 4*2 = 9
dot ใชกบเมทรกซ คลำยกบกำรคณเมทรกซx = np.array([[1,2],[3,4],[5,6]]) x.shape คอ (3,2) y = np.array([[-2],[3]]) y.shape คอ (2,1)z = np.array([[-2,3]]) z.shape คอ (1,2)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,)
124 09 : NumPy
ฟงกชนทระบแกนได, กำร 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 จะไดเขยนสน ๆ
ลมระบประเภทของขอมลทจะเกบวำเปน int หรอ float
x = np.zeros((3,4)) # ไดเปน 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
กำรท�ำงำนของเวกเตอรไมเหมอนเมทรกซ (อำเรย 1 มต vs 2 มต)
x = np.array([1,2,3]) ไดอำเรย 1 มต 3 ชอง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)) ได 14print(x.T.dot(x)) กได 14print(y.dot(y.T)) ได array([[14]])print(y.T.dot(y)) ได np.array([[1,2,3],[2,4,6],[3,6,9]])
09 : NumPy 125
broadcasting & element-wise operations
x = np.array([[1,2,3],[4,5,6]])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 จ�ำนวนจำกแปนพมพ เกบใน kProcess: เปลยนคำของชองใน M ทหมำยเลขแถวและหลก หำรดวย k ลงตวใหมคำเปน 0
สมมตวำมอำเรย 2 มต M มำใหInput: จ�ำนวนเตมบวก 1 จ�ำนวนจำกแปนพมพ เกบใน kProcess: เปลยนคำของชองใน 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 จ�ำนวนจำกแปนพมพ เกบใน kProcess: สรำงเมทรกซขนำด 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]])
126 09 : NumPy
Problem Code
Input: จ�ำนวนเตมบวก 1 จ�ำนวนจำกแปนพมพ เกบใน kProcess: สรำงเมทรกซขนำด 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 10 15 10 20 5 15 14 8 7 12 12 12 0.5 0.25 0.25
11.25 15.0 10.75 12.0
2 10 30 20 20 10 30 0.6 0.3 0.1
17.0 18.0
09 : NumPy 127
ตวอยางการเขยนโปรแกรม
โปรแกรม ค�าอธบาย
n = int(input())S = []for i in range(n): S.append([int(e) for e in input().split()])W = [float(e) for e in input().split()]
for i in range(n): score = [S[i][j]*W[j] for j in range(3)] print(sum(score))
โปรแกรมสวนบนเปนสวนส�ำหรบรบขอมลได S เปนลสตซอนลสตของคะแนนผเขำแขงขนแตละคน และ W เปนลสตของน�ำหนก เชน S = [[10,30,20],[20,10,30]] W = [0.6,0.3,0.1]โปรแกรมดำนขวำท�ำงำนถกตอง แตถำมจ�ำนวนขอมลมำก จะชำ เพรำะใชลสตในกำรประมวลผล
n = int(input())S = []for i in range(n): S.append([int(e) for e in input().split()])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)
ยบ for วงลำงใหเปน list comprehension ท�ำงำนถกตอง แตกยงชำอย ลองเปลยนมำใช numpy
n = int(input())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 range(n): print(sum(S[i]*W))
เปลยนลสต S และ W มำใช numpy array สง run, ใสขอมลตำมตวอยำงแรก, ผดทบรรทดท 7NameError: name 'np' is not definedแปลวำ ระบบไมรจกค�ำวำ np เนองจำกไมไดimport numpy as np
import numpy as npn = int(input())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 range(n): print(sum(S[i]*W))
ท�ำงำนไดถกตอง (ใชกำรคณแบบ element-wise) แตไมไดเรวกวำของเดมนก เพรำะยงใชค�ำสงของ numpy ไดไมเตมท
128 09 : NumPy
โปรแกรม ค�าอธบาย
import numpy as npn = int(input())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)S *= Wtotal_score = np.sum(S, axis = 0)for i in total_score: print(i)
เรำสำมำรถเขยน S *= W ไดเลย เพรำะ numpy จะ broadcast อำเรย W ใหโดยอตโนมต สง run, ใสขอมลตำมตวอยำงแรก, ได2899ไมตรงกบทแสดง พบวำจ�ำนวนตวเลขไมครบ 4 ตว นำจะผดท axis
import numpy as npn = int(input())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)S *= Wtotal_score = np.sum(S, axis = 1)for i in total_score: print(i)
เปลยนเปน axis = 1สง run, ใสขอมลตำมตวอยำงแรก, ได10141012 ไมตรงกบทแสดง พบวำสงทแสดงเปนจ�ำนวนเตม แสดงวำนำจะมปญหำทกำรเกบคำ พบวำค�ำสง S *= W จะเกบผลคณในอำเรย S ซงเกบจ�ำนวนเตม ดงนน ผลลพธจงเปนจ�ำนวนเตม ซงไมถกตอง
import numpy as npn = int(input())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)T = S*Wtotal_score = np.sum(T, axis = 1)for i in total_score: print(i)
เปลยนเปน T = S*Wสง run, ใสขอมลตำมตวอยำงแรก, ได 11.2515.010.75 12.0 ถกตอง
import numpy as npn = int(input())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)
อกวธทท�ำได และงำยกวำคอ ใชค�ำสง S.dot(W)ซงไดผลลพธเปนอำเรย 1 มต มขอมลแตละตวคอคะแนนรวมทถวงน�ำหนกแลว
09 : NumPy 129
ตวอยางโจทยปญหา
คาเชาหนงสอ จงเขยนโปรแกรมค�ำนวณหำรำคำคำเชำหนงสอของรำนเชำหนงสอแหงหนง ทมประเภทหนงสอใหเชำ 4 ประเภท คอ นยำย สำรคด ทองเทยว และกำรตน
เจำของรำนเชำหนงสอตองกำรทรำบวำในหนงสปดำห (คด 5 วนจนทรถงศกร) วนใดใหเชำหนงสอเปนจ�ำนวนเลมมำกทสด เปนจ�ำนวนกเลม และคำเชำหนงสอรวมทกประเภทในแตละวนเปนจ�ำนวนเทำไร
► ขอมลน�ำเขำ
บรรทดท 1 เปนจ�ำนวนเตม 4 จ�ำนวนคนดวยชองวำง แทนคำเชำ นยำย สำรคด ทองเทยว และกำรตน บรรทดท 2 เปนจ�ำนวนหนงสอนยำยทถกเชำในวน จ. อ. พ. พฤ. และ ศ. (คนดวยชองวำง) บรรทดท 3 เปนจ�ำนวนหนงสอสำรคดทถกเชำในวน จ. อ. พ. พฤ. และ ศ. (คนดวยชองวำง) บรรทดท 4 เปนจ�ำนวนหนงสอทองเทยวทถกเชำในวน จ. อ. พ. พฤ. และ ศ. (คนดวยชองวำง) บรรทดท 5 เปนจ�ำนวนหนงสอกำรตนทถกเชำในวน จ. อ. พ. พฤ. และ ศ. (คนดวยชองวำง)
► ขอมลสงออก
บรรทดแรกแสดง ชอวนทมจ�ำนวนหนงสอถกเชำรวมมำกสด และจ�ำนวนหนงสอรวมนน (ใหถอวำมวนเดยวเทำนนทใหเชำมำกสด)บรรทดทสองแสดงคำเชำรวมของหนงสอทกประเภทในแตละวน (เรยงตงแตวนจนทรถงศกร คนดวยชองวำง)
► ตวอยำง
Input (จากแปนพมพ) Output (ทางจอภาพ)
50 30 40 2020 50 10 15 2030 40 20 65 3575 30 42 70 4540 25 35 22 55
Thu 1725700 5400 3480 5940 4950
ขนตอนกำรท�ำงำนของโปรแกรม1. x = ลสตทสรำงจำกขอมลในบรรทดแรกจำกแปนพมพ เปนจ�ำนวนเตม 4 จ�ำนวนแทนคำเชำหนงสอแตละประเภท 2. rentalrates = สรำง numpy array ทมคำเรมตนจำกลสต x3. sales = สรำง numpy array ขนำด 4 แถว 5 คอลมน (แถวแทนประเภทหนงสอ คอลมนแทนวน)4. วงวนท�ำขอ 5 โดยเปลยนคำของตวแปร k = 0,1,2,3 (k แทนหมำยเลขประเภทหนงสอ)5. sales[k,] = list ทสรำงจำกขอมลหนงบรรทดจำกแปนพมพ เปนจ�ำนวนเตม 5 จ�ำนวน แทนจ�ำนวนหนงสอ
ประเภทท k ของแตละวนทขำยได6. totalsales = ผลรวมของจ�ำนวนหนงสอทถกเชำในแตละวนค�ำนวณจำก sales (ในขอ 3)7. d = ต�ำแหนงใน totalsales ทมคำมำกสด (d = 0 แทนวนจนทร, 1 แทนวนองคำร, ..., 4 แทนวนศกร)8. หำชอยอวน จำก d และ tuple ('Mon', 'Tue', 'Wed', 'Thu', 'Fri')9. แสดง ชอยอวน ตำมดวย totalsales[d] 10. salesvalues = คำเชำหนงสอรวมของหนงสอทกประเภทในแตละวน (น�ำ rentalrates มำ dot กบ sales)11. แสดงรำยกำรของยอดเงนทขำยไดจำก salesvalues มำแสดง (คนดวยชองวำง)
130 09 : NumPy
BMI ฟงกชน read_height_weight() ขำงลำงน อำนขอมลควำมสง (หนวยเปนเซนตเมตร) และน�ำหนก (หนวยเปนกโลกรม) มำสรำง numpy array แบบสองมต ดงตวอยำงในตำรำงขำงลำงน (บรรทดแรกคอจ�ำนวนขอมล บรรทดทตำมมำคอ ควำมสงกบน�ำหนก)
Input ผลทไดจาก read_height_weight()
4160 60155 62170 54180 55
array([[160, 60], [155, 62], [170, 54], [180, 55]])
จงเขยนฟงกชน cm_to_m(x) และ cal_bmi(hw) ในโปรแกรมขำงลำงน ทมขอก�ำหนดของพำรำมเตอร และผลลพธทไดตำมตำรำงน
Function Input parameter Return value
cm_to_m(x) array หนงมต เกบควำมสงหนวยเปนเซนตเมตร เชน array([160, 155, 170, 180])
array หนงมตเกบควำมสงหนวยเปนเมตร เชน array([1.6,1.55,1.7,1.8])
cal_bmi(hw) array สองมต ขนำด n แถว 2 คอลมน แตละแถวแทนขอมลหนงค คอลมน 0 เกบควำมสง (เซนตเมตร) คอลมน 1 เกบน�ำหนก (กโลกรม) เชนarray([[160, 60], [155, 62], [170, 54], [180, 55]])
array หนงมตเกบ bmi ทค�ำนวณจำกควำมสงและน�ำหนกใน Input parameter ทไดรบ เขนarray([23.4375, 25.80645161, 18.68512111, 16.97530864])
และเขยนค�ำสง
• หำคำเฉลยของ bmi ทงหมดทค�ำนวณได เกบใสตวแปร avg_bmi และ
• นบจ�ำนวน bmi ทค�ำนวณไดทมคำนอยกวำ 18.5
09 : NumPy 131
โปรแกรมเรมตน
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()4160 60155 62170 54180 55
average bmi = 21.2260953405#bmi < 18.5 = 1
132 09 : NumPy
การค�านวณจ�านวนฟโบนกชโดยใชการยกก�าลงเมทรกซอยางรวดเรว 0, 1, 1, 2, 3, 5, 8, ... เปนล�ำดบของจ�ำนวนฟโบนกช (F0 = 0, F1 = 1, F2 = 1, ...) วธหนงในกำรหำ Fn คอค�ำนวณ ผลกำรยกก�ำลง n ของเมทรกซ A ทแสดงดำนลำง จะไดผลเปนเมทรกซขนำด 2×2 ทม Fn อยทมมขวำบนของเมทรกซ เชน
หำ F3 ค�ำนวณ ได F3 = 2 หำ F4 ค�ำนวณ ได F4 = 3
ถำคดดด ๆ จะพบวำกำรหำดวยวธขำงตนนคอกำรหำคำยกก�ำลง ซงเรำกไมนำหำแบบคอย ๆ คณไปทละครง เชน กำรหำ A10 กไมนำใชวธทเรมดวยเมทรกซเอกลกษณ I แลวคณดวย A ไป 10 ครง นำจะใชวธกำรหำ A5 แลวจบมำคณกบตวเอง กจะได A10 นนคอ
จงเขยนฟงกชน fib(n,k) เพอค�ำนวณ Fn % k ดวยวธขำงตนน โดยใชค�ำสงของ numpy เพอคณเมทรกซ (หมำยเหต: หลงกำรคณเมทรกซทกครง ใหน�ำผลทไดมำ % k numpy จะท�ำ % k แบบ element-wise ในเมทรกซ)
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)
► ขอมลสงออก
แสดงคำ Fn % k
► ตวอยำง
Input (จากแปนพมพ) Output (ทางจอภาพ)
0 10 0
2 10 1
89 10 9
11111 111 55
1234567890 1234 162
10000000000000 999 600
10 : Class 133
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)'
134 10 : Class
• การเรยกเมทอดท�าได 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 ในเมทอด ไมไดประกาศ self เปนพารามเตอรไมม self. น�าหนาตวแปรของออบเจกต
class A: def __init__(self, x, y): 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 = 5print(b1.b) # 5
indent ผด class C: def __init__(self, c): self.c = cdef double(self): # indent ผด กลายเปนฟงกชนทวไป self.c *= 2 # เรยก double(c1) ได # แตจะเรยก c1.double() ไมได # เรยก C.double(c1) กไมได
10 : Class 135
แบบฝกหด
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')
136 10 : Class
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): # คนลสตของประวตการซอมบ�ารง (วนท, ค�าอธบาย, ราคา) ทกรายการ ทมคาใชจายมากทสด # กรณทรถยนตไมมประวตการซอมบ�ารงเลย ใหคนคาลสตวาง
10 : Class 137
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): # ตะกราทมราคารวมของหนงสอนอยกวา จะเปนตะกราทนอยกวา
138 10 : Class
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 = Truep = c1.enter(s3) # p = False (แตะเขาสถานหลงจากแตะเขาไปแลว)p = c1.leave(s2) # c1 เหลอเงนในบตร 95 บาท โดย p = (95, 0)# --------------------------------------------------------------p = c2.enter(s3) # p = Truep = 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 = Truep = 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
10 : Class 139
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): # บตรโดยสารทมเงนในบตรนอยกวา จะถอวานอยกวา
140 10 : Class
ตวอยางการแกโจทยปญหา Busใหเขยนคลาสของรถเมลซงมเมทอดดงน
1. __init__ สรางรถเมล 1 คน รบพารามเตอร จ�านวนคนบนรถ people และคาโดยสาร fare
2. __str__ คนคาสตรงซงบอกจ�านวนคนบนรถและคาโดยสาร
3. __lt__ เปรยบเทยบรถเมลโดยพจารณาคาโดยสารรวมของรถ (จ�านวนคนบนรถคณคาโดยสารตอคน)
4. people_in เพมจ�านวนคนบนรถ k คน ไมคนคา
5. people_out ลดจ�านวนคนบนรถ k คน (หากจ�านวนคนนอยกวา 0 จะตองแกไขจ�านวนคนเปน 0) ไมคนคา
6. change_fare เปลยนคาโดยสารเปนคาโดยสารใหม new_fare ไมคนคา
► ตวอยาง
b1 = Bus(10, 5) b2 = Bus( 8, 7) if b1 < b2: print(b1) else: print(b2) b1.people_in(3) b1.people_out(6) b1.change_fare(12) print(b1)
# b1 has 10 people with fare = 5 # b2 has 8 people with fare = 7 # b1 < b2 is True (10*5 < 8*7) this bus has 10 people with fare = 5 # b1 has 13 people with fare = 5 # b1 has 7 people with fare = 5 # b1 has 7 people with fare = 12 this bus has 7 people with fare = 12
ตวอยางการเขยนโปรแกรม
โปรแกรม ค�าอธบาย
class Bus: def __init__(people, fare): people = people fare = fare def __str__(): return 'this bus has ' + str(people) \ + ' 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
ท�างานไมถกตอง มจดผดดงน- ไมมการใช self- เมทอด people_in, people_out และ change_fare ตองไมคนคา- เมทอด people_out ไมไดตรวจสอบวา จ�านวนคนนอยกวาศนยหรอไม
10 : Class 141
โปรแกรม ค�าอธบาย
class Bus: def __init__(self, people, fare): 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
ท�างานถกตอง สงเกตการใชงานself.people = max(0,self.people-k)วาท�าการแกไขจ�านวนคนหากนอยกวาศนยใหแลว
class Bus: def __init__(self, people, fare): self.fare = fare self.total = people*fare def __str__(self): return 'this bus has ' + \ str(self.total//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
เราสามารถเขยนคลาส Bus แบบอนได เชน แทนทจะเกบจ�านวนคนและคาโดยสาร อาจจะเกบคาโดยสารตอคนและคาโดยสารรวมกได แตกตองปรบการท�างานของคลาสใหถกตอง(ในเมทอด change_fare ถาท�าการเปลยนคาself.fare กอน จะท�าใหเมทอดท�างานผดได)
142 10 : Class
ตวอยางโจทยปญหา
เศษสวน ก�าหนดคลาสของเศษสวน ประกอบดวยเศษ (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 ได
10 : Class 143
► ขอมลน�าเขา
มบรรทดเดยว เปนจ�านวนเตมบวก 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
144 10 : Class
คลาสของไพ ขางลางนแสดงการเรยกใชคลาส 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])
10 : Class 145
รายละเอยดตาง ๆ ของคลาส Card และเมทอดของคลาส Card
• เมทอด getScore จะคนคาคะแนนของไพเปนจ�านวนเตม ตามกฎดงน
o ไพทมคา A จะมคะแนน 1 คะแนน
o ไพทมคา 2 ถง 10 จะมคะแนนเทากบคาของไพ คอ 2 ถง 10 คะแนน ตามล�าดบ
o ไพทมคา J, Q, K จะมคะแนน 10 คะแนน
• เมทอด sum จะคนคาผลรวมคะแนนของไพสองใบและ mod ดวย 10 เชน
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 (ทางจอภาพ)
5A spadeK heartK club7 diamond2 spade
1101072----------1079----------(7 diamond)(K club)(K heart)(A spade)(2 spade)
146 10 : Class
กระปกออมสน จงเขยนคลาส piggybank เพอผลตออบเจกตกระปกออมสน ทสามารถหยอดเหรยญมลคาอะไรกได โดยจ�ากดจ�านวนเหรยญรวมทกแบบในกระปกแลวหามเกน 100 เหรยญ (ถาหยอดแลวเกนไมรบเพม) ตามโครงของคลาสและตวอยางการใชงาน ขางลางน
โครงของคลาส piggybank ตวอยางการใชงาน piggybank
class piggybank: def __init__(self): # มตวแปร self.coins เกบ dict เรมตนใหวาง ๆ # ม key เปนมลคาเหรยญ และ value เปนจ�านวนเหรยญ
def add(self, v, n): # ถาเพมจ�านวนเหรยญในกระปกอก n เหรยญแลวเกน 100 # จะไมใหเพม ใหคน False แทนวา เพมไมส�าเรจ # แปลง v เปน float กอน (เพม 5 กบ 5.0 จะไดเหมอนกน) # ถากระปกไมเคยมเหรยญ v ท�า self.coins[v] = 0 # ท�าค�าสง self.coins[v] += n # คน True แทนวาเพมส�าเรจ
def __float__(self): # น�าคาของเหรยญคณกบจ�านวนเหรยญ ของเหรยญทกแบบ # ตองคนจ�านวนแบบ float เทานน อยากคนศนย กตอง 0.0
def __str__(self): # คนสตรงทแสดงจ�านวนเหรยญแตละแบบตามตวอยาง # โดยใหเรยงเหรยญตามมลคาจากนอยไปมาก
p1 = piggybank()print( float(p1) ) # 0.0p1.add(0.25, 4) # เพมเหรยญ 25 สตางค 4 เหรยญprint( float(p1) ) # 1.0p1.add(0.50, 1) # เพมเหรยญ 50 สตางค 1 เหรยญprint( float(p1) ) # 1.5p1.add(10, 1) # เพมเหรยญ 10 บาท 1 เหรยญprint( float(p1) ) # 11.5print( p1 ) # {0.25:4, 0.5:1, 10.0:1}print(p1.add(10, 1)) # True เพมไดprint( float(p1) ) # 21.5print(p1.add(1,94)) # False เพมไมได เกน 100 เหรยญprint( float(p1) ) # 21.5
10 : Class 147
เมทอด __float__ ถกเรยกเมอ float(p) ท�างาน โดยท p เปน piggybank ไดผลลพธเปน float แทนคาของ p
เมทอด __str__ ถกเรยกเมอ str(p) ท�างาน โดยท p เปน piggybank ไดผลลพธเปนสตรงแทนคาของ p
► การสงตรวจ
ใหน�าโปรแกรมขางลางน ตอทาย class piggybank ทเขยนขางบนน แลวจงสงให Grader ตรวจ
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) print(float(p2), p2)
2.22 {1.11:2} 0.0 {}
p1.add(0.25,1);p1.add(5,1);p1.add(0.25,2);p1.add(5.0,1) print(float(p1), str(p1))
10.75 {0.25:3, 5.0:2}
p1.add(0.25,1); print(p1.add(0.25,100)) print(p1.add(0.25,99)); print(float(p1))
False True 25.0
ดร. สภชย สตณฑวบลย
Intania 63
Principal Member of Technical StaffAdvanced Micro Devices Inc. (AMD)California, USA
ก ำรใชคอมพวเตอรชวยออกแบบ (Computer Aid Design : CAD) มควำมส�ำคญมำกส�ำหรบกำรออกแบบ
System on Chips ซงประกอบดวยทรำนซสเตอรหลำยพนลำนตว วศวกรออกแบบ chips ทประสบ
ควำมส�ำเรจสวนใหญมควำมรควำมสำมำรถในกำรใชโปรแกรม CAD และสำมำรถเขยนโปรแกรมเสรมเพอให
ตนเองท�ำงำนออกแบบไดเรวขน การเขยนโปรแกรมใหไดดจงตองเรมดวยทกษะพนฐำนดำน Programming
แลวเสรมดวยองคควำมรเรอง Algorithms และ Data Structures จงจะท�ำใหเขยนโปรแกรมทมประสทธภำพ เชน
ท�ำงำนไดเรว ใชหนวยควำมจ�ำนอย และใชพลงงำนต�ำ เปนตน
11 : Solutions to Exercises 149
บทท 1 ► ขอท 1 h = int(input()) m = int(input()) s = int(input()) total = 60*60*h + 60*m + s print( total )
► ขอท 2import mathx = float(input())y = 2 - x + 3/7*x**2 - 5/11*x**3 + \ math.log(x,10)print(y)
► ขอท 3a = float(input())x = 1x = (x + a/x)/2 x = (x + a/x)/2x = (x + a/x)/2x = (x + a/x)/2print(x)
► ขอท 4v1,v2,v3 = [float(e) \ for e in input().split()]u1,u2,u3 = [float(e) \ for e in input().split()]dotp = v1*u1 + v2*u2 + v3*u3print(dotp)
► ขอท 5import mathx1,y1,x2,y2 = \ [float(e) for e in input().split()]d = math.sqrt((x1-x2)**2+(y1-y2)**2)print(d)
► ขอท 6import mathr,theta = [float(e) \ for e in input().split()]x = r*math.cos(theta)y = r*math.sin(theta)print(x, y)
► ขอท 7import mathx,y = [float(e) for e in input().split()]r = math.sqrt(x**2+y**2)theta = math.atan2(y,x)print(r,theta)
► ขอท 8a,b,c,d,g = \ [float(e) for e in input().split()]avg = (a+b+c+d+g)/5print(avg)
► ขอท 9a,b,c = [e for e in input().split()]c = int(c)out = a + b + str(c) + (a + b) * cprint(out)
บทท 2► ขอท 1 # ex. 3 4 1 --> median is 3a,b,c = [int(e) for e in input().split()]if b <= a <= c or c <= a <= b : print(a)elif a <= b <= c or c <= b <= a : print(b)else : print(c)
► ขอท 2x1,y1,r1 = [float(e) \ for e in input().split()]x2,y2,r2 = [float(e) \ for e in input().split()]d = (x1-x2)**2 + (y1-y2)**2sumr2 = (r1+r2)**2if d < sumr2 : print('overlap')elif d == sumr2 : print('touch')else : print('free')
11 : Solutions to Exercises
150 11 : Solutions to Exercises
► ขอท 3x,y = [float(e) \ for e in input().split()]if x == 0 and y == 0 : print('At the origin') elif x == 0 : print('On y-axis')elif y == 0 : print('On x-axis')elif x > 0 and y > 0 : print('Quadrant I')elif x < 0 and y > 0 : print('Quadrant II')elif x < 0 and y < 0 : print('Quadrant III')else : print('Quadrant IV') ► ขอท 4a,b,c,d,e = [int(e) \ for e in input().split()]if a <= b <= c <= d <= e : print('True')else : print('False')
# print( a <= b <= c <= d <= e ) ► ขอท 5a,b,c,d = [int(e) \ for e in input().split()]mx = aif b > mx : mx = bif c > mx : mx = cif d > mx : mx = dmn = aif b < mn : mn = bif c < mn : mn = cif d < mn : mn = ds = (a+b+c+d) - mx - mnprint(s)
# s = (a+b+c+d)-max(a,b,c,d)-min(a,b,c,d)
► ขอท 6a = int(input())x = int(round(a**(1/3),0))if x**3 == a : print(x)else : print('Not Found')
► ขอท 7c = int(input())if c < 37 : s = 'XS'elif c < 41 : s = 'S'elif c < 43 : s = 'M'elif c < 46 : s = 'L'else : s = 'XL' print(s)
บทท 3► ขอท 1k = 1while 1/k*k == 1 : k += 1print(k) ► ขอท 2k = 1p = 1.0while (1-p) < 0.5 : p *= (365-k)/365 k += 1print(k) ► ขอท 3p = 0.0for k in range(1,400000,4): p += 1/k p -= 1/(k+2)print(4*p)
► ขอท 4 a,b = [int(e) for e in input().split()]s = 0for i in range(a,b): t = 0 for j in range(i+1,b+1): t += (i+j) s += (-1)**i * tprint(s)
► ขอท 5a,b = [int(e) for e in input().split()]s = 0for i in range(a,b): for j in range(i+1,b+1): s += (-1)**i * (i+j)print(s)
11 : Solutions to Exercises 151
► ขอท 6n = int(input())a = int(input())mn = mx = ac = 0if a < 0 : c = 1for k in range(n-1): a = int(input()) if a > mx : mx = a if a < mn : mn = a if a < 0 : c += 1print( (mx - mn), c )
► ขอท 7n = int(input())for x in range(1,n+1): for y in range(x,n+1): for z in range(y,n+1): t = x**2+y**2+z**2 w = int(round(t**(1/3),0)) if w**3 == t: print(w,x,y,z)
บทท 4► ขอท 1s = input().strip()t = ''for e in s: t += e*2print(t)
► ขอท 2s = input().strip()t = ''s = ' ' + s + ' 'for i in range(1,len(s)-1) : t += s[i] if s[i-1] != s[i] != s[i+1] : t += s[i]print(t)
► ขอท 3s = input().strip()if s == s[::-1] : print('Y')else: print('N')
► ขอท 4d,n = [int(e) for e in input().split()]t = "0"*n + str(d)t = t[-max(n,len(str(d))):]print(t)
► ขอท 5h = input().strip()d = '0123456789ABCDEF'.find(h)if d >= 0 : print(d)else : print('invalid hex digit')
► ขอท 6t = input().strip()c = 0for e in t : if e in '13579' : c += 1print(c)
► ขอท 7t = input().strip()c = 0for k in range(len(t)-1) : if t[k] in 'aeiou' and \ t[k+1] in 'aeiou' : c += 1print(c)
► ขอท 8b = input().strip()b = b[::-1]d = 0for i in range(len(b)) : d += int(b[i])*2**iprint(d)
บทท 5► ขอท 1file1 = open( input().strip() )s = ''for line in file1 : if line[-1] != '\n' : # กรณบรรทดสดทายไมม \n line = line + '\n' s = line + s # น�าบรรทดใหมมาตอทางซายfile1.close()print(s[:-1]) # ลบ \n ทบรรทดสดทาย
152 11 : Solutions to Exercises
► ขอท 2file1 = open( input().strip() )s = ''for line in file1 : if len(line.strip()) > 0 : if line[-1] != '\n' line = line + '\n' s = line + sfile1.close()out = open('reverse.txt', 'w')out.write(s[:-1])out.close()
► ขอท 3file1 = open( input().strip() )for line in file1 : a = line.find("<headline>") if a >= 0 : j = a+len("<headline>") b = line.find("</headline>",j) print( line[j:b] )file1.close()
► ขอท 4file1 = open( input().strip() )file2 = open( input().strip() )for line1 in file1 : line2 = file2.readline() if line1 != line2 : print( False ) breakelse : print( len(file2.readline()) == 0 )file1.close()file2.close()
หรอแบบสน ๆ ใช readlines
file1 = open( input().strip() )file2 = open( input().strip() )print( file1.readlines() == \ file2.readlines() )
บทท 6.1► ขอท 1v1 = [float(e) for e in input().split()]v2 = [float(e) for e in input().split()]if len(v1) != len(v2) : print( 'Error' )else : dotp = 0 for k in range(len(v1)) : dotp += v1[k]*v2[k] print(dotp)
► ขอท 2n = int(input())d = []for k in range(n): d.append( int(input()) )d.sort()t = []for e in d : t.append(str(e))print(','.join(t))
► ขอท 3file1 = open( input().strip() )d = []for line in file1: d.append( int(line) )file1.close()c = []for e in d: c.append( d.count(e) )maxc = max(c)out = []for k in range(len(d)): if c[k]==maxc and d[k] not in out : out.append(d[k])for e in out : print(e)
► ขอท 4file1 = open( input().strip() )h = []for line in file1 : a = line.find("<headline>") if a >= 0 : j = a+len("<headline>") b = line.find("</headline>",j) h.append( line[j:b] )file1.close()h.sort()for e in h : print(e)
► ขอท 5file1 = open( input().strip() )d = []for line in file1 : d.append( line.strip() )file1.close()
for k in range(len(d)-1) : for i in range(len(d)-1) : if len(d[i]) > len(d[i+1]) or \ len(d[i]) == len(d[i+1]) and \ d[i] > d[i+1] : d[i],d[i+1] = d[i+1],d[i]
for e in d : print(e)
11 : Solutions to Exercises 153
บทท 6.2► ขอท 1r,c = [int(e) for e in \ input().split()]m = []for k in range(r) : m.append( [int(e) for e in \ input().split()] ) if len(m[k]) != c : m = [[]] breakprint( m )
► ขอท 2infile = open(input().strip())f = []for line in infile : usernames = line.split() f.append( [usernames[0], \ usernames[1:]] )infile.close()print( f ) ► ขอท 3 # สมมตวาม f มาแลวnofollowers = []for [username,followers] in f : if len(followers) == 0 : nofollowers.append( username )print( 'No followers :', \ ','.join(nofollowers) )
► ขอท 4n = int(input())d = []for k in range(n) s = input().strip() d.append( [len(s),s] )d.sort()for [c,s] in d : print(s)
บทท 6.3► ขอท 1d = [ e.count(c) for e in x ]
► ขอท 2แบบแรก x = [e for e in x if e >= 0] คอการสรางลสตใหมทไมมเลขลบ แลวให x อางองลสตใหมน ถาเขยนอกแบบ x[:] = [e for e in x if e >= 0]คอการสรางลสตใหมทไมมเลขลบ แลวน�าคาในลสตใหมนไปใสในทเกบเดมของลสต x สองวธนใหผลคลายกน ตางกนตรงท ถากอนหนานมการท�าค�าสง y = x คอให y อางองลสตเดยวกบ x การท�าแบบแรกจะท�าให y อางองลสตเดม และ x อางองลสตใหม ในขณะทแบบหลง y ยงคงอางองลสตเดยวกบ x
► ขอท 3# t = [ [1,2,3], [33], [3,3,3,4] ]t = sum( [ sum(e) for e in x ] )
► ขอท 4c = sum( [1 for e in input().split() \ if int(e) < 0])
► ขอท 5t = ''.join([e for e in input() \ if 'a' <= e.lower() <= 'z'])
► ขอท 6x = [float(e) for e in input().split()]y = [float(e) for e in input().split()]z = [x[i]+y[i] for i in range(len(x))]
► ขอท 7f = [e for row in m for e in row]
► ขอท 8x = [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)
154 11 : Solutions to Exercises
► ขอท 9n = int(input())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) \ if x[i] != x[i+1] ]c.append(x[-1])
► ขอท 10n = int(input())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) \ if x[i] != x[i+1] ]c.append(x[-1])p = [e for e in range(2,n) if e not in c]
บทท 7► ขอท 11) dict ม key คอ studentID, value คอ grade2) set ของ studentID3) dict ม key คอ dept, value คอ set ของ studentID4) list ของ phone5) dict ม key คอ เลขทาย TelNo, value คอ count ► ขอท 2x = int(input())t = ()for i in range(0,x,2): # ค�าสงขางลางนไมไดเปลยน tuple ของ t แตสราง # tuple ใหม แลวแทนท t ตวเกา t += (i,) # เหมอน t = t + (i,)print(t)หรอt = tuple([e for e in range(0,x,2)])หรอt = tuple(range(0,x,2))
► ขอท 3x = int(input())t = ()while x > 0: t = (x%10,) + t x //= 10print(t)หรอ เปลยนมารบสตรง, น�าแตละหลกมาเปลยนเปน int, เกบใส list, แลวสงไปสรางเปน tuple x = input().strip()print(tuple([int(e) for e in x])) ► ขอท 4x = input().strip()d = {}for e in x: if e not in d: d[e] = 1 else: d[e] += 1print(d)
► ขอท 5x = input().strip()y = input().strip()set_x = set(x)set_y = set(y)print(set_x.intersection(set_y))
บทท 8► ขอท 1def f1(a,b): for i in range(b): print(a)
► ขอท 2def f2(a,b): return [a]*b ► ขอท 3def g(m,b,n,c): if m==n and b!=c: return 1 if m==n and b==c: return 2 x = (c-b)/(m-n) y = m*x + b return (x,y) ► ขอท 4 def h(x): return [e for e in x if e%2==0] ► ขอท 5 def a(n): if n==0: return 1 if n==1: return -2 return a(n-2)*n
11 : Solutions to Exercises 155
► ขอท 6 def k(n): if n==0: return 1 if n==1: return 2 if n%2==0: x = k(n//2) return x + x%10 return k(n//2-1)*(n//2) ► ขอท 7 def s(i,k): if i>=k: return 0 return k + t(i+1,k)def t(j,k): if j>=k: return 0 return j + s(j,k-1)
► ขอท 8 def is_palindrome(s): if len(s) <= 1: return True if s[0]!=s[-1]: return False return is_palindrome(s[1:-1])
บทท 9► ขอท 1k = int(input())M[::k,::k] = 0 ► ขอท 2
แบบชาk = int(input())for i in range(M.shape[0]): for j in range(M.shape[1]): if i%k==0 and j%k==0: M[i][j]*=2
แบบนกยงชาอย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] = 1M += M*N
แบบนเรวและสนk = int(input())M[::k,::k] *= 2
► ขอท 3MAX = np.max(M,axis=0)MIN = np.min(M,axis=0)A = MAX-MIN
► ขอท 4Y = (X[:,0]**2+X[:,1]**2)**0.5 ► ขอท 5k = int(input())C = np.zeros((k,k),int)C[::2, 1::2] = C[1::2, ::2] = 1
► ขอท 6k = int(input())C = np.zeros((k,k),int)C[::2, ::2] = C[1::2, 1::2] = 1C = (C*np.arange(1,k+1)).T# ใช C*(np.arange(1,k+1).T) ไมได (เพราะอะไร ?)
บทท 10► ขอท 1def __init__(self, name, year, faculty): self.name = name self.year = year self.faculty = faculty
def __str__(self): return self.name + \ ' (year ' + str(self.year) + ') ' + \ self.faculty def __lt__(self, rhs): if self.faculty != rhs.faculty: return self.faculty < rhs.faculty if self.year != rhs.year return self.year < rhs.year return self.name < rhs.name
156 11 : Solutions to Exercises
► ขอท 2def __init__(self, license, brand, color): self.license = license self.brand = brand self.color = color self.report = []
def __str__(self): return self.license + ' - ' \ + self.color + ' ' + self.brand
def __lt__(self, rhs): return self.license < rhs.license
def add_report(self, new_report): self.report.append(new_report)
def total_payment(self): return sum([r[2] for r in self.report]) def max_payment(self): if self.report == []: return [] max_p = max([r[2] for r in self.report]) return [r for r in self.report \ if r[2] == max_p]
► ขอท 3def 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()
► ขอท 4 def add_value(self, x): self.value += x
def enter(self, station): if self.station == '': self.station = station return True else: return False
def leave(self, station): if self.station == '': return (self.value, -2) price = Station.get_price \ (self.station, station) if price > self.value: return (self.value, -1) else: self.value -= price self.station = '' return (self.value, 0)
def __lt__(self, rhs): return self.value < rhs.value
Appendix 157
Appendix
เวบไซตทเปนประโยชน• youtu.be/U2l1xgpVsuo?list=PL0ROnaCzUGB4ieaQndKybT9xyoq2n9NGq (ภาพยนตรบรรยายเนอหาวชา)
• en.wikibooks.org/wiki/Python_Programming (เวบไซตอางองส�าหรบการเขยนโปรแกรมภาษา Python)
• www.python.org (เวบไซตทางการของภาษา Python)
• docs.python.org/3/tutorial/index.html, docs.python.org/3/library/index.html,
docs.python.org/3/reference/index.html (เวบไซตทางการของภาษา Python สวนเอกสารอางอง)
• www.numpy.org (เวบไซตทางการของคลงค�าสง NumPy)
• www.lfd.uci.edu/~gohlke/pythonlibs (เวบไซตส�าหรบดาวนโหลดคลงค�าสงภาษา Python)
• www.pythontutor.com (เวบไซตส�าหรบการ visualize โปรแกรมภาษา Python)
• repl.it/languages/python3 (เวบไซตส�าหรบเขยนโปรแกรมภาษา Python ออนไลน สามารถใช NumPy ได)
• openbookproject.net/thinkcs/python/english3e (เวบไซตอางองส�าหรบการเขยนโปรแกรมภาษา Python)
Error ทสามารถพบไดแบบขนเปนกลองขอความ
ขอความ error สาเหต แนวทางการแกไข
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
158 Appendix
แบบขนเปนตวอกษรสแดงใน shell
ขอความ error สาเหต แนวทางการแกไข
name 'x' is not defined ไมไดก�าหนดคาตวแปร x กอนใชงาน เชน print(x+1)หรอพมพชอฟงกชนผด เชนpintt('cat') หรอลม import
ก�าหนดคาตวแปรกอนใชงานใหเรยบรอยตรวจสอบการพมพชอฟงกชนท�าการ import ใหเรยบรอย
ZeroDivisionError: division by zero
มการหารดวย 0 เชน print(5/0) แกไขตวหารใหไมเปน 0
ImportError: No module named 'maht'
พมพชอ module ทตองการ import ผด เชน import maht
แกไขชอ module ทตองการ import ใหถกตอง
AttributeError: module 'math' has no attribute 'arcsin'
module ทเรยก ไมมฟงกชนทตองการ เชน print(math.arcsin(0))
แกไขชอฟงกชนใหถกตอง เชนในทนตองใช math.asin(0)
ValueError: math domain error
มการใสคาทฟงกชนไมรองรบ เชนprint(math.asin(1000))print(math.log(10,0))
ตรวจสอบคาทฟงกชนนนรองรบ และใสคาทถกตอง
invalid literal for int() with base 10
มการใสคาทแปลงไมไดลงไปใน int() เชน x = int('cat')
ตรวจสอบคาทตองการแปลง วาเปนจ�านวนเตมหรอไม และแกไขใหถกตอง
could not convert string to float
มการใสคาทแปลงไมไดลงไปใน float() เชน x = float('cat')
ตรวจสอบคาทตองการแปลง วาเปนจ�านวนทศนยมหรอไมและแกไขใหถกตอง
Can't convert 'int' object to str implicitly
มการบวก int กบ string เชนprint('cat'+3)
แกไขใหถกตอง อาจใช comma แทนเครองหมาย + หรอเพมอญประกาศเปน '3'
sqrt() takes exactly one argument (3 given)
ฟงกชน sqrt() ตองใสขอมล 1 คา แตตอนนใสไป 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 interpreted as an integer
มการใสคา float ในสวนทควรจะเปนคา int เชน for i in range(2.5):
แกไขคาใหเปนจ�านวนเตม
Appendix 159
ขอความ error สาเหต แนวทางการแกไข
'int' object is not iterable
มการใชค�าสง in กบสงทไลล�าดบไมได (int หรอ float) เชนfor i in 5:
ใช in กบสงทไลล�าดบได เชน range, string, list, tuple, set, dict
index out of range มการเรยก index เกนจากทม เชนx = 'cat'; print(x[100])y = [1,2,3]; print(y[100])
ตรวจสอบวา index ทตองการเรยก ไมเกนความยาวทม
indices must be integers มการเรยก index ของสตรงหรอลสตดวยคาทไมเปนจ�านวนเตม เชนx = 'cat'; print(x[2/1])y = [1,2,3]; print(y['a'])
ตรวจสอบวา index ทเรยก เปนจ�านวนเตมหรอไม และแกไขใหถกตอง
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 ทตองการ เชนd = {}; print(d[1])หรอ set ไมมสมาชกทตองการ เชนs = {1,2,3}; s.remove(4)
ดวาใช key ถกตองหรอไมเพม code เพอตรวจสอบวาม key อยใน dict หรอไม
'set' object has no attribute 'delete' (อาจเกด error กบ list, string, tuple และ dict ไดดวย)
เรยกใชบรการทไมมก�าหนดไว เชนs = {1,2,3}; s.delete(1)ซง set ไมมบรการทชอวา delete
แกไขการใชค�าสงใหถกตอง
TypeError: unhashable type มการใช list, set, dict เปน key ของ dict หรอเกบ list, set, dict ใน set เชนd = {}; d[{1}] = 'cat'
ตรวจสอบประเภทขอมลทน�ามาใช วาไมใช list, set, dict
unsupported operand type(s) for +: 'NoneType' and 'int'
มการน�า None ไปประมวลผล เชน def func(x): x += 1print(func(3)+1)ซงอาจเกดจากการลม return
return คาใหถกตอง
'int' object is not callable
มการเรยกฟงกชนดวยตวแปร เชนa = 3b = a(5)อาจเกดจากการตงชอฟงกชนซ�ากบตวแปร
ตรวจสอบการตงชอฟงกชนและตวแปร และแกไขใหถกตอง
RecursionError: maximum recursion depth exceeded
มการเรยกฟงกชนตวเองซ�ามากเกนไปอาจเกดจากการลมกรณพนฐานของการ recursive เชนdef f(n): return n*f(n-1)
เตมกรณพนฐานของการ recursive และเชคเงอนไขการหยดท�างานให ถกตอง
ผมคดวำกำรเรยนเขยนโปรแกรมจะเปนเหมอนกำรเรยนภำษำท 3 ในอนำคตอนใกล ยงเทคโนโลยแทรกซมไปใน
ทกสงเรวเทำไหร ควำมตองกำรคนทเขำใจและควบคมเทคโนโลยไดกจะมมำกขนเทำนน นอกจำกนนกำรเรยน
เขยนโปรแกรมยงชวยใหเรำรจกคดแกปญหำอยำงเปนระบบ และใหพลงในกำรสรำงสรรคสงตำง ๆ ไดอยำงไมรจบ
ถำ เทยบกำรสรำง software กบกำรสรำงตกตกหนง programming กเหมอนเปนเสำเขม ทรองรบแรงของทงตก
ใหตงอยได และไมพงทลำย ตรำบใดทไมมเสำเขม กไมสำมำรถสรำงตกได ดงนน programming กเปนเหมอน
รำกฐำนทส�ำคญของ software ถำเรำมทกษะ programming ทด เรำกจะสำมำรถพฒนำ software ทมคณภำพไดเชนกน
ศภเสฏฐ ชชยศร Intania 86
Solutions Engineer, Facebook และ นายกสมาคมโปรแกรมเมอรไทย
ณ ฐชยา ลละศภกล Intania 95
ตลาดหลกทรพยแหงประเทศไทย
ค�ำสงพนฐำน import math
x = int(input()) รบขอมลจ�ำนวนเตม 1 จ�ำนวนx,y,z = [float(e) for e in input().split()]
รบขอมลจ�ำนวนจรง 3 จ�ำนวนในบรรทดเดยวกน คนดวยชองวำงint(x), float(x), str(x):
คนคำ x ทถกเปลยนประเภทขอมลเปนจ�ำนวนเตม จ�ำนวนจรง และสตรงabs(n): คนคำสมบรณของ nround(f): คนคำจ�ำนวนเตมทเกดจำกกำรปดเศษจ�ำนวนจรง f โดยถำเศษของ f มคำตงแต 0.5 จะปดขน ถำนอยกวำ 0.5 จะปดลงround(f,d): คนคำจ�ำนวนจรงทเกดจำกกำรปดเศษจ�ำนวนจรง f โดยปดใหมจ�ำนวนตวเลขหลงจดทศนยม d หลกrange(start,stop [,step]) หรอ range(stop): คนคำเปนลสตของตวเลขตำมล�ำดบตงแต start ถง stop-step และ เพมขนทละ step (ถำไมระบ start จะมคำ 0 และ step จะมคำ 1)enumerate(L): คนลสตของ tuple (index, element) ของแตละ ขอมลในลสต Llen(a): คนคำเปนจ�ำนวนขอมลใน a ซง a อำจเปนลสต ดกชนนำร เซต ทเปล สตรง หรอ numpy array กไดmax(a), min(a): คนคำทมำก/นอยทสดของขอมลใน a ซง a อำจเปน ลสต ดกชนนำร เซต ทเปล หรอสตรงกได (numpy array ใช np.max(a), np.min(a)) ถำ a เปนดกชนนำร จะคนคำมำก/นอยทสดของ key ของดกชนนำรtype(a): คนคำประเภทของ a เชน type([1,2]) ได <class 'list'>list(), dict(), tuple(), set():
สรำงลสตวำง ดกชนนำรวำง ทเปลวำง เซตวำง
math.exp(x): คนคำ e ยกก�ำลง xmath.cos(x): คนคำ cosine ของ x เรเดยนmath.sin(x): คนคำ sine ของ x เรเดยนmath.sqrt(x): คนคำรำกทสองของ xmath.log(x,base): คนคำลอกำรทมของ x ฐำน basemath.degrees(x): แปลงมม x จำกเรเดยนเปนองศำmath.radians(x): แปลงมม x จำกองศำเปนเรเดยนmath.pi, math.e: คำคงท pi และ e
string s
s.lower(): คนสตรงใหมทมคำเหมอน s แตเปนตวพมพเลกทงหมดs.upper(): คนสตรงใหมทมคำเหมอน s แตเปนตวพมพใหญทงหมดs.find(sub): คน index แรกสดทพบ sub ใน s ถำไมพบคนคำ -1s.find(sub,i): คน index แรกสดทพบ sub ใน s โดยเรมคนท index is.count(sub): คนจ�ำนวนครงท sub ปรำกฏในสตรง ss.split(sep): คนลสตของสตรงทแยกดวย sep (หรอ space ถำไมระบ)s.strip(): คนสตรงใหมทมคำเหมอน s แตตด spaces หวทำยออกs.join(L): คนสตรงทสรำงจำกกำรน�ำแตละ element ในลสต L มำตอกน โดยม s เปนตวคนระหวำงขอมลทตอกน (L ตองเปนลสตของสตรง)
import numpy as np
np.array(L): คนคำ numpy array ทสรำงจำกลสต Lnp.arange(start,stop,step): คนอำเรย 1 มตของจ�ำนวนทมคำตำม start,stop,step
np.ones(shape): คนอำเรยทมคำ 1 ทงหมด มขนำดตำม tuple shapenp.zeros(shape): คนอำเรยทมคำ 0 ทงหมด มขนำดตำม tuple shapenp.identity(size): คนอำเรยขนำด size x size ซงมขอมลในแนว เสนทแยงมมเปน 1 และคำในต�ำแหนงอน ๆ เปน 0np.empty_like(a): คนอำเรยใหมทมขนำดเหมอน a แตไมมกำรก�ำหนด คำขอมลในอำเรยใหมนnp.add(a,b), np.subtract(a,b), np.multiply(a,b), np.divide(a,b):
คนคำอำเรยใหมทเปนผลบวกลบคณหำรแบบชองตอชองของ a และ bnp.dot(a,b): คนอำเรยทเปนผลคณแบบเมทรกซของ a และ bnp.sin(a), np.cos(a), np.sqrt(a), np.abs(a):
คนอำเรยทมคำของขอมลในแตละต�ำแหนงเปนผลจำกกำรเรยกฟงกชน sine, cosine, sqrt, abs กบขอมลในอำเรย a ทต�ำแหนงเดยวกนnp.max(a,axis), np.min(a,axis): คนอำเรยของคำมำก/นอยทสด ใน a ตำม axis ทก�ำหนดnp.argmax(a,axis), np.argmin(a,axis): คนอำเรยของ index ทมคำมำก/นอยทสดใน a ตำม axis ทก�ำหนด ตวอยำงเชน a = np.array([ [2, 4, 6], [8, 10, 12] ])
np.max(a) คนคำ 12, np.argmax(a) คนคำ 5 np.max(a,axis=0) คนคำ array([8,10,12]) np.argmax(a,axis=0) คนคำ array([1,1,1]) np.argmax(a,axis=1) คนคำ array([2,2])np.sum(), np.std(), np.mean(): มกำรใชงำนเหมอน np.max()np.ndenumerate(a): คนลสตของ tuple (position,element) ของ แตละขอมลใน a โดย position เปน tuple ทเกบต�ำแหนงของขอมล
list L
L.append(e): เพม e ไปททำยลสต LL.insert(index,e): เพม e ไปทต�ำแหนง index ในลสต LL.pop(index): ลบขอมลทต�ำแหนง index และคนคำขอมลทถกลบL.count(e): คนจ�ำนวนครงท e ปรำกฏในลสต L
dict D
D.items(): คนลสตของ tuple (key, value) ของดกชนนำร DD.keys(): คนลสตของ key ทงหมดของดกชนนำร DD.values(): คนลสตของ value ทงหมดของดกชนนำร DD.pop(k): ลบขอมลใน D ทม key เปน k และคนคำ value ของ key นนD.update(D1): เพมขอมลจำกดกชนนำร D1 เขำไปใน D
set S
S.add(e): เพม e ในเซต SS.difference(T): คนเซตใหมทเทำกบ S-TS.discard(e): ลบ e ออกจำกเซต S ถำไมม e ใน S กไมท�ำอะไรS.intersection(T): คนเซตใหมทเทำกบ S ∩ TS.union(T): คนเซตใหมทเทำกบ S U TS.issubset(T): ทดสอบวำ S ⊆ T หรอไมS.issuperset(T): ทดสอบวำ S ⊇ T หรอไมS.pop(): ลบขอมลหนงตวออกจำกเซต S และคนขอมลทถกลบS.update(T): ให S = S U T
Find job opportunities at jobs.exxonmobil.com