คิดอย่างไพธอน

จาก วิกิตำรา
ไปยังการนำทาง ไปยังการค้นหา

คิดอย่างไพธอน

แปลจาก Think Python โดย Allen Downey, 2nd Edition, Ver 2.2.20 (https://greenteapress.com/wp/think-python/)

เนื้อหา

คำนำ[แก้ไข]

วิถีของโปรแกรม (The way of the program)[แก้ไข]

จุดประสงค์ของตำรานี้ คือ สอนให้คุณคิดอย่างนักวิทยาศาสตร์คอมพิวเตอร์ หรือวิศวกรคอมพิวเตอร์. วิธีคิดนี้ รวมเอาส่วนของแง่มุมที่ดีที่สุดของคณิตศาสตร์ วิศวกรรม และวิทยาศาสตร์ธรรมชาติ. ในลักษณะเดียวกับนักคณิตศาสตร์ วิศวกรคอมพิวเตอร์ใช้ ภาษารูปนัย (formal language) เพื่อสื่อถึงความคิด (โดยเฉพาะ การคำนวณ การประมวณข้อมูล). ในลักษณะเดียวกับวิศวกรอื่นๆ วิศวกรคอมพิวเตอร์ออกแบบสิ่งต่างๆ ประกอบส่วนประกอบต่างๆเข้าด้วยกันเป็นระบบที่ใหญ่ขึ้น และประเมินข้อดี-ข้อเสีย (tradeoffs) ของทางเลือกต่างๆ. ในลักษณะเดียวกับนักวิทยาศาสตร์ วิศวกรคอมพิวเตอร์สังเกตุพฤติกรรมของระบบที่ซับซ้อน ตั้งสมมติฐาน และทดสอบสมมติฐาน.

ทักษะที่สำคัญที่สุดของวิศวกรคอมพิวเตอร์ คือ ทักษะการแก้ปัญหา (problem solving). ทักษะการแก้ปัญหา หมายถึง ความสามารถในการอ่าน-ตีความปัญหา (formulate problems) คิดอย่างสร้างสรรค์เกี่ยวกับวิธีการแก้ปัญหา (think creatively about solutions) และ การนำเสนอวิธีแก้ปัญหาได้อย่างกระจ่างและตรงประเด็น (express a solution clearly and accurately). นั่นเท่ากับว่า กระบวนการเรียนการเขียนโปรแกรม เป็น โอกาสที่ดีในการฝึกฝนทักษะการแก้ปัญหา. นั่นเป็นเหตุผลว่า บทนี้เรียกว่า วิถีของโปรแกรม

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

อะไรคือโปรแกรม (What is a program?)[แก้ไข]

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

รายละเอียดของโปรแกรม แตกต่างกันไปบ้างตามแต่ละภาษา แต่คำสั่งพื้นฐานต่างๆ ก็มีอยู่ในทุกๆภาษา ได้แก่

  • อินพุต (input) รับข้อมูลเข้าจากแป้นพิมพ์ ไฟล์ เครือข่าย หรือ อุปกรณ์อื่นๆ.
  • เอาต์พุต (output) แสดงข้อมูลออกหน้าจอ บันทึกข้อมูลลงไฟล์ ส่งข้อมูลผ่านเครือข่าย หรือ ส่งข้อมูลไปอุปกรณ์อื่นๆ.
  • คณิตศาสตร์ (math) ทำการคิดคณิตศาสตร์พื้นฐาน เช่น การบวก และการคูณ.
  • การทำเงื่อนไข (conditional execution) ตรวจสอบเงื่อนไขที่ระบุ และเลือกทำคำสั่งที่เหมาะสม.
  • การทำซ้ำ (repetition) ทำคำสั่งซ้ำๆ โดยแต่ละรอบของการทำซ้ำอาจมีความต่างบ้าง.

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

การรันโปรแกรมไพธอน (Running Python)[แก้ไข]

เรื่องหนึ่งที่ยากที่สุดของการเริ่มใช้ไพธอน (Python) คือ คุณอาจจะต้องติดตั้งไพธอน รวมถึงซอฟต์แวร์ที่เกี่ยวข้อง. ถ้าคุณคุ้นเคยกับระบบปฏิบัติการ โดยเฉพาะถ้าคุณสะดวกที่จะใช้คอมมานไลน์ (command-line interface) คุณไม่น่ามีปัญหาในการติดตั้งไพธอน. แต่สำหรับมือใหม่ มันก็อาจจะลำบากบ้างที่จะต้องเรียนการจัดการระบบไปพร้อมๆกับการเรียนเขียนโปรแกรม.

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

โปรแกรมแรก (The first program)[แก้ไข]

ตัวดำเนินการพีชคณิต (Arithmetric operators)[แก้ไข]

ค่าและชนิด (Values and types)[แก้ไข]

ภาษารูปนัย และ ภาษาธรรมชาติ (Formal and natural languages)[แก้ไข]

การดีบัก (Debugging)[แก้ไข]

คำศัพท์ (Glossary)[แก้ไข]

(Exercises)[แก้ไข]

ตัวแปร นิพจน์ และข้อความสั่ง (Variables, expressions and statements)[แก้ไข]

ฟังชั่น (Functions)[แก้ไข]

กรณีศึกษา การออกแบบการเชื่อมต่อ (Case study: interface design)[แก้ไข]

(Conditionals and recursion)[แก้ไข]

(Fruitful functions)[แก้ไข]

(Iteration)[แก้ไข]

(Strings)[แก้ไข]

(Case study: word play)[แก้ไข]

(Lists)[แก้ไข]

(Dictionaries)[แก้ไข]

(Tuples)[แก้ไข]

(Case study: data structure selection)[แก้ไข]

(Files)[แก้ไข]

คลาสและวัตถุ (Classes and objects)[แก้ไข]

ณ จุดนี้เรารู้แล้วว่าจะใช้ฟังก์ชันเพื่อจัดระเบียบคำสั่งได้อย่างไรและรู้วิธีใช้ชนิดข้อมูลภายในเพื่อการจัดการข้อมูล ในขั้นถัดไปเป็นการเรียนรู้ "การโปรแกรมเชิงวัตถุ" (Object-oriented programming) ซึ่งใช้ชนิดข้อมูลที่ผู้เขียนกำหนดเองเพื่อจัดการทั้งข้อมูลและคำสั่งในตัว การโปรแกรมเชิงวัตถุมีเนื้อหากว้าง เพื่อให้ครอบคลุมเนื้อหาทั้งหมดจะต้องศึกษาอีกสองถึงสามบทถัดไป

สามารถดูตัวอย่างโปรแกรมของบทนี้ได้ที่ http://thinkpython2.com/code/Point1.py และมีเฉลยอยู่ที่ http://thinkpython2.com/code/Point1_soln.py

ชนิดข้อมูลผู้เขียนกำหนดเอง (User-defined types)[แก้ไข]

ที่ผ่านมาเราได้ใช้หลากหลายชนิดข้อมูลที่สร้างไว้ภายใน ต่อไปเราจะสร้างชนิดข้อมูลใหม่ เพื่อใช้เป็นตัวอย่างเราจะสร้างชนิดข้อมูลที่ชื่อว่า Point ที่แสดงถึงพิกัดในระนาบสองมิติ

ในทางคณิตศาสตร์ใช้สัญลักษณ์แทนพิกัดด้วยวงเล็บคร่อมตำแหน่งที่คั่นด้วยจุลภาค ตัวอย่างเช่น (0,0) ใช้แทนจุดกำเนิดและใช้สัญกรณ์ ​(x,y) หมายถึงจุดที่อยู่ห่างจากจุดกำเนิดไปทางขวา x และอยู่เหนือจากจุดกำเนิดเท่ากับ y

มีหลายวิธีที่สามารถใช้ในการแทนค่าพิกัดในภาษาไพธอน ตัวอย่างเช่น

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

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

ชนิดข้อมูลที่ผู้เขียนสร้างขึ้นจะมีชื่อเรียกอีกอย่างว่า คลาส (class) การนิยามคลาสมีลักษณะดังต่อไปนี้

class Point:

    """Represents a point in 2-D space."""

ส่วนหัวบอกถึงการประกาศคลาสใหม่ที่ชื่อว่า Point ส่วนเนื้อหาเป็นข้อความบรรยายถึงวัตถุประสงค์ของคลาสนี้ นอกจากนี้คุณยังสามารถกำหนดให้มีตัวแปรและเมธอด (method) ไว้ภายในคลาสได้ แต่จะได้กล่าวถึงในภายหลัง

การประกาศคลาสเป็นการสร้างวัตถุคลาส (class object)

>>> Point

<class '__main__.Point'>

เนื่องจากคลาสถูกประกาศไว้ระดับบนสุด ดังนั้นชื่อเต็มของคลาสจึงเป็นดังนี้ __main__.Point

คุณลักษณะ (Attributes)[แก้ไข]

รูปสี่เหลี่ยม (Rectangles)[แก้ไข]

ส่งค่ากลับเป็นอินสแตนซ์ (Instances as return values)[แก้ไข]

วัตถุสามารถแก้ไขได้ (Objects are mutable )[แก้ไข]

การคัดลอกวัตถุ (Copying)[แก้ไข]

การดีบัก (Debugging)[แก้ไข]

อภิธานศัพท์ (Glossary)[แก้ไข]

แบบฝึกหัด (Exercises)[แก้ไข]

(Classes and functions)[แก้ไข]

(Classes and methods)[แก้ไข]

(Inheritance)[แก้ไข]

(The Goodies)[แก้ไข]

(Debugging)[แก้ไข]

(Analysis of algorithms)[แก้ไข]