python ๑๐๑ ·...

170

Upload: others

Post on 21-Jan-2020

6 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Python ๑๐๑ · นิสิตช่วยสอนที่ร่วมกันสร้างโจทย์ปัญหา สอน และปรับปรุงวิชา
Page 2: Python ๑๐๑ · นิสิตช่วยสอนที่ร่วมกันสร้างโจทย์ปัญหา สอน และปรับปรุงวิชา

Python ๑๐๑

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

v1.0.1

ผอานสามารถดาวนโหลดหนงสอรนลาสด

และรวมแสดงความคดเหน/ขอแนะน�าเกยวกบหนงสอเลมนท

www.cp.eng.chula.ac.th/books/python101

ขอบคณครบ

Page 3: Python ๑๐๑ · นิสิตช่วยสอนที่ร่วมกันสร้างโจทย์ปัญหา สอน และปรับปรุงวิชา

กตตภณ พละการ, กตตภพ พละการ, สมชาย ประสทธจตระกล, สกร สนธภญโญ

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

Page 4: Python ๑๐๑ · นิสิตช่วยสอนที่ร่วมกันสร้างโจทย์ปัญหา สอน และปรับปรุงวิชา

ค�ำน�ำ

วชา ๒๑๑๐๑๐๑ การเขยนโปรแกรมคอมพวเตอร เปนหนงในวชาพนฐานทางวศวกรรมศาสตร ทนสตชนปท ๑

คณะวศวกรรมศาสตร ทกคนตองลงทะเบยนเรยน วตถประสงคหลกของวชานคอ ใหนสตเขาใจหลกการในการใชค�าสงตาง ๆ

ของภาษาโปรแกรม เพอเขยนโปรแกรมคอมพวเตอรใหตรงตามขอก�าหนดทไดรบ การเขยนโปรแกรมเปนความสามารถทตอง

ลงมอฝกฝนฝกปฏบตดวยตนเอง เหมอนกบทกษะอนทางวศวกรรมทจ�าเปนตองฝก ๆ ๆ ใหช�านาญจงจะไดผล ไมสามารถไดมา

ดวยการอาน ๆ ๆ จ�า ๆ ๆ

หนงสอ Python ๑๐๑ เลมนถกจดท�าขน เพอใหนสตใชทบทวนเนอหาหลงชมภาพยนตรบรรยายเนอหาดวยตนเอง

ในแตละบท ใชเตรยมตวกอนเขาเรยน และใชระหวางการเขยนโปรแกรมจรงในหองปฏบตการทจดขนเปนกจกรรมประจ�าทกสปดาห

โดยมระบบ Grader ชวยตรวจสอบความถกตองของผลการท�างานของโปรแกรมอยางอตโนมต นสตจะไดฝกเขยนโปรแกรมตาม

โจทย ฝกหาทผด และฝกตรวจสอบความถกตองของโปรแกรมทพฒนาขน นอกจากน ยงมแบบฝกปฏบตเพมเตมอกมากมายใน

ระบบ Grader ใหนสตไดท�าเสรมอกดวย

ผเขยนตองขอขอบคณ ผศ. ดร. นทท นภานนท ผปรบปรงระบบตรวจโปรแกรมอตโนมต Grader เพอใชประกอบ

การเรยน การสอน และการสอบวชาการเขยนโปรแกรมมาตงแตปการศกษา ๒๕๕๗ ขอขอบคณบคลากรของศนยคอมพวเตอร

คณะวศวกรรมศาสตร ทใหบรการจดเตรยมความพรอมของอปกรณและเครอขายในหองปฏบตการ ขอขอบคณคณาจารยและ

นสตชวยสอนทรวมกนสรางโจทยปญหา สอน และปรบปรงวชา ๒๑๑๐๑๐๑ ตลอดมา ขอขอบคณ ภานกร สนทรเวชพงษ และ

อตคณ ออไอศรย ทชวยจดรปเลม และ กมลพรรณ ลวประเสรฐ ทชวยออกแบบหนาปก ขอขอบคณภาควชาวศวกรรมคอมพวเตอร

ทใหการสนบสนนในสารพดเรอง และทายสดทตองขอบคณทสดกคอ นสตคณะวศวฯ กวาหลายพนคนทขยนหมนศกษาและฝาฟน

อปสรรคในการเรยนวชาพนฐานบงคบทคอนขางไมคนเคยนจนส�าเรจ *

กตตภณ พละการ

กตตภพ พละการ สมชาย ประสทธจตระกล

(ผเรยบเรยงและรวบรวมเนอหา)

สกร สนธภญโญ (ทปรกษา)

ภาควชาวศวกรรมคอมพวเตอร

คณะวศวกรรมศาสตร

จฬาลงกรณมหาวทยาลย

๑๒ สงหาคม ๒๕๖๐

* ภาควชาวศวกรรมคอมพวเตอรขอขอบคณ บรษท เอกซอนโมบล จ�ากด ทใหการสนบสนนคาใชจายส�าหรบการจดพมพใหกบ

นสตทกคนทลงทะเบยนเรยนวชา ๒๑๑๐๑๐๑ ใชประกอบการเรยนในปการศกษา ๒๕๖๐

Page 5: Python ๑๐๑ · นิสิตช่วยสอนที่ร่วมกันสร้างโจทย์ปัญหา สอน และปรับปรุงวิชา

ขอขอบคณ

คณาจารยคณะวศวกรรมศาสตร จฬาลงกรณมหาวทยาลย

ผศ. ดร. ชยเชษฐ สายวจตร

ศ. ดร. ไพศาล กตตศภกร

รศ. ดร. อาณต เรองรศม

รศ. ดร. พสทธ เพยรมนกล

อ. ดร. กรวก ตนกษรานนท

อ. ดร. พรรณ แสงแกว

รศ. ดร. ณฐชา ทวแสงสกลไทย

อ. ดร. เชษฐา พนธเครอบตร

อ. ดร. สรฐ ขวญเมอง

ผศ. ดร. อนรกษ ศรอรยวฒน

ผศ. ดร. จรวฒน ชวรงโรจน

ผศ. ดร. ณฐวฒ หนไพโรจน

ศษยเกาภาควชาวศวกรรมคอมพวเตอร

คณะวศวกรรมศาสตร จฬาลงกรณมหาวทยาลย

คณวโรรส โรจนะ

คณธนาวฒน มาลาบปผา

คณลสา ตรงประกอบ

คณภทราวธ ซอสตยาศลป

คณวโรจน จรพฒนกล

คณสภชย สตณฑวบลย

คณศภเสฏฐ ชชยศร

คณณฐชยา ลละศภกล

ทกรณาใหความรถงความส�าคญของการเขยนโปรแกรมกบงานทางวศวกรรมในสาขาตาง ๆ

ขอขอบคณภาพประกอบจาก

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 (ภาพประกอบค�าอธบายเนอหา)

Page 6: Python ๑๐๑ · นิสิตช่วยสอนที่ร่วมกันสร้างโจทย์ปัญหา สอน และปรับปรุงวิชา

สำรบญ

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

Page 7: Python ๑๐๑ · นิสิตช่วยสอนที่ร่วมกันสร้างโจทย์ปัญหา สอน และปรับปรุงวิชา

คณาจารยวชา ๒๑๑๐๑๐๑ ปการศกษา ๒๕๕๘ - ๒๕๕๙

อ. ดร. ชยรต พงศพนธภาณ

ผศ. เชษฐ พฒโนทย

อ. ดร. ฐต ศรบรณ

อ. ดร. ดวงดาว วชาดากล

ผศ. ดร. ธนารตน ชลดาพงศ

ศ. ดร. ประภาส จงสถตยวฒนา

ผศ. ดร. พรพล เวทกล

รศ. มณฑนา ปราการสมทร

ผศ. ดร. วระ เหมองสน

รศ. ดร. สมชาย ประสทธจตระกล

ผศ. ดร. สกร สนธภญโญ

นสตชวยสอนวชา ๒๑๑๐๑๐๑ ปการศกษา ๒๕๕๘ - ๒๕๕๙

กบล กาญจมาภรณกล

กตตภณ พละการ

กตตภพ พละการ

ไกรฤกษ ตรทพสนทร

คณศร ทองประไพแสง

ชานนท ภทรธยานนท

ณฐชนน ผจงกจพพฒน

ธนานพ กอบชยสวสด

ธรพงศ ปานบญยน

ธรภทร ชนธนกจ

ธราพร ศภกล

ลทธพล จระประดษฐ

วรยทธ วงศนล

สทธพงษ เหลาโกก

สทศไนย หลาธรรม

อรญชย ชวะโนทย

อสรา วชาค�า

ภาควชาวศวกรรมคอมพวเตอร

คณะวศวกรรมศาสตร จฬาลงกรณมหาวทยาลย

Page 8: Python ๑๐๑ · นิสิตช่วยสอนที่ร่วมกันสร้างโจทย์ปัญหา สอน และปรับปรุงวิชา

00 : Programming in Engineering 1

ศ าสตรของวศวกรรมไฟฟาเปนศาสตรทครอบคลมความหลากหลาย มการ

เปลยนแปลงและมความพลวตอยางมากในปจจบน ในหลายโอกาส การสราง

ตนแบบเสมอนจรงอาจมตนทนสง หรอแทบเปนไปไมไดเลยในชวงเรมตนของโครงการ

ตาง ๆ ความสามารถในการใชทกษะการ Programming เพอวตถประสงคตาง ๆ เชน

การสรางแบบจ�าลองดวยคอมพวเตอรเพอการออกแบบ การศกษาความเปนไปได

ในการใชงาน การทดสอบสมรรถนะ หรอแมกระทงการจ�าลองเพอหาเหตการณท

เกนความคาดหมายของวศวกร จงเปนสงจ�าเปนอยางมากส�าหรบวศวกรไฟฟาทกสาขา

ในปจจบนและอนาคต

ผศ. ดร. ชยเชษฐ สายวจตรภาควชาวศวกรรมไฟฟา

ในทางวศวกรรมโยธา โปรแกรมมใชกนอยางมากเพอใชจ�าลองพฤตกรรมของ

โครงสรางเชน อาคาร สะพาน ฐานราก ภายใตการรบแรงซงจะท�าใหทราบ

แรงทเกดกบโครงสรางเพอทวศวกรโยธาจะท�าการออกแบบโครงสรางใหปลอดภย

และประหยด และในการกอสรางกตองใชโปรแกรมเพอการวางแผนและจดการ

การกอสราง นอกจากนนกมการใชโปรแกรมในการจ�าลองระบบขนสงเพอการออกแบบ

หรอวเคราะหระบบคมนาคมแบบตาง ๆ

รศ. ดร. อาณต เรองรศมภาควชาวศวกรรมโยธา

00 : Programming in Engineering

Programming เปนเครองมอทชวยในการหาค�าตอบเพออธบายปรากฏการณ

หรอพฤตกรรมพลวตของหนวยปฏบตการหรอกระบวนการตาง ๆ นอกจากน

ยงใชประมาณคาตวแปรหรอพารามเตอร และพฒนาไปสการท�านายปรากฏการณหรอ

พฤตกรรมพลวตของหนวยปฏบตการหรอกระบวนการตอไป

ศ. ดร. ไพศาล กตตศภกรภาควชาวศวกรรมเคม

Page 9: Python ๑๐๑ · นิสิตช่วยสอนที่ร่วมกันสร้างโจทย์ปัญหา สอน และปรับปรุงวิชา

2 00 : Programming in Engineering

Programming มความส�าคญตอการเรยนในสาขาวชาวศวกรรมนวเคลยรคอนขางมาก

การประมวลผลการตรวจวดรงสแบบทเปนจ�านวนนบรงส จ�านวนขอมลการนบรงส

มจ�านวนมากตอการวด เครองตรวจนบรงสตองใชโปรแกรมคอมพวเตอรในการรวบรวม

และประมวลผลขอมลมาสรางเปนแถบสเปกตรมขอมล ส�าหรบการประมวลผลทไดจากภาพ

การฉายรงสแบบภาพคอนทราสขาว-ด�า การถายภาพรงสแบบทะลผานและมสเตปการถาย

หมนรอบวตถนนทเรยกวา CT-scan เมอรวบรวมผลของแตละสเตปมารวมกนจะได

ภาพตดขวางของวตถหรอถามการวดในแนวตงดวยท�าใหไดภาพสดทายเปนภาพ 3D ซงจะได

เปนโมเดลทมรายละเอยดภายในดวย โดยเทคนคนท�าใหไดขอมลภายในของวตถหรอแมแต

ภายในของรางกายมนษยได และยงออกแบบโปรแกรมในการควบคมอปกรณการตรวจวดรงสใหท�างานไดอยางอตโนมต และ

ควบคมไดจากระยะไกล ท�าใหผใชรบปรมาณรงสนอยลง ส�าหรบระบบการควบคมการท�างานทงหมดของโรงไฟฟานวเคลยรนน

ท�าโดยโปรแกรมคอมพวเตอรทงหมด

อ. ดร. พรรณ แสงแกวภาควชาวศวกรรมนวเคลยร

ก ารเขยนโปรแกรมมความส�าคญกบงานทกดานของวศวกรรมส�ารวจ โดยเฉพาะ

อยางยงงานดาน GIS ทตองการการเขยนโปรแกรมในการจดการ ประมวลผล

วเคราะห และแสดงผลขอมล โดยเฉพาะขอมลขนาดใหญทซอฟตแวรพนฐาน

โดยทวไปเชน MS Excel ไมสามารถรองรบได นอกจากน ยงมความส�าคญตอการ

พฒนาซอฟตแวรดานแผนท โดยเฉพาะระบบแผนทบนเวบทตองอาศยการพฒนาดวย

การเขยนโปรแกรม และการเขยนโปรแกรมส�าคญมากทสดกบการศกษาในระดบสง

เนองจากจะตองพฒนาซอฟตแวรใหมขนมาใหมเอง

อ. ดร. กรวก ตนกษรานนทภาควชาวศวกรรมส�ารวจ

ก ารเรยนวศวกรรมสงแวดลอม บอยครง เราตองค�านวณและสรปผลวเคราะห

คาพารามเตอรทางสงแวดลอมซงค�านวณไมงาย และกไมซบซอนถงขนาดตองเรยน

ภาคคอม ฯ การทนสตไดเรยน Programming เบองตน จะสามารถชวยใหนสตสามารถ

ตอยอดความรไปสงานวศวกรรมสงแวดลอมในโลกอนาคตไดอยางงายดาย

รศ. ดร. พสทธ เพยรมนกลภาควชาวศวกรรมสงแวดลอม

Page 10: Python ๑๐๑ · นิสิตช่วยสอนที่ร่วมกันสร้างโจทย์ปัญหา สอน และปรับปรุงวิชา

00 : Programming in Engineering 3

บทบาทของวศวกรรมอตสาหการ คอ การออกแบบ ด�าเนนการ ปรบปรงและ

สรางสรรคนวตกรรมระบบ ทงการผลต บรการ และ ธรกจ

ทกษะ Programming ชวยใหมตรรกะการคดอยางมเหตผล อกทงยงเปน

เครองมอในการวเคราะหและประมวลผลอยางรวดเรวและแมนย�าตามตวแปรและ

ขอจ�ากดในบรบทหนง ๆ ซงมความซบซอนมากขนในอนาคต

รศ. ดร. ณฐชา ทวแสงสกลไทยภาควชาวศวกรรมอตสาหการ

Programming เปนเครองมอทใชในการสราง ค�านวณและวเคราะหผลของ

แบบจ�าลองทางวศวกรรมของระบบทางกล ความรอน ของแขงและของไหล

นอกจากแบบจ�าลองแลว ยงใชในการควบคมระบบทางกลตาง ๆ เชน ระบบ

อตโนมตหนยนต เปนตน

อ. ดร. สรฐ ขวญเมองภาควชาวศวกรรมเครองกล

วทยาการทางดานวศวกรรมโลหการและวสด เปนความรทเกยวของกบหลกการพนฐาน

ของวสดตาง ๆ กระบวนการแปรรปและขนรปโลหะ สมบตของวสด และการเลอก

และออกแบบวสดทเหมาะสมกบงานทหลากหลาย ดงนน เพอใหสามารถพฒนาวสดใหม

ใหมสมบตตาง ๆ ทดขน Computer Programming จงเขามามบทบาทส�าคญในการ

สรางแบบจ�าลองตาง ๆ เพอเชอมโยงความสมพนธระหวาง กระบวนการผลต - โครงสราง

ของวสด - สมบตของวสด - ความสามารถในการใชงาน ในปจจบนมการน�า Computer

Programming เขามาใชอยางแพรหลายมากขน อาทเชน การท�านายโครงสราง

จลภาคของวสดภายหลงการขนรปดวยกรรมวธตาง ๆ เชน Casting, 3D printing,

Metal Forming จนสามารถท�าใหปรบปรงใหวสดมความแขงแรงทสงขนได หรอมการ

น�ามาใชเพอท�านายการพงเสยหายของวสดจากการเกด Fatigue และ Corrosion ท�าให

สามารถวางแผนการซอมบ�ารงไดอยางเหมาะสมมากขน นอกจากนนยงมการน�า Artificial Intelligence เขามาใชเพอหา

สวนผสมของวสดใหม ๆ ทยงไมเคยมการคนพบอกดวย

อ. ดร. เชษฐา พนธเครอบตรภาควชาวศวกรรมโลหการ

Page 11: Python ๑๐๑ · นิสิตช่วยสอนที่ร่วมกันสร้างโจทย์ปัญหา สอน และปรับปรุงวิชา

4 00 : Programming in Engineering

ง านทางด านวศวกรรมแหล งน� ามความจ�าเป นทจะต องย ง เกยวกบข อมล

จ�านวนมาก ทงขอมลน�าฝน ขอมลน�าทา ขอมลสภาพพนท ขอมลความตองการการใชน�า

Programming จงเปนเครองมอส�าคญในการชวยจดการ วเคราะห และประมวลผล

ขอมลตาง ๆ อยางมประสทธภาพ

ผศ. ดร. อนรกษ ศรอรยวฒนภาควชาวศวกรรมแหลงน�า

ก ารใชแบบจ�าลองแหลงกกเกบปโตรเลยมเปนสงจ�าเปนในงานวศวกรรมปโตรเลยม

เพอท�าความเขาใจกบพฤตกรรมการผลตในอดตและปจจบน และยงใชท�านาย

การผลตในอนาคตอกดวย นอกจากนปรมาณขอมลการผลตทถกจดเกบอยางตอเนอง

จ�าเปนตองมการบรหารจดการทด เพอใหวศวกรสามารถน�าไปใชประโยชนไดหลากหลาย

รปแบบ ความส�าคญของการเขาใจและสามารถเขยนโปรแกรมเพอใชงานเปนการเฉพาะ

เปนสงจ�าเปนส�าหรบวศวกรปโตรเลยม

ส�าหรบงานวศวกรรมเหมองแรมการน�า Programming ไปใชในการออกแบบ

การท�าเหมองแร เชน การเปดหนาดนเพอน�าแรออกมา การค�านวณเสถยรภาพของ

ชนดน การขนสงวตถดบจากบรเวณหนาเหมอง การใชธรณสถตเพอประกอบการค�านวณ

ปรมาณส�ารอง เปนตน

ผศ. ดร. จรวฒน ชวรงโรจนภาควชาวศวกรรมเหมองแรและปโตรเลยม

ก ารทมนษยเราเปนสตวสงคมทอยรวมกน ท�าใหสงทเราจะเรยนรตงแตเดก ๆ คอภาษา

ทเราใชในการสอสารระหวางกน เพอใหมนษยเราสามารถเขาใจกนไดเปนอยางด

เฉกเชนเดยวกน การทจะเขาใจสงตาง ๆ ในโลกปจจบน ทเปนโลกดจตอล จ�าเปนอยางยง

ทเราจะตองเรยนรภาษาทคอมพวเตอรเขาใจ ดงเชนภาษา Python ซงจะชวยใหเราไดเขาใจ

การท�างานของคอมพวเตอรมากยงขน ดงนน นสตทศกษาในภาควชาวศวกรรมคอมพวเตอร

มความจ�าเปนอยางยงทจะตองเรยนรการเขยนโปรแกรม เพราะไมเพยงแตจะตองเขาใจ

กลไกและกระบวนการท�างานของคอมพวเตอรเทานน แตยงจะตองสามารถเขยนโปรแกรม

เพอควบคมการท�างานของคอมพวเตอรไดอยางเหมาะสมและมประสทธภาพ

ผศ. ดร. ณฐวฒ หนไพโรจนภาควชาวศวกรรมคอมพวเตอร

Page 12: 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

Page 13: Python ๑๐๑ · นิสิตช่วยสอนที่ร่วมกันสร้างโจทย์ปัญหา สอน และปรับปรุงวิชา

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

Page 14: Python ๑๐๑ · นิสิตช่วยสอนที่ร่วมกันสร้างโจทย์ปัญหา สอน และปรับปรุงวิชา

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 ทค�ำนวณได

Page 15: Python ๑๐๑ · นิสิตช่วยสอนที่ร่วมกันสร้างโจทย์ปัญหา สอน และปรับปรุงวิชา

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 (คนดวยชองวำง)

Page 16: Python ๑๐๑ · นิสิตช่วยสอนที่ร่วมกันสร้างโจทย์ปัญหา สอน และปรับปรุงวิชา

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)

Page 17: Python ๑๐๑ · นิสิตช่วยสอนที่ร่วมกันสร้างโจทย์ปัญหา สอน และปรับปรุงวิชา

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

Page 18: Python ๑๐๑ · นิสิตช่วยสอนที่ร่วมกันสร้างโจทย์ปัญหา สอน และปรับปรุงวิชา

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 เปนองศำไดผลเปนเรเดยน

Page 19: Python ๑๐๑ · นิสิตช่วยสอนที่ร่วมกันสร้างโจทย์ปัญหา สอน และปรับปรุงวิชา

12 01 : Data Type, Variable and Expression

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

แปลงอณหภม สตรในกำรเปลยนคำจำกองศำเซลเซยสไปเปนองศำฟำเรนไฮตและเคลวนมดงน

ใหอำนขอมลอณหภม (หนวยเปนองศำเซลเซยส) จำกนนค�ำนวณหำคำองศำฟำเรนไฮตและเคลวนดวยสมกำรดำนบน เมอ C คอ องศำเซลเซยส F คอ องศำฟำเรนไฮต และ K คอ เคลวน

► ขอมลน�ำเขำ

หนงบรรทดประกอบดวยคำองศำเซลเซยสเปนจ�ำนวนจรง

► ขอมลสงออก

มหนงบรรทดประกอบดวยตวเลขจ�ำนวนจรงสองจ�ำนวน ตวแรกเปนองศำฟำเรนไฮต และตวทสองเปนเคลวน

► ตวอยำง

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

39.85 103.73 313.0

Page 20: Python ๑๐๑ · นิสิตช่วยสอนที่ร่วมกันสร้างโจทย์ปัญหา สอน และปรับปรุงวิชา

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. แสดงควำมยำวดำนทค�ำนวณไดทำงจอภำพในรปแบบทแสดงตำมตวอยำง

Page 21: Python ๑๐๑ · นิสิตช่วยสอนที่ร่วมกันสร้างโจทย์ปัญหา สอน และปรับปรุงวิชา

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

Page 22: Python ๑๐๑ · นิสิตช่วยสอนที่ร่วมกันสร้างโจทย์ปัญหา สอน และปรับปรุงวิชา

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

Page 23: Python ๑๐๑ · นิสิตช่วยสอนที่ร่วมกันสร้างโจทย์ปัญหา สอน และปรับปรุงวิชา

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'

Page 24: Python ๑๐๑ · นิสิตช่วยสอนที่ร่วมกันสร้างโจทย์ปัญหา สอน และปรับปรุงวิชา

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 จะผด)

Page 25: Python ๑๐๑ · นิสิตช่วยสอนที่ร่วมกันสร้างโจทย์ปัญหา สอน และปรับปรุงวิชา

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'

Page 26: Python ๑๐๑ · นิสิตช่วยสอนที่ร่วมกันสร้างโจทย์ปัญหา สอน และปรับปรุงวิชา

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

Page 27: Python ๑๐๑ · นิสิตช่วยสอนที่ร่วมกันสร้างโจทย์ปัญหา สอน และปรับปรุงวิชา

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: ขนาดเสอโปโลตามรอบอกทไดรบ

Page 28: Python ๑๐๑ · นิสิตช่วยสอนที่ร่วมกันสร้างโจทย์ปัญหา สอน และปรับปรุงวิชา

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 บาทไมตรงตามตวอยาง ไดแครางวลทหนง เลขทายตรวจไมพบ

Page 29: Python ๑๐๑ · นิสิตช่วยสอนที่ร่วมกันสร้างโจทย์ปัญหา สอน และปรับปรุงวิชา

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

Page 30: Python ๑๐๑ · นิสิตช่วยสอนที่ร่วมกันสร้างโจทย์ปัญหา สอน และปรับปรุงวิชา

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 ถกตอง

Page 31: Python ๑๐๑ · นิสิตช่วยสอนที่ร่วมกันสร้างโจทย์ปัญหา สอน และปรับปรุงวิชา

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 ถกตอง

Page 32: Python ๑๐๑ · นิสิตช่วยสอนที่ร่วมกันสร้างโจทย์ปัญหา สอน และปรับปรุงวิชา

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

Page 33: Python ๑๐๑ · นิสิตช่วยสอนที่ร่วมกันสร้างโจทย์ปัญหา สอน และปรับปรุงวิชา

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

Page 34: Python ๑๐๑ · นิสิตช่วยสอนที่ร่วมกันสร้างโจทย์ปัญหา สอน และปรับปรุงวิชา

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

Page 35: Python ๑๐๑ · นิสิตช่วยสอนที่ร่วมกันสร้างโจทย์ปัญหา สอน และปรับปรุงวิชา

วโรรส โรจนะ Intania 85

CEO & Co-Founder Dek-D Interactive co., ltd.

Programming จ�ำเปนมำกในกำรเรมกจกำรดำน IT เพรำะกจกำรสวนใหญทสำมำรถอยรอดได ผกอตงซงเปน

ผทเขำใจผลตภณฑทจะสรำงมำกทสด ตองมสวนรวมในกำรพฒนำระบบเอง ถงจะสำมำรถถำยทอดควำมคด และ

ผลกดนผลตภณฑทดออกมำได เรยกวำมเงนมำกแคไหน ถำตองไปจำงใหคนอนมำเขยนโปรแกรมแทนใหยงไงกส

คนทมทงไอเดย และทกษะลงมอเขยนโปรแกรมเองไดยำก

นอกจำกน Programming ยงเปนกำรฝกวธคดแกปญหำอยำงเปนขนตอน ท�ำใหผเรยนมระบบกำรคดซงสำมำรถ

ประยกตไปแกปญหำไดในหลำยแขนงอยำงทผเรยนคำดไมถงอกดวย (เทพในหลำย ๆ วงกำรจบวศวฯ คอม)

Page 36: Python ๑๐๑ · นิสิตช่วยสอนที่ร่วมกันสร้างโจทย์ปัญหา สอน และปรับปรุงวิชา

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

Page 37: Python ๑๐๑ · นิสิตช่วยสอนที่ร่วมกันสร้างโจทย์ปัญหา สอน และปรับปรุงวิชา

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

Page 38: Python ๑๐๑ · นิสิตช่วยสอนที่ร่วมกันสร้างโจทย์ปัญหา สอน และปรับปรุงวิชา

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

Page 39: Python ๑๐๑ · นิสิตช่วยสอนที่ร่วมกันสร้างโจทย์ปัญหา สอน และปรับปรุงวิชา

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 )

Page 40: Python ๑๐๑ · นิสิตช่วยสอนที่ร่วมกันสร้างโจทย์ปัญหา สอน และปรับปรุงวิชา

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)

กจะพบวาขาดไปรอบ

Page 41: Python ๑๐๑ · นิสิตช่วยสอนที่ร่วมกันสร้างโจทย์ปัญหา สอน และปรับปรุงวิชา

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 จงไมมคำ

Page 42: Python ๑๐๑ · นิสิตช่วยสอนที่ร่วมกันสร้างโจทย์ปัญหา สอน และปรับปรุงวิชา

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: คาทค�านวณได

Page 43: Python ๑๐๑ · นิสิตช่วยสอนที่ร่วมกันสร้างโจทย์ปัญหา สอน และปรับปรุงวิชา

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

Page 44: Python ๑๐๑ · นิสิตช่วยสอนที่ร่วมกันสร้างโจทย์ปัญหา สอน และปรับปรุงวิชา

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))กพบวาผดดวยเหตผลเดยวกน

Page 45: Python ๑๐๑ · นิสิตช่วยสอนที่ร่วมกันสร้างโจทย์ปัญหา สอน และปรับปรุงวิชา

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 ผด เกดอะไรขน ?

Page 46: Python ๑๐๑ · นิสิตช่วยสอนที่ร่วมกันสร้างโจทย์ปัญหา สอน และปรับปรุงวิชา

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

Page 47: Python ๑๐๑ · นิสิตช่วยสอนที่ร่วมกันสร้างโจทย์ปัญหา สอน และปรับปรุงวิชา

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

Page 48: Python ๑๐๑ · นิสิตช่วยสอนที่ร่วมกันสร้างโจทย์ปัญหา สอน และปรับปรุงวิชา

03 : Repetition ( while, for ) 41

สามเหลยมมมฉาก โจทยนสนใจเฉพาะสามเหลยมมมฉากทความยาวดานทกดานเปนจ�านวนเตม

จงเขยนโปรแกรมอานคาความยาวเสนรอบรปจากแปนพมพ เพอหาจ�านวนเตมมากสดทเปนความยาวของดานตรงขามมมฉากของสามเหลยมมมฉากทมความยาวเสนรอบรปตามทไดรบ เชน ใหเสนรอบรปของสามเหลยมยาว 90 จะมสามเหลยมมมฉากตามขอก�าหนดอยสองรปคอ 15, 36, 39 และ 9, 40, 41 ค�าตอบทตองการคอ 41 เพราะเปนความยาวดานตรงขามมมฉากทยาวสดของสามเหลยมมมฉากตามขอก�าหนด และมเสนรอบรปยาว 90

► ขอมลน�าเขา

มบรรทดเดยวเปนจ�านวนเตมบวก แทนความยาวเสนรอบรปของสามเหลยมมมฉากตามขอก�าหนด (รบประกนวา มสามเหลยมมมฉากทมความยาวเสนรอบรปเทากบจ�านวนทเปนขอมลน�าเขา)

► ขอมลสงออก

มบรรทดเดยวแสดงความยาวของดานตรงขามมมฉากทยาวทสดของสามเหลยมมมฉากตามขอก�าหนด

► ตวอยาง

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

30 13

90 41

Page 49: Python ๑๐๑ · นิสิตช่วยสอนที่ร่วมกันสร้างโจทย์ปัญหา สอน และปรับปรุงวิชา

ธนาวฒน มาลาบปผา Intania 84

CEO & Co-Founder of Priceza

Programming เปนหนงในวชำทผมชอบเรยนมำกทสดวชำนงเลยตอนป  1  เหตผลเพรำะวำมนชวยใหผมม

กระบวนกำรคดและกำรแกปญหำตำง ๆ  อยำงเปนระบบ จนมำถงตอนทอยำกท�ำ Startup สรำง Priceza ขนมำ 

ดวยควำมเขำใจใน Programming ท�ำใหผมมพนฐำนวธคดในกำรศกษำพฒนำระบบตำง ๆ ทเรำไมเคยพฒนำ

ขนมำกอน และท�ำใหเรำศกษำและวจยตงแตตน จนพฒนำมนขนมำไดในทสด

Programming  ท�ำใหเรำรจกคดและรจกสอสำร  และไมใชกำรคดและกำรสอสำรแบบทว  ๆ  ไป  แตเปน

กำรคดอยำงเปนระบบ  คดอยำงรอบคอบ  คดในทก  ๆ  ควำมเปนไปได  และเปนกำรสอสำรทตองชดเจนททง

ผสงสำรและผรบสำรตองเขำใจไปในทำงเดยวกน ถำมอะไรผดพลำดแมเพยงนดเดยว ลมคดไปนดนง สอสำรผดไป

เลกนอย ผลกจะออกมำไมไดอยำงทวำงแผนไว กำรคดและกำรสอสำรแบบนสำมำรถน�ำไปใชกบอะไรกได และสำมำรถ

สรำงผลลพธเปนอะไรกไดตำมแตทใจเรำอยำกใหเปน

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

Google Inc.

Page 50: Python ๑๐๑ · นิสิตช่วยสอนที่ร่วมกันสร้างโจทย์ปัญหา สอน และปรับปรุงวิชา

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'

Page 51: Python ๑๐๑ · นิสิตช่วยสอนที่ร่วมกันสร้างโจทย์ปัญหา สอน และปรับปรุงวิชา

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

Page 52: Python ๑๐๑ · นิสิตช่วยสอนที่ร่วมกันสร้างโจทย์ปัญหา สอน และปรับปรุงวิชา

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

Page 53: Python ๑๐๑ · นิสิตช่วยสอนที่ร่วมกันสร้างโจทย์ปัญหา สอน และปรับปรุงวิชา

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)

Page 54: Python ๑๐๑ · นิสิตช่วยสอนที่ร่วมกันสร้างโจทย์ปัญหา สอน และปรับปรุงวิชา

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: สตรงใหมทตองการ

Page 55: Python ๑๐๑ · นิสิตช่วยสอนที่ร่วมกันสร้างโจทย์ปัญหา สอน และปรับปรุงวิชา

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: จ�านวนเตมทได

Page 56: Python ๑๐๑ · นิสิตช่วยสอนที่ร่วมกันสร้างโจทย์ปัญหา สอน และปรับปรุงวิชา

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 ออกจากวงวนได (คอรวามเลขซ�าแลว)

Page 57: Python ๑๐๑ · นิสิตช่วยสอนที่ร่วมกันสร้างโจทย์ปัญหา สอน และปรับปรุงวิชา

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, แสดงวามซ�า, ถกตอง

Page 58: Python ๑๐๑ · นิสิตช่วยสอนที่ร่วมกันสร้างโจทย์ปัญหา สอน และปรับปรุงวิชา

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

Page 59: Python ๑๐๑ · นิสิตช่วยสอนที่ร่วมกันสร้างโจทย์ปัญหา สอน และปรับปรุงวิชา

52 04 : String

นบตวอกษรพมพใหญ ใหเขยนโปรแกรมอานขอมลทเปนสตรงเขามาหนงบรรทด ประกอบดวยอกขระอะไรกได เวนวรรคกได จากนนใหนบเฉพาะตวอกษรทเปนตวใหญเทานน และแสดงผลลพธออกมาทางหนาจอ

► ขอมลน�าเขา

ม 1 บรรทด ประกอบดวยสตรงทประกอบไปดวยตวอกขระอะไรกได เวนวรรคกได

► ขอมลสงออก

ม 1 บรรทด แสดงจ�านวนตวอกษรทเปนตวใหญทงหมดทนบไดจากขอมลน�าเขา

► ตวอยาง

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

HelLo WoRLd 5

PYTHON123 6

yes! 0

Page 60: Python ๑๐๑ · นิสิตช่วยสอนที่ร่วมกันสร้างโจทย์ปัญหา สอน และปรับปรุงวิชา

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

Page 61: Python ๑๐๑ · นิสิตช่วยสอนที่ร่วมกันสร้างโจทย์ปัญหา สอน และปรับปรุงวิชา

วรวร สตยวนจ (Product Manager) ภทราวธ ซอสตยาศลป (CTO) ยอด ชนสภคกล (CEO) ศภฤทธ กฤตยาเกยรณ (Software Architect) เอกลกษณ วรยะโกวทยา (COO)(จากซายไปขวา)

Intania 84Wongnai

ไมวำคณจะเรยนคณะอะไรหรอภำคอะไร Computer Programming  ไดกลำยมำเปนควำมรททกคนจ�ำเปน

ตองมไปแลว เพรำะเทคโนโลยเกดใหมในธรกจและอตสำหกรรมตำง ๆ ไมวำจะทำงดำนกำรคำขำย ธนำคำร 

กำรแพทย  โฆษณำ  บนเทง  กฬำ  เครองจกรและหนยนต  ฯลฯ  ลวนแลวแตตองใชควำมรดำน Computer

Programming  มำชวยพฒนำผลตภณฑหรอบรกำรใหดขนกวำเดม โดยควำมตองกำรนจะยงมำกขนมำกในอนำคต 

เมอผลตภณฑ บรกำร หรอแมกระทงเงนทเรำใชซอสนคำตำง ๆ ถกแปลงไปอยในรปแบบดจตอล จงเปนเรองส�ำคญมำก

ทเรำจะใสใจกบควำมรดำน Computer Programming  เพรำะมนคอ  “ทกษะทจ�ำเปน”  ของคนทจะสำมำรถรบมอ

กบควำมเปลยนแปลงของโลกดจตอล และพรอมเกบเกยวโอกำสทจะมำพรอมกบคลนยกษลกใหมในอนำคตอนใกลน

Page 62: Python ๑๐๑ · นิสิตช่วยสอนที่ร่วมกันสร้างโจทย์ปัญหา สอน และปรับปรุงวิชา

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

Page 63: Python ๑๐๑ · นิสิตช่วยสอนที่ร่วมกันสร้างโจทย์ปัญหา สอน และปรับปรุงวิชา

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

Page 64: Python ๑๐๑ · นิสิตช่วยสอนที่ร่วมกันสร้างโจทย์ปัญหา สอน และปรับปรุงวิชา

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:บรรทดละหนงหวขอออกทางจอภาพใหครบทกหวขอ

Page 65: Python ๑๐๑ · นิสิตช่วยสอนที่ร่วมกันสร้างโจทย์ปัญหา สอน และปรับปรุงวิชา

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

Page 66: Python ๑๐๑ · นิสิตช่วยสอนที่ร่วมกันสร้างโจทย์ปัญหา สอน และปรับปรุงวิชา

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สตรงจงตองหาทางแยกบรรทดใหเปนสองสตรงเลขประจ�าตวกบค�าตอบทงหลาย

Page 67: Python ๑๐๑ · นิสิตช่วยสอนที่ร่วมกันสร้างโจทย์ปัญหา สอน และปรับปรุงวิชา

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

Page 68: Python ๑๐๑ · นิสิตช่วยสอนที่ร่วมกันสร้างโจทย์ปัญหา สอน และปรับปรุงวิชา

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 ถกตองภาระทเหลอกแคเปลยนจากการแสดงผลออกหนาจอเปนการบนทกลงแฟมซงขอใหผอานลองเขยนตอเอง

Page 69: Python ๑๐๑ · นิสิตช่วยสอนที่ร่วมกันสร้างโจทย์ปัญหา สอน และปรับปรุงวิชา

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

Page 70: Python ๑๐๑ · นิสิตช่วยสอนที่ร่วมกันสร้างโจทย์ปัญหา สอน และปรับปรุงวิชา

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

Page 71: Python ๑๐๑ · นิสิตช่วยสอนที่ร่วมกันสร้างโจทย์ปัญหา สอน และปรับปรุงวิชา

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

Page 72: Python ๑๐๑ · นิสิตช่วยสอนที่ร่วมกันสร้างโจทย์ปัญหา สอน และปรับปรุงวิชา

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

Page 73: Python ๑๐๑ · นิสิตช่วยสอนที่ร่วมกันสร้างโจทย์ปัญหา สอน และปรับปรุงวิชา

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

Page 74: Python ๑๐๑ · นิสิตช่วยสอนที่ร่วมกันสร้างโจทย์ปัญหา สอน และปรับปรุงวิชา

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

Page 75: Python ๑๐๑ · นิสิตช่วยสอนที่ร่วมกันสร้างโจทย์ปัญหา สอน และปรับปรุงวิชา

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 ไดจ�ำนวนจรง

Page 76: Python ๑๐๑ · นิสิตช่วยสอนที่ร่วมกันสร้างโจทย์ปัญหา สอน และปรับปรุงวิชา

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

Page 77: Python ๑๐๑ · นิสิตช่วยสอนที่ร่วมกันสร้างโจทย์ปัญหา สอน และปรับปรุงวิชา

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: ขอมลทกตวทปรากฏซ�ากนมากสดในแฟม เรยงตามล�าดบทปรากฏในแฟม

Page 78: Python ๑๐๑ · นิสิตช่วยสอนที่ร่วมกันสร้างโจทย์ปัญหา สอน และปรับปรุงวิชา

06.1 : List 71

Problem Code

Input: หนงบรรทดเปนชอแฟมProcess: แสดงหวขอขาวทงหมดในแฟม หวขอขาว เปนขอความทอยระหวาง <headline> กบ </headline> ในแฟมน (ทง <headline> กบ </headline> อยในบรรทดเดยวกนแน ๆ และแตละบรรทดมไมเกน 1 หวขอขาว)Output: หนงบรรทดหนงหวขอ ใหครบทกหวขอ โดยแสดงเรยงหวขอตามตวอกษรจากนอยไปมาก

Input: หนงบรรทดเปนชอแฟม แฟมนเกบชอ บรรทดละหนงชอProcess: เรยงล�าดบชอทอานจากแฟม โดยเรยงล�าดบตามความยาวของชอจากนอยไปมาก ถามความยาวเทากน ใหเรยงตามตวอกษรแบบในพจนานกรมOutput: ล�าดบของชอตามทเรยงได

Page 79: Python ๑๐๑ · นิสิตช่วยสอนที่ร่วมกันสร้างโจทย์ปัญหา สอน และปรับปรุงวิชา

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

Page 80: Python ๑๐๑ · นิสิตช่วยสอนที่ร่วมกันสร้างโจทย์ปัญหา สอน และปรับปรุงวิชา

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 ถกตอง

Page 81: Python ๑๐๑ · นิสิตช่วยสอนที่ร่วมกันสร้างโจทย์ปัญหา สอน และปรับปรุงวิชา

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, ถกตอง

Page 82: Python ๑๐๑ · นิสิตช่วยสอนที่ร่วมกันสร้างโจทย์ปัญหา สอน และปรับปรุงวิชา

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)

Page 83: Python ๑๐๑ · นิสิตช่วยสอนที่ร่วมกันสร้างโจทย์ปัญหา สอน และปรับปรุงวิชา

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

Page 84: Python ๑๐๑ · นิสิตช่วยสอนที่ร่วมกันสร้างโจทย์ปัญหา สอน และปรับปรุงวิชา

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]

Page 85: Python ๑๐๑ · นิสิตช่วยสอนที่ร่วมกันสร้างโจทย์ปัญหา สอน และปรับปรุงวิชา

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: ลสตทสรำงได

Page 86: Python ๑๐๑ · นิสิตช่วยสอนที่ร่วมกันสร้างโจทย์ปัญหา สอน และปรับปรุงวิชา

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

Page 87: Python ๑๐๑ · นิสิตช่วยสอนที่ร่วมกันสร้างโจทย์ปัญหา สอน และปรับปรุงวิชา

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

Page 88: Python ๑๐๑ · นิสิตช่วยสอนที่ร่วมกันสร้างโจทย์ปัญหา สอน และปรับปรุงวิชา

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()เพอเรยงขอมลจำกนอยไปมำก เมอคะแนนรวมมคำมำก ตดลบคะแนนรวมจะมคำนอย กลำยเปนตองกำรเรยงคะแนนรวมจำกมำกไปนอย และถำเทำกน กเรยงรหสนสตจำกนอยไปมำก ตำมตองกำร ตอนแสดงคะแนนรวม กตองแสดงคำตดลบของคำทเกบดวย (เพรำะทเกบเปนคำตดลบ)

ลองเขยนโปรแกรมนใหม ถำเรำเปลยนกำรจดเกบขอมลจำก[ [รหสนกเรยน, คะแนน, ..., คะแนน], [รหสนกเรยน, คะแนน, ..., คะแนน], ... ]

เปน[ [รหสนกเรยน, [คะแนน, ..., คะแนน] ], [รหสนกเรยน, [คะแนน, ..., คะแนน] ], ... ]

Page 89: Python ๑๐๑ · นิสิตช่วยสอนที่ร่วมกันสร้างโจทย์ปัญหา สอน และปรับปรุงวิชา

ดร.วโรจน จรพฒนกล

Intania 87

กรรมการผจดการ บรษท สคลดโอ จ�ากด, อดตนกวทยาศาสตรขอมล (Data Scientist) ท Facebook

ควำมสำมำรถในการเขยนโปรแกรมเปนเหมอนพลงวเศษทชวยเพมขดควำมสำมำรถในกำรท�ำงำนของเรำ

ไมวำจะเปนกำรแกปญหำทำงวศวกรรมทซบซอน (simulation, optimization) กำรสงใหคอมพวเตอรท�ำงำน

ทซ�ำซำกนำเบอแทนเรำ  (automation)  กำรสอนใหคอมพวเตอรมควำมเฉลยวฉลำดและชวยเรำตดสนใจได 

(artificial  intelligence)  รวมไปถงกำรสรำงเวบหรอแอปทเปนประโยชนกบผคนในวงกวำง  เรยกไดวำเปนทกษะท

ขำดไมไดส�ำหรบนวตกรในยคน

Page 90: Python ๑๐๑ · นิสิตช่วยสอนที่ร่วมกันสร้างโจทย์ปัญหา สอน และปรับปรุงวิชา

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เชนกน

Page 91: Python ๑๐๑ · นิสิตช่วยสอนที่ร่วมกันสร้างโจทย์ปัญหา สอน และปรับปรุงวิชา

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

Page 92: Python ๑๐๑ · นิสิตช่วยสอนที่ร่วมกันสร้างโจทย์ปัญหา สอน และปรับปรุงวิชา

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ทกตวทตดลบ

Page 93: Python ๑๐๑ · นิสิตช่วยสอนที่ร่วมกันสร้างโจทย์ปัญหา สอน และปรับปรุงวิชา

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แตไมมตวซ�า (ใชวธทเขยนในขอทแลว)

Page 94: Python ๑๐๑ · นิสิตช่วยสอนที่ร่วมกันสร้างโจทย์ปัญหา สอน และปรับปรุงวิชา

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 )

Page 95: Python ๑๐๑ · นิสิตช่วยสอนที่ร่วมกันสร้างโจทย์ปัญหา สอน และปรับปรุงวิชา

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

Page 96: Python ๑๐๑ · นิสิตช่วยสอนที่ร่วมกันสร้างโจทย์ปัญหา สอน และปรับปรุงวิชา

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

Page 97: Python ๑๐๑ · นิสิตช่วยสอนที่ร่วมกันสร้างโจทย์ปัญหา สอน และปรับปรุงวิชา

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

Page 98: Python ๑๐๑ · นิสิตช่วยสอนที่ร่วมกันสร้างโจทย์ปัญหา สอน และปรับปรุงวิชา

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

Page 99: Python ๑๐๑ · นิสิตช่วยสอนที่ร่วมกันสร้างโจทย์ปัญหา สอน และปรับปรุงวิชา

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

Page 100: Python ๑๐๑ · นิสิตช่วยสอนที่ร่วมกันสร้างโจทย์ปัญหา สอน และปรับปรุงวิชา

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 ไมเรวเทา

Page 101: Python ๑๐๑ · นิสิตช่วยสอนที่ร่วมกันสร้างโจทย์ปัญหา สอน และปรับปรุงวิชา

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'

Page 102: Python ๑๐๑ · นิสิตช่วยสอนที่ร่วมกันสร้างโจทย์ปัญหา สอน และปรับปรุงวิชา

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

Page 103: Python ๑๐๑ · นิสิตช่วยสอนที่ร่วมกันสร้างโจทย์ปัญหา สอน และปรับปรุงวิชา

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 เรวมาก คนขอมลเรวมาก

Page 104: Python ๑๐๑ · นิสิตช่วยสอนที่ร่วมกันสร้างโจทย์ปัญหา สอน และปรับปรุงวิชา

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}

Page 105: Python ๑๐๑ · นิสิตช่วยสอนที่ร่วมกันสร้างโจทย์ปัญหา สอน และปรับปรุงวิชา

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 เปนสตรง (เพราะอะไร ?)

Page 106: Python ๑๐๑ · นิสิตช่วยสอนที่ร่วมกันสร้างโจทย์ปัญหา สอน และปรับปรุงวิชา

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]

Page 107: Python ๑๐๑ · นิสิตช่วยสอนที่ร่วมกันสร้างโจทย์ปัญหา สอน และปรับปรุงวิชา

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

Page 108: Python ๑๐๑ · นิสิตช่วยสอนที่ร่วมกันสร้างโจทย์ปัญหา สอน และปรับปรุงวิชา

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) อยากนบวาหมายเลขโทรศพทสวนใหญลงทายดวยเลขอะไร

Page 109: Python ๑๐๑ · นิสิตช่วยสอนที่ร่วมกันสร้างโจทย์ปัญหา สอน และปรับปรุงวิชา

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

Page 110: Python ๑๐๑ · นิสิตช่วยสอนที่ร่วมกันสร้างโจทย์ปัญหา สอน และปรับปรุงวิชา

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

}

Page 111: Python ๑๐๑ · นิสิตช่วยสอนที่ร่วมกันสร้างโจทย์ปัญหา สอน และปรับปรุงวิชา

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() สรางแบบนถงจะไดเซตวางทถกตอง

Page 112: Python ๑๐๑ · นิสิตช่วยสอนที่ร่วมกันสร้างโจทย์ปัญหา สอน และปรับปรุงวิชา

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

Page 113: Python ๑๐๑ · นิสิตช่วยสอนที่ร่วมกันสร้างโจทย์ปัญหา สอน และปรับปรุงวิชา

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

Page 114: Python ๑๐๑ · นิสิตช่วยสอนที่ร่วมกันสร้างโจทย์ปัญหา สอน และปรับปรุงวิชา

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

Page 115: Python ๑๐๑ · นิสิตช่วยสอนที่ร่วมกันสร้างโจทย์ปัญหา สอน และปรับปรุงวิชา

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

}

Page 116: Python ๑๐๑ · นิสิตช่วยสอนที่ร่วมกันสร้างโจทย์ปัญหา สอน และปรับปรุงวิชา

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

Page 117: Python ๑๐๑ · นิสิตช่วยสอนที่ร่วมกันสร้างโจทย์ปัญหา สอน และปรับปรุงวิชา

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)

Page 118: Python ๑๐๑ · นิสิตช่วยสอนที่ร่วมกันสร้างโจทย์ปัญหา สอน และปรับปรุงวิชา

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() ถกตอง

Page 119: Python ๑๐๑ · นิสิตช่วยสอนที่ร่วมกันสร้างโจทย์ปัญหา สอน และปรับปรุงวิชา

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: ลสตทสราง

Page 120: Python ๑๐๑ · นิสิตช่วยสอนที่ร่วมกันสร้างโจทย์ปัญหา สอน และปรับปรุงวิชา

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

Page 121: Python ๑๐๑ · นิสิตช่วยสอนที่ร่วมกันสร้างโจทย์ปัญหา สอน และปรับปรุงวิชา

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

Page 122: Python ๑๐๑ · นิสิตช่วยสอนที่ร่วมกันสร้างโจทย์ปัญหา สอน และปรับปรุงวิชา

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)

Page 123: Python ๑๐๑ · นิสิตช่วยสอนที่ร่วมกันสร้างโจทย์ปัญหา สอน และปรับปรุงวิชา

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 ท�าใหฟงกชนท�างาน

ไดถกตองแลว

Page 124: Python ๑๐๑ · นิสิตช่วยสอนที่ร่วมกันสร้างโจทย์ปัญหา สอน และปรับปรุงวิชา

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)

เปลยนกลองตาง ๆ เปนการเรยกฟงกชนและสงคาไป

ใหแตละฟงกชนใหถกตอง

Page 125: Python ๑๐๑ · นิสิตช่วยสอนที่ร่วมกันสร้างโจทย์ปัญหา สอน และปรับปรุงวิชา

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

Page 126: Python ๑๐๑ · นิสิตช่วยสอนที่ร่วมกันสร้างโจทย์ปัญหา สอน และปรับปรุงวิชา

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

Page 127: Python ๑๐๑ · นิสิตช่วยสอนที่ร่วมกันสร้างโจทย์ปัญหา สอน และปรับปรุงวิชา

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

Page 128: Python ๑๐๑ · นิสิตช่วยสอนที่ร่วมกันสร้างโจทย์ปัญหา สอน และปรับปรุงวิชา

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

Page 129: Python ๑๐๑ · นิสิตช่วยสอนที่ร่วมกันสร้างโจทย์ปัญหา สอน และปรับปรุงวิชา

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] ไมเกดกำรเปลยนแปลงใด ๆ

Page 130: Python ๑๐๑ · นิสิตช่วยสอนที่ร่วมกันสร้างโจทย์ปัญหา สอน และปรับปรุงวิชา

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

Page 131: Python ๑๐๑ · นิสิตช่วยสอนที่ร่วมกันสร้างโจทย์ปัญหา สอน และปรับปรุงวิชา

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

Page 132: Python ๑๐๑ · นิสิตช่วยสอนที่ร่วมกันสร้างโจทย์ปัญหา สอน และปรับปรุงวิชา

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

Page 133: Python ๑๐๑ · นิสิตช่วยสอนที่ร่วมกันสร้างโจทย์ปัญหา สอน และปรับปรุงวิชา

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

Page 134: Python ๑๐๑ · นิสิตช่วยสอนที่ร่วมกันสร้างโจทย์ปัญหา สอน และปรับปรุงวิชา

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 ไดไมเตมท

Page 135: Python ๑๐๑ · นิสิตช่วยสอนที่ร่วมกันสร้างโจทย์ปัญหา สอน และปรับปรุงวิชา

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 มต มขอมลแตละตวคอคะแนนรวมทถวงน�ำหนกแลว

Page 136: Python ๑๐๑ · นิสิตช่วยสอนที่ร่วมกันสร้างโจทย์ปัญหา สอน และปรับปรุงวิชา

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 มำแสดง (คนดวยชองวำง)

Page 137: Python ๑๐๑ · นิสิตช่วยสอนที่ร่วมกันสร้างโจทย์ปัญหา สอน และปรับปรุงวิชา

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

Page 138: Python ๑๐๑ · นิสิตช่วยสอนที่ร่วมกันสร้างโจทย์ปัญหา สอน และปรับปรุงวิชา

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

Page 139: Python ๑๐๑ · นิสิตช่วยสอนที่ร่วมกันสร้างโจทย์ปัญหา สอน และปรับปรุงวิชา

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

Page 140: Python ๑๐๑ · นิสิตช่วยสอนที่ร่วมกันสร้างโจทย์ปัญหา สอน และปรับปรุงวิชา

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

Page 141: Python ๑๐๑ · นิสิตช่วยสอนที่ร่วมกันสร้างโจทย์ปัญหา สอน และปรับปรุงวิชา

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) กไมได

Page 142: Python ๑๐๑ · นิสิตช่วยสอนที่ร่วมกันสร้างโจทย์ปัญหา สอน และปรับปรุงวิชา

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

Page 143: Python ๑๐๑ · นิสิตช่วยสอนที่ร่วมกันสร้างโจทย์ปัญหา สอน และปรับปรุงวิชา

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): # คนลสตของประวตการซอมบ�ารง (วนท, ค�าอธบาย, ราคา) ทกรายการ ทมคาใชจายมากทสด # กรณทรถยนตไมมประวตการซอมบ�ารงเลย ใหคนคาลสตวาง

Page 144: Python ๑๐๑ · นิสิตช่วยสอนที่ร่วมกันสร้างโจทย์ปัญหา สอน และปรับปรุงวิชา

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): # ตะกราทมราคารวมของหนงสอนอยกวา จะเปนตะกราทนอยกวา

Page 145: Python ๑๐๑ · นิสิตช่วยสอนที่ร่วมกันสร้างโจทย์ปัญหา สอน และปรับปรุงวิชา

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

Page 146: Python ๑๐๑ · นิสิตช่วยสอนที่ร่วมกันสร้างโจทย์ปัญหา สอน และปรับปรุงวิชา

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): # บตรโดยสารทมเงนในบตรนอยกวา จะถอวานอยกวา

Page 147: Python ๑๐๑ · นิสิตช่วยสอนที่ร่วมกันสร้างโจทย์ปัญหา สอน และปรับปรุงวิชา

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 ไมไดตรวจสอบวา จ�านวนคนนอยกวาศนยหรอไม

Page 148: Python ๑๐๑ · นิสิตช่วยสอนที่ร่วมกันสร้างโจทย์ปัญหา สอน และปรับปรุงวิชา

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 กอน จะท�าใหเมทอดท�างานผดได)

Page 149: Python ๑๐๑ · นิสิตช่วยสอนที่ร่วมกันสร้างโจทย์ปัญหา สอน และปรับปรุงวิชา

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 ได

Page 150: Python ๑๐๑ · นิสิตช่วยสอนที่ร่วมกันสร้างโจทย์ปัญหา สอน และปรับปรุงวิชา

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

Page 151: Python ๑๐๑ · นิสิตช่วยสอนที่ร่วมกันสร้างโจทย์ปัญหา สอน และปรับปรุงวิชา

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

Page 152: Python ๑๐๑ · นิสิตช่วยสอนที่ร่วมกันสร้างโจทย์ปัญหา สอน และปรับปรุงวิชา

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)

Page 153: Python ๑๐๑ · นิสิตช่วยสอนที่ร่วมกันสร้างโจทย์ปัญหา สอน และปรับปรุงวิชา

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

Page 154: Python ๑๐๑ · นิสิตช่วยสอนที่ร่วมกันสร้างโจทย์ปัญหา สอน และปรับปรุงวิชา

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

Page 155: Python ๑๐๑ · นิสิตช่วยสอนที่ร่วมกันสร้างโจทย์ปัญหา สอน และปรับปรุงวิชา

ดร. สภชย สตณฑวบลย

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  จงจะท�ำใหเขยนโปรแกรมทมประสทธภำพ  เชน 

ท�ำงำนไดเรว ใชหนวยควำมจ�ำนอย และใชพลงงำนต�ำ เปนตน

Page 156: Python ๑๐๑ · นิสิตช่วยสอนที่ร่วมกันสร้างโจทย์ปัญหา สอน และปรับปรุงวิชา

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

Page 157: Python ๑๐๑ · นิสิตช่วยสอนที่ร่วมกันสร้างโจทย์ปัญหา สอน และปรับปรุงวิชา

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)

Page 158: Python ๑๐๑ · นิสิตช่วยสอนที่ร่วมกันสร้างโจทย์ปัญหา สอน และปรับปรุงวิชา

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 ทบรรทดสดทาย

Page 159: Python ๑๐๑ · นิสิตช่วยสอนที่ร่วมกันสร้างโจทย์ปัญหา สอน และปรับปรุงวิชา

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)

Page 160: Python ๑๐๑ · นิสิตช่วยสอนที่ร่วมกันสร้างโจทย์ปัญหา สอน และปรับปรุงวิชา

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)

Page 161: Python ๑๐๑ · นิสิตช่วยสอนที่ร่วมกันสร้างโจทย์ปัญหา สอน และปรับปรุงวิชา

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

Page 162: Python ๑๐๑ · นิสิตช่วยสอนที่ร่วมกันสร้างโจทย์ปัญหา สอน และปรับปรุงวิชา

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

Page 163: Python ๑๐๑ · นิสิตช่วยสอนที่ร่วมกันสร้างโจทย์ปัญหา สอน และปรับปรุงวิชา

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

Page 164: Python ๑๐๑ · นิสิตช่วยสอนที่ร่วมกันสร้างโจทย์ปัญหา สอน และปรับปรุงวิชา

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

Page 165: Python ๑๐๑ · นิสิตช่วยสอนที่ร่วมกันสร้างโจทย์ปัญหา สอน และปรับปรุงวิชา

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

แกไขคาใหเปนจ�านวนเตม

Page 166: Python ๑๐๑ · นิสิตช่วยสอนที่ร่วมกันสร้างโจทย์ปัญหา สอน และปรับปรุงวิชา

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 และเชคเงอนไขการหยดท�างานให ถกตอง

Page 167: Python ๑๐๑ · นิสิตช่วยสอนที่ร่วมกันสร้างโจทย์ปัญหา สอน และปรับปรุงวิชา

ผมคดวำกำรเรยนเขยนโปรแกรมจะเปนเหมอนกำรเรยนภำษำท  3  ในอนำคตอนใกล  ยงเทคโนโลยแทรกซมไปใน

ทกสงเรวเทำไหร  ควำมตองกำรคนทเขำใจและควบคมเทคโนโลยไดกจะมมำกขนเทำนน  นอกจำกนนกำรเรยน

เขยนโปรแกรมยงชวยใหเรำรจกคดแกปญหำอยำงเปนระบบ และใหพลงในกำรสรำงสรรคสงตำง ๆ ไดอยำงไมรจบ

ถำ       เทยบกำรสรำง software กบกำรสรำงตกตกหนง programming กเหมอนเปนเสำเขม ทรองรบแรงของทงตก

ใหตงอยได และไมพงทลำย ตรำบใดทไมมเสำเขม กไมสำมำรถสรำงตกได ดงนน programming กเปนเหมอน

รำกฐำนทส�ำคญของ software ถำเรำมทกษะ programming ทด เรำกจะสำมำรถพฒนำ software ทมคณภำพไดเชนกน

ศภเสฏฐ ชชยศร Intania 86

Solutions Engineer, Facebook และ นายกสมาคมโปรแกรมเมอรไทย

ณ ฐชยา ลละศภกล Intania 95

ตลาดหลกทรพยแหงประเทศไทย

Page 168: Python ๑๐๑ · นิสิตช่วยสอนที่ร่วมกันสร้างโจทย์ปัญหา สอน และปรับปรุงวิชา

ค�ำสงพนฐำน 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

Page 169: Python ๑๐๑ · นิสิตช่วยสอนที่ร่วมกันสร้างโจทย์ปัญหา สอน และปรับปรุงวิชา

Find job opportunities at jobs.exxonmobil.com

Page 170: Python ๑๐๑ · นิสิตช่วยสอนที่ร่วมกันสร้างโจทย์ปัญหา สอน และปรับปรุงวิชา