กลับสู่คอร์สเรียน
AI036 Undergraduate

การเขียนโปรแกรมพีธอน: การแนะนำวิชาคอมพิวเตอร์ไซเอนซ์

หนังสือเรียนระดับมหาวิทยาลัยเบื้องต้นเล่มนี้ถูกออกแบบมาเพื่อสอนหลักการพื้นฐานของวิชาคอมพิวเตอร์ไซเอนซ์ โดยใช้ภาษาโปรแกรมพีธอนเป็นภาษาหลัก หนังสือเล่มนี้เน้นการแก้ปัญหา การออกแบบ และการเขียนโปรแกรมผ่านแบบจำลองการเรียนรู้แบบเกลียว (spiral coverage model) และแนวทางที่เน้นกราฟิก

4.9
39.0h
793 ผู้เรียน
0 การถูกใจ
ปัญญาประดิษฐ์

ภาพรวมคอร์สเรียน

📚 สรุปเนื้อหา

หนังสือเรียนระดับมหาวิทยาลัยนี้ออกแบบมาเพื่อสอนหลักการพื้นฐานของวิทยาการคอมพิวเตอร์โดยใช้ภาษาโปรแกรมพายธอน (Python) เป็นภาษาหลัก โดยเน้นการแก้ปัญหา การออกแบบ และการเขียนโปรแกรมผ่านแบบจำลองการเรียนรู้แบบเกลียว (spiral coverage model) และแนวทางที่เน้นกราฟิก

บทนำอันอ่อนโยนและครอบคลุมเกี่ยวกับศิลปะของวิทยาการคอมพิวเตอร์ผ่านมุมมองของพายธอน

ผู้แต่ง: จอห์น เอ็ม. เซลล์

คำขอบคุณ: กูโด แวน รอสซัม (คำนำ), จิม ไลซี และเพื่อนร่วมงานด้านวิชาการจากวิทยาลัยวาร์ตเบิร์ก และมหาวิทยาลัยต่างๆ เช่น โอเวน อัสตราชาน, แคย ฮอร์สต์แมน, และ เนลล์ เดล

🎯 วัตถุประสงค์การเรียนรู้

  1. แยกแยะความแตกต่างระหว่างฮาร์ดแวร์/ซอฟต์แวร์ และอัลกอริธึม/โปรแกรม
  2. อธิบายว่าไบต์โค้ดในตัวแปลภาษาพายธอน (Python interpreter) แปลโค้ดระดับสูงให้กลายเป็นคำสั่งที่ทำงานได้อย่างไร
  3. กำหนดและเรียกใช้ฟังก์ชันพายธอนพื้นฐานโดยใช้พารามิเตอร์และอาร์กิวเมนต์
  4. ระบุและอธิบายขั้นตอนการพัฒนาซอฟต์แวร์ 6 ขั้นตอน
  5. ประยุกต์กฎการเขียนรหัสพายธอนเพื่อสร้างชื่อที่ถูกต้องและนิพจน์ทางคณิตศาสตร์ที่มีลำดับการดำเนินการถูกต้อง
  6. แยกแยะโมเดลตัวแปรแบบ "กล่อง" และ "โน้ตติด" และอธิบายกระบวนการประเมินค่าและการกำหนดค่า
  7. แยกแยะประเภทข้อมูล int และ float และประยุกต์ใช้การแปลงชนิดข้อมูลอย่างชัดเจน
  8. ใช้รูปแบบการรวมผล (accumulator pattern) เพื่อแก้ปัญหาเชิงคณิตศาสตร์ เช่น การหาค่าแฟกเตอรีล
  9. ใช้ไลบรารี math ในพายธอนเพื่อแก้สมการพีชคณิต รวมถึงสูตรกำลังสอง
  10. กำหนดและประยุกต์แนวคิดหลักของวัตถุ-เชิงวัตถุ (OO): วัตถุ, เมธอด, การเข้าถึง (accessors), การเปลี่ยนแปลง (mutators), และการอ้างอิง (aliasing)

🔹 บทเรียนที่ 1: บทนำสู่วิทยาการคอมพิวเตอร์และพื้นฐานพายธอน

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

ผลลัพธ์การเรียนรู้:

  • แยกแยะความแตกต่างระหว่างฮาร์ดแวร์/ซอฟต์แวร์ และอัลกอริธึม/โปรแกรม
  • อธิบายว่าตัวแปลภาษาพายธอนแปลโค้ดระดับสูงให้กลายเป็นคำสั่งที่ทำงานได้อย่างไรผ่านไบต์โค้ด
  • กำหนดและเรียกใช้ฟังก์ชันพายธอนพื้นฐานโดยใช้พารามิเตอร์และอาร์กิวเมนต์

🔹 บทเรียนที่ 2: กระบวนการพัฒนาซอฟต์แวร์และโปรแกรมพื้นฐาน

ภาพรวม: บทเรียนนี้แนะนำแนวทางระบบในการสร้างซอฟต์แวร์ผ่านกระบวนการพัฒนา 6 ขั้นตอน และส่วนประกอบพื้นฐานของการเขียนโปรแกรมพายธอน นักเรียนจะสำรวจไวยากรณ์พื้นฐาน ได้แก่ ชื่อตัวแปร นิพจน์ และการกำหนดค่า พร้อมเปรียบเทียบโมเดลตัวแปรแบบ "โน้ตติด" กับแนวคิดดั้งเดิม บทเรียนสิ้นสุดด้วยการใช้งานลูปแบบแน่นอน (definite loops) ด้วยฟังก์ชัน range() เพื่อจัดการการคำนวณซ้ำ

ผลลัพธ์การเรียนรู้:

  • ระบุและอธิบายขั้นตอนการพัฒนาซอฟต์แวร์ 6 ขั้นตอน
  • ประยุกต์กฎไวยากรณ์พายธอนเพื่อสร้างชื่อที่ถูกต้องและนิพจน์ทางคณิตศาสตร์ที่มีลำดับการดำเนินการถูกต้อง
  • แยกแยะโมเดลตัวแปรแบบ "กล่อง" และ "โน้ตติด" และอธิบายกระบวนการประเมินค่าและการกำหนดค่า

🔹 บทเรียนที่ 3: การแทนค่าข้อมูลจำนวนและไลบรารีคณิตศาสตร์

ภาพรวม: บทเรียนนี้สำรวจวิธีที่คอมพิวเตอร์แทนค่าและจัดการข้อมูลเชิงตัวเลข โดยแยกแยะระหว่างจำนวนเต็มที่เป็นจำนวนเฉพาะ (จำนวนเต็ม) และค่าประมาณของจำนวนจริง (จุดลอยตัว) นักเรียนจะเรียนรู้การคำนวณที่ซับซ้อนโดยใช้ตัวดำเนินการในพายธอนและไลบรารี math พร้อมเข้าใจข้อจำกัดที่แท้จริงของระบบเลขฐานสองและข้อจำกัดด้านความแม่นยำ

ผลลัพธ์การเรียนรู้:

  • แยกแยะประเภทข้อมูล int และ float และประยุกต์ใช้การแปลงชนิดข้อมูลอย่างชัดเจน
  • ใช้รูปแบบการรวมผล (accumulator pattern) เพื่อแก้ปัญหาเชิงคณิตศาสตร์ เช่น การหาค่าแฟกเตอรีล
  • ใช้ไลบรารี math ของพายธอนเพื่อแก้สมการพีชคณิต รวมถึงสูตรกำลังสอง

🔹 บทเรียนที่ 4: กราฟิกเชิงวัตถุ-เชิงวัตถุและอินเทอร์เฟซผู้ใช้แบบโต้ตอบ

ภาพรวม: บทเรียนนี้นำนักเรียนจากโปรแกรมแบบข้อความ มาสู่การใช้งานอินเทอร์เฟซผู้ใช้แบบกราฟิก (GUI) โดยใช้แนวทางเชิงวัตถุ-เชิงวัตถุ (OO) นักเรียนจะเรียนรู้การจัดการวัตถุกราฟิก (จุด สาย รูปทรง) การจัดการระบบพิกัด และการสร้างโปรแกรมโต้ตอบที่ตอบสนองต่อการกดเมาส์ แป้นพิมพ์ และการกรอกข้อมูล

ผลลัพธ์การเรียนรู้:

  • กำหนดและประยุกต์แนวคิดหลักของวัตถุ-เชิงวัตถุ: วัตถุ, เมธอด, การเข้าถึง (accessors), การเปลี่ยนแปลง (mutators), และการอ้างอิง (aliasing)
  • สร้างและแสดงวัตถุกราฟิก เช่น จุด (Points), เส้นตรง (Lines), วงกลม (Circles), สี่เหลี่ยม (Rectangles), รูปไข่ (Ovals), และรูปหลายเหลี่ยม (Polygons)
  • ใช้การแปลงพิกัดและองค์ประกอบโต้ตอบ (เมาส์/คีย์บอร์ด/กล่องกรอกข้อมูล) เพื่อสร้าง GUI ที่ใช้งานได้จริง

🔹 บทเรียนที่ 5: ลำดับข้อมูล: สายอักษร รายการ และการอ่าน/เขียนไฟล์

ภาพรวม: บทเรียนนี้สำรวจวิธีที่วิทยาการคอมพิวเตอร์แทนค่าและจัดการลำดับข้อมูล โดยเน้นเฉพาะสายอักษร (strings) และรายการ (lists) นักเรียนจะเรียนรู้กลไกการดัชนี (indexing) และการตัดส่วน (slicing) ความแตกต่างสำคัญระหว่างวัตถุที่เปลี่ยนแปลงได้ (mutable) กับไม่เปลี่ยนแปลงได้ (immutable) และวิธีติดต่อกับข้อมูลภายนอกผ่านการจัดการไฟล์ บทเรียนยังครอบคลุมการเข้ารหัสข้อมูลผ่านยูนิคอเดอร์ (Unicode) และหลักการพื้นฐานของรหัสลับโดยใช้การเข้ารหัสแบบพื้นฐาน

ผลลัพธ์การเรียนรู้:

  • ดำเนินการขั้นสูงกับสายอักษรและรายการโดยใช้การดัชนี การตัดส่วน และเมธอดในตัว (split, join, upper, lower)
  • ออกแบบและนำเสนอลำดับการเข้ารหัส/ถอดรหัส และการเข้ารหัสแบบตัวอักษร (เช่น คาเซียร์ และการแทนที่)
  • พัฒนาโปรแกรมประมวลผลแบบแบตช์ที่เปิด อ่าน ประมวลผล และปิดไฟล์ข้อมูลภายนอก

🔹 บทเรียนที่ 6: การกำหนดฟังก์ชันและขอบเขตของตัวแปร

ภาพรวม: บทเรียนนี้สำรวจการเปลี่ยนจากเขียนสคริปต์ขนาดใหญ่เป็นการสร้างโปรแกรมแบบมอดูลาร์โดยใช้ฟังก์ชัน ครอบคลุมไวยากรณ์ในการกำหนดและเรียกใช้ฟังก์ชัน กลไกการส่งข้อมูลผ่านพารามิเตอร์จริง (actual parameters) และพารามิเตอร์นามธรรม (formal parameters) และวิธีที่ฟังก์ชันส่งผลลัพธ์กลับไปยังโปรแกรมผ่านค่าที่ส่งคืน (รวมถึงหลายค่าและวัตถุ None) นักเรียนยังเรียนรู้เรื่องขอบเขตของตัวแปร — โดยเฉพาะความแตกต่างระหว่างตัวแปรท้องถิ่น (local) และตัวแปรทั่วโลก (global) — และวิธีที่ฟังก์ชันสามารถเปลี่ยนแปลงพารามิเตอร์ที่เปลี่ยนแปลงได้เพื่อส่งผลต่อสถานะโปรแกรม

ผลลัพธ์การเรียนรู้:

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

🔹 บทเรียนที่ 7: โครงสร้างการตัดสินใจและการจัดการข้อผิดพลาด

ภาพรวม: บทเรียนนี้แนะนำโครงสร้างการตัดสินใจ ซึ่งทำให้โปรแกรมสามารถดำเนินการลำดับคำสั่งที่แตกต่างกันตามเงื่อนไขเฉพาะ นักเรียนจะเรียนรู้การสร้างนิพจน์บูลีนโดยใช้ตัวดำเนินการเปรียบเทียบ นำไปสู่การปฏิบัติการตัดสินใจแบบเดียว สองทาง และหลายทาง พร้อมใช้การวางซ้อน (nesting) สำหรับตรรกะที่ซับซ้อน บทเรียนยังครอบคลุมการดำเนินการแบบโมดูลาร์ด้วยตัวแปร __name__ และการจัดการข้อผิดพลาดอย่างแข็งแรงผ่านการจัดการข้อผิดพลาด (exception handling)

ผลลัพธ์การเรียนรู้:

  • ใช้โครงสร้างการตัดสินใจแบบง่าย สองทาง และหลายทางโดยใช้ if, else, และ elif
  • สร้างและประเมินนิพจน์บูลีนโดยใช้ตัวดำเนินการเปรียบเทียบ และลำดับเชิงอักษร (lexicographic ordering) สำหรับสายอักษร
  • ใช้รูปแบบ try-except เพื่อจัดการข้อผิดพลาดขณะทำงานและป้องกันการหยุดทำงานของโปรแกรม

🔹 บทเรียนที่ 8: ลูปแบบไม่แน่นอนและตรรกะบูลีน

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

ผลลัพธ์การเรียนรู้:

  • ออกแบบและใช้งาน ลูปแบบไม่แน่นอน โดยใช้คำสั่ง while ของพายธอน
  • ประยุกต์ใช้รูปแบบลูปที่พบบ่อย ได้แก่ ลูปแบบโต้ตอบ, ลูปลิขสิทธิ์, และ รูปแบบการอ่านก่อน (priming read pattern)
  • ลดความซับซ้อนของเงื่อนไขตรรกะโดยใช้ พีชคณิตบูลีน และ กฎของเดอมอร์แกน (DeMorgan’s Laws)

🔹 บทเรียนที่ 9: การจำลอง ออกแบบ และการปรับปรุงแบบค่อยเป็นค่อยไป

ภาพรวม: บทเรียนนี้สำรวจกระบวนการเชิงระบบในการพัฒนาโปรแกรมคอมพิวเตอร์ที่ซับซ้อนผ่าน การออกแบบแบบด้านบนลงล่าง (Top-Down Design) และ การปรับปรุงแบบค่อยเป็นค่อยไป (Stepwise Refinement) นักเรียนจะเรียนรู้การแยกปัญหาใหญ่ออกเป็น "ชิ้นเล็ก" ที่จัดการได้โดยใช้การสร้างภาพรวม (abstraction) และการแบ่งแยก (modularization) แสดงภาพลำดับชั้นของโปรแกรมผ่าน แผนผังโครงสร้าง (Structure Charts) และนำเทคนิคการจำลองแบบ มอนติคาร์โล (Monte Carlo) มาใช้ บทเรียนยังครอบคลุมกลยุทธ์การพัฒนาแบบวนซ้ำ เช่น การสร้างต้นแบบ (Prototyping) และ การพัฒนาแบบเกลียว (Spiral Development) พร้อมวิธีทดสอบที่มั่นคง เช่น การทดสอบหน่วย (Unit Testing)

ผลลัพธ์การเรียนรู้:

  • แยกปัญหาซับซ้อนออกเป็นปัญหาย่อยที่แก้ได้โดยใช้ การออกแบบแบบด้านบนลงล่าง (Top-Down Design)
  • สร้างและตีความ แผนผังโครงสร้าง (Structure Charts) ที่แสดงการไหลของข้อมูล (พารามิเตอร์และค่าที่ส่งคืน) ระหว่างโมดูล
  • ใช้เทคนิคการจำลองแบบมอนติคาร์โลเพื่อจำลองเหตุการณ์ที่มีความน่าจะเป็น โดยใช้ไลบรารี random ของพายธอน

🔹 บทเรียนที่ 10: การกำหนดคลาสและการเขียนโปรแกรมที่ขึ้นอยู่กับเหตุการณ์

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

ผลลัพธ์การเรียนรู้:

  • แยกแยะความแตกต่างระหว่างการออกแบบโปรแกรมแบบฟังก์ชันและแบบวัตถุ-เชิงวัตถุ
  • กำหนดคลาสพายธอนเองโดยใช้คอนสตรัคเตอร์ (__init__), ตัวแปรอินสแตนซ์ และพารามิเตอร์ self
  • ใช้การบรรจุข้อมูล (encapsulation) และเอกสารโดยใช้ docstrings

🔹 บทเรียนที่ 11: การจัดเก็บข้อมูล: รายการขั้นสูงและไดคชันนารี

ภาพรวม: บทเรียนนี้สำรวจเทคนิคการจัดเก็บข้อมูลขั้นสูงในพายธอน โดยเน้นความหลากหลายของรายการ (lists) และไดคชันนารี (dictionaries) นักเรียนจะเรียนรู้การแยกแยะรายการของพายธอนจากอาร์เรย์แบบดั้งเดิม ดำเนินการรายการขั้นสูง เช่น การตัดส่วน (slicing) และการจัดเรียงข้อมูล รวมถึงการใช้การแมปแบบไม่เรียงลำดับผ่านไดคชันนารี บทเรียนสิ้นสุดด้วยการประยุกต์โครงสร้างเหล่านี้ในการวิเคราะห์สถิติ และอัลกอริธึมคลาสสิก เช่น วิธีการตัดกรองเอราทอสเทนีส (Sieve of Eratosthenes)

ผลลัพธ์การเรียนรู้:

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

🔹 บทเรียนที่ 12: หลักการการออกแบบเชิงวัตถุ-เชิงวัตถุ (OOD)

ภาพรวม: บทเรียนนี้สำรวจการเปลี่ยนจากแบบจำลองการออกแบบเชิงฟังก์ชันแบบด้านบนลงล่าง มาเป็นการออกแบบเชิงวัตถุ-เชิงวัตถุ (OOD) ซึ่งเป็นแนวทางที่เน้นข้อมูล โดยระบุระบบว่าเป็นชุดของ "กล่องดำ" (วัตถุ) ที่มีปฏิสัมพันธ์กัน นักเรียนจะเรียนรู้การระบุวัตถุและเมธอดที่เป็นไปได้ การใช้คลาสหลายตัวในการจำลองสถานการณ์ เช่น แร็กเก็ตบอล และโป๊กเกอร์ลูกเต๋า และประยุกต์หลักสามประการของวัตถุ-เชิงวัตถุ: การบรรจุข้อมูล (Encapsulation), การพหุรูป (Polymorphism), และการสืบทอด (Inheritance) บทเรียนสิ้นสุดด้วยการจัดการปฏิสัมพันธ์แบบซับซ้อนของอินเทอร์เฟซผู้ใช้แบบกราฟิก (GUI) ผ่านการสืบทอดคลาสและการแทนที่เมธอด

ผลลัพธ์การเรียนรู้:

  • ระบุ คลาสและเมธอดที่เป็นไปได้จากโจทย์ปัญหาโดยวิเคราะห์คำนามและกริยา
  • ประยุกต์ใช้ การจำลองสถานการณ์แบบซับซ้อนหลายวัตถุโดยใช้คลาสที่จัดโครงสร้าง (เช่น Player, Game, Stats)
  • แยกแยะ และประยุกต์แนวคิดพื้นฐานของ การบรรจุข้อมูล (Encapsulation), การพหุรูป (Polymorphism), และการสืบทอด (Inheritance)

🔹 บทเรียนที่ 13: การออกแบบอัลกอริธึม ความเรียบง่ายและการประสิทธิภาพ

ภาพรวม: บทเรียนนี้สำรวจเทคนิคพื้นฐานที่ใช้ในการแก้ปัญหาคอมพิวเตอร์อย่างมีประสิทธิภาพ ครอบคลุมกลยุทธ์การค้นหา กลไกการแก้ปัญหาแบบเรียกซ้ำ (recursive) ที่มีกรณีฐาน (base cases) และขั้นตอนเรียกซ้ำ (recursive steps) และการเปรียบเทียบอัลกอริธึมการเรียงลำดับ เช่น การเรียงแบบเลือก (Selection Sort) และการเรียงแบบรวม (Merge Sort) เพื่อเข้าใจว่าการออกแบบอัลกอริธึมส่งผลต่อประสิทธิภาพอย่างไร

ผลลัพธ์การเรียนรู้:

  • เปรียบเทียบและประยุกต์ใช้กลยุทธ์การค้นหาแบบเส้นตรง (Linear) และแบบไบนารี (Binary)
  • ออกแบบฟังก์ชันแบบเรียกซ้ำโดยใช้กรณีฐานและขั้นตอนเรียกซ้ำสำหรับปัญหา เช่น การพลิกกลับสายอักษร และการยกกำลังอย่างรวดเร็ว
  • วิเคราะห์ข้อเสียเปรียบด้านประสิทธิภาพระหว่างการเรียกซ้ำกับการวนซ้ำ และระหว่างอัลกอริธึมการเรียงลำดับต่างๆ (n^2 กับ n \log n)