ภาษาโปรแกรมมิ่งไพธอน Python programming language

เอกวิทยาการคอมพิวเตอรì คณะวิทยาศาสตรì มหาวิทยาลัยนเรศวร 2 รายชื่อผูéจัดทำ

ชื่อ รหัสนิสิต หนéาที่ดำเนินการ นายฉัตรชัย ดำดี 46320388 แบบฝƒกหัด นายทรงยศ คชนิล 46320511 จัดทำเอกสารการเรียน นางสาวธัญญากร แกéวประสงคì 46320610 ผูéชèวยสอน นายประจักษì เจตะภัย 46320693 ผูéชèวยสอนและแบบฝƒกหัด นายมารุต จันทรìบัว 46320818 แบบฝƒกหัด นางสาวศรินยา อยูèสุขดี 46320925 ผูéชèวยสอน นางสาวณัฐณิชา คงประกอบ 46321097 ผูéชèวยสอน นายอุทิศ ศักดิ์สิทธิ์ 46321139 ผูéชèวยสอนและแบบฝƒกหัด นายอรรณพ สุวัฒนพิเศษ 46321150 ผูéสอนและจัดทำเอกสารเรียน

3 4 คำนำ

ภาษาไพธอนเปšนภาษาที่ไดéรับความนิยมอยèางมากในป˜จจุบันเนื่องจากความสามารถที่สูง, การเรียนรูéที่ รวดเร็ว, การเขียนระบบที่เขéาใจงèาย และสามารถขยายขีดความสามารถในการสรéางโปรแกรมและซอฟตìแวรì ที่สูงมากขึ้นตลอดเวลา ทางทีมผูéจัดทำจึงเล็งเห็นวèาควรนำความรูé ความเขéาใจในการเขียนโปรแกรมดéวยภาษา ไพธอนมาเผยแพรè ดéวยจะไดéผูéอื่นไดéรับความรูéและไดéเขéาถึงภาษาที่เขียนใจงèาย, ทำงานรวดเร็ว และสามารถ สรéางสรรคìงานไดéอยèางมีความสามารถสูง อีกทั้งซอฟตìแวรìที่ใชéสรéางโปรแกรมและซอฟตìแวรìดéวยภาษาไพธอน นั้นมีทั้งแจกฟรี, รหัสเปด และเชิงธุรกิจ ซึ่งมีขีดความสามารถที่แตกตèางกัน แตèถึงแมéจะเปšนซอฟตìแวรìที่ใชé เขียนโปรแกรมดéวยภาษาไพธอนจะแจกฟรี หรือเปšนรหัสเปด ก็ไมèไดéดéอยไปกวèาเชิงธุรกิจเลย จึงเปšนทางเลือก ที่ดีที่จะศึกษาเปšนทางเลือกอีกทางหนึ่งนอกเหนือจากภาษาอื่น ๆ ที่ไดéรับความนิยมอยูèแลéว ทางทีมงานจึงหวังวèาทèานผูéที่นำเอกสารนี้ไปใชéในการศึกษาจะไดéรับประโยชนìสูงสุดในการเขียนโปรแกรม และซอฟตìแวรìดéวยภาษาไพธอน

ทีมผูéจัดทำ

5 6 สารบัญ

1 แนะนำภาษาไพธอน 13 1.1 ประวัติ ...... 13 1.1.1 Python 1.0 ...... 13 1.1.2 Python 2.0 ...... 14 1.1.3 อนาคต ...... 14 1.2 หลักปรัชญาของภาษาไพธอน ...... 15 1.3 Language Evaluation Criteria ...... 15 1.4 ขéอเดèนของภาษาไพธอน ...... 15 1.5 Category และ Application Domains ...... 16 1.5.1 Web และ Internet Development ...... 16 1.5.2 Database Access ...... 16 1.5.3 Desktop GUI ...... 17 1.5.4 Scientific และ Numeric computation ...... 17 1.5.5 Education ...... 17 1.5.6 Network programming ...... 17 1.5.7 Software builder และ Testing ...... 17 1.5.8 Game และ 3D Graphics Rendering ...... 17 1.6 ซอฟตìแวรìที่เขียนดéวยไพธอน ...... 17 1.7 ตัวอยèางความสำเร็จของไพธอน ...... 18

2 การแสดงผลเบื้องตéน (Printing) 21

3 การตั้งตัวชื่อแปร และคำสงวน (Reserved word หรือ Keywords) 23 3.1 การตั้งตัวชื่อแปร ...... 23 3.2 คำสงวนในการใชéงาน (Reserved words, Keywords) ...... 23

4 การคำนวณทางคณิตศาสตรì (Arithmetic Mathematics) 25 4.1 การคำนวณพื้นฐาน (normal arithmetic operators) ...... 25 4.2 การคำนวณผèานฟ˜งกìชั่นภายใน (Built-in Math Functions) ...... 26 4.2.1 การหาคèาสัมบูรณì (absolute value) ...... 26 4.2.2 จำนวนที่นéอยที่สุด และมากที่สุดในกลุèม (smallest or largest values) ...... 26 4.2.3 กำหนดจำนวนตัวเลขทศนิยม (specified number of digits) ...... 27 4.2.4 หาผลรวมทั้งหมดในชุดขéอมูล (adds numbers in a sequence.) ...... 27 4.2.5 ชèวงของขéอมูลตัวเลข (range of numbers.) ...... 27

7 8 สารบัญ

5 ชนิดของตัวแปร (Data type) 29 5.1 ตัวเลข (Numbers) ...... 29 5.1.1 จำนวนเต็ม(Integers) ...... 29 5.1.2 จำนวนจริง (Floating-point numbers) ...... 30 5.1.3 จำนวนเชิงซéอน (Complex Numbers) ...... 31 5.2 ชนิดขéอมูลแบบการรวมกลุèมขéอมูล (Collection Data Types) ...... 32 5.2.1 ลิสตì (List) ...... 32 5.2.2 ดิกชันนารี (Dictionary หรือ Groupings of Data Indexed by Name) . . . . . 33 5.2.3 ทับเบิ้ล (Tuples) และ อนุกรม (Sequences) ...... 34 5.2.4 เซ็ต (Sets) ...... 34 5.2.5 ฟ˜งกìชั่นที่นèาสนใจเกี่ยวขéองกับลิสตìและดิกชันนารี ...... 35 5.3 สายอักขระ (String หรือ Array of Characters) ...... 39 5.3.1 ฟ˜งกìชั่นที่นèาสนใจเกี่ยวขéองกับสายอักขระ ...... 42

6 การเปรียบเทียบ (Comparisons) 45

7 นิพจนìทางตรรกะศาสตรì (Boolean Expressions) 47 7.1 AND (และ) ...... 47 7.2 OR (หรือ) ...... 47 7.3 NOT (ไมè) ...... 48

8 ชèวงของการทำงาน (Statement block) และ ชèวงชีวิตของตัวแปร (Life time หรือ Variable scope) 49 8.1 ชèวงของการทำงาน (Statement block) ...... 49 8.2 ชèวงชีวิตของตัวแปร (Life time หรือ Variable scope) ...... 49

9 การควบคุมทิศทางของโปรแกรม (Control flow, Flow of Control หรือ Alternatively) 51 9.1 การตัดสินใจ (Decisions, Choice หรือ Selection) ...... 51 9.1.1 if Statements ...... 51 9.1.2 switch Statements ...... 53 9.2 การวนทำซ้ำ (Loop) ...... 53 9.2.1 while Statements ...... 53 9.2.2 for Statements ...... 53 9.2.3 pass, break, continue และ else Clauses Statements ...... 54 9.2.4 do-while Statements ...... 55 9.3 การจัดการความผิดปกติของโปรแกรม (Error Checking) ...... 55 9.3.1 assert Statements ...... 55 9.3.2 try-except และ raise Statements (Exception handling) ...... 56

10 การสรéางฟ˜งกìชั่น (Defined Function) 59 10.1 การรับคèาของฟ˜งกìชั่น, คืนคèากลับ และคèามาตรฐานของการรับคèา ...... 60 10.2 ตัวแปรแบบ Global (ทั่วไป) และ Local (เฉพาะสèวน) ...... 62

11 การใสèขéอมูลผèานคียìบอรìด (Input Data from Keyboard) 63 สารบัญ 9

ก เรื่องที่หéามลืมใน Python 67

ข การติดตั้ง Python, wxPython และ Stani’s Python Editor 69 ข.1 การติดตั้ง Python ...... 69 ข.2 การติดตั้ง wxPython ...... 72 ข.3 การติดตั้ง Stani’s Python Editor ...... 75

ค อธิบายสèวนตèาง ๆ พอสังเขปของโปรแกรม SPE 79 ค.0.1 Sidebar ...... 80 ค.0.2 Source ...... 81 ค.0.3 Tools ...... 81

ง การเขียน, Debug และสั่งใหéโปรแกรมทำงาน 85 ง.1 การเขียนโปรแกรมใน SPE และสั่งใหéโปรแกรมทำงาน ...... 85 ง.2 การ Debug โปรแกรม ...... 86

จ ขéอมูลอéางอิง 87 10 สารบัญ สารบัญรูป

1.1 Guido van Rossum ...... 14

ข.1 เลือกดาวนìโหลด Python 2.4 สำหรับ Windows ...... 69 ข.2 ขั้นตอนที่ 1 : ดับเบิลคลิ้กที่ไฟลìติดตั้ง ...... 70 ข.3 ขั้นตอนที่ 2 : เลือก "Install for all users" ...... 70 ข.4 ขั้นตอนที่ 3 : ใหéเลือกที่ติดตั้งที่ C:\Python24\ ...... 70 ข.5 ขั้นตอนที่ 4 : เลือกติดตั้งทุกตัวเลือก ...... 71 ข.6 ขั้นตอนที่ 5 : ดำเนินการติดตั้ง ...... 71 ข.7 ขั้นตอนที่ 6 : เสร็จสิ้นการติดตั้ง ...... 71 ข.8 เลือกดาวนìโหลด wxPython runtime for Python 2.4 ...... 72 ข.9 เลือกสถานที่ดาวนìโหลด ...... 72 ข.10 ขั้นตอนที่ 1 : ดับเบิลคลิ้กที่ไฟลìติดตั้ง ...... 73 ข.11 ขั้นตอนที่ 2 : หนéาตéอนรับการติดตั้งใหé กด Next ...... 73 ข.12 ขั้นตอนที่ 3 : หนéายอมรับขéอตกลงใหé กด Yes ...... 73 ข.13 ขั้นตอนที่ 4 : หนéาเลือกสถานที่ติดตั้ง ใหéเลือกตามที่โปรแกรมไดéกำหนดไวéแตèแรก . . . . 73 ข.14 ขั้นตอนที่ 5 : หนéาเลือก component ใหéเลือกทั้งหมด แลéวกด Next ...... 74 ข.15 ขั้นตอนที่ 6 : เขéาสูèขั้นตอนการติดตั้งและเมื่อเสร็จแลéวใหéเลือก checkbox ทั้งหมดเพื่อใหé โปรแกรมติดตั้งทำการดัดแปลงระบบเพิ่มเติมแลéวกด Finish ...... 74 ข.16 ดาวนìโหลด Stani´s Python Editor Version 0.8.2.a สำหรับ Windows ไดéจากลิงสì Source- Forge (mirror) ...... 75 ข.17 เลือกสถานที่ดาวนìโหลด ...... 75 ข.18 ขั้นตอนที่ 1 : ดับเบิลคลิ้กที่ไฟลìติดตั้ง ...... 76 ข.19 ขั้นตอนที่ 2 : หนéาตéอนรับการติดตั้งใหé กด Next ...... 76 ข.20 ขั้นตอนที่ 3 : หนéาเลือกสถานที่ติดตั้ง ใหéเลือกตามที่โปรแกรมไดéกำหนดไวéแตèแรก . . . . 76 ข.21 ขั้นตอนที่ 4 : เขéาสูèขั้นตอนการติดตั้งโดยกด Next เพื่อเริ่มการติดตั้ง ...... 77 ข.22 ขั้นตอนที่ 5 : เขéาสูèขั้นตอนการติดตั้ง และเสร็จสิ้นการติดตั้ง ...... 77

ค.1 เปดโปรแกรม Stani’s Python Editor หรือเรียกสั้น ๆ วèา SPE ขึ้นมา ...... 79 ค.2 หนéาตèางโปรแกรม Stani’s Python Editor (SPE) ...... 80 ค.3 Shell ...... 81 ค.4 Local object browser ...... 82 ค.5 Session ...... 82 ค.6 Output ...... 82

11 12 สารบัญรูป

ง.1 สั่งใหéโปรแกรมทำงาน ...... 85 ง.2 ผลการทำงาน ...... 85 ง.3 การแจéง Error เพื่อใชéประกอบการ Debug ...... 86 บทที่ 1

แนะนำภาษาไพธอน

ไพธอน (Python) เปšนภาษาโปรแกรมในลักษณะภาษาอินเตอรìพรีเตอรìโปรแกรมมิ่ง (Interpreted pro- gramming language) ผูéคิดคéนคือ Guido van Rossum ในป‚ 1990 ซึ่งไพธอนเปšน การจัดการชนิดของ ตัวแปรแบบแปรผันตามขéอมูลที่บรรจุอยูè (Fully dynamically typed) และใชéการจัดการหนèวยความจำเปšน อัตโนมัติ (Automatic memory management) โดยไดéเปšนการพัฒนาและผสมผสานของภาษาอื่น ๆ ไดéแกè ABC, Modula-3, Icon, ANSI C, , Lisp, Smalltalk และ Tcl และภาษาไพธอนยังเปšนแนวคิดที่ทำใหé เกิดภาษาใหมè ๆ ซึ่งไดéแกè Ruby และ Boo เปšนตéน ไพธอนนั้นพัฒนาเปšนโครงการ Open source โดยมีการจัดการแบบไมèหวังผลกำไรโดย Python Software Foundation และสามารถหาขéอมูลและตัวแปรภาษาไดéจากเว็บไซตìของไพธอนเอง ที่ http://www.python.org/ ซึ่งในป˜จจุบัน (ณ.วันที่ 25 กันยายน 2549) ไพธอนไดéพัฒนาถึงรุèนที่ 2.5 (ออกวันที่ 19 กันยายน 2549) * เอกสารเลèมนี้ยึดตามไพธอนรุèนที่ 2.4.3 (ออกวันที่ 29 มีนาคม 2549)

1.1 ประวัติ

1.1.1 Python 1.0

ไพธอนสรéางขึ้นครั้งแรกในป‚ 1990 โดย Guido van Rossum ที่ CWI (National Research Insti- tute for Mathematics and Computer Science) ในประเทศเนเธอรìแลนดì โดยไดéนำความสำเร็จของภาษา โปรแกรมมิ่งที่ชื่อ ABC มาปรับใชéกับ Modula-3, Icon, C, Perl, Lisp, Smalltalk และ Tcl โดย Dui- do van Rossim ถือวèาเปšนผูéริเริ่มและคิดคéน แตèเคéาก็ยังคิดวèาผลงานอยèางไพธอนนั้น เปšนผลงานความรูéที่ ทำขึ้นเพื่อความสนุกสนานโดยไดéอéางอิงงานชิ้นนี้ของเขาวèาเปšน Benevolent Dictator for Life (BDFL) ซึ่ง ผลงานที่ถูกเรียกวèาเกิดจากความสนุกสนานเหลèานี้นั้นมักถูกเรียกวèา BDFL เพราะมักเกิดจากความไมèตั้งใจ และความอยากที่จะทำอะไรที่เปšนอิสระนั้นเอง ซึ่งคนที่ถูกกลèาวถึงวèาทำในลักษณะแบบนี้ก็ไดéแกè Linus Tor- valds ผูéสรéาง Linux kernel, Larry Wall ผูéสรéาง Perl programming language และคนอื่น ๆ อีกมากมาย โดยที่ในไพธอน 1.2 นั้นไดéถูกปลèอยออกมาในป‚ 1995 โดย Guido ไดéกลับมาพัฒนาไพธอนตèอที่ Corpo- ration for National Research Initiatives (CNRI) ที่ เรสตัน, มลรัฐเวอรìจิเนีย ประเทศสหรัฐอเมริกา โดย ที่ในขณะเดียวกันก็ไดéปลèอยรุèนใหมè ในหมายเลขรุèน 1.6 ออกมาโดยอยูèที่ CNRI เชèนกัน ซึ่งหลังจากปลèอยรุèน 1.6 ออกมาแลéว Guido van Rossum ก็ไดéออกจาก CNRI เพื่อทำงานใหéการทำธุรกิจ พัฒนาซอฟตìแวรìแบบเต็มตัว โดยกèอนที่จะเริ่มทำงานธุรกิจ เขาก็ไดéทำใหéไพธอนนั้นอยูèบนสัญญาลิขสิทธิ์ แบบ General Public License (GPL) โดยที่ CNRI และ Free Software Foundation (FSF) ไดéรวม กันเปดเผยรหัสโปรแกรมทั้งหมด เพื่อใหéไพธอนนั้นไดéชื่อวèาเปšนซอฟตìแวรìเสรี และเพื่อใหéตรงตามขéอกำหนด

13 14 แนะนำภาษาไพธอน

รูปที่ 1.1: Guido van Rossum

ของ GPL-compatible ดéวย (แตèยังคงไมèสมบูรณìเพราะการพัฒนาในรุèน 1.6 นั้นออกมากèอนที่จะใชéสัญญา ลิขสิทธิ์แบบ GPL ทำใหéยังมีบางสèวนที่ยังเปดเผยไมèไดé) และในป‚เดียวกันนั้นเอง Guido van Russom ก็ไดéรับรางวัลจาก FSF ในชื่อวèา "Advancement of Free Software" โดยในป‚นั้นเองไพธอน 1.6.1 ก็ไดéออกมาเพื่อแกéป˜ญหาขéอผิดพลาดของตัวซอฟตìแวรìและใหéเปšนไปตาม ขéอกำหนดของ GPL-compatible license อยèางสมบูรณì

1.1.2 Python 2.0

ในป‚ 2000 Guido และ Python Core Development team ไดéยéายการทำงานไป BeOpen.com โดยที่ พวกเขาไดéยéายจาก BeOpen PythonLabs team โดยในไพธอนรุèนที่ 2.0 นั้นไดéถูกนำออกเผยแพรèตèอบุคคล ทั่วไปจากเว็บไซตì BeOpen.com และหลังจากที่ไพธอนออกรุèนที่ 2.0 ที่ BeOpen.com แลéว Guido และนัก พัฒนาคนอื่น ๆ ในทีม PythonLabs ก็ไดéเขéารวมกับทีมงาน Digital Creations ไพธอนรุèน 2.1 ไดéสืบทอนการทำงานและพัฒนามาจาก 1.6.1 มากกวèาไพธอนรุèน 2.0 และไดéทำการ เปลี่ยนชื่อสัญญาลิขสิทธิ์ใหมèเปšน Python Software Foundation License โดยที่ในไพธอนรุèน 2.1 alpha นั้นก็ไดéเริ่มชื่อสัญญาสิขสิทธิ์นี้และผูéเปšนเจéาของคือ Python Software Foundation (PSF) โดยที่เปšนองคìกร ที่ไมèหวังผลกำไรเชèนเดียวกับ Apache Software Foundation

1.1.3 อนาคต

ผูéพัฒนาไพธอนมีการประชุมและถกเถียงกันในเรื่องของความสามารถใหมè ๆ ในไพธอนรุèนที่ 3.0 โดยมีชื่อ โครงการวèา Python 3000 (Py3K) โดยที่จะหยุดการสนับสนุนโคéดโปรแกรมจากรุèน 2.x โดยที่ทำแบบนี้เพื่อ ทำการปรับปรุงเปลี่ยนแปลงการทำงานของภาษาใหéดียิ่งขึ้นตามคำแนะนำที่วèา "reduce feature duplication by removing old ways of doing things" (ลดทอนคุณสมบัติที่ซ้ำซéอนดéวยการยกเลิกเสéนทางที่เดินผèานมา แลéว) โดยในตอนนนี้ยังไมèมีตารางงานของไพธอน รุèน 3.0 แตèอยèางใด แตè Python Enhancement Proposal (PEP) ไดéมีการวางแผนไวéแลéว โดยไดéวางแผนไวéดังนี้

• ทำการเพื่อสèวนสนับสนุนชนิดตัวแปรใหéมากขึ้น 1.2 หลักปรัชญาของภาษาไพธอน 15

• สนับสนุนการทำงานของชนิดตัวแปรแบบ unicode/str และ separate mutable bytes type

• ยกเลิกการสนับสนุนคุณสมบัติของ classic class, classic division, string exceptions และ implicit relative imports

• ฯลฯ

1.2 หลักปรัชญาของภาษาไพธอน

ไพธอนเปšนภาษาที่สามารถสรéางงานไดéหลากหลายกระบวนทัศนì (Multi-paradigm language) โดยจะ มองอะไรที่มากกวèาการ coding เพื่อนำมาใชéงานตามรูปแบบเดิม ๆ แตèจะเปšนการนำเอาหลักการของกระบวน ทัศนì (Paradigm) แบบ Object-oriented programming, Structured programming, Functional program- ming และ Aspect-oriented programming นำเอามาใชéทั้งแบบเดียว ๆ และนำมาใชéรèวมกัน ซึ่งไพธอนนั้น เปšน ภาษาที่มีการตรวจสอบชนิดตัวแปรแบบยืดหยุèน (dynamically type-checked) และใชé Garbage col- lection ในการจัดการหนèวยความจำ

1.3 Language Evaluation Criteria

ดéวยความที่ไพธอนนั้นผสมผสานการสรéางภาษาที่สวยงาม ทำใหéการอèานหรือเขéาใจโคéด (Readability) ตèาง ๆ นั้นทำไดéงèาย รวมถึงการเขียนโคéด (Writability) ที่กระชับและสั้นในการเขียน รวมถึงมีประสิทธิภาพ ทำใหéมีเสถียรภาพ (Reliability) สูงขึ้นและมีความรวดเร็วในการทำงานอีกดéวย และในดéานคèาใชéจèาย (Cost) ในการพัฒนาซอฟตìแวรìจากไพธอนนั้นในประเทศไทยนั้นยังตéองใชéคèาใชéจèายคèอนขéางสูง เพื่อใหéไดéมาซึ่งซอฟตìแวรì ที่ดี เพราะผูéเชี่ยวชาญที่เขียนไพธอนไดéมีเสถียรภาพนั้นยังมีนéอย ทำใหéคèาตัวสำหรับผูéพัฒนานั้นสูงตามไปดéวย ถึงแมéวèาเครื่องมือในการพัฒนานั้นจะฟรี และเปšน Open source ก็ตาม แตèคèาใชéจèายในดéานบุคลากรนั้นมีมาก กวèาคèาเครื่องมือพัฒนา

1.4 ขéอเดèนของภาษาไพธอน

1. งèายตèอการเรียนรูé โดยภาษาไพธอนมีโครงสรéางของภาษาไมèซับซéอนเขéาใจงèาย ซึ่งโครงสรéางภาษาไพ ธอนจะคลéายกับภาษาซีมาก เพราะภาษาไพธอน สรéางขึ้นมาโดยใชéภาษาซี ทำใหéผูéที่คุéนเคยภาษาซี อยูè แลéวใชéงานภาษาไพธอนไดéไมèยาก นอกจากนี้โดยตัวภาษาเองมีความยืดหยุèนสูงทำใหéการจัดการกับงาน ดéานขéอความ และ Text File ไดéเปšนอยèางดี

2. ไมèตéองเสียคèาใชéจèายใดๆ ทั้งสิ้น เพราะตัวแปรภาษาไพธอนอยูèภายใตéลิขสิทธิ์ Python Software Foun- dation License (PSFL) ซึ่งเปšนของ Python Software Foundation (PSF) ซึ่งมีลักษณะคลéายกับ ลิขสิทธิ์แมèแบบอยèาง General Public License (GPL) ของ Free Software Foundation (FSF)

3. ใชéไดéหลายแพลตฟอรìม ในชèวงแรกภาษาไพธอนถูกออกแบบใชéงานกับระบบ Unix อยูèก็จริง แตèใน ป˜จจุบันไดéมีการพัฒนาตัวแปลภาษาไพธอน ใหéสามารถใชéกับระบบปฏิบัติการอื่นๆ อาทิเชèน Linux Platform, Windows Platform, OS/2, Amiga, Mac OS X และรวมไปถึงระบบปฎิบัติการที่ .NET Framework, Java virtual machine ทำงานไดé ซึ่งใน Nokia Series 60 ก็สามารถทำงานไดéเชèนกัน 16 แนะนำภาษาไพธอน

4. ภาษาไพธอนถูกสรéางขึ้นโดยไดéรวบรวมเอาสèวนดีของภาษาตèางๆ เขéามาไวéดéวยกัน อาทิเชèน ภาษา ABC, Modula-3, Icon, ANSI C, Perl, Lisp, Smalltalk และ Tcl

5. ไพธอนสามารถรวมการพัฒนาของระบบเขéากับ COM, .NETและ CORBA objects

6. สำหรับ Java libraries แลéวสามารถใชé Jython เพื่อทำการพัฒนาซอฟตìแวรìจากภาษาไพธอนสำหรับ Java Virtual Machine

7. สำหรับ .NET Platform แลéว สามารถใชé IronPython ซึ่งเปšนการพัฒนาของ Microsoft เพื่อจะทำใหé ไพธอนนั้นสามารถทำงานไดéบน .Net Framework ซึ่งใชéชื่อวèา Python for .NET

8. ไพธอนนั้นสนับสนุน Internet Communications Engine (ICE) และการรวมกันของเทคโนโลยีอื่น ๆ อีกมากมายในอนาคต

9. บางครั้งนักพัฒนาอาจจะพบวèาไพธอนไมèสามารถทำงานบางอยèางไดé แตèนักพัฒนาตéองการใหéมันทำงาน ไดé ก็สามารถพัฒนาเพิ่มไดéในรูปแบบของ extension modules ซึ่งอยูèในรูปแบบของโคéด C หรือ C++ หรือใชé SWIG หรือ Boost.Python

10. ภาษาไพธอนเปšนสามารถพัฒนาเปšนภาษาประเภท Server side Script คือการทำงานของภาษาไพ ธอนจะทำงานดéานฝ˜›ง Server แลéวสèงผลลัพธìกลับมายัง Client ทำใหéมีความปลอดภัยสูง และยังใชé ภาษาไพธอนนำมาพัฒนาเว็บเซอรìวิสไดéอีกดéวย

11. ใชéพัฒนาระบบบริหารการสรéางเว็บไซตìสำเร็จรูปที่เรียกวèา Content Management Systems (CMS) ซึ่ง CMS ที่มีชื่อเสียงมาก และเบื้องหลังทำงานดéวยไพธอนคือ Plone http://www.plone.org/

1.5 Category และ Application Domains

ภาษาไพธอนนั้น จัดอยูèใน Category ภาษาที่สามารถสรéางงานไดéหลากหลายกระบวนทัศนì (Multi-paradigm language) โดยรองรับทั้ง Object-oriented programming, Imperative, Functional programming และ Logic programming ซึ่งไพธอนสามารถนำไปพัฒนาซอฟตìแวรìประยุกตìไดéมากมาย ไดéแกè

1.5.1 Web และ Internet Development

ไพธอนนั้นมีการสนับสนุนในดéานของ Web Development ในโซลูชันระดับสูงดéวย Zope, mega frame- works อยèาง Django และ TurboGears และรวมไปถึง Content Management Systems ขั้นสูงอยèาง Plone และ CPS จึงทำใหéไพธอนนั้นเปšน Common Gateway Interface (CGI) ระดับสูงที่มีประสิทธิภาพที่ดีที่สุด ตัวหนึ่งในตลาด

1.5.2 Database Access

ไพธอนนั้นสนับสนุนการเขéาถึงขéอมูลในฐานขéอมูลของผูéผลิตฐานขéอมูลตèาง ๆ มากมาย โดยผèานทาง ODBC Interfaces และ Database Connection Interface อื่น ๆ ซึ่งสามารถทำงานรèวมกับ MySQL, Oracle, MS SQL Server, PostgreSQL, SybODBC และอื่น ๆ ที่จะมีมาเพิ่มเติมอีกในอนาคต 1.6 ซอฟตìแวรìที่เขียนดéวยไพธอน 17

1.5.3 Desktop GUI

เมื่อไพธอนไดéติดตั้งลงบนเครื่องของคุณแลéว จะมี Tk GUI development library ซึ่งเปšน libraries ที่ มีความสามารถเทียบเทèา Microsoft Foundation Classes (MFC, ซึ่งคลéาย ๆ กับ win32 extensions), wxWidgets, GTK, Qt, Delphi และอื่น ๆ ทำใหéสามารถพัฒนาซอฟตìแวรìประยุกตìตèาง ๆ แบบ Graphic user interface ไดé

1.5.4 Scientific และ Numeric computation

ไพธอนรองรับการทำงานของนักวิทยาศาสตรìในเรื่องของทฤษฎีการคำนวณ, Bioinformatics และ Physic- s เปšนตéน

1.5.5 Education

ไพธอนนั้นเปšนภาษาที่เหมาะกับการเรียนการสอนในวิชา programming อยèางมาก โดยสามารถนำไปใชé ในระดับเบื้องตéนถึงระดับสูง ซึ่ง Python Software Foundation นั้นไดéมีหลักสูตรสำหรับการเรียนการสอน ในดéานนี้อยูèแลéว ซึ่งสามารถนำเอา pyBiblio และ Software Carpentry Course มาเรียนเพื่อเสริมความรูéไดé

1.5.6 Network programming

เปšนการเพิ่มความามารถจาก Web และ Internet Development ไพธอนนั้นสนับสนุนในการเขียนโปรแกรม ในระดับต่ำในดéานของ network programming ที่งèายตèอการพัฒนา sockets และ รวมไปถึงการทำงานรèวม กับ mudules อยèาง Twisted และ Framework สำหรับ Asyncronous network programming

1.5.7 Software builder และ Testing

ไพธอนนั้นสนับสนุนการพัฒนาซอฟตìแวรìที่มีการควบคุมการพัฒนาและจัดการระบบทดสอบตèาง ๆ โดย ใชéเครื่องมือในการพัฒนาที่สนับสนุนการเขียนโปรแกรมในไพธอนเอง ซึ่งตัวไพธอนนั้นไดéมาพรéอมกับ

• Scons สำหรับ build โปรแกรม

• Buildbot และ Apache Gump ที่ใชéสำหรับงาน Automated continuous compilation และ Testing

• Roundup หรือ Trac สำหรับ bug tracking และ project management

1.5.8 Game และ 3D Graphics Rendering

ไพธอนนั้นไดéถูกใชéในตลาดพัฒนาเกมสìทั้งเชิงธุรกิจและสมัครเลèน โดยมีการสรéาง Framework สำหรับ พัฒนา Game บนไพธอนซึ่งชื่อวèา PyGame และ PyKyra ซึ่งยังรวมไปถึงการทำ 3D Graphics Rendering ที่ไพธอนมี libraries ทางดéานงานนี้อยูèมากมาย

1.6 ซอฟตìแวรìที่เขียนดéวยไพธอน

• BitTorrent เปšนการพัฒนาโดยระบบการจัดการไฟลì BitTorrent, การจัดการ การกระจายตัวของ Pack- age ขéอมูลใน Tracker และการเขéารหัสสèวนขéอมูลตèาง ๆ 18 แนะนำภาษาไพธอน

• Blender ซอฟตìแวรì open source สำหรับทำ 3D modeling

• Chandler ซอฟตìแวรìจัดการขéอมูลสèวนบุคคล (Personal Information Manager, PIM) โดยมีสèวน เพิ่มเติมทั้งงานปฎิทิน, อีเมล, ตารางงาน และขéอมูลโน็ตตèาง ๆ ซึ่งทำงานคลéาย ๆ กับ Outlook ของ Microsoft

• Civilization IV วีดิโอเกมสì และยังเปšนเกมสìที่ใชé boost.python เพื่อทำการควบคุมสèวนประกอบตèาง ๆ ภายในเกมสì ซึ่งรวมไปถึงรูปแบบ, หนéาตา และเนื้อหาของเกมสìดéวย

• Mailman หนึ่งในซอฟตìแวรì E-Mail mailing lists ที่ไดéรับความนิยมสูงสุด

• Kombilo ระบบจัดการฐานขéอมูลของเกมสìโกะ

• MoinMoin ระบบ Wiki ที่ไดéรับความนิยมสูงตัวหนึ่ง

• OpenRPG ระบบเกมสìเสมือนแบบ Role Playing Games ลน Internet

• Plone ระบบ Content Management System

• Trac ระบบติดตามติดตามขéอผิดพลาดและจัดการขéอมูลดéานการพัฒนาซอฟตìแวรìดéวย MoinMoin ที่ เปšน wiki และ Subversion เพื่อทำระบบ Source version control

• Turbogears ระบบพัฒนาซอฟตìแวรì Framework โดยรวมเอา Cherrypy, SQLObject, MochiKit และ KID templates

• ViewVC ระบบ Web-based สำหรับจัดการดéาน CVS และ SVN repositories

• Zope ระบบพัฒนาซอฟตìแวรìบนอินเทอรìเน็ตแบบ web-application platform

• Battlefield 2 เกมสì First Person Shooter ที่ไดéใชéไพธอนในการทำ Configuration scripts

• Indian Ocean Tsunami Detector ซอฟตìแวรìสำหรับมือถือเพื่อแจéงเตือน Tsunami

• EVE Online เกมสìแบบ Multi Massive Online Role Playing Game ซึ่งเปšนเกมสìที่ไดéรับอันดับ สูงมากบน MMORPG.com

• SPE - Stani’s Python Editor เปšน Free และ open-source สำหรับงานพัฒนาซอฟตìแวรìดéวยไพ ธอน โดยมีทั้งแบบ Python IDE for Windows, Linux & Mac with wxGlade (GUI designer), PyChecker (Code Doctor) และ Blender (3D)

• ฯลฯ

1.7 ตัวอยèางความสำเร็จของไพธอน

Industrial Light & Magic "ไพธอนเปšนกุญแจสำหรับการสรéางผลงานที่ดี ถéาไมèมีมันแลéวงานอยèาง Star Wars: Episode II ก็เปšนเรื่องที่ยากมากที่จะสำเร็จ ดéวยวิธีการ crowd rendering เพื่อสèงไปทำการ batch processing ในการ compositing video นั้นเปšนเรื่องที่งèายไปเลยเมื่อใชéการพัฒนาระบบดéวยไพ ธอน" Tommy Burnette, Senior Technical Director, Industrial Light & Magic "ไพธอนอยูèทุก ๆ ที่ใน ILM มันชèวยใหéเราสามารถที่จะทำงานกับภาพกราฟฟกที่ถูกสรéางสรรคìไดéงèาย 1.7 ตัวอยèางความสำเร็จของไพธอน 19

และรวดเร็ว"Philip Peterson, Principal Engineer, Research & Development, Industrial Light & Magic

Google "ไพธอนมีความสำคัญตèอ Google มาก เพราะตั้งแตèเริ่มมี Google เราก็ใชéมันสรéางระบบของเรา และยังคงเปšนสèวนสำคัญจนทุกวันนี้ โดยในทุก ๆ วันเหลèาวิศวะกรของ Google ใชéไพธอนในการ ทำงานอยูèตลอดเวลา เพื่อคéนหาขéอมูลบนโลกของอินเทอรìเน็ตอยèางไมèมีทีสิ้นสุด" Peter Norvig, Di- rector of Search Quality, Google, Inc.

NASA "NASA ใชéไพธอนในการพัฒนา การจัดการ Model, Integration และ ระบบ Transformation ในงาน CAD/CAE/PDM โดยพวกเราเลือกไพธอนเพราะมีความสามารถในการสรéางงานใหéออกมา ไดéอยèางรวดเร็วและมีประสิทธิภาพสูง โดยสิ่งที่สำคัญคือ code ในการเขียนนั้นสะอาดและงèายตèอการ จัดการดูแลในภายหลัง อีกทั้งยังมี libraries ใหéใชéอยèางมากมายทำการ Integration ของระบบนั้นเปšน ไปอยèางชาญฉลาดและรวดเร็วแถมยังทำระบบที่สามารถเชื่อมตèอการกับระบบอื่น ๆ ไดéอยèางดี ซึ่งไพ ธอนนั้นตอบโจทยìของเราไดéทั้งหมด" Steve Waterbury, Software Group Leader, NASA STEP Testbed 20 แนะนำภาษาไพธอน บทที่ 2

การแสดงผลเบื้องตéน (Printing)

การแสดงผลออกทางหนéาจอของไพธอนนั้นใชéคำสั่ง print แลéวตามดéวย ’String’ หรือ "String" โดยแทน ที่ String ดéวยขéอความใด ๆ เชèน * ในภาษา C/C++, Java, ฯลฯ เครื่องหมายที่บอกการจบ ของ คำสั่งคือ ; (Semi-colon Symbol) แตè Python ใชéการจบบรรทัดแทน

>>> print "Hello, World!"

และไดéผลการทำงาน

Hello, World!

ทดสอบการพิมพìหลาย ๆ บรรทัด

>>> print "Jack and Jill went up a hill" >>> print "to fetch a pail of water;" >>> print "Jack fell down, and broke his crown," >>> print "and Jill came tumbling after."

ผลการทำงาน

Jack and Jill went up a hill to fetch a pail of water; Jack fell down, and broke his crown, and Jill came tumbling after.

ซึ่งบางครั้งเราตéองการพิมพìชุดขéอความซ้ำ ๆ กันเราสามารถใชéสัญลักษณì * (Repetition Symbol) เพื่อทำ การพิมพìชุดขéอความนั้นไดé

>>> print "Hello, World!"*5

ผลการทำงาน

Hello, World!Hello, World!Hello, World!Hello, World!Hello, World!

21 22 การแสดงผลเบื้องตéน (Printing)

* ภาษาไพธอน ใชé "#" บอกจุดเริ่มตéนของ Comment ไปจนสุดบรรทัด โดย Comment เขียนไวéเตือน ความจำ ไมèใชèสèวนที่เอาไป Execute Program ตัวอยèาง

>>> print "Foo" # Test Comment >>> print "Bar"

ผลการทำงาน

Foo Bar บทที่ 3

การตั้งตัวชื่อแปร และคำสงวน (Reserved word หรือ Keywords)

3.1 การตั้งตัวชื่อแปร

1. ขึ้นตéนดéวยตัวอักษรในภาษาอังกฤษ ตามดéวยตัวอักษรหรือตัวเลขใดๆ ก็ไดé

2. หéามเวéนชèองวèาง และหéามใชéสัญลักษณìพิเศษนอกเหนือจาก underscore ( ) เทèานั้น

3. ตัวอักษรของชื่อจะคำนึงถึงความแตกตèางระหวèางอักษรตัวพิมพìใหญèกับตัวพิมพìเล็ก

4. การตั้งชื่อมีขéอพึงระวังวèา จะตéองไมèซ้ำกับคำสงวน(Reserved words, Keywords)

5. ควรจะตั้งชื่อโดยใหéชื่อนั้นมีสื่อความหมายใหéเขéากับขéอมูล สามารถอèานและเขéาใจไดé

3.2 คำสงวนในการใชéงาน (Reserved words, Keywords)

and, assert, break, class, continue, def, del, elif, else, except, exec, finally, for, from, global, if, import, in, is, lambda, not, or, pass, print, raise, return, try, while, yield, as (ไพธอน 2.5) และ with (ไพธอน 2.5) * อéางอิงจากเอกสารไพธอน รุèน 2.4.3 และ 2.5 (Python Reference Manual Release 2.4.3, docu- mentation updated on 29 March 2006 and Python Reference Manual Release 2.5, documentation updated on 19 September 2006)

23 24 การตั้งตัวชื่อแปร และคำสงวน (Reserved word หรือ Keywords) บทที่ 4

การคำนวณทางคณิตศาสตรì (Arithmetic Mathematics)

4.1 การคำนวณพื้นฐาน (normal arithmetic operators)

ไพธอนนั้นมีสัญลักษณìการคำนวณพื้นฐาน (normal arithmetic operators) ซึ่งไดéแกè

• ** (ยกกำลัง, Exponentiation)

• * (คูณ, multiplication)

• / (หาร, division)

• % (หารเอาเศษ, remainder หรือ modulo)

• + (บวก, addition)

• - (ลบ, subtraction)

โดยอันดับความสำคัญของการคำนวณเหมือนกับคณิศาสตรìโดยมีความสำคัญดังตèอไปนี้

1. วงเล็บ (parentheses "()")

2. ยกกำลัง (exponents "**" )

3. คูณ (multiplication "*" ), หาร (division "/" ) และหารเอาเศษ (remainder/modulo "%" )

4. บวก (addition "+") และ ลบ (subtraction "-")

ทดสอบการคำนวณไดéจากการคำนวณดéานลèางนี้

>>> i = 10 >>> f = 6.54 >>> print i + f 16.54

25 26 การคำนวณทางคณิตศาสตรì (Arithmetic Mathematics)

อธิบายโปรแกรมดéานบนไดéวèา ตัวแปร i ถูกตั้งคèาเริ่มตéนไวéที่ 10 และตัวแปร f ถูกตั้งคèาเริ่มตéนเปšน 6.54 โดยที่ i มีชนิดตัวเปšน integer และ f เปšน float โดยเรานำมาบวกกันจะไดéคำตอบคือ 16.54 ทดสอบการบวกโดยใหéนำคèาที่ทำการคำนวณสèงกลับตัวแปรเดิม จากคำสั่งการทำงานดéานลèางนี้

>>> i = 10 >>> i = i + 6 >>> i = i / 2 >>> print i 8

จะเห็นวèาชุดคำสั่งที่ใชéมีความยาวกวèาปกติ แตèอèานงèายกวèา ซึ่งเราสามารถยèอรูปการคำนวณตèาง ๆ เหลèานี้ ไดéดังตัวอยèางดังดéานลèาง

>>> i = 10 >>> i += 6 >>> i /= 2 >>> print i 8

ซึ่งการยèอรูปแบบนี้เปšนไปตามรูปแบบดั่งเดิมของภาษา C นั่นเอง

4.2 การคำนวณผèานฟ˜งกìชั่นภายใน (Built-in Math Functions)

4.2.1 การหาคèาสัมบูรณì (absolute value)

มีรูปแบบ Function คือ abs(var) เปšน function ที่ใชéหาคèาสัมบูรณì โดนที่คèา var เปšนตัวแปรหรือจำนวน ที่ตéองการหาคèา

>>> print abs(-6.5) 6.5

4.2.2 จำนวนที่นéอยที่สุด และมากที่สุดในกลุèม (smallest or largest values)

ฟ˜งกìชั่นหาจำนวนที่นéอยที่สุด มีรูปแบบฟ˜งกìชั่น คือ min(var) เปšนฟ˜งกìชั่นที่ใชéในการหาจำนวนที่นéอย ที่สุดในกลุèมของชุดขéอมูลชนิดตèาง ๆ เชèน list, set หรือแมéแตèตัวเลขทั่วไป โดยที่คèา var เปšนตัวแปร, จำนวน หรือชุดของจำนวนที่ตéองการหาคèา ฟ˜งกìชั่นหาจำนวนที่มากที่สุด มีรูปแบบฟ˜งกìชั่น คือ max(var) เปšนฟ˜งกìชั่นที่ใชéในการหาจำนวนที่มากที่สุด ในกลุèมของชุดขéอมูลชนิดตèาง ๆ เชèน list, set หรือแมéแตèตัวเลขทั่วไป โดยที่คèา var เปšนตัวแปร, จำนวนหรือ ชุดของจำนวนที่ตéองการหาคèา

>>> print min(6, 7, 2, 8, 5) 2 >>> print max(6, 7, 2, 8, 5) 4.2 การคำนวณผèานฟ˜งกìชั่นภายใน (Built-in Math Functions) 27

8 >>> print min([0, 43.5, 19, 5, -6]) 0 >>> print max([0, 43.5, 19, 5, -6]) 43.5

4.2.3 กำหนดจำนวนตัวเลขทศนิยม (specified number of digits)

มีรูปแบบฟ˜งกìชั่น คือ round(var, digits) เปšนฟ˜งกìชั่นที่ใชéในการเพิ่มหรือลดจำนวนตัวเลขทศนิยมที่จะ นำมาแสดง โดย

>>> print round(1234.56789, 2) 1234.57 >>> print round(1234.56789, -2) 1200.0

4.2.4 หาผลรวมทั้งหมดในชุดขéอมูล (adds numbers in a sequence.)

มีรูปแบบฟ˜งกìชั่น คือ sum(sequence) เปšนฟ˜งกìชั่นที่ใชéในการหาผลรวมของชุดขéอมูลตัวเลขหนึ่ง ๆ โดยที่ ใสèคèาของชุดจำนวนเขéาไปในรูปแบบของ sequence of numbers เชèน (1,2,3,4,5) ซึ่งหมายถึงจำนวนตั้งแตè 1 - 5 เปšนตéน ลงไปในฟ˜งกìชั่น sum เพื่อทำการคำนวณหาผลรวมของชุดขéอมูลดังกลèาว

>>> print sum((1, 2, 3, 4, 5)) 15

4.2.5 ชèวงของขéอมูลตัวเลข (range of numbers.)

มีรูปแบบฟ˜งกìชั่น คือ range(start, end [,step]) เปšนฟ˜งกìชั่นที่ใชéในการสèงคèาชèวงของขéอมูลตัวเลขที่ ตéองการออกมาเชèนตéองการตัวเลขตั้งแตè 1 - 500 เราสามารถทำไดéตามตัวอยèางดéานลèางนี้

>>> print range(1, 6) [1, 2, 3, 4, 5]

ซึ่งเราสามารถนำความสามารถนี้มาใชéรèวมกับฟ˜งกìชั่นหาผลรวมทั้งหมดไดé โดยดังตัวอยèางดéานลèางนี้

>>> print sum(range(1, 6)) 15

จากตัวอยèางทั้งสองนั้น โดยชèวงของขéอมูลนั้นคือ 1 - 6 ซึ่งไดéขéอมูลคือ 1, 2, 3, 4, 5 ซึ่งเรานำมาซึ่งสูตรคือ m ถึง ( n -1) โดยที่ m และ n คือจำนวนเต็มบวก และ m มีคèานéอยกวèา n หรือบางครั้งเราอยากเพิ่มคèาทีละ 2 ก็สามารถทำไดéดéวย

>>> print range(1, 6, 2) [1, 3, 5] 28 การคำนวณทางคณิตศาสตรì (Arithmetic Mathematics) บทที่ 5

ชนิดของตัวแปร (Data type)

ดังที่เราไดéทราบไปแลéววèาภาษาไพธอนเปšนภาษาที่เปšน Interpreter Programming ซึ่งเราไมèจำเปšนตéอง สนใจ Data type แตèบางครั้งการที่เรารูéจัก Data type ตèาง ๆ และนำมาใชéงานไดéอยèางเหมาะสมทำใหéการ เขียนโปรแกรมมีประสิทธิภาพมากขึ้น โดย Data type ตèาง ๆ นั้นมีจุดเดèนในแบบชนิดของตัวมันเอง ซึ่งในการแสดงผลการทำงานของขéอมูลตèาง ๆ ในไพธอนนั้นมีหลากหลายรูปแบบ เราจะมาพูดกันในเรื่อง นี้เชèนเดียวกัน โดยในหลาย ๆ ภาษานั้น ๆ เราจำเปšนตéองประกาศชนิดตัวแปร (Data type) กèอน แลéวจึงตั้งชื่อตัวแปร ซึ่ง หลาย ๆ ครั้งสรéางความสับสนในการจดจำ แตèในภาษาไพธอนนั้นเราไมèจำเปšนตéองประกาศชนิดของตัวแปร กèอนการใชéงานแตèอยèางใด โดยในบทนี้เราจะพูดถึงชนิดของตัวแปรตèาง ๆ

5.1 ตัวเลข (Numbers)

5.1.1 จำนวนเต็ม(Integers)

จำนวนเต็มธรรมดา (Plain Integer)

Plain Integers มีคำยèอสำหรับเขียนในโปรแกรมคือ int เปšนการบèงบอกคุณสมบัติของตัวแปรที่ใชéเก็บ ขéอมูลตัวเลขแบบจำนวนเต็มที่เปšนตัวเลขแบบ signed integer เก็บขéอมูล 32 bits ตั้งแตè -2147483648 ถึง +2147483647 ทดสอบโดยการพิมพìคำสั่งโปรแกรมดังนี้

>>> x = 42 >>> type(x)

จะไดéผลการทำงานโดยแสดงเปšนชนิดของตัวแปรนั้นคือ

* function type(var) เปšน function ที่ใชéในการแสดงชนิดของตัวแปรนั้น ๆ โดยที่ตัวแปร var เปšนชื่อ ตัวแปรที่ตéองการแสดงชนิดของตัวแปรนั้น ๆ ดังตัวอยèางที่ไดéทำดéานบน การทดสอบตèอมาเราจะทำการ casting data ผèาน function int เพื่อทำการแปลงขéอมูลเปšน interger numbers ตัวอยèางเชèน

29 30 ชนิดของตัวแปร (Data type)

>>> x = int("17") >>> y = int(4.8) >>> print x, y, x - y

ผลการทำงาน

17 4 13

* function int(var) เปšน function ที่ใชéในการแปลงชนิดของขéอมูลของตัวแปรอื่น ๆ มาเปšนชนิดตัวแปร แบบ integer โดยที่ตัวแปร var เปšนชื่อตัวแปรที่ตéองการแปลงชนิดขéอมูลของตัวแปรนั้น ๆ

จำนวนเต็มแบบยาว (Long integer)

Long integers มีคำยèอสำหรับเขียนในโปรแกรมคือ long เปšนการบèงบอกคุณสมบัติของตัวแปรที่ใชéเก็บ ขéอมูลตัวเลขแบบจำนวนเต็ม ที่เปšนตัวเลขแบบ signed integer เก็บขéอมูลที่มากกวèาตัวเลขที่ Integer เก็บไดé หรือมีจำนวนที่มากกวèา - 2147483647 ถึง + 2147483647 นั้นเอง โดยสามารถใชéคำตัวอักษร L ตèอทéาย ตัวเลขนั้น ๆ เพื่อบอกวèาจำนวนนั้นเปšนจำนวน Long Integer เชèน 234187626348292917L หรือ 7L

>>> googol = 10 ** 100 >>> print googol >>> type(googol)

ผลการทำงาน (Operator ** มีความหมายในการคำนวณคือ ยกกำลัง )

10000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000

ผลจากการทำงานนั้นจะทำการแสดงคèาของตัวแปร googol และบอกชนิดของตัวแปรวèาเปšน long นั้นเอง

จำนวนตรรกะ (Boolean)

Boolean มีคำยèอสำหรับเขียนในโปรแกรมคือ bool ความจริงแลéวขéอมูลชนิดตรรกะในไพธอนไมèมีอยูèจริง เพราะไมèจำเปšนตéองมีนั่นเอง สิ่งที่ไพธอนมีใหéนั้นเปšนเพียงคèาคงที่เพื่อใชéแทนตรรกะ จริง และ เท็จ เทèานั้น ไดéแกè

• True - แทนคèาจริง มีคèาเปšน 1

• False - แทนคèาเท็จ มีคèาเปšน 0

5.1.2 จำนวนจริง (Floating-point numbers)

Floating-point มีคำยèอสำหรับเขียนในโปรแกรมคือ float เปšนการบèงบอกคุณสมบัติของตัวแปรที่ใชéเก็บ ขéอมูลตัวเลขแบบจำนวนจริงแบบ 64 bit double precision ที่มีความหมายรวบรัดรวมกันเลยทั้ง float และ double ในหลายๆ ภาษา แตèในไพธอนจะใชé float เพียงอยèางเดียว ซึ่งมีชèวงตั้งแตè 1.23 ไปจนถึง 7.8 x 10-28 5.1 ตัวเลข (Numbers) 31

>>> debt = 7784834892156.63 >>> print debt >>> type(debt)

ภาษาไพธอนนั้นจะทำการยèอขนาดของจำนวนใหéอยูèในรูปแบบขนาดยèอทางคณิตศาสตรìจะไดéผลการทำงาน โดยแสดงเปšนชนิดของตัวแปรนั้นคือ

7.78483489216e+012

โดยมีความหมายวèา 7.78483489216 x 10 12 เราสามารถทำใหéจำนวนชนิด ๆ เปลี่ยนเปšนจำนวนจริงไดéโดยใชé function float

>>> x = float(17) >>> y = float("4") >>> print x, y, x - y

ผลการทำงาน

17.0 4.0 13.0

* function float(var) เปšน function ที่ใชéในการแปลงชนิดของขéอมูลของตัวแปรอื่น ๆ มาเปšนชนิดตัวแปร แบบ floating-point โดยที่ตัวแปร var เปšนชื่อตัวแปรที่ตéองการแปลงชนิดขéอมูลของตัวแปรนั้น ๆ

5.1.3 จำนวนเชิงซéอน (Complex Numbers)

มีคำยèอสำหรับเขียนในโปรแกรมคือ complex จำนวนเชิงซéอนคือเซตที่ตèอเติมจากเซตของจำนวนจริงโดย เพิ่มจำนวน j เขéาไปในตัวเลขจำนวนจริงจนไดéเปšน จำนวนจินตภาพ (imaginary number) จนทำใหéสมการ j2 + 1 = 0 เปšนจริง และหลังจากนั้นเพิ่มสมาชิกตัวอื่นๆ เขéาไปจนกระทั่งเซตที่ไดéใหมèมีสมบัติปดภายใตéการ บวกและการคูณ จำนวนเชิงซéอน z ทุกตัวสามารถเขียนอยูèในรูป x + iy โดยที่ x และ y เปšนจำนวนจริง โดยเราเรียก x และ y วèาสèวนจริงและสèวนจินตภาพของ z ตามลำดับ เราสามารถนำมาเขียนเปšนสมการในการเขียนชุดคำสั่งไดéดังนี้

>>> imaginary_number = 16j >>> complex_number = 6 + 4j >>> print complex_number (6+4j) >>> print type(complex_number)

หรือเราอาจจะไมèตéองใชéจำนวน j เพื่อทำใหéตัวเลขนั้นเปšนจำนวนจินตภาพ ไดéจาก function ที่ชื่อวèา com- plex(real, [imag]) ดังตัวอยèางดéานลèางนี้ * function complex(real, imag) เปšน function ที่ใชéในการแปลงชนิดของขéอมูลของตัวแปรอื่น ๆ มาเปšน ชนิดตัวแปรแบบ complex โดยที่ตัวแปร real เปšนจำนวนที่เปšนจำนวนจริง และ imag คือจำนวนจินตภาพ 32 ชนิดของตัวแปร (Data type)

>>>complex_number = complex(6, 4) >>>type(complex_number) >>>print(complex_number) (6+4j)

5.2 ชนิดขéอมูลแบบการรวมกลุèมขéอมูล (Collection Data Types)

5.2.1 ลิสตì (List)

ในไพธอนนั้นชนิดตัวแปรที่ถูกนำมารวมกันอยูèในชื่อเดียวกับเลยคือ อารìเรยì (Array) และ ลิสตì (List) แตèถéานักพัฒนาตéองการใชé อารìเรยìแบบที่คุéนเคยจริง ๆ จำเปšนตéอง import module array ของไพธอนเขéามา ซึ่งยุèงยากและทำงานชéากวèาที่ควรจะเปšน ลิสตìมีคำยèอสำหรับเขียนในโปรแกรมคือ list การทำงานของลิสตìนั้นเปšนการนำขéอมูลหลาย ๆ ชนิดมา เรียงตèอกันในลิสตìของตัวแปรนั้น ๆ ซึ่งแตกตèางจากอารìเรยìที่ขéอมูลที่นำมาเรียงตèอกันตéองเปšนชนิดเดียวกัน และนี่คงเปšนสาเหตุที่ทำใหéอารìเรยì ถูกตัดทิ้งไปจากชนิดของตัวแปรพื้นฐานของไพธอนเพราะดéวยเหตุผลดéาน ความยืดหยุèนของชนิดของตัวแปรนั้นเอง โดยลิสตìนั้นจะมีขéอมูลเรียงกันหลาย ๆ ตัว ครอบดéวยเครื่องหมาย square brackets "[" และ "]" เชèน

>>> i = [1, 2, 3, 4, ’Foo’, 5, ’Bar’] >>> print i >>> type(i)

ผลที่ไดéคือ

[1, 2, 3, 4, ’Foo’, 5, ’Bar’]

เราสามารถเขéาถึงขéอมูลในแตèละลิสตìไดé ผèานทางหมายเลขสมาชิก (index key) เชèน

>>> print i[6]

ผลการทำงานคือ

Bar

โดยหมายเลขสมาชิกเริ่มตั้งแตè 0 ไปจนถึงจำนวนขéอมูลที่มีอยูèในลิสตìลบดéวยหนึ่ง หรืออธิบายใหéเห็นภาพก็ คือ

0, 1, 2, 3, 4 , .... , n - 1

เมื่อ n คือจำนวนของขéอมูลในลิสตì เราสามารถเขéาถึงสมาชิกของ list เปšนกลุèมๆ ไดé โดยใชéคำสั่ง : (Colon Symbol) เพื่อคั่นระหวèางหมายเลข สมาชิกที่ตéองการ เชèน

>>> x = [1, 2, 3, 4, ’Foo’, 5, ’Bar’] >>> print x[3:5] 5.2 ชนิดขéอมูลแบบการรวมกลุèมขéอมูล (Collection Data Types) 33

ผลการทำงาน [4, ’Foo’] เราสามารถเลือกสมาชิกบางตัวอยèางมีเงื่อนไขไดé เชèน >>> y = [10, 3, 5, 25, 7, 9] >>> z = [x for x in y if x >= 9] >>> print z ผลการทำงานคือ [10, 25, 9] จากชุดคำสั่งดéานบนนั้นเปšนการเลือกสมาชิกภายในลิสตìที่มีคèามากกวèาหรือเทèากับ 9 นั่นเอง

5.2.2 ดิกชันนารี (Dictionary หรือ Groupings of Data Indexed by Name)

ดิกชันนารี (Dictionary หรือ Groupings of Data Indexed by Name) มีคำยèอสำหรับเขียนในโปรแกรม คือ dict เปšนอนุกรมอีกอันหนึ่ง มีสภาพเหมือนอาเรยì ที่มีสมาชิกทั้ง keys และ value โดยที่ นั้นจะใชéชื่อ อéางอิงสมาชิก (associated key) แทนการใชéหมายเลขสมาชิก (index key) ซึ่งจะซ้ำกันไมèไดé (ถéากำหนดคèา ซ้ำ มันจะลบคèาเกèา และใชéคèาใหมèแทน) โดยใชéการจัดเรียงขéอมูลและแกéไขคèาไมèไดé (จึงสามารถใชé tuple เปšน keys ไดé ถéาชนิดของขéอมูลสมาชิกเปšนชนิดเดียวกัน แตèใชé list เปšน keys ไมèไดé) แตèลบ keys:value ไดé เวลา เรียกขéอมูล value จะคéนจาก keys ถéาคéนไมèพบจะเกิดขéอผิดพลาด >>> i = {’first’:’alpha’,’last’:’omega’} >>> print i >>> print i[’first’] >>> type(i) ผลการทำงานคือ {’last’: ’omega’, ’first’: ’alpha’} ’alpha’ โดยการเขéาถึงขéอมูลของดิกชันนารี นั้นสามารถทำไดéโดยการอéางอิงจากชื่ออéางอิงสมาชิก ดั่งในตัวอยèางขéางตéน นั้นไดéอéางอิงถึง first ดéวยรูปแบบ >>> print i[’first’] เราก็จะไดéขéอมูล ’alpha’ ออกมา โดยเราสามารถใสèสมาชิกลงไปไดéเรื่อย ๆ จากตัวอยèางตèอไปนี้ >>> menus_specials = {} >>> menus_specials[“breakfast”] = “canadian ham” >>> menus_specials[“lunch”] = “tuna surprise” >>> menus_specials[“dinner”] = “Cheeseburger Deluxe” >>> print menus_specials[’breakfast’] ผลการทำงาน canadian ham 34 ชนิดของตัวแปร (Data type)

5.2.3 ทับเบิ้ล (Tuples) และ อนุกรม (Sequences)

ทับเบิ้ล (นéองลิสตì, Tuples) มีคำยèอสำหรับเขียนในโปรแกรมคือ tuple ขéอมูลจะอยูèภายในวงเล็บ () แตè ตอนกำหนดคèา ถéาอยูèโดดๆ อาจไมèใสèวงเล็บก็ไดé โดยใชéหลักคลéายกับลิสตì (แตèไมèเหมือนกันทั้งหมด) เพียงแตè เราสามารถนำลิสตìหลาย ๆ ลิสตìมาบรรจุลงในลิสตìเดียวกันเองไดéโดยไมèตéองแยกตัวแปร เชèน

>>> t = 12345, 54321, ’hello!’ >>> type(t) >>> t[0] 12345 >>> t (12345, 54321, ’hello!’) >>> # Tuples may be nested: ... u = t, (1, 2, 3, 4, 5) >>> u ((12345, 54321, ’hello!’), (1, 2, 3, 4, 5))

แตèสมาชิกในทับเบิ้ลเปลี่ยนคèาไมèไดé ซึ่งเหมือนกับเหมือนสตรีง ไมèเหมือนลิสทì ซึ่งการกำหนดคèาใหéทับ เบิ้ลที่มีสมาชิกเดียว ยุèงยากขึ้นเล็กนéอย เพราะตéองใชé "," ชèวย

>>> empty = () >>> singleton = ’hello’, # <-- note trailing comma >>> len(empty) 0 >>> len(singleton) 1 >>> singleton (’hello’,)

การกำหนดคèาใหé tuple เชèน t = 12345, 54321, ’hello!’ เรียกวèาการแพ็ค (packing) ใชéไดéกับ tuple อยèางเดียว สèวนการกำหนดคèาแบบยéอนกลับ เรียกวèาการ อันแพ็ค (unpacking) อันนี้ใชéไดéกับทุกอนุกรม คือ ทั้งลิสทì และทูเปล * function len(var) เปšน function ที่ใชéในการหนéาจำนวนสมาชิก, ความยาวของสายอักขระ และกลุèม ของขéอมูลตèาง ๆ โดยที่ var นั้นคือชื่อของตัวแปรที่เราตéองการหานั้นเอง

>>> x, y, z = t

* ในตัวอยèางนี้ t ตéองมีสมาชิกอยèางนéอย 3 คèา มิเชèนนั้นจะเกิดขéอผิดพลาด เนื่องจากไมèสามารถใหéคèาไดé กับ 3 ตัวแปรที่ตéองการสèงคèาไปใหé

5.2.4 เซ็ต (Sets)

เซ็ต เปรียบเสมือนสèวนขยายของลิสทì(และสตริงดéวย) และจะไมèมีสมาชิกที่มีคèาซ้ำกัน ใชéประโยขนìเหมือน กับ เรื่องเซ็ทในวิชาคณิตศาสตรì 5.2 ชนิดขéอมูลแบบการรวมกลุèมขéอมูล (Collection Data Types) 35

มีคำยèอสำหรับเขียนในโปรแกรมคือ set แตèการที่จะไดéชนิดขéอมูลแบบเซ็ตนั้นตéองทำผèาน function set เพื่อใหéไดéเซ็ตออกมา ซึ่งสèวนมากแลéวจะใชé List มาทำการแปลงชนิดตัวแปรเปšนเซ็ตอีกที ดังตัวอยèางดéานลèาง * function set(var) เปšน function ที่ใชéในการแปลงชนิดของขéอมูลของตัวแปรอื่น ๆ มาเปšนชนิดตัวแปร แบบ set โดยที่ตัวแปร var เปšนชื่อตัวแปรที่ตéองการแปลงชนิดขéอมูลของตัวแปรนั้น ๆ

>>> basket = [’apple’, ’orange’, ’apple’, ’pear’, ’orange’, ’banana’] >>> fruit = set(basket) # create a set without duplicates >>> type(fruit) >>> fruit set([’orange’, ’pear’, ’apple’, ’banana’]) >>> ’orange’ in fruit # fast membership testing True >>> ’crabgrass’ in fruit False

>>> # Demonstrate set operations on unique letters from two words ... >>> a = set(’abracadabra’) >>> b = set(’alacazam’) >>> a # unique letters in a set([’a’, ’r’, ’b’, ’c’, ’d’]) >>> a - b # letters in a but not in b set([’r’, ’d’, ’b’]) >>> a | b # letters in either a or b set([’a’, ’c’, ’r’, ’d’, ’b’, ’m’, ’z’, ’l’]) >>> a & b # letters in both a and b set([’a’, ’c’]) >>> a ^ b # letters in a or b but not both set([’r’, ’d’, ’b’, ’m’, ’z’, ’l’])

5.2.5 ฟ˜งกìชั่นที่นèาสนใจเกี่ยวขéองกับลิสตìและดิกชันนารี

* การเรียกใชéฟ˜งคìชั่èนของลิสตìและดิกชันนารีนั้นทำคลéาย ๆ กับการเรียกใชéเมธอดในภาษา Java เชèน

>>> i = [1,2,3,4] >>> print i.pop() 4 >>> j = {’first’:’alpha’,’last’:’omega’} >>> print j.pop(’first’) alpha 36 ชนิดของตัวแปร (Data type)

ฟ˜งกìชั่น pop - [ลิสตì/ดิกชันนารี]

รูปแบบฟ˜งกìชั่น Object.pop([key]) ในลิสตìนั้นเราไมèจำเปšนตéองกำหนดหมายเลขสมาชิก (index key) กèอนการ pop เพราะเมธอดจะนำคèาบนสุดมาใหéเรา แตèถéาตéองการ pop ในหมายเลขสมาชิกที่ตéองการก็ เพียงแตèใสèหมายเลขสมาชิกเทèานั้น แตèในดิกชันนารเราจำเปšนตéองกำหนดชื่ออéางอิงสมาชิก (associated key) กèอนการ pop เพราะมิเชèนนั้นเมธอดจะไมèสามารถนำคèาของสมาชิกนั้น ๆ มาใหéเราได

>>> i = [1,2,3,4] >>> print i.pop() 4 >>> j = {’first’:’alpha’,’last’:’omega’} >>> print j.pop(’first’) alpha

ฟ˜งกìชั่น append - [ลิสตì]

รูปแบบฟ˜งกìชั่น Object.append([object]) เปšนฟ˜งกìชั่นที่ใชéในการเพิ่มขéอมูลสมาชิกลงไปในลิสตìโดยจะ นำไปตèอทéายลิสตìเสมอ

>>> i = [1,2,3,4] >>> print i.pop() 4 >>> i.append(5) >>> print i [1,2,3,5]

ฟ˜งกìชั่น insert - [ลิสตì]

รูปแบบฟ˜งกìชั่น Object.insert(index, object) เปšนฟ˜งกìชั่นที่ใชéในการเพิ่มขéอมูลสมาชิกลงไปในลิสตìโดย จะนำไปใสèในลำดับสมาชิกที่เราตéองการ

>>> print i [1, 3] >>> i.insert(4, 5) >>> print i [1, 3, 5] >>> i.insert(2, 6) >>> print i [1, 3, 6, 5]

ฟ˜งกìชั่น count - [ลิสตì]

รูปแบบฟ˜งกìชั่น Object.count([object]) เปšนฟ˜งกìชั่นที่ใชéในการนับขéอมูลสมาชิกที่ตéองการคéนหา

>>> i = [1,2,3,4] >>> print i.count(5) 5.2 ชนิดขéอมูลแบบการรวมกลุèมขéอมูล (Collection Data Types) 37

0 >>> print i.count(4) 1

ฟ˜งกìชั่น index - [ลิสตì]

รูปแบบฟ˜งกìชั่น Object.index(value, [ start , stop ]) เปšนฟ˜งกìชั่นที่ใชéในการหาคèาของหมายเลขสมาชิก (index key) วèาขéอมูลที่เราตéองการนั้นอยูèที่หมายเลขสมาชิกที่เทèาใด

>>> i = [1,2,3,4] >>> print i.index(4) 3 >>> print i.index(1) 0

ฟ˜งกìชั่น extend - [ลิสตì]

รูปแบบฟ˜งกìชั่น Object.extend(list|dict) เปšนฟ˜งกìชั่นที่ใชéในเพิ่มสมาชิกทั้งหมดจากอีกลิสตìหรือดิกชันนา รี จากตัวแปรอื่น ๆ มาไวéที่ตัวแปรตั้งตéน

>>> j = {’last’: ’omega’} >>> i = [1,2,3,4] >>> i.extend(j) >>> print i [1, 2, 3, 4, ’last’]

ฟ˜งกìชั่น remove - [ลิสตì]

รูปแบบฟ˜งกìชั่น Object.remove(value) เปšนฟ˜งกìชั่นที่ใชéในการลบคèาที่กำหนดไวéในพารามิเตอรìออกไป จากลิสตì

>>> print i [1, 2, 3, 4, ’last’] >>> i.remove(1) >>> print i [3, 6, 5, ’last’]

ฟ˜งกìชั่น sort - [ลิสตì]

รูปแบบฟ˜งกìชั่น Object.sort() เปšนฟ˜งกìชั่นที่ใชéในการจัดเรียงขéอมูล (sort) ภายในลิสตìโดยสามารถที่จะ จัดเรียงไดéทั้งตามหมายเลขสมาชิก หรือจัดเรียงตามขéอมูลของสมาชิก

>>> a = [5, 2, 3, 1, 4] >>> a.sort() >>> print a [1, 2, 3, 4, 5] 38 ชนิดของตัวแปร (Data type)

>>> i = [’a’,’r’,’b’,’i’,’z’] >>> print i [’a’, ’r’, ’b’, ’i’, ’z’] >>> i.sort() >>> print i [’a’, ’b’, ’i’, ’r’, ’z’]

ฟ˜งกìชั่น reverse - [ลิสตì]

รูปแบบฟ˜งกìชั่น Object.reverse() เปšนฟ˜งกìชั่นที่ใชéในการจัดเรียงขéอมูล (sort) ภายในลิสตìแบบยéอนกลับ

>>> a = [5, 2, 3, 1, 4] >>> a.sort() >>> print a [1, 2, 3, 4, 5] >>> i.reverse() >>> print i [5, 4, 3, 2, 1]

ฟ˜งกìชั่น clear - [ดิกชันนารี]

รูปแบบฟ˜งกìชั่น Object.clear() เปšนฟ˜งกìชั่นที่ใชéในการลบขéอมูลภายในดิกชันนารีทั้งหมด

>>> j = {’first’:’a’, ’second’:’b’} >>> print j {’second’: ’b’, ’first’: ’a’} >>> j.clear() >>> print j {}

ฟ˜งกìชั่น get - [ดิกชันนารี]

รูปแบบฟ˜งกìชั่น Object.get(key) เปšนฟ˜งกìชั่นที่ใชéในเรียกขéอมูลจากชื่ออéางอิงสมาชิกภายในดิกชันนารี

>>> j = {’first’:’a’, ’second’:’b’} >>> print j {’second’: ’b’, ’first’: ’a’} >>> j.get(’first’) ’a’

ฟ˜งกìชั่น has key - [ดิกชันนารี]

รูปแบบฟ˜งกìชั่น Object.has key(key) เปšนฟ˜งกìชั่นที่ใชéในการตรวจสอบชื่ออéางอิงสมาชิก (associated key) วèามีอยูèหรือไมè 5.3 สายอักขระ (String หรือ Array of Characters) 39

>>> j = {’first’:’a’, ’second’:’b’} >>> print j {’second’: ’b’, ’first’: ’a’} >>> j.has_key(’first’) True >>> j.has_key(’last’) False

ฟ˜งกìชั่น items - [ดิกชันนารี]

รูปแบบฟ˜งกìชั่น Object.items(key) เปšนฟ˜งกìชั่นที่ใชéในการแสดงรายการชื่ออéางอิงสมาชิกและขéอมูลทั้งหมด ในดิกชันนารี

>>> j = {’first’:’a’, ’second’:’b’} >>> print j {’second’: ’b’, ’first’: ’a’} >>>>>> j.items() [(’second’, ’b’), (’first’, ’a’)]

ฟ˜งกìชั่น keys - [ดิกชันนารี]

รูปแบบฟ˜งกìชั่น Object.keys() เปšนฟ˜งกìชั่นที่ใชéในการแสดงรายการชื่ออéางอิงสมาชิกทั้งหมดในดิกชันนา รี

>>> j = {’first’:’a’, ’second’:’b’} >>> print j {’second’: ’b’, ’first’: ’a’} >>>>>> j.keys() [’second’, ’first’]

ฟ˜งกìชั่น values - [ดิกชันนารี]

รูปแบบฟ˜งกìชั่น Object.values() เปšนฟ˜งกìชั่นที่ใชéในการแสดงรายการขéอมูลทั้งหมดในดิกชันนารี

>>> j = {’first’:’a’, ’second’:’b’} >>> print j {’second’: ’b’, ’first’: ’a’} >>>>>>>>> j.values() [’b’, ’a’]

5.3 สายอักขระ (String หรือ Array of Characters)

สายอักขระ (Strings) เปšนการเรียงตัวของอักขระมาตèอกันมากกวèา 1 ตัวจนกลายเปšนเสéนสาย หรือเรียก อีกอยèางวèาลำดับของอักขระ (Array of Characters) โดยเราสามารถกำหนดคèาตัวแปรไดéโดยใชéเครื่องหมาย 40 ชนิดของตัวแปร (Data type) single quotation (’.....’) หรือ double quotation (" .... ") ครอบอักขระ, สายอักจระ หรือแมéแตèตัวเลข และ รวมไปถึงสัญลักษณìพิเศษตèาง ๆ โดยในไพธอนนั้นจะเก็บขéอมูลแบบ 8-bit strings หรือ Unicode objects ขึ้นอยูèกับขéอมูลที่จัดเก็บอยูèในขณะนั้น ดังตัวอยèางตèอไปนี้

>>> print "Hello, World!"

และไดéผลการทำงาน

Hello, World!

ซึ่งบางครั้งเราตéองการพิมพìคèาของตัวแปรนั้นไปพรéอมกับขéอความใน function print นั้นสามารถใชéสัญลักษณì , (Concatenation Symbol) ดéานหลังชุดขéอความนั้น ๆ กèอน แลéวจึงพิมพìชื่อตัวแปรนั้น ๆ ตèอทéาย

>>> i = 5 >>> print "14 / 3 = ",14 / 3 >>> print "14 % 3 = ",14 % 3 >>> print "14.0 / 3.0 =",14.0 / 3.0 >>> print "hello", "hello", i

ผลการทำงาน

14 / 3 = 4 14 % 3 = 2 14.0 / 3.0 = 4.66666666667 hello hello 5

ซึ่งการใชé Concatenation Symbol นั้นสามารถที่จะนำมาประยุกตìใชéงาน อื่น ๆ ไดéอีกนอกจาก print แตèถéาตéองการใหéขéอความนั้นตèอกันใหéใชéสัญลักษณì + (String Concatenation Symbol) เพื่อเชื่อมขéอความ แตèละชุดเขéาดéวยกัน

>>> print "Jack and Jill went up a hill" + "to fetch a pail of water;" + "Jack fell down, and broke his crown," + "and Jill came tumbling after."

ผลการทำงาน

Jack and Jill went up a hill to fetch a pail of water; Jack fell down, and broke his crown, and Jill came tumbling after.

ซึ่งการใสèขéอมูลภายใตéเครื่องหมาย double quotation นั้น สามารถใชéสัญลักษณìพิเศษไดéดังนี้ 5.3 สายอักขระ (String หรือ Array of Characters) 41

\newline ไมèสนใจ (Ignored) \\ เครื่องหมาย Backslash ( \) \’ เครื่องหมาย Single quote (’) \" เครื่องหมาย Double quote (") \a ASCII Bell (BEL) \b ASCII Backspace (BS) \f ASCII Formfeed (FF) \n ASCII Linefeed (LF) \r ASCII Carriage Return (CR) \t ASCII Horizontal Tab (TAB) \v ASCII Vertical Tab (VT)

โดยเปšนสัญลักษณìพิเศษที่เราเจอกันอยูèในหลาย ๆ ภาษา และในบางครั้งการตèอสายอักขระ นั้นอาจจะไมèสะดวกการใชé String formatting operator "%" เขéามา ชèวยจะทำใหéการนำตัวแปรตèาง ๆ มาใสèในสายอักขระทำไดéงèายมากขึ้น เชèน

>>> state = ’California’ >>> ’It never rains in sunny %s.’ %state

จะไดéผลการทำงานคือ

’It never rains in sunny California.’

โดยที่ %s นั้นเราสามารถแทนดéวยตัวอักษร s เปšนตัวอักษรอื่น ๆ ไดéตามความเหมาะกับตัวแปรที่เราจะ นำมาผสมลงในสายอักขระ ซึ่งมีดังนี้

d Signed integer decimal i Signed integer decimal o Unsigned octal u Unsigned decimal x Unsigned hexidecimal (lowercase) X Unsigned hexidecimal (uppercase) e Floating point exponential format (lowercase) E Floating point exponential format (uppercase) f Floating point decimal format F Floating point decimal format g Same as "e" if exponent is greater than -4 or less than precision, "f" otherwise G Same as "E" if exponent is greater than -4 or less than precision, "F" otherwise c Single character (accepts integer or single character string) r String (converts any python object using repr()) s String (converts any python object using str()) 42 ชนิดของตัวแปร (Data type)

d = 4.5000 print ’It never rains in sunny %d.’ %d print ’It never rains in sunny %i.’ %d print ’It never rains in sunny %o.’ %d print ’It never rains in sunny %u.’ %d print ’It never rains in sunny %x.’ %d print ’It never rains in sunny %X.’ %d print ’It never rains in sunny %e.’ %d print ’It never rains in sunny %E.’ %d print ’It never rains in sunny %f.’ %d print ’It never rains in sunny %F.’ %d print ’It never rains in sunny %g.’ %d print ’It never rains in sunny %G.’ %d print ’It never rains in sunny %c.’ %int(d) print ’It never rains in sunny %r.’ %d print ’It never rains in sunny %s.’ %d

ผลการทำงาน

It never rains in sunny 4. It never rains in sunny 4. It never rains in sunny 4. It never rains in sunny 4. It never rains in sunny 4. It never rains in sunny 4. It never rains in sunny 4.500000e+000. It never rains in sunny 4.500000E+000. It never rains in sunny 4.500000. It never rains in sunny 4.500000. It never rains in sunny 4.5. It never rains in sunny 4.5. It never rains in sunny L. It never rains in sunny 4.5. It never rains in sunny 4.5.

5.3.1 ฟ˜งกìชั่นที่นèาสนใจเกี่ยวขéองกับสายอักขระ

ฟ˜งกìชั่น find

รูปแบบฟ˜งกìชั่น Object.find((sub[, start[, end]]) เปšนฟ˜งกìชั่นที่ใชéในการคéนหาคำในสายอักขระโดยจะ คืนคèาใน หมายเลขสมาชิก (index key) ของสายอักขระนั้น ๆ ที่เจอเปšนตัวแรก แตèถéาไมèเจอจะสèงคèา -1 กลับ มา 5.3 สายอักขระ (String หรือ Array of Characters) 43

>>> s = "windows" >>> s.find(’dow’) 3

ฟ˜งกìชั่น upper

รูปแบบฟ˜งกìชั่น Object.upper() เปšนฟ˜งกìชั่นที่ใชéในการทำใหéตัวอักษรเปลี่ยนเปšนตัวใหญè (ในภาษาอังกฤษ)

>>> s = "windows" >>> s.upper() WINDOWS

ฟ˜งกìชั่น lower

รูปแบบฟ˜งกìชั่น Object.lower() เปšนฟ˜งกìชั่นที่ใชéในการทำใหéตัวอักษรเปลี่ยนเปšนตัวเล็ก (ในภาษาอังกฤษ)

>>> s = "WINDOWS" >>> s.lower() windows

ฟ˜งกìชั่น replace

รูปแบบฟ˜งกìชั่น Object.replace(old, new) เปšนฟ˜งกìชั่นที่ใชéในการคéนหาคำที่กำหนดและแทนที่คำนั้น ดéวยคำที่กำหนดใหé

>>> s = ’The happy cat ran home.’ >>> s.replace(’cat’, ’dog’) ’The happy dog ran home.’ 44 ชนิดของตัวแปร (Data type) บทที่ 6

การเปรียบเทียบ (Comparisons)

ในภาษาไพธอนนั้นมีการเปรียบเทียบในเชิงคณิตศาสตรìตèาง ๆ เปšนพื้นฐานอยูèแลéว แตèบางอยèางก็มีที่ไมè เหมือนกับภาษาอื่น ๆ คือมีการเพิ่มเติมการเปรียบเทียบในดéานของกลุèมขéอมูล และขéอมูลที่เหมือนกัน โดย ไดéเพิ่ม การเปรียบเทียบแบบ "in" และ "is" เขéามาเพื่อเปรียบเทียบกับกลุèมขéอมูล สèวนใหญèการใชé "is" มักใชéในการเปรียบเทียบดéานตัวอักขระและสายอักขระมากกวèาเพราะสื่อความหมายมากกวèาใชé "==" ในการ เปรียบเทียบ โดยเมื่อมีการเปรียบเทียบแลéวเราจะไดéผลออกมาคือคèาทางตรรกะ หรือ Boolean value ซึ่งในภาษาไพ ธอนนั้นคือ True แทนดéวยเปšนจริง และ False แทนดéวยเปšนเท็จ และเรายังสามารถใชéตัวเลขแทนคèาดังกลèาว ไดéดéวย 0 คือ False และ 1 คือ True นั้นเอง โดยคèาที่ไดéนั้นมาจากการทำการทดสอบทางตรรกศาสตรìในเชิง เปรียบเทียบคèาทั้งสองขéางของขéอมูล Operator ความหมาย < เปรียบเทียบคèาทางดéานซéายของเครื่องหมาย นéอยกวèา คèาทางดéานขวาหรือไมè <= เปรียบเทียบคèาทางดéานซéายของเครื่องหมาย นéอยกวèาหรือเทèากับ คèาทางดéานขวา หรือไมè > เปรียบเทียบคèาทางดéานซéายของเครื่องหมาย มากกวèา คèาทางดéานขวาหรือไมè >= เปรียบเทียบคèาทางดéานซéายของเครื่องหมาย มากกวèาหรือเทèากับ คèาทางดéานขวาหรือไมè == เปรียบเทียบคèาทางดéานซéายของเครื่องหมาย เทèากับ คèาทางดéานขวาหรือไมè != เปรียบเทียบคèาทางดéานซéายของเครื่องหมาย ไมèเทèากับ คèาทางดéานขวาหรือไมè <> เปรียบเทียบคèาทางดéานซéายของเครื่องหมาย ไมèมีทางเทèากับ คèาทางดéานขวาหรือไมè in เปรียบเทียบคèาทางดéานซéายของเครื่องหมายอยูèในกลุèมขéอมูลในกลุèมขéอมูลดéานขวาหรือไมè is เปรียบเทียบคèาทางดéานซéายของเครื่องหมาย เหมือนกับ คèาทางดéานขวาหรือไมè

ตัวอยèาง

>>> 1 < 2 True True >>> 0 != 1 >>> 2 <= 2 True True >>> x = [1,2,3,4] >>> 2 > 0 >>> 1 in x True True >>> 3 >= 3 >>> 1 is 1 True True >>> 0 == 0 45 46 การเปรียบเทียบ (Comparisons) บทที่ 7

นิพจนìทางตรรกะศาสตรì (Boolean Expressions)

การทำการเปรียบเทียบนั้น เมื่อไดéคèาจากการเปรียบเทียบซึ่งเปšนคèาทางตรรกะมาหนึ่งคèา โดยทั่วไปแลéวก็ เพียงพอตèอการนำไปใชéในการทำสอบทางตรรกศาสตรì (Condition) อยูèแลéว แตèบางครั้งแลéวเรามักนำคèาตèาง ๆ มาเชื่อมกันเพื่อใหéไดéนิพจนìที่มีความหมายเชื่อมโยงกันเพื่อใหéไดéความหมายที่ดีมากขึ้นเมื่อมีการทดสอบ ทางตรรกศาสตรìมากกวèา 1 ชุดการทดสอบ และเปšนการชèวยใหéการเขียนโปรแกรมนั้นสั้นลง โดยในไพธอน นั้นมีนิพจนìทางตรรกะศาสตรìตามพื้นฐานภาษาทั่วไปคือ AND, OR และ NOT โดยเปšนการเปรียบเทียบจาก ผลของการเปรียบเทียบในเชิงคณิตศาสตรìที่ไดéอยูèกèอนแลéวมาเปรียบเทียบในเชิงตรรกศาสตรìอีกรอบหนึ่ง

7.1 AND (และ)

มีคียìเวิรìดคือ and จะประมวลผลประโยคหรือตัวแปรที่ตามหลังตัวมันเอง ถéาประโยคหรือตัวแปรที่อยูè กèอนหนéามีคèาทางตรรกศาสตรìเปšน false เพราะวèาคèาที่เปšน false เมื่อนำมาประมวลผลกับ คèาอื่น ๆ แลéว จะไดé false เสมอ expression ผล true and true True true and false False false and true False false and false False

7.2 OR (หรือ)

มีคียìเวิรìดคือ or จะประมวลผลประโยคหรือตัวแปรที่ตามมาเมื่อประโยคแรก หรือตัวแปรตัวแรกมีคèาเปšน true เพราะวèาประโยคหรือตัวแปรที่มีคèาเปšน true เมื่อนำมาประมวลกับคèาใด ๆ ก็ตามจะไดéคèา true เสมอ expression ผล true or true True true or false True false or true True false or false False

47 48 นิพจนìทางตรรกะศาสตรì (Boolean Expressions)

7.3 NOT (ไมè)

มีคียìเวิรìดคือ not โดยเมื่อไปอยูèหนéาตัวแปรหรือประโยคที่มีคèาทางตรรกศาสตรìคèาใดคèาหนึ่ง ก็จะเปลี่ยนคèา นั้นใหéเปšนตรงกันขéามทันที expression ผล not true False not false True

ตัวอยèาง

>>> i = 1 >>> j = 2 >>> k = 3 >>> l = 1 >>> i == k and j == i False >>> i == k or l == i True >>> not i == k and l == i True บทที่ 8

ชèวงของการทำงาน (Statement block) และ ชèวง ชีวิตของตัวแปร (Life time หรือ Variable scope)

8.1 ชèวงของการทำงาน (Statement block)

กèอนอื่นเราตéองทำความเขéาในเกี่ยวกับชèวงของการทำงานของไพธอนเสียกèอน ยกตัวอยèาง ในภาษา C นั้นชèวงของการทำงานจะครอบดéวย เครื่องหมายป‚กกาเปดและปด ..... แตèใน Python ใชéยèอหนéาแทน (indentation) เชèน >>> x = 1 >>> if x == 1: >>> print "True" >>> else: >>> print "False" >>> print "xxx" การจบ block ก็ดูไดéจากยèอหนéา คำสั่ง if ก็อยèางที่เห็น if ตามดéวย เงื่อนไข จบดéวย : (colon) หลัง จากนั้น สิ่งที่จะถูกทำเมื่อเงื่อนไขเปšนจริงก็จะอยูèในยèอหนéาเยื้องถัดมา ซึ่งโปรแกรมขéางบนก็ไดéผลออกมาเปšน True xxx

8.2 ชèวงชีวิตของตัวแปร (Life time หรือ Variable scope)

ในการกำหนดชèวงชีวิตของตัวแปรวèาตัวแปรตัวไหนจะมีชèวงการทำงานในสèวนใดไดéบéางนั้นสามารถทำไดé โดยจากตัวอยèางดéานลèางนั้น เราไดéสรéางตัวแปรชนิดจำนวนเต็มชื่อวèา x ใหéคèาคือ 5 และสรéางฟ˜งกìชั่นชื่อวèา hello โดยในตัวอยèางที่ 1 นั้นเรากำหนดตัวแปรภายในฟ˜งกìชั่นใหéมีชื่อเปšน x เหมือนกัน แลéวใสèคèาใหéเปšน 6 แลéวตèอมาใหéฟ˜งกìชั่น hello ทำงาน และ print คèา x ออกมา ผลคือไดé 6 และ 5 ตามลำดับ ในตัวอยèางที่ 2 นั้นเราไดéกำหนดตัวแปร และฟ˜งกìชั่นตèาง ๆ เหมือนกับตัวอยèางที่ 1 เพียงแตèเราใชé global มากำหนดใหéกับ x วèาเราจะใชé x จาก global scope แทน แลéวทำการใสèคèาใหéกับ x เปšน 6 ผลที่ไดéคือ 6 และ 6 ตามลำดับ

49 50 ชèวงของการทำงาน (Statement block) และ ชèวงชีวิตของตัวแปร (Life time หรือ Variable scope)

ตัวอยèางที่ 1 ตัวอยèางที่ 2

>>> x = 5 >>> x = 5 >>> def hello(): >>> def hello(): >>> global x >>> x = 6 >>> x = 6 >>> print x >>> print x >>> hello() >>> hello() >>> print x >>> print x คำตอบคือ คำตอบคือ

6 6 5 6

จากตัวอยèางทั้งสองจะเห็นวèาเราสามารถใชéตัวแปรแบบภายในฟ˜งกìชั่นและจากภายนอกฟ˜งกìชั่นไดéดéวยวิธี ดังตèอไปนี้

1. ถéาตéองการใชéตัวแปรภายนอกฟ˜งกìชั่นที่มีอยูèแลéวใหéในคียìเวิรìด global แลéวตามดéวยชื่อตัวแปรที่มีอยูè แลéวจากภายนอกฟ˜งกìชั่นนั้น แลéวจึงนำมาใชéงาน

2. ถéาตéองการประกาศตัวแปรใหมèภายในฟ˜งกìชั่น สามารถประกาศตัวแปรไดéโดยทั่วไปไดéทันที

3. ถéาตéองการใชéทั้งตัวแปรภายนอกและภายในพรéอม ๆ กันใหéตั้งชื่อตัวแปรที่ตั้งใหมè ซึ่งใชéภายในฟ˜งกìชั่น นั้นใหéชื่อแตกตèางกันเพื่อป‡องกันการสับสน บทที่ 9

การควบคุมทิศทางของโปรแกรม (Control flow, Flow of Control หรือ Alternatively)

การควบคุมทิศทางของโปรแกรม เปšนการเลียนแบบ การทำงานของมนุษยì เพราะในเหตุการณìตèาง ๆ เรา มีการตัดสินสินใจในแบบตèาง ๆ กันออกไป เชèนเมื่อเดินทางไปเจอ 3 แยก เราตéองตัดสินใจ เสี้ยวซéายหรือ เลี้ยวขวา โดยมีแผนที่ และป‡ายบอกเสéนทางเปšนตัวกำหนด ใหéเราเลี้ยวซéายหรือเลี้ยวขวา เปšนตéน ในการเขียน โปรแกรมก็คือ การจำลองตัวเราลงไป เพื่อจัดการกับสถาณการณìตèางๆ ซึ่งเราตéองมีขéอมูลในการประกอบการ พิจารณา ถéาขéอมูลบอกเราแบบหนึ่ง เราก็ตéองทำแบบหนึ่ง แตèถéาขéอมูลบอกเราอีกอยèาง เราก็ตéองทำอีกอยèาง ที่แตกตèางกันออกไป ซึงèการที่ตéองจัดการกับสถาณการณìตèางๆ นี้ เราเรียกมันวèาการควบคุมการทำงานของ โปรแกรมนั่นเอง การควบคุมการทำงาน มี 3 รูปแบบ ไดéแกè

1. การตัดสินใจ (Decisions, Choice หรือ Selection)

2. การวนทำซ้ำ (Loop หรือ Iteration)

3. การจัดการความผิดปกติของโปรแกรม (Error Checking)

ในการควบคุมทิศทาง ไมèวèาจะเปšนการตัดสินใจ หรือการทำงานแบบวนซ้ำ เราจะตéองอาศัยการ พิจรณาขéอมูล ที่มีอยูè ประกอบการควบคุม สèวนการจัดการความผิดปกติของโปรแกรมนั้นเปšนการดักจับสิ่งที่อาจจะเกิดขึ้น ไดéจากการเขียนโปรแกรมที่ไมèครอบคลุมการทำงาน ซึ่งอาจจะเกิดขึ้นไดé แตèป‡องกันโปรแกรมปดตัวเองโดย ฉับพลัน เราจึงใชéการจัดการความผิดปกติของโปรแกรมมาชèวยในการดักจับสิ่งเหลèานี้

9.1 การตัดสินใจ (Decisions, Choice หรือ Selection)

9.1.1 if Statements

คำสั่ง if ใชéตัดสินใจวèาจะทำหรือไมèทำคำสั่งชุดหนึ่งที่อยูèภายในชèวงของการทำงานของ if (if Statements scope) ถéาเงื่อนไขที่นำมาทดสอบทางตรรศาสตรìเปšนจริง (True) ก็จะทำคำสั่งชุดนั้นถéาเงื่อนไขที่นำมาทดสอบ ทางตรรกศาสตรìเปšนเท็จ (False) ก็จะไมèทำคำสั่งชุดนั้น โดยมีรูปแบบคำสั่งในภาษาไพธอนดังนี้

51 52 การควบคุมทิศทางของโปรแกรม (Control flow, Flow of Control หรือ Alternatively) if Condition: Statements ...... else: Statements ......

ตัวอยèาง

>>> x = 1 >>> if x is 1: >>> print ’Yes’ >>> else: >>> print ’No’

โดยจากตัวอยèางดéานบนนั้นจะไดéผลออกมาเปšน "Yes" เนื่องจากวèา x มีคèาเปšน 1 และเปรียบเทียบกับ 1 ซึ่งมี คèาเดียวกันผลที่ออกมาเปšน True ในการเปรียบเทียบ แลéวจึงพิมพìคèา "Yes" ออกมานั้นเอง ซึ่งในบางครั้งการตัดสินใจในการทำชุดคำสั่งอาจมีมากกวèา 2 ทางจากขéางตéน เราสามารถในคำสั่งอีกหนึ่ง ตัวที่ชื่อวèา elif ไดé (หรือ มาจาก else if ในภาษาอื่น เชèน java หรือ c/c++) โดยมีรูปแบบดังตèอไปนี้ if Condition: Statements ...... elif Condition: Statements ...... else: Statements ......

ตัวอยèาง

>>> x = 3 >>> if x < 1: >>> print ’x < 1’ >>> elif x > 1: >>> print ’x > 1’ >>> else: >>> print ’x = 1’

จากตัวอยèางดéานบน นั้นเราจะไดéคำตอบคือ "x > 1" 9.2 การวนทำซ้ำ (Loop) 53

9.1.2 switch Statements

ในไพธอนนั้นไมèสนับสนุนการตัดสินใจแบบ switch

9.2 การวนทำซ้ำ (Loop)

9.2.1 while Statements

คำสั่ง while เปšนคำสั่งที่ใชéในการวนทำซ้ำในชèวงของการทำงานของ while (while Statements scope) จนกวèาการทดสอบทางตรรกศาสตรìจะเปšนเท็จ มีรูปแบบดังนี้ while Condition: Statements ......

ตัวอยèาง

>>> x = 1 >>> while x < 5: >>> print ’Yes\n’ >>> x+=1

ผลจากการทำ

Yes Yes Yes Yes

จากตัวอยèางคือกำหนดใหé x มีคèาเปšน 1 แลéวเปรียบเทียบทางตรรกศาสตรìกèอน โดยใหé x < 5 ในที่นี้ x มี คèาเปšน 1 ผลคำตอบคือ True จึงทำคำสั่งภายในชèวงการทำงานของ while โดยการพิมพì Yes แลéวทำการเพิ่ม คèา x โดยการบวกไปทีละ 1 คèา แลéวกลับมาเปรียบเทียบทางตรรกศาสตรìใหมè ทำอยèางนี้ไปเรื่อย ๆ จนกวèา การเปรียบเทียบทางตรรกศาสตรìจะมีผลเปšน False

9.2.2 for Statements

คำสั่ง for เปšนคำสั่งที่ใชéในการวนทำซ้ำในชèวงของการทำงานของ for (for Statements scope) จนกวèา การทดสอบทางตรรกศาสตรìจะเปšนเท็จ โดยมีการกำหนดชèวงการทำงานต่ำสุด และมากสุดของจำนวนครั้งที่ ทำคำสั่งภายในดéวย โดยใชé for รวมกับคำสั่งในการเปรียบเทียบทางตรรกศาสตรìคือ in และ function การ ทำงานแบบชèวงของกลุèมของขéอมูลคือ range (ดูวิธีการใชéไดéจากบทกèอน ๆ ) 54 การควบคุมทิศทางของโปรแกรม (Control flow, Flow of Control หรือ Alternatively) for var in range(m, n [, step = 1]): Statements ......

ตัวอยèาง

>>> for i in range(0, 10): >>> if i % 2 == 0: >>> print i, ’is an even number’ >>> else: >>> print i, ’is an odd number’

จากตัวอยèางดéานบนนั้นทำการทำซ้ำตั้งแตè 0 ไปจนถึง 9 แลéวทำการตรวจสอบหาเลขคี่และเลขคูèดéวย

0 is an even number 1 is an odd number 2 is an even number 3 is an odd number 4 is an even number 5 is an odd number 6 is an even number 7 is an odd number 8 is an even number 9 is an odd number

ซึ่งในไพธอนนั้นไมèสนับสนุน foreach แตèเราสามารถใชéความสามารถของ for มาใชéงานจนไดéคำสั่ง fore- ach ไดéอยูèแลéว

>>> x = {’first’:’one’, ’second’:’two’} >>> for j in x: print x[j] two one

9.2.3 pass, break, continue และ else Clauses Statements pass

เปšนคำสั่งที่ใชéในการทดแทน Statements อื่น ๆ โดยไมèมีการทำงานตัวอยèาง

>>> while True: .... pass .... 9.3 การจัดการความผิดปกติของโปรแกรม (Error Checking) 55 break

คำสั่งนี้ใชéในการหยุดการทำงานของการวนทำซ้ำ หรือการตัดสินใจ continue

คำสั่งนี้ใชéในการเริ่มการทำงานหลังจากหยุดการทำงานของการวนทำซ้ำ หรือการตัดสินใจ else Clauses

คำสั่งนี้ใชéในการทำหลังจาก break ใน การวนทำซ้ำ (Loop, Iteration)

ตัวอยèาง for n in range(2, 10): for x in range(2, n): if n % x == 0: print n, ’equals’, x, ’*’, n/x break else: print n, ’is a prime number’

2 is a prime number 3 is a prime number 4 equals 2 * 2 5 is a prime number 6 equals 2 * 3 7 is a prime number 8 equals 2 * 4 9 equals 3 * 3

9.2.4 do-while Statements

ในไพธอนนั้นไมèสนับสนุนการตัดสินใจแบบ do-while (จะสนับสนุนบน Python 2.5 และมีบน Python 2.5 Beta เมื่อวันที่ 24 กุมพาพันธì 2549)

9.3 การจัดการความผิดปกติของโปรแกรม (Error Checking)

9.3.1 assert Statements

assert เปšนคำสั่งที่วางไวéสำหรับตรวจสอบความผิดพลาดภายในคำสั่งที่เราเขียนในโปรแกรมของเรา โดย เปšนเหมือนสèวนเติมเต็มในการแจéงความผิดพลาดของตัวไพธอนเพื่อบอกรายละเอียดที่มากขึ้นในการเขียน โปรแกรมของเรา ดังรูปแบบคือ assert Condition, ’Text Error or Text Mixed’ 56 การควบคุมทิศทางของโปรแกรม (Control flow, Flow of Control หรือ Alternatively)

ตัวอยèาง def test(arg1, arg2): arg1 = float(arg1) arg2 = float(arg2) assert arg2 != 0, ’Bad dividend, arg1: %f arg2: %f’ % (arg1, arg2) ratio = arg1 / arg2 print ’ratio:’, ratio test(0,2) test(2,0)

เมื่อเราสั่งใหéทำงานจะไดéดังนี้ ratio: 0.0 Traceback (most recent call last): File "C:\tmp.py", line 51, in ? test(2,0) File "C:\tmp.py", line 46, in test assert arg2 != 0, ’Bad dividend, arg1: %f arg2: %f’ % (arg1, arg2) AssertionError: Bad dividend, arg1: 2.000000 arg2: 0.000000

จะเห็นไดéวèาโปรแกรมจะมีตัวชèวยในการสรéางมุมมองของตัวแปรตèาง ๆ ไดéวèาคèาที่ใสèไปนั้นถูกตéองหรือไมè

9.3.2 try-except และ raise Statements (Exception handling)

ในภาษาไพธอนนั้น try-except เปšนการบอกถึงสิ่งผิดปกติที่เกิดขึ้นในโปรแกรม ซึ่งอาจเปšนขéอผิดพลาด หรือเหตุการณìที่ไมèพึงประสงคìและตéองการความดูแลเปšนพิเศษ โดยทั่วไปในการเขียนโปรแกรมที่ดีนั้น เรา จะตéองตรวจสอบถึงเหตุการณìที่อาจทำใหéโปรแกรมของเราลéมเหลวในการทำงาน เชèน ขéอมูลถูกหารดéวยศูนยì, การเขéาหาขéอมูลใน list ดéวยการใชé index ที่ไมèมีอยูèจริง หรือ อéางถึงหนèวยความจำที่เปšน null เปšนตéน ถึงแมéวèา เรามีวิธีการตรวจสอบ error ตèาง ๆ เหลèานี้ดéวยการใชéการตั้งสินใจดéวย if Statements หรือ การตรวจสอบอื่น ๆ ที่ทำใหéโปรแกรมของเราทำงานไดéราบรื่น แตèจะทำใหé code ของเราดูแลéววุèนวายเพราะถéามีการตรวจสอบ ขéอผิดพลาดมากเกินไปชุดคำสั่งของเราก็จะดูซับซéอนมากยิ่งขึ้น แตèไมèไดéหมายความวèาเราจะไมèตรวจสอบ และ ดักจับขéอผิดพลาดเหลèานี้ การนำเอา try-except เขéามาเปšนตัวชèวยในการตรวจสอบและดักจับ ทำใหéเกิดการ แยกสèวนของ code ที่ทำงานไดéราบรื่น ออกจากสèวนของชุดคำสั่งที่จัดการเกี่ยวกับความผิดพลาดทำใหéเรา สามารถที่จะคéนหาสèวนของคำสั่งทั้งสองไดéงèายขึ้น ถéามีการเปลี่ยนแปลง code ในอนาคต ขéอดีอีกอันหนึ่ง ของ try-except ก็คือ ทำใหéการตรวจสอบและดักจับเปšนไปอยèางเฉพาะเจาะจง ตรงกับขéอผิดพลาดที่เกิดขึ้น ทำใหéการแกéไขเปšนไปอยèางถูกตéอง และเนื่องจากวèาขéอผิดพลาดตèาง ๆ มีหลากหลายรูปแบบ เราตéองเขียน คำสั่งตèาง ๆ ขึ้นมารองรับไมèเชèนนั้นแลéว โปรแกรมของเราก็จะไมèผèานการ compile เราไมèจำเปšนที่จะตéอง ใชé try-except ในการตรวจสอบและดักจับ error ในโปรแกรมเสมอไป เพราะการใชé exception จะเสียเวลา ในการประมวลผลมาก ทำใหéโปรแกรมทำงานชéาลง ดังนั้นเราจะตéองตัดสินใจใหéดีวèาควรจะใชé try-except ใน กรณีไหน อยèางไร ตัวอยèางของโปรแกรมที่ไมèตéองใชé try-except ก็นèาจะเปšนการใสèขéอมูลนำเขéาแบบผิด ๆ ของ ผูéใชé ซึ่งถือเปšนเรื่องปกติ ถéาเรามัวแตèเสียเวลาในการดักจับดéวยการใชé try-except แทนการตรวจสอบและดัก จับทั่วไปโปรแกรมของเราก็จะเสียเวลาในการประมวลผลสèวนอื่น ๆ ไป 9.3 การจัดการความผิดปกติของโปรแกรม (Error Checking) 57

รูปแบบคำสั่ง try: Standard operation except: Error operation

จากรูปแบบคำสั่ง ชุดคำสั่งเดิมหรือคำสั่งที่ตéองกาารทำงานทั่ว ๆ ไป จะอยูèภายใตéชèวงการทำงานของ try ถéา การทำงานภายในชèวงการทำงานของ try มีขéอผิดพลาดการทำงานจะกระโดด หรือถูกโยนการทำงานไปสูèชèวง การทำงานของ except แทน ดังตัวอยèางดéานลèางนี้

>>> try: ... x = y ... except: ... print ’y not defined’ ... y not defined

ถéาเราไมèไดéใชé try-except จะไดéผลแบบนี้

>>> x = y Traceback (most recent call last): File "", line 1, in ? NameError: name ’y’ is not defined

จากตัวอยèางที่ไดéดูไปเปšนรูปแบบ try-except ที่งèายที่สุด แตèในการดักจับขéอผิดพลาดจริง ๆ แลéวเราไมèสามารถ ที่จะทำแบบนี้ไดéทุกกรณี เพราะขéอผิดพลาดในชุดคำสั่งที่เราเขียนไปนั้นมีกลุèมของความผิดพลาดที่แตกตèาง กัน เชèนความผิดพลาดของการอèานและเขียนไฟลì, ขéอผิดพลาดจากการทำเกินขอบเขตของลิสตì, ฯลฯ โดยเรา ดูไดéจากตัวอยèางตèอไปนี้ ตัวอยèางที่ไมèไดéใชé try-except

>>> fridge_contents = {"egg":8, "mushroom":20, "pepper":3, "cheese":2, "tomato":4,"milk":13} >>> if fridge_contents["orange juice"] > 3: ... print "Sure, let’s have some juice" ... Traceback (most recent call last): File "", line 1, in ? KeyError: ’orange juice’

จากดéานบนไมèไดéมีการแกéไขป˜ญหาทาง try-except ทำใหéแจéงขéอผิดพลาดแบบควบคุมไมèไดé เราจึงเขียนใหมè โดยใชé try-except มาแกéป˜ญหานี้

>>> fridge_contents = {"egg":8, "mushroom":20, "pepper":3, "cheese":2, "tomato":4,"milk":13} >>> try: 58 การควบคุมทิศทางของโปรแกรม (Control flow, Flow of Control หรือ Alternatively)

... if fridge_contents["orange juice"] > 3: ... print "Sure, let’s have some juice" ... except KeyError: ... print "Aww, there’s no juice. Lets go shopping" ... Aww, there’s no juice. Lets go shopping

เมื่อเราใชé try-except เราสามารถควบคุมควบคุมวèาผลของความผิดพลาดที่ออกมาจะเปšนอยèางไรดéวย โดย ควบคุมชนิดของความผิดพลาดวèาจะใหéออกมาเปšนแบบใด ในที่นี้ในการ except ความผิดพลาดแบบ KeyEr- ror แลéวใหéพิมพìขéอความผิดพลาดออกมา

>>> fridge_contents = {"egg":8, "mushroom":20, "pepper":3, "cheese":2, "tomato":4,"milk":13} >>> try: ... if fridge_contents["orange juice"] > 3: ... print "Sure, let’s have some juice" ... except KeyError, error: ... print "Woah! There is no %s" % error ... Woah! There is no ’orange juice’

raise เปšน Statements เสริมของ try-except เพื่อชèวยในการโยนความผิดพลาดไปใชéใน try-except ตèอ อื่น ๆ ที่เกี่ยวขéอง

>>> class E(RuntimeError): ... def __init__(self, msg): ... self.msg = msg ... def getMsg(self): ... return self.msg ... >>> >>> try: ... raise E(’my test error’) ... except E, obj: ... print ’Msg:’, obj.getMsg() ... Msg: my test error บทที่ 10

การสรéางฟ˜งกìชั่น (Defined Function)

ฟ˜งกìชั่นคือแหลèงรวมชุดคำสั่งหลาย ๆ โดยคำสั่งที่เราเรียบเรียงขึ้นเอง เพื่อนำไปใชéในการเขียนโปรแกรม ซ้ำ ๆ กันโดยไมèตéองเขียนชุดคำสั่งนั้น ๆ ใหมèอีกครั้ง (Reusability Code) โดยในไพธอนนั้นก็มีฟ˜งกìชั่นอยูè 2 แบบคือ สามารถคืนคèากลับมาไดé (real function, return value) และแบบไมèคืนคèา (void, sub , subprogram หรือ subroutine ) การสรéางฟ˜งกìชั่นจะใชéคียìเวิรìดชื่อ def แลéวตามดéวยชื่อของฟ˜งกìชั่นนั้น ๆ โดยลักษณะของ ชèวงการทำงานเหมือนกับคำสั่งควบคุมทิศทางโปรแกรมตèาง ๆ เชèนเดียวกัน รูปแบบการเขียนคำสั่ง def function_name( [Argument] ): Statement …… [return]

• function name ชื่อฟ˜งกìชั่น

• Statements ชุดคำสั่ง

• var ตัวแปร

• Argument รับคèาของฟ˜งกìชั่น

• return การคืนคèากลับ โดยที่การคืนคèากลับนั้นสามารถคืนคèากลับไดéมากกวèา 1 คèา หรือมากกวèา 1 ตัวแปร ซึ่งสามารถคืนคèาไดéทุกชนิดขéอมูลดéวย

ตัวอยèาง

# สèวนนี้ใชé define ฟ˜งกìชั่น def foo(): print "Foobar" # สèวนนี้เปšนสèวนที่เรียกใชé ตéองมีเครื่องหมาย () หลังวงเล็บเสมอ foo()

ผลการทำงาน

Foobar

59 60 การสรéางฟ˜งกìชั่น (Defined Function)

10.1 การรับคèาของฟ˜งกìชั่น, คืนคèากลับ และคèามาตรฐานของการรับคèา

1. การรับคèาของฟ˜งกìชั่น (Function Argument)

2. การคืนคèากลับ (return)

3. คèามาตรฐานของการรับคèา (Function Default Argument)

ตัวอยèาง

# สèวนนี้ใชé define ฟ˜งกìชั่น def foo(text): print text # สèวนนี้เปšนสèวนที่เรียกใชé ตéองมีเครื่องหมาย () หลังวงเล็บเสมอ foo("Foobar")

ผลการทำงาน

Foobar

ตัวอยèาง คียìเวิรìด return เปšนคำสั่งใหéฟ˜งกìชั่นนั้นคืนคèาและ ออกจาก function def add(x,y): return x + y print add(10,20) print add(add(10,20),30)

ผลการทำงาน

30 60

ตัวอยèาง การคืนคèาแบบหลายคèา หรือหลายตัวแปร a, b, c = 0, 0, 0 def getabc(): a = "Hello" b = "World" c = "!" return a,b,c def gettuple(): a,b,c = 1,2,3 return (a,b,c) def getlist(): a,b,c = (3,4),(4,5),(5,6) return [a,b,c] a,b,c = getabc() 10.1 การรับคèาของฟ˜งกìชั่น, คืนคèากลับ และคèามาตรฐานของการรับคèา 61 print a,b,c d,e,f = gettuple() print d,e,f g,h,i = getlist() print g,h,i

ผลการทำงาน

Hello World ! 1 2 3 (3, 4) (4, 5) (5, 6)

ตัวอยèาง กำหนดคèามาตรฐานของตัวแปร x และ y ใหéมีคèาเปšน 0 เพื่อป‡องกันการไมèใสèใหéกับตัวรับคèาใน ฟ˜งกìชั่น def add(x = 0,y = 0): return x + y print add(10,20) print add()

ผลการทำงาน

30 0

ตัวอยèาง def multiprint( n=5, txt="Hello" ): i = 0 while i < n: print txt multiprint()

ผลการทำงาน

Hello Hello Hello Hello

ตัวอยèาง def factorial(n = 1): if n <= 1: return 1 return n*factorial(n-1) print "2! = ",factorial(2) 62 การสรéางฟ˜งกìชั่น (Defined Function) print "3! = ",factorial(3) print "4! = ",factorial(4) print "5! = ",factorial(5)

ผลการทำงาน

2! = 2 3! = 6 4! = 24 5! = 120

10.2 ตัวแปรแบบ Global (ทั่วไป) และ Local (เฉพาะสèวน)

ในการประกาศตัวแปรตัวหนึ่งขึ้นมาใชé จะเปลืองหนèวยความจำไปสèวนหนึ่งสำหรับเก็บคèาตัวแปร ดังนั้นถéา เราประกาศตัวแปรมา 1 ตัว แลéวนำไปใชéเพียงในฟ˜งกìชั่นเดียว จะเปšนการสิ้นเปลื่องโดยใชèเหตุ ดังนั้นควร ประกาศตัวแปรแบบทั่วไปบéางตามความเหมาะสม โดยตัวแปรเฉพาะสèวนที่อยูèภายในฟ˜งกìชั่นนั้น เมื่อฟ˜งกìชันจบการทำงานตัวแปรพวกนี้จะถูกลบออกไป จากหนèวยความจำทันที ซึ่งประโยชนìอีกอยèางหนึ่งของตัวแปรเฉพาะ (Local Variable) ก็คือ สèวนอื่น ๆ ของ โปรแกรมจะไมèรูéจักตัวแปรเฉพาะสèวนที่อยูèในฟ˜งกìชั่นเลย ดังนั้นเราก็สามารถใชéตัวแปรชื่อเดียวกันไดé พรéอมกันในคนละสèวนของโปรแกรม โดยไมèเกิดขéอผิดพลาด โดยในการทำงานหลัก ๆ ของโปรแกรมเราก็ตéองใชéตัวแปรทั่วไป (Global Variable) โดยที่ตัวแปรทั่วไป จะเปšนที่รูéจักไปทั้งโปรแกรมดังนั้นฟ˜งกìชั่นตèาง ๆ ก็สามารถเรียกใชéไดéดéวย โดยการเรียกใชéตัวแปรทั่วไปในนั้น ตéองใชéดียìเวิรìดที่ชื่อ global ตามดéวยชื่อตัวแปรแบบทั่วไป

ตัวอยèาง การใชéตัวแปรแบบเฉพาะที่ ตัวอยèาง การใชéตัวแปรแบบทั่วไป

x = 5 x = 5 def hello(): def hello(): global x x = 6 x = 6 print x print x hello() hello() print x print x ผลการทำงาน ผลการทำงาน

6 6 5 6 บทที่ 11

การใสèขéอมูลผèานคียìบอรìด (Input Data from Keyboard)

เราสามารถใหéผูéใชéสามารถที่จะใสèคèาที่เราตéองการไดéผèานทางคียìบอรìดโดยทำงานผèานฟ˜งกìชั่นที่ชื่อวèา raw input รูปแบบการเขียนคำสั่ง var = raw_input([prompt])

• prompt ขéอความที่เปšนคำถาม

• var ตัวแปรที่มารับขéอมูล ซึ่งคèาที่สèงออกมาจาก raw input ฟ˜งกìชั่น โดยมีชนิดขéอมูลเปšน String

ตัวอยèาง print "Halt!" s = raw_input("Who Goes there? ") print "You may pass,", s

เมื่อสั่งทำงานจะแสดงขéอความดังนี้

Halt! Who Goes there?

ทำการกรอกขéอมูลงไปใน โดยในตัวอยèางนี้กรอกคำวèา Josh ลงไป แลéวจะทำการแสดงออกมา

Halt! Who Goes there? Josh You may pass, Josh

63 64 การใสèขéอมูลผèานคียìบอรìด (Input Data from Keyboard)

ตัวอยèาง menu_item = 0 list = [] while menu_item != 9: print "------" print "1. Print the list" print "2. Add a name to the list" print "3. Remove a name from the list" print "4. Change an item in the list" print "9. Quit" menu_item = input("Pick an item from the menu: ") if menu_item == 1: current = 0 if len(list) > 0: while current < len(list): print current,". ",list[current] current = current + 1 else: print "List is empty" elif menu_item == 2: list.append(raw_input("Type in a name to add: ")) elif menu_item == 3: del_name = raw_input("What name would you like to remove: ") if del_name in list: item_number = list.index(del_name) del list[item_number] #The code above only removes the first occurance of # the name. The code below from Gerald removes all. #while del_name in list: # item_number = list.index(del_name) # del list[item_number] else: print del_name," was not found" elif menu_item == 4: old_name = raw_input("What name would you like to change: ") if old_name in list: item_number = list.index(old_name) list[item_number] = raw_input("What is the new name: ") else: print old_name," was not found" print "Goodbye" 65

การทำงาน เมื่อทำงานจะแสดงขéอความดéานลèางนี้

------1. Print the list 2. Add a name to the list 3. Remove a name from the list 4. Change an item in the list 9. Quit

ใหéพิมพì 2 ลงไปแลéวกรอกคำวèา Jack และไลèการทำงานตèาง ๆ ดังตัวอยèางดéานลèาง ไปเรื่อย ๆ ซึ่งนี่คือการ ทำงานโดยการรับคèาผèานทางคียìบอรìดนั้นเอง

Pick an item from the menu: 2 Type in a name to add: Jack

Pick an item from the menu: 2 Type in a name to add: Jill

Pick an item from the menu: 1 0 . Jack 1 . Jill

Pick an item from the menu: 3 What name would you like to remove: Jack

Pick an item from the menu: 4 What name would you like to change: Jill What is the new name: Jill Peters

Pick an item from the menu: 1 0 . Jill Peters

Pick an item from the menu: 9 Goodbye 66 การใสèขéอมูลผèานคียìบอรìด (Input Data from Keyboard) ภาคผนวก ก

เรื่องที่หéามลืมใน Python

1. Don’t forget the colons อยèาลืมโคลอน (Colon, :) เมื่อจบคำสั่งควบคุมทิศทางของโปรแกรมตèาง ๆ เชèน if, while หรือ for เปšนตéน

2. Start in column 1 ไพธอนใชéระบบแท็ปแทนป‚กกาเพื่อควบคุมชèวงของการทำงาน และตéองเริ่มจาก คอลัมที่ 1 ทุกครั้งดéวย

3. Blank lines matter at the interactive prompt อยèาเผลอมีบรรทัดวèางหรือขึ้นบรรทัดใหมèใน shell prompt ถéาไมèชัวรìวèาเขียนคำสั่งจบในบรรทัดนั้น ๆ

4. Indent consistently อยèาใชéปุèมแท็ปปนกับการเคาะเวéนวรรค โดยควรเลือกวèาจะใชéการแท็ปหรือเคาะ วรรคì ถéาใชéเคาะวรรคก็ควรใชéใหéตลอดรอดฝ˜›ง โดย 1 แท็ป ใหéมีขนาดเทèากับเคาะวรรค 4 ครั้ง (4 whitespaces/tab)

5. Don’t code C in Python อยèาเขียนโคéดแบบ C ในไพธอน เชèน if (X==1): print X โดยในความ เปšนจริงแลéวไมèตéองมี () ก็ไดé เปšนตéน

6. Don’t always expect a result บาง Method เชèน Append หรือ Sort อยèาไปคิดวèามันจะ return obj บางครั้งมัน return None หรือ Null ออกมา ซึ่งเราไมèจำเปšนตéองเขียน list=list.append(X) แตèใหé เขียน list.append(X) ลงไปไดéเลย

7. Use calls and imports properly หลังเรียก Method ใหéมี () ดéวยเชèน function() อยèาใชé function เฉยๆ และตอน Import ไมèตéองใสèนามสกุล file อยèาง import mod.py ใชé import mod เฉยๆ ก็พอ

67 68 เรื่องที่หéามลืมใน Python ภาคผนวก ข

การติดตั้ง Python, wxPython และ Stani’s Python Editor

ข.1 การติดตั้ง Python

* ในเอกสารนี้อéางอิง Python Version 2.4.3

1. ดาวนìโหลด Python 2.4 สำหรับ Windows ไดéจาก http://www.python.org/download/ และเลือก version 2.4.x จากรายการดาวนìโหลด โดยเลือกรูปแบบ "Python 2.4.x Windows installer"

รูปที่ ข.1: เลือกดาวนìโหลด Python 2.4 สำหรับ Windows

2. ดับเบิลคลิ้กที่ Python-2.xxx.yyy.exe ที่เปšนไฟลìที่เราดาวนìโหลด แลéวทำตามขั้นตอนการติดตั้งดังตèอไปนี้

69 70 การติดตั้ง Python, wxPython และ Stani’s Python Editor

รูปที่ ข.2: ขั้นตอนที่ 1 : ดับเบิลคลิ้กที่ไฟลìติดตั้ง

รูปที่ ข.3: ขั้นตอนที่ 2 : เลือก "Install for all users"

รูปที่ ข.4: ขั้นตอนที่ 3 : ใหéเลือกที่ติดตั้งที่ C:\Python24\ ข.1 การติดตั้ง Python 71

รูปที่ ข.5: ขั้นตอนที่ 4 : เลือกติดตั้งทุกตัวเลือก

รูปที่ ข.6: ขั้นตอนที่ 5 : ดำเนินการติดตั้ง

รูปที่ ข.7: ขั้นตอนที่ 6 : เสร็จสิ้นการติดตั้ง 72 การติดตั้ง Python, wxPython และ Stani’s Python Editor

ข.2 การติดตั้ง wxPython

* ในเอกสารนี้อéางอิง wxPython Version 2.6.3.3 win32-unicode for Python 2.4 1. ดาวนìโหลด wxPython Version 2.6 สำหรับ Windows ไดéจาก http://www.wxpython.org/download.php และไปที่ Microsoft Windows และเลือก win32-unicode จากตาราง wxPython runtime โดยเลือก ที่คอรìลัม Python 2.4 จากรายการดาวนìโหลด โดย win32-unicode สำหรับ Windows NT/2000/XP และ win32-ansi สำหรับ Windows 95/98/Me

รูปที่ ข.8: เลือกดาวนìโหลด wxPython runtime for Python 2.4

รูปที่ ข.9: เลือกสถานที่ดาวนìโหลด

2. ดับเบิลคลิ้กที่ wxPython2.6-win32-unicode-2.6.3.3-py24.exe แลéวทำตามขั้นตอนการติดตั้งดังตèอไปนี้ ข.2 การติดตั้ง wxPython 73

รูปที่ ข.10: ขั้นตอนที่ 1 : ดับเบิลคลิ้กที่ไฟลìติดตั้ง

รูปที่ ข.11: ขั้นตอนที่ 2 : หนéาตéอนรับการติดตั้งใหé กด Next

รูปที่ ข.12: ขั้นตอนที่ 3 : หนéายอมรับขéอตกลงใหé กด Yes

รูปที่ ข.13: ขั้นตอนที่ 4 : หนéาเลือกสถานที่ติดตั้ง ใหéเลือกตามที่โปรแกรมไดéกำหนดไวéแตèแรก 74 การติดตั้ง Python, wxPython และ Stani’s Python Editor

รูปที่ ข.14: ขั้นตอนที่ 5 : หนéาเลือก component ใหéเลือกทั้งหมด แลéวกด Next

รูปที่ ข.15: ขั้นตอนที่ 6 : เขéาสูèขั้นตอนการติดตั้งและเมื่อเสร็จแลéวใหéเลือก checkbox ทั้งหมดเพื่อใหé โปรแกรมติดตั้งทำการดัดแปลงระบบเพิ่มเติมแลéวกด Finish ข.3 การติดตั้ง Stani’s Python Editor 75

ข.3 การติดตั้ง Stani’s Python Editor

* ในเอกสารนี้อéางอิง Stani’s Python Editor Version 0.8.2.a for wxPython Version 2.6 win32- unicode and Python 2.4 1. ดาวนìโหลด Stani’s Python Editor Version 0.8.2.a ไดéจาก http://www.stani.be/python/spe/page download และไปที่ Where to get? และเลือก SourceForge (mirror)

รูปที่ ข.16: ดาวนìโหลด Stani´s Python Editor Version 0.8.2.a สำหรับ Windows ไดéจากลิงสì SourceForge (mirror)

รูปที่ ข.17: เลือกสถานที่ดาวนìโหลด

2. ดับเบิลคลิ้กที่ SPE-0.8.2.a-wx2.6.1.0-py24.exe ที่เปšนไฟลìที่เราดาวนìโหลด แลéวทำตามขั้นตอนการ ติดตั้งดังตèอไปนี้ 76 การติดตั้ง Python, wxPython และ Stani’s Python Editor

รูปที่ ข.18: ขั้นตอนที่ 1 : ดับเบิลคลิ้กที่ไฟลìติดตั้ง

รูปที่ ข.19: ขั้นตอนที่ 2 : หนéาตéอนรับการติดตั้งใหé กด Next

รูปที่ ข.20: ขั้นตอนที่ 3 : หนéาเลือกสถานที่ติดตั้ง ใหéเลือกตามที่โปรแกรมไดéกำหนดไวéแตèแรก ข.3 การติดตั้ง Stani’s Python Editor 77

รูปที่ ข.21: ขั้นตอนที่ 4 : เขéาสูèขั้นตอนการติดตั้งโดยกด Next เพื่อเริ่มการติดตั้ง

รูปที่ ข.22: ขั้นตอนที่ 5 : เขéาสูèขั้นตอนการติดตั้ง และเสร็จสิ้นการติดตั้ง 78 การติดตั้ง Python, wxPython และ Stani’s Python Editor ภาคผนวก ค

อธิบายสèวนตèาง ๆ พอสังเขปของโปรแกรม SPE

รูปที่ ค.1: เปดโปรแกรม Stani’s Python Editor หรือเรียกสั้น ๆ วèา SPE ขึ้นมา

79 80 อธิบายสèวนตèาง ๆ พอสังเขปของโปรแกรม SPE

รูปที่ ค.2: หนéาตèางโปรแกรม Stani’s Python Editor (SPE)

ค.0.1 Sidebar

Explore

เปšนหนéาตèาง Class browser สำหรับแสดงรายการ class, method และ function ที่แสดงออกมาเปšน โครงสรéางตéนไมé

Index

หนéาตèางที่ทำหนéาที่คéนหาอัตโนมัติสำหรับสรéาง index เพื่อทำ index ใหéกับการคéนโดยทำ index จาก class และ and method

Todo

หนéาตèางแสดงรายการที่ตéองทำในไฟลìนั้น ๆ

Notes

หนéาตèางแสดงหมายเหตุตèาง 81

Browser

หนéาตèางในการแสดงไฟลìใน folder หรือ directory ที่ไฟลìนั้นอยูè ทำงานคลéาย ๆ กับ Windows Explorer

ค.0.2 Source

Editor

หนéาตèางสำหรับในการพิมพìโคéดคำสั่งตèาง ๆ

UML view

หนéาตèางแสดง Graphical layout ของลำดับของ class hierarchy

Pydoc

หนéาตèางสรéางไฟลì documentation แบบอัตโนมัติ

Separators

หนéาตèางสำหรับใชé separator เพื่อทำ Label ของชุดคำสั่งของโปรแกรม

ค.0.3 Tools

Shell

เปšนสèวนรายงานความผิดพลาดตèาง ๆ ของโปรแกรมที่เราเขียน และสามารถใชéเปšนตัวกระโดดขéามไปยัง Error line ไดéงèาย และยังใชéในการพิมพìคำสั่ง หรือโคéดโปรแกรมตèาง ๆ แทน Editor ไดéดéวย

รูปที่ ค.3: Shell

Local object browser

เปšนสèวนบอกรายการตัวแปร, อ็อปเจ็ค และคลาส ตèาง ๆ เพื่อใชéในการดูชèวงของชีวิตของตัวแปร และ อ็อปเจ็คตèาง ๆ และยังชèวยในการคéนหาและกระโดดไปยังตัวแปร, อ็อปเจ็ค และคลาส ที่เราตéองการไดéงèาย 82 อธิบายสèวนตèาง ๆ พอสังเขปของโปรแกรม SPE

รูปที่ ค.4: Local object browser

Session

เปšนตัวบันทึกการพิมพìโคéดโปรแกรมสำหรับชèวยในการไมèตéองพิมพìใหมèในกรณีที่ใชé shell ในการพิมพì คำสั่งโปรแกรมตèาง ๆ

รูปที่ ค.5: Session

Output

ถéาคุณสั่งใหéโปรแกรมทำงานใน SPE โดยใชéคำสั่ง Tools > Run/Stop ตัวผลการทำงานจะออกมาใน หนéาตèางนี้ รวมถึง Error ตèาง ๆ โดยสามารถกระโดดไปยังโคéดหรือชุดคำสั่งที่ Error นั้น ๆ ไดéจากหนéาตèางนี้

รูปที่ ค.6: Output 83

อื่น ๆ

1. Find หนéาตèางสำหรับการคéนหาขéอมูลตèาง ๆ

2. Browser หนéาตèางที่ใชéในการเรียกรายชื่อไฟลìซึ่งทำงานเหมือน Windows Explorer

3. Recent หนéาตèางแสดงรายชื่อไฟลìที่เราเปดอยูè

4. Todo หนéาตèางแสดงรายการที่ตéองทำใน Project หรือไฟลìที่เราเปดอยูè

5. Index หนéาตèางคำสั่งสำหรับเรียกใชéสารบัญงานตèาง ๆ ภายในไฟลì

6. Notes หนéาตèางคำสั่งหมายเหตุสำหรับป‡องกันการหลงลืม 84 อธิบายสèวนตèาง ๆ พอสังเขปของโปรแกรม SPE ภาคผนวก ง

การเขียน, Debug และสั่งใหéโปรแกรมทำงาน

ง.1 การเขียนโปรแกรมใน SPE และสั่งใหéโปรแกรมทำงาน

เพื่อทดสอบการทำงานใหéพิมพìคำสั่งโปรแกรมเริ่มตéนกèอนโดยพิมพìคำสั่งดังนี้

>>> print "Hello, World!"

พิมพìลงใน Source Editor แลéวไปไปที่ "Tools" ที่ menu bar แลéวไปที่ คำสั่ง "Run without argu- ments/Stop" หรือกด short-key Ctrl+Shift+R

รูปที่ ง.1: สั่งใหéโปรแกรมทำงาน

รูปที่ ง.2: ผลการทำงาน

85 86 การเขียน, Debug และสั่งใหéโปรแกรมทำงาน

ง.2 การ Debug โปรแกรม

รูปที่ ง.3: การแจéง Error เพื่อใชéประกอบการ Debug

File "C:\Documents and Settings\Ford AntiTrust\Desktop\helloworld.py", line 1 print "Hello, World! ^ SyntaxError: EOL while scanning single-quoted string

จากตัวอยèางไดéแจéง Error ไดéสองที่ดéวยกัน คือหนéาตèาง Editor ซึ่งจะมีเสéนใตéเปšนฟ˜นปลาสีแดงขีดตาม บรรทัดที่มี Error และในหนéาตèาง Output ก็มี Error Code แจéงไวé โดยไดéบอกไวéวèาที่ line 1 มี Error โดย บอกวèาเปšน SyntaxError และมีป˜ญหาจาก Systax ลักษณะ single-quoted string มีป˜ญหานั้นเอง โดยป˜ญหาในการแจéงตèาง ๆ นั้นตัว Interpreter จะแจéงใหéทราบไดéจาก line ที่มีป˜ญหา เชèนตัวอยèางดéาน ลèางนี้ไดéแจéงไวéวèามาจาก line ที่ 1

File "C:\Documents and Settings\Ford AntiTrust\Desktop\helloworld.py", line 1

รวมไปถึงแจéง column ของ line วèานèาจะผิดที่คำสั่งใด ในที่นี้ผิดที่คำสั่ง print นั้นเอง print "Hello, World! ^ SyntaxError: EOL while scanning single-quoted string ภาคผนวก จ

ขéอมูลอéางอิง

• Python programming language. http://www.python.org/, Python Software Foundation, 2006.

• Python programming language. http://en.wikipedia.org/wiki/Python programming language, Wikipedia the free encyclopedia, 2006.

• Python software. http://en.wikipedia.org/wiki/Python software, Wikipedia the free encyclope- dia, 2006.

• Comparison of programming languages. http://en.wikipedia.org/wiki/Comparison of programming languages, Wikipedia the free en- cyclopedia, 2006.

• Python Tutorial Online. http://python.cmsthailand.com/, CMSthailand.com, 2005.

• An empirical comparison of C, C++, Java, Perl, Python, Rexx, and Tcl — March 2000 refereed journal paper. http://page.mi.fu-berlin.de/prechelt/Biblio/jccpprt˜ computer2000.pdf, Lutz Prechelt, 2000.

• Programming in Python. http://www-128.ibm.com/developerworks/library/os-python5/index.html, Robert Brunner ([email protected]), Research Scientist, National Center for Supercomputing Applications, 2005.

• wxPython, a blending of the wxWidgets C++ class library. http://www.wxpython.org/, OS- AF (Open Source Applications Foundation), 2006.

• Stani’s Python Editor, Python IDE with Blender, Kiki, PyChecker, wxGlade & XRC support. http://pythonide.stani.be/, S. Michiels, Amsterdam, the Netherlands 2006.

• Beginning Python Wiley Publishing, Inc., Peter Norton, Alex Samuel, David Aitel, Eric Foster-Johnson, Leonard Richardson, Jason Diamond, Aleatha Parker, Michael Roberts, 2005.

• Python http://veer.exteen.com/, วีรì สัตยมาศ, 2005.

• เรื่องที่หéามลืมใน Python http://plynoi.exteen.com/20060827/python, Plynoi, 2006.

87 ดรรชนี

64 bit double precision, 30 จำนวนเชิงซéอน (Complex Numbers), 31 จำนวนเต็ม (Integer), 29 Alternatively, 50 จำนวนเต็มธรรมดา (Plain Integer), 29 Category และ Application Domains, 16 จำนวนเต็มแบบยาว (Long integer), 30 3D Graphics Rendering, 17 สายอักขระ (String หรือ Array of Characters), Database Access, 16 39 Desktop GUI, 17 Flow of Control, 50 Education, 17 Function argument, 59 Game, 17 Functions GUI, 17 abs(), 26 Network programming, 17 complex(), 31 Numeric computation, 17 float(), 31 Scientific, 17 int(), 30 Software builder, 17 len(), 34 Software Testing, 17 max(), 26 Web และ Internet Development, 16 min(), 26, 27 Colon Symbol, 32 print, 21 Comment, 22 range(), 27, 53–55 Concatenation Symbol, 40 raw input, 63 Control flow, 50 set(), 35 Data type, 27 sum(), 27 ชนิดขéอมูลแบบการรวมกลุèมขéอมูล (Collection type(), 29 Data Types), 32 Google, 19 ดิกชันนารี (Dictionary หรือ Groupings of Guido van Rossum, 13 Data Indexed by Name), 33 ทับเบิ้ล (Tuples) และ อนุกรม (Sequences), Hello World, 21, 85 33 ลิสตì (List), 32 Industrial Light & Magic, 18 อารìเรยì (Array), 32 Language Evaluation Criteria, 15 เซ็ต (Sets), 34 Cost, 15 ตัวเลข (Numbers), 29 Readability, 15 imaginary number, 31 Reliability, 15 signed integer, 29 Writability, 15 จำนวนตรรกะ (Boolean), 30 จำนวนจริง (Floating-point numbers), 30 Multi-paradigm language, 15

88 ดรรชนี 89

NASA, 19 return , 22 try, 22, 56 Operator while, 22, 53 *, 25 with, 22 **, 25, 30 yield, 22 +, 25 -, 25 Stani’s Python Editor (SPE), 75 /, 25 Browser, 81 %, 25 Explore, 80 Index, 80 Python, 13 Notes, 80 Source, 81 Repetition Symbol, 21 Editor, 81 Reserved words (Keywords), 22 Pydoc, 81 and, 22, 47 Separators, 81 as, 22 UML view, 81 assert, 22, 55 Todo, 80 break, 22, 54 Tools, 81 class, 22 Local object browser, 81 continue, 22, 54 Output, 82 def, 22, 58 Session, 82 del, 22 Shell, 81 elif, 22, 51 อื่น ๆ, 83 else, 22, 51 การเขียน, Debug และสั่งใหéโปรแกรมทำงาน, 85 else clauses, 54 การ Debug โปรแกรม, 86 else if, 51 การสั่งใหéโปรแกรมทำงาน, 85 except, 22, 56 การเขียนโปรแกรมใน SPE, 85 exec, 22 หนéาตèางโปรแกรม, 80 finally, 22 statement block, statement scope, 48 for, 22, 53 String Concatenation Symbol, 40 from, 22 String formatting operator, 41 global, 22, 49, 62 Symbol if, 22, 51 *, 21 import, 22 +, 40 in, 22, 45, 53–55 „ 40 is, 22, 45 :, 32 lambda, 22 #, 22 not, 22, 47 % (String formatting operator), 41 or, 22, 47 pass, 22, 54 type print, 22 bool, 30 raise, 22, 56 complex, 31 return, 59 dict, 33 90 ดรรชนี

False, 30 การคำนวณพื้นฐาน (normal arithmetic oper- float, 30 ators), 25 int, 29 คูณ, 25 list, 32 บวก, 25 long, 30 ยกกำลัง, 25 set, 34 ลบ, 25 True, 30 หาร, 25 tuple, 34 หารเอาเศษ, 25 อันดับความสำคัญของการคำนวณ, 25 wxPython, 72 การตั้งตัวชื่อแปร, 22 การติดตั้ง, 69 การควบคุมทิศทางของโปรแกรม, 50 Python, 69 การจัดการความผิดปกติของโปรแกรม (Error Check- Stani’s Python Editor (SPE), 69, 75 ing), 51, 55 wxPython, 69, 72 assert Statements, 55 การสรéางฟ˜งกìชั่น (Defined Function), 58 try-except และ raise Statements (Exception Global Variable, 62 handling), 56 Local Variable, 62 การตัดสินใจ (Decisions, Choice or Selection), การคืนคèากลับ (return) , 60 51 การรับคèาของฟ˜งกìชั่น (Function Argument), 60 การตัดสินใจ (Decisions, Choice หรือ Selec- คèามาตรฐานของการรับคèา (Function Default Ar- tion) gument, 60 elif, 51 การเปรียบเทียบ (Comparisons), 43 else, 51 ตัวอยèาง, 45 else if, 51 การแสดงผลเบื้องตéน (Printing) และสัญลักษณìที่เกี่ยวขéอง, if, 51 19 switch, 52 ขéอเดèนของภาษาไพธอน, 15 การวนทำซ้ำ (Loop, Iteration), 51 break, 54 คำสงวน, 22 continue, 54 ชนิดของตัวแปร, 27 do-while, 55 ชèวงของการทำงาน, 48 else clauses, 54 ชèวงของการทำงาน (Statement block), 49 for, 53 ชèวงชีวิตของตัวแปร (Life time หรือ Variable s- while, 53 cope), 49 การคำนวณทางคณิตศาสตรì (Arithmetic Mathemat- ics), 23 ซอฟตìแวรìที่เขียนดéวยไพธอน, 17 การคำนวณผèานฟ˜งกìชั่นภายใน (Built-in Math Battlefield 2, 18 Functions), 26 BitTorrent, 17 การหาคèาสัมบูรณì, 26 Blender, 18 กำหนดจำนวนตัวเลขทศนิยม, 27 Chandler, 18 จำนวนที่นéอยที่สุด และมากที่สุดในกลุèม, 26 Civilization IV, 18 ชèวงของขéอมูลตัวเลข, 27 EVE Online, 18 หาผลรวมทั้งหมดในชุดขéอมูล, 27 Indian Ocean Tsunami Detector, 18 ดรรชนี 91

Kombilo, 18 Mailman, 18 MoinMoin, 18 OpenRPG, 18 Plone, 18 Stani’s Python Editor(SPE), 18 Trac, 18 Turbogears, 18 ViewVC, 18 Zope, 18

นิพจนìทางตรรกะศาสตรì (Boolean Expressions), 46 AND, 47 NOT, 47 OR, 47

ประวัติ, 13 Python 1.0, 13 Python 2.0, 14 อนาคต, 14

หลักปรัชญาของภาษาไพธอน, 15