K: เข้าใจ 4 เสาหลักของการคิดเชิงคำนวณในการแก้ปัญหา P: สามารถแตกปัญหาย่อยและออกแบบอัลกอริทึมได้ถูกต้อง A: มีความรอบคอบและคิดวิเคราะห์อย่างเป็นระบบ
การคิดเชิงคำนวณ (Computational Thinking) เป็นทักษะการแก้ปัญหาอย่างมีระเบียบแบบแผน เพื่อให้คอมพิวเตอร์หรือมนุษย์สามารถปฏิบัติตามได้อย่างถูกต้อง ประกอบด้วย 4 เสาหลักสำคัญ:
1. การแยกย่อยปัญหา (Decomposition): การแบ่งปัญหาใหญ่ที่ซับซ้อนออกเป็นปัญหาย่อยๆ ที่จัดการได้ง่ายขึ้น
2. การหารูปแบบ (Pattern Recognition): การสังเกตความคล้ายคลึงหรือแนวโน้มของข้อมูลเพื่อลดความซ้ำซ้อน
3. การคิดเชิงนามธรรม (Abstraction): การคัดเลือกเฉพาะสาระสำคัญที่จำเป็นต่อการแก้ปัญหา และตัดรายละเอียดที่ไม่เกี่ยวข้องออก
4. การออกแบบอัลกอริทึม (Algorithm Design): การกำหนดลำดับขั้นตอนวิธี 1, 2, 3... เพื่อนำไปสู่วิธีแก้ปัญหาที่นำไปเขียนโค้ดได้จริง
Python 3.10+ Script
คัดลอกโค้ด
# 1. Decomposition: กำหนดคะแนนเก็บแต่ละรายวิชา
scores = [85, 92, 78, 64, 88]
# 2. Pattern & Abstraction: คำนวณเฉพาะผลรวมและค่าเฉลี่ย
total_score = sum(scores)
subject_count = len(scores)
average_score = total_score / subject_count
# 3. Algorithm: ตรวจสอบระดับผลการเรียน
if average_score >= 80:
grade_desc = "ดีเยี่ยม (ระดับ 4)"
elif average_score >= 70:
grade_desc = "ดี (ระดับ 3)"
else:
grade_desc = "ผ่านเกณฑ์มาตรฐาน"
print(f"ผลคะแนนรวม: {total_score} คะแนน")
print(f"คะแนนเฉลี่ย: {average_score:.2f} คะแนน")
print(f"ผลการประเมินคุณภาพ: {grade_desc}")
ผลคะแนนรวม: 407 คะแนน
คะแนนเฉลี่ย: 81.40 คะแนน
ผลการประเมินคุณภาพ: ดีเยี่ยม (ระดับ 4)
ข้อสังเกตสำหรับครูผู้สอน: ก่อนให้นักเรียนลงมือพิมพ์โค้ด ควรให้นักเรียนฝึกเขียนผังงาน (Flowchart) หรือรหัสลำลอง (Pseudocode) ลงในสมุด เพื่อสร้างกระบวนการคิดเชิงตรรกะก่อนเข้าสู่ไวยากรณ์ภาษา
ใบกิจกรรมฝึกปฏิบัติการ 1.1
ให้นักเรียนวิเคราะห์ปัญหาการคำนวณ อัตราการสิ้นเปลืองน้ำมันเชื้อเพลิง (กม./ลิตร) โดยรับระยะทางรวม (กม.) และปริมาณน้ำมันที่ใช้ (ลิตร) จากนั้นประเมินว่ารถยนต์คันนี้ประหยัดน้ำมันหรือไม่ (เกณฑ์: เกิน 15 กม./ลิตร ถือว่าประหยัด)
คลิกดูแนวทางการเขียนโค้ดและเฉลย
Solution Guide
คัดลอกเฉลย
distance_km = 450.0 # ระยะทางที่วิ่งได้
fuel_liters = 28.0 # ปริมาณน้ำมันที่ใช้
consumption_rate = distance_km / fuel_liters
print(f"อัตราสิ้นเปลือง: {consumption_rate:.2f} กม./ลิตร")
if consumption_rate >= 15.0:
print("ผลการประเมิน: รถยนต์ประหยัดพลังงานดีเยี่ยม")
else:
print("ผลการประเมิน: รถยนต์มีอัตราสิ้นเปลืองปกติหรือสูง")
K: เข้าใจสถาปัตยกรรมตัวแปลภาษา Python (Interpreter) P: ติดตั้งเครื่องมือและสั่งพิมพ์ผลลัพธ์ด้วย print() ได้ A: ตระหนักถึงความสำคัญของการจัดรูปแบบโค้ดที่ถูกต้อง
ภาษา Python เป็นภาษาประเภท Interpreted Language ซึ่งประมวลผลคำสั่งทีละบรรทัดผ่านตัวแปลภาษา (Python Interpreter) ทำให้สะดวกในการทดสอบและเรียนรู้ เครื่องมือแนะนำในห้องเรียน ได้แก่ VS Code หรือ Thonny IDE
คำสั่งพื้นฐานที่สุดคือคำสั่ง print() ซึ่งทำหน้าที่ส่งออกข้อมูลออกทางหน้าจอ โดยมีพารามิเตอร์เสริมสำคัญ:
sep="..." กำหนดตัวคั่นระหว่างข้อมูล (ค่าเริ่มต้นคือเว้นวรรค)
end="..." กำหนดตัวปิดท้ายบรรทัด (ค่าเริ่มต้นคือขึ้นบรรทัดใหม่ \n)
Python 3.10+ Script
คัดลอกโค้ด
# ตรวจสอบสภาพแวดล้อมและทดสอบคำสั่ง print()
import sys
import platform
print("=== ยินดีต้อนรับสู่ห้องเรียนคอมพิวเตอร์ ครูบาส ===")
print("ระบบปฏิบัติการ:", platform.system(), platform.release())
print("เวอร์ชันภาษา Python:", platform.python_version())
# การใช้ sep และ end ในการจัดรูปแบบการแสดงผล
print("Python", "Programming", "Class", sep=" | ")
print("กำลังโหลดข้อมูล", end="... ")
print("เสร็จสมบูรณ์ 100%")
=== ยินดีต้อนรับสู่ห้องเรียนคอมพิวเตอร์ ครูบาส ===
ระบบปฏิบัติการ: Windows 10
เวอร์ชันภาษา Python: 3.10.11
Python | Programming | Class
กำลังโหลดข้อมูล... เสร็จสมบูรณ์ 100%
Pro-Tip: ภาษา Python ให้ความสำคัญกับตัวพิมพ์เล็ก-ใหญ่ (Case-sensitive) ดังนั้นคำสั่ง Print() หรือ PRINT() จะส่งผลให้เกิดข้อผิดพลาด NameError ทันที
ใบกิจกรรมฝึกปฏิบัติการ 1.2
ให้นักเรียนเขียนโปรแกรมพิมพ์ป้ายนิเทศแนะนำห้องปฏิบัติการคอมพิวเตอร์ โดยใช้ sep และ end ให้ข้อความแสดงเป็นกรอบสวยงาม 3 บรรทัด
คลิกดูแนวทางการเขียนโค้ดและเฉลย
Solution Guide
คัดลอกเฉลย
border = "=" * 40
print(border)
print("ห้องปฏิบัติการคอมพิวเตอร์", "กลุ่มสาระวิทย์-เทคโน", sep=" :: ")
print("พร้อมสำหรับการเรียนรู้ศตวรรษที่ 21", end="\n")
print(border)
K: จำแนกชนิดข้อมูลพื้นฐาน int, float, str, bool ได้ P: ประกาศตัวแปรและแปลงชนิดข้อมูล (Type Casting) ได้ถูกต้อง A: ปฏิบัติตามมาตรฐานการตั้งชื่อตัวแปรแบบสากล
ตัวแปร (Variable) ทำหน้าที่เป็นชื่ออ้างอิงตำแหน่งในหน่วยความจำเพื่อเก็บค่าข้อมูล ใน Python ไม่จำเป็นต้องประกาศชนิดข้อมูลล่วงหน้า (Dynamic Typing) ชนิดข้อมูลหลักที่ใช้บ่อยได้แก่:
int (Integer): จำนวนเต็มบวก ลบ ศูนย์ เช่น 42, -7
float (Floating point): จำนวนจริงมีทศนิยม เช่น 3.14159, 0.85
str (String): ข้อความหรืออักขระ อยู่ในเครื่องหมายคำพูดเดี่ยวหรือคู่ เช่น "ครูบาส"
bool (Boolean): ค่าความจริงทางตรรกศาสตร์ มีเพียง True หรือ False
การแปลงชนิดข้อมูล (Type Casting) ใช้ฟังก์ชัน int(), float(), str(), bool()
Python 3.10+ Script
คัดลอกโค้ด
# ประกาศตัวแปรข้อมูลนักเรียน
student_name = "สมชาย มุ่งมั่น" # str
student_id = 6701048 # int
gpa = 3.85 # float
is_passed = True # bool
# ตรวจสอบชนิดข้อมูลด้วยฟังก์ชัน type()
print("ชื่อ:", student_name, "| ชนิด:", type(student_name).__name__)
print("เกรดเฉลี่ย:", gpa, "| ชนิด:", type(gpa).__name__)
# การแปลงชนิดข้อมูล (Type Casting)
str_score = "85"
int_score = int(str_score) # แปลง str เป็น int
final_score = int_score + 5 # นำมาคำนวณทางคณิตศาสตร์ได้
print(f"คะแนนหลังปรับเพิ่ม 5 คะแนน: {final_score}")
ชื่อ: สมชาย มุ่งมั่น | ชนิด: str
เกรดเฉลี่ย: 3.85 | ชนิด: float
คะแนนหลังปรับเพิ่ม 5 คะแนน: 90
กฎการตั้งชื่อตัวแปร: ควรใช้ตัวอักษรภาษาอังกฤษ ตัวเลข และเครื่องหมาย _ (Underscore) ห้ามขึ้นต้นด้วยตัวเลข และไม่ควรตั้งชื่อซ้ำกับคำสงวน (Reserved Keywords) เช่น for, if, class, def, return
ใบกิจกรรมฝึกปฏิบัติการ 1.3
ให้นักเรียนเขียนโปรแกรมคำนวณปีเกิด พ.ศ. โดยรับปีปัจจุบันเป็น พ.ศ. 2567 และอายุเป็นข้อความ '16' จากนั้นแปลงชนิดข้อมูลเพื่อหาปีเกิดและแสดงผลอย่างชัดเจน
คลิกดูแนวทางการเขียนโค้ดและเฉลย
Solution Guide
คัดลอกเฉลย
current_year = 2567
age_str = "16"
age = int(age_str)
birth_year = current_year - age
print(f"ปีปัจจุบัน พ.ศ. {current_year}")
print(f"อายุ {age} ปี")
print(f"ปีเกิดของนักเรียนคือ พ.ศ. {birth_year}")
K: เข้าใจพฤติกรรมการคืนค่าของฟังก์ชัน input() P: ใช้ f-String จัดตำแหน่งและทศนิยมในการแสดงผลได้สวยงาม A: ออกแบบส่วนต่อประสานกับผู้ใช้ (User Prompt) ที่เข้าใจง่าย
ฟังก์ชัน input() จะรอรับข้อมูลจากผู้ใช้ทางแป้นพิมพ์ และจะ ส่งคืนค่าเป็นชนิดข้อความ (str) เสมอ ดังนั้นหากต้องการนำไปคำนวณตัวเลข จะต้องแปลงประเภทข้อมูลทันที เช่น float(input()) หรือ int(input())
การแสดงผลข้อความระดับมืออาชีพในภาษา Python แนะนำให้ใช้ f-String (Formatted String Literals) ซึ่งเริ่มต้นด้วย f"..." และแทรกตัวแปรใน {variable} สามารถจัดรูปแบบตัวเลขได้ เช่น:
{num:.2f} แสดงทศนิยม 2 ตำแหน่ง
{num:,.2f} ใส่เครื่องหมายจุลภาคคั่นหลักพัน
{text:>15} หรือ {text:<15} จัดตำแหน่งชิดขวาหรือชิดซ้าย
Python 3.10+ Script
คัดลอกโค้ด
# ระบบคำนวณดัชนีมวลกาย (BMI Calculator) และออกใบสรุปผล
weight_kg = 68.5 # จำลองค่า input จากผู้ใช้
height_cm = 175.0 # จำลองค่า input จากผู้ใช้
height_m = height_cm / 100
bmi = weight_kg / (height_m ** 2)
# จัดรูปแบบตารางสรุปผลด้วย f-String
print("=" * 45)
print(f"{'รายการ':<25} | {'ค่าที่วัดได้':>15}")
print("-" * 45)
print(f"{'น้ำหนักตัว (Weight)':<25} | {weight_kg:>11.1f} กก.")
print(f"{'ส่วนสูง (Height)':<25} | {height_cm:>11.1f} ซม.")
print(f"{'ดัชนีมวลกาย (BMI)':<25} | {bmi:>11.2f}")
print("=" * 45)
=============================================
รายการ | ค่าที่วัดได้
---------------------------------------------
น้ำหนักตัว (Weight) | 68.5 กก.
ส่วนสูง (Height) | 175.0 ซม.
ดัชนีมวลกาย (BMI) | 22.37
=============================================
ข้อควรระวัง: หากผู้ใช้ป้อนตัวอักษรแทนตัวเลขใน float(input()) จะเกิดข้อผิดพลาด ValueError ทันที ซึ่งเราจะได้เรียนรู้วิธีการดักจับข้อผิดพลาดในหน่วยที่ 2 บทที่ 8
ใบกิจกรรมฝึกปฏิบัติการ 1.4
ให้นักเรียนเขียนโปรแกรมคำนวณใบเสร็จสหกรณ์โรงเรียน โดยรับราคาสินค้า 350 บาท จำนวน 3 ชิ้น คำนวณยอดรวม และภาษีมูลค่าเพิ่ม 7% พร้อมแสดงผลเป็นเงินบาทมีเครื่องหมายคั่นหลักพัน
คลิกดูแนวทางการเขียนโค้ดและเฉลย
Solution Guide
คัดลอกเฉลย
unit_price = 350.0
quantity = 3
subtotal = unit_price * quantity
vat = subtotal * 0.07
net_total = subtotal + vat
print(f"ยอดรวมก่อนภาษี: {subtotal:>10,.2f} บาท")
print(f"ภาษีมูลค่าเพิ่ม (7%): {vat:>10,.2f} บาท")
print(f"ยอดสุทธิที่ต้องชำระ: {net_total:>10,.2f} บาท")
K: เข้าใจตัวดำเนินการทางคณิตศาสตร์ ตรรกศาสตร์ และการเปรียบเทียบ P: คำนวณนิพจน์ซับซ้อนตามลำดับความสำคัญ (PEMDAS) ได้ถูกต้อง A: มีความรอบคอบในการจัดกลุ่มนิพจน์ด้วยวงเล็บ
ตัวดำเนินการใน Python แบ่งออกเป็นหลายกลุ่มหลัก ได้แก่:
ตัวดำเนินการคณิตศาสตร์: บวก +, ลบ -, คูณ *, หารจริง /, หารปัดเศษลง //, หารเอาเศษ %, ยกกำลัง **
ตัวดำเนินการเปรียบเทียบ: ==, !=, >, <, >=, <= (คืนค่าเป็น True หรือ False)
ตัวดำเนินการตรรกศาสตร์: and (จริงทั้งคู่), or (จริงอย่างน้อยหนึ่ง), not (กลับค่าความจริง)
ลำดับความสำคัญ: วงเล็บ () > ยกกำลัง ** > คูณ/หาร *, /, //, % > บวก/ลบ +, - > เปรียบเทียบ > ตรรกศาสตร์
Python 3.10+ Script
คัดลอกโค้ด
# ตัวอย่างการคำนวณและลำดับความสำคัญของตัวดำเนินการ
x = 10
y = 3
print(f"ผลหารจริง {x} / {y} = {x / y:.3f}")
print(f"ผลหารปัดเศษ {x} // {y} = {x // y}")
print(f"เศษจากการหาร {x} % {y} = {x % y}")
print(f"ยกกำลัง {x} ** {y} = {x ** y}")
# การใช้ตัวดำเนินการตรรกศาสตร์
score = 75
attendance = 85
is_eligible = (score >= 60) and (attendance >= 80)
print(f"มีสิทธิ์สอบหรือไม่: {is_eligible}")
ผลหารจริง 10 / 3 = 3.333
ผลหารปัดเศษ 10 // 3 = 3
เศษจากการหาร 10 % 3 = 1
ยกกำลัง 10 ** 3 = 1000
มีสิทธิ์สอบหรือไม่: True
Pro-Tip: เมื่อต้องเขียนนิพจน์ที่มีเงื่อนไขซับซ้อน แนะนำให้ใส่วงเล็บ () เสมอ แม้จะไม่จำเป็นตามหลักคณิตศาสตร์ เพื่อให้อ่านโค้ดได้ง่ายและลดข้อผิดพลาดจากลำดับที่ไม่พึงประสงค์
ใบกิจกรรมฝึกปฏิบัติการ 2.1
ให้นักเรียนเขียนโปรแกรมตรวจสอบปีอธิกสุรทิน (Leap Year) ค.ศ. ที่กำหนด โดยมีเงื่อนไข: เป็นปีที่หารด้วย 4 ลงตัว และต้องหารด้วย 100 ไม่ลงตัว เว้นแต่จะหารด้วย 400 ลงตัว
คลิกดูแนวทางการเขียนโค้ดและเฉลย
Solution Guide
คัดลอกเฉลย
year = 2024
is_leap = (year % 4 == 0 and year % 100 != 0) or (year % 400 == 0)
if is_leap:
print(f"ปี ค.ศ. {year} เป็นปีอธิกสุรทิน (มี 366 วัน)")
else:
print(f"ปี ค.ศ. {year} เป็นปีปกติสุรทิน (มี 365 วัน)")
K: เข้าใจตรรกะการแยกสาขาการทำงาน (Branching) P: ประยุกต์ใช้ if-elif-else และ match-case ได้เหมาะสม A: วางโครงสร้างเงื่อนไขอย่างรัดกุมครอบคลุมทุกกรณี
โครงสร้างแบบเลือกทำ (Selection Control Structure) ช่วยให้โปรแกรมตัดสินใจเลือกเส้นทางการทำงานตามเงื่อนไขที่กำหนด:
if: ตรวจสอบเงื่อนไขแรก หากเป็นจริงจะทำงานในบล็อก
elif (else if): ตรวจสอบเงื่อนไขถัดไปเมื่อเงื่อนไขก่อนหน้าเป็นเท็จ
else: ทำงานเมื่อเงื่อนไขทั้งหมดด้านบนเป็นเท็จ
match ... case: ไวยากรณ์ทันสมัยใน Python 3.10+ (Structural Pattern Matching) เหมาะสำหรับการเปรียบเทียบค่าแบบหลายทางเลือกที่อ่านง่ายกว่า elif ยาวๆ
Python 3.10+ Script
คัดลอกโค้ด
# ระบบตัดเกรดและตรวจสอบสิทธิ์ด้วย if-elif-else และ match-case
score = 84
if score >= 80:
grade = "4"
elif score >= 75:
grade = "3.5"
elif score >= 70:
grade = "3"
elif score >= 65:
grade = "2.5"
elif score >= 60:
grade = "2"
else:
grade = "ต่ำกว่าเกณฑ์"
user_role = "teacher"
match user_role:
case "admin":
permission = "สิทธิ์ผู้ดูแลระบบสูงสุด (Full Control)"
case "teacher":
permission = "สิทธิ์ครูผู้สอน: บันทึกคะแนนและประเมินผล"
case "student":
permission = "สิทธิ์นักเรียน: ศึกษาบทเรียนและส่งงาน"
case _:
permission = "สิทธิ์ผู้เยี่ยมชมทั่วไป"
print(f"ผลคะแนน: {score} -> ได้เกรด: {grade}")
print(f"บทบาท: {user_role} -> {permission}")
ผลคะแนน: 84 -> ได้เกรด: 4
บทบาท: teacher -> สิทธิ์ครูผู้สอน: บันทึกคะแนนและประเมินผล
จุดสำคัญเรื่อง Indentation: Python ใช้การย่อหน้า (Indentation 4 เคาะ) เพื่อแบ่งขอบเขตบล็อกคำสั่ง ห้ามผสมแท็บกับสเปซ เพราะจะเกิดข้อผิดพลาด IndentationError ทันที
ใบกิจกรรมฝึกปฏิบัติการ 2.2
ให้นักเรียนเขียนโปรแกรมคำนวณส่วนลดตามยอดสั่งซื้อ: ต่ำกว่า 500 ไม่ลด, 500-999 ลด 5%, 1,000-2,499 ลด 10%, 2,500 ขึ้นไป ลด 15% พร้อมแสดงยอดชำระสุทธิ
คลิกดูแนวทางการเขียนโค้ดและเฉลย
Solution Guide
คัดลอกเฉลย
purchase_amount = 1850.0
if purchase_amount >= 2500:
discount_pct = 15
elif purchase_amount >= 1000:
discount_pct = 10
elif purchase_amount >= 500:
discount_pct = 5
else:
discount_pct = 0
discount_val = purchase_amount * (discount_pct / 100)
net_price = purchase_amount - discount_val
print(f"ยอดซื้อ: {purchase_amount:,.2f} บาท")
print(f"ส่วนลด ({discount_pct}%): -{discount_val:,.2f} บาท")
print(f"ยอดสุทธิ: {net_price:,.2f} บาท")
K: แยกแยะความแตกต่างระหว่าง for loop และ while loop ได้ P: ใช้คำสั่ง break, continue และ range() ในการวนลูปได้แม่นยำ A: ระมัดระวังเงื่อนไขหยุดเพื่อป้องกันลูปไม่รู้จบ (Infinite Loop)
โครงสร้างแบบวนซ้ำ (Repetition / Iteration) ช่วยให้คอมพิวเตอร์ประมวลผลงานซ้ำๆ ได้อย่างรวดเร็ว:
for loop: เหมาะสำหรับการวนซ้ำที่ทราบจำนวนรอบแน่นอน หรือวนผ่านสมาชิกของลำดับ (Sequence) ร่วมกับฟังก์ชัน range(start, stop, step)
while loop: เหมาะสำหรับการวนซ้ำที่ขึ้นอยู่กับเงื่อนไข จะทำงานวนซ้ำตราบเท่าที่เงื่อนไขยังเป็น True
break: สั่งหยุดและออกจากลูปทันที
continue: ข้ามรอบปัจจุบันและข้ามไปยังการวนรอบถัดไป
Python 3.10+ Script
คัดลอกโค้ด
# 1. ตารางสูตรคูณแม่ 9 ด้วย for loop และ range()
print("=== ตารางสูตรคูณแม่ 9 ===")
for multiplier in range(1, 13):
print(f"9 x {multiplier:2d} = {9 * multiplier:2d}")
# 2. การค้นหาจำนวนเฉพาะ (Prime Numbers) ในช่วง 2 ถึง 20
primes = []
for num in range(2, 21):
is_prime = True
for divisor in range(2, int(num ** 0.5) + 1):
if num % divisor == 0:
is_prime = False
break # หากมีตัวหารลงตัว ออกจากลูปย่อยทันที
if is_prime:
primes.append(num)
print(f"จำนวนเฉพาะ 2-20 ได้แก่: {primes}")
=== ตารางสูตรคูณแม่ 9 ===
9 x 1 = 9
9 x 2 = 18
...
9 x 12 = 108
จำนวนเฉพาะ 2-20 ได้แก่: [2, 3, 5, 7, 11, 13, 17, 19]
เทคนิคการลดภาระคอมพิวเตอร์: ในการตรวจสอบจำนวนเฉพาะ เราตรวจสอบตัวหารเพียงแค่ถึงรากที่สอง int(num ** 0.5) + 1 ก็เพียงพอ ไม่จำเป็นต้องตรวจถึงตัวเลขนั้นทั้งหมด
ใบกิจกรรมฝึกปฏิบัติการ 2.3
ให้นักเรียนเขียนโปรแกรมพิมพ์รูปพีระมิดดาว โดยมีจำนวนชั้นเท่ากับ 5 แถว เพื่อฝึกทักษะการใช้ลูปซ้อนลูป (Nested Loops)
คลิกดูแนวทางการเขียนโค้ดและเฉลย
Solution Guide
คัดลอกเฉลย
rows = 5
for i in range(1, rows + 1):
spaces = " " * (rows - i)
stars = "*" * (2 * i - 1)
print(spaces + stars)
K: เข้าใจชนิดของ Error ที่พบบ่อย เช่น ValueError, ZeroDivisionError P: ใช้บล็อก try-except-else-finally ดักจับข้อผิดพลาดไม่ให้โปรแกรมหยุดชะงัก A: พัฒนาโปรแกรมที่มีความทนทานต่อข้อผิดพลาด (Robust Software)
ขณะที่โปรแกรมทำงาน อาจมีข้อผิดพลาดระหว่างรันไทม์ (Runtime Errors) ส่งผลให้โปรแกรมแครช (Crash) การใช้โครงสร้าง Exception Handling ช่วยให้โปรแกรมสามารถรับมือและทำงานต่อไปได้:
try: ใส่โค้ดที่มีความเสี่ยงว่าจะเกิดข้อผิดพลาด
except ErrorType: กำหนดการทำงานเมื่อเกิดข้อผิดพลาดตามชนิดที่ระบุ
else: ทำงานเมื่อ ไม่เกิด ข้อผิดพลาดใดๆ ในบล็อก try
finally: ทำงาน เสมอ ไม่ว่าจะเกิดข้อผิดพลาดหรือไม่ เหมาะสำหรับปิดไฟล์หรือตัดการเชื่อมต่อ
Python 3.10+ Script
คัดลอกโค้ด
# ระบบหารตัวเลขและรับคะแนนอย่างปลอดภัย
def safe_calculator(dividend_str, divisor_str):
try:
a = float(dividend_str)
b = float(divisor_str)
result = a / b
except ValueError:
return "ข้อผิดพลาด: ข้อมูลที่ป้อนต้องเป็นตัวเลขเท่านั้น!"
except ZeroDivisionError:
return "ข้อผิดพลาด: ตัวหารต้องไม่เป็นศูนย์ (ZeroDivisionError)!"
except Exception as e:
return f"ข้อผิดพลาดที่ไม่คาดหมาย: {e}"
else:
return f"ผลลัพธ์: {a} / {b} = {result:.2f}"
finally:
pass
print(safe_calculator("100", "4"))
print(safe_calculator("100", "0"))
print(safe_calculator("หนึ่งร้อย", "4"))
ผลลัพธ์: 100.0 / 4.0 = 25.00
ข้อผิดพลาด: ตัวหารต้องไม่เป็นศูนย์ (ZeroDivisionError)!
ข้อผิดพลาด: ข้อมูลที่ป้อนต้องเป็นตัวเลขเท่านั้น!
ข้อควรระวัง: หลีกเลี่ยงการใช้ except: เปล่าๆ โดยไม่ระบุประเภทของ Exception เพราะจะทำให้ดักจับข้อผิดพลาดของระบบทั้งหมดรวมถึงการกด Ctrl+C เพื่อหยุดโปรแกรม
ใบกิจกรรมฝึกปฏิบัติการ 2.4
ให้นักเรียนเขียนโปรแกรมรับค่าน้ำหนักนักเรียน หากผู้ใช้ป้อนค่าน้อยกว่าหรือเท่ากับศูนย์ ให้ทำการ raise ข้อผิดพลาด ValueError พร้อมข้อความเตือน
คลิกดูแนวทางการเขียนโค้ดและเฉลย
Solution Guide
คัดลอกเฉลย
try:
weight = float(input("ป้อนน้ำหนัก (กก.): "))
if weight <= 0:
raise ValueError("น้ำหนักต้องมากกว่า 0 กิโลกรัม")
print(f"บันทึกค่าน้ำหนัก {weight:.1f} กก. เรียบร้อย")
except ValueError as e:
print(f"แจ้งเตือน: {e}")
K: เปรียบเทียบความแตกต่างระหว่าง List (Mutable) กับ Tuple (Immutable) P: ใช้เมธอดจัดการ List และเขียน List Comprehension ได้คล่องแคล่ว A: เลือกโครงสร้างข้อมูลที่เหมาะสมกับลักษณะของงาน
โครงสร้างข้อมูลแบบลำดับ (Sequence Data Types) ใช้จัดเก็บชุดข้อมูลหลายค่าไว้ในตัวแปรเดียว:
List [...]: เปลี่ยนแปลงค่าได้ (Mutable) สามารถเพิ่ม ลบ แก้ไข และเรียงลำดับข้อมูลได้ เมธอดสำคัญได้แก่ append(), insert(), pop(), remove(), sort()
List Comprehension: รูปแบบการสร้างลิสต์ใหม่จากลิสต์เดิมที่กระชับและมีประสิทธิภาพสูง เช่น [x for x in data if condition]
Tuple (...): ไม่สามารถเปลี่ยนแปลงค่าได้ (Immutable) มีความเร็วในการประมวลผลสูง ปลอดภัยจากการแก้ไขโดยไม่ตั้งใจ เหมาะสำหรับพิกัดหรือค่าคงที่
Python 3.10+ Script
คัดลอกโค้ด
# ตัวอย่างการจัดการรายชื่อวิชาและคะแนนสอบ
subjects = ["วิทยาการคำนวณ", "คณิตศาสตร์", "ฟิสิกส์"]
subjects.append("เคมี") # เพิ่มข้อมูลท้ายลิสต์
subjects.insert(1, "ภาษาไทย") # แทรกข้อมูลที่ดัชนี 1
print("รายวิชาทั้งหมด:", subjects)
# การใช้ List Comprehension กรองคะแนนที่ผ่านเกณฑ์ (>= 70)
scores = [65, 82, 90, 54, 73, 88]
passed_scores = [s for s in scores if s >= 70]
print("คะแนนที่ผ่านเกณฑ์:", passed_scores)
# การใช้งาน Tuple สำหรับพิกัดภูมิศาสตร์ที่ไม่ต้องการให้เปลี่ยนค่า
school_location = (13.7563, 100.5018, "อาคารวิทยาศาสตร์")
lat, lon, building = school_location
print(f"พิกัดโรงเรียน: {lat}, {lon} ({building})")
รายวิชาทั้งหมด: ['วิทยาการคำนวณ', 'ภาษาไทย', 'คณิตศาสตร์', 'ฟิสิกส์', 'เคมี']
คะแนนที่ผ่านเกณฑ์: [82, 90, 73, 88]
พิกัดโรงเรียน: 13.7563, 100.5018 (อาคารวิทยาศาสตร์)
เทคนิค List Slicing: เราสามารถดึงข้อมูลบางช่วงของลิสต์ได้ด้วย list[start:stop:step] เช่น scores[:3] ดึง 3 ตัวแรก หรือ scores[::-1] เพื่อกลับทิศทางลิสต์
ใบกิจกรรมฝึกปฏิบัติการ 3.1
ให้นักเรียนเขียนโปรแกรมตัดเกรด โดยมีลิสต์คะแนนสอบ 5 คน แล้วใช้ List Comprehension แปลงคะแนนทั้งหมดเป็นเกรด 'ผ่าน' (>=50) หรือ 'ไม่ผ่าน'
คลิกดูแนวทางการเขียนโค้ดและเฉลย
Solution Guide
คัดลอกเฉลย
raw_scores = [45, 78, 92, 38, 60]
results = ["ผ่าน" if s >= 50 else "ไม่ผ่าน" for s in raw_scores]
for score, result in zip(raw_scores, results):
print(f"คะแนน {score:2d} -> {result}")
K: เข้าใจแนวคิด Key-Value ใน Dictionary และความไม่ซ้ำของ Set P: ดึงและปรับปรุงข้อมูลใน Nested Dictionary และทำ Set Operations ได้ A: จัดระเบียบข้อมูลที่มีความซับซ้อนให้ค้นหาได้อย่างมีประสิทธิภาพ
โครงสร้างข้อมูลแบบแมปปิ้งและเซต:
Dictionary {"key": value}: เก็บข้อมูลเป็นคู่คีย์-ค่า (Key-Value Pairs) ค้นหาข้อมูลได้เร็วมากด้วย Key เมธอดสำคัญได้แก่ .get(), .keys(), .values(), .items()
Set {item1, item2}: รวบรวมข้อมูลที่ไม่เรียงลำดับและ ไม่มีสมาชิกซ้ำกันเลย รองรับการดำเนินการทางคณิตศาสตร์:
Union (|): รวมสมาชิกทั้งหมด
Intersection (&): หาเฉพาะสมาชิกที่มีร่วมกัน
Difference (-): สมาชิกที่มีในเซตแรกแต่ไม่มีในเซตหลัง
Python 3.10+ Script
คัดลอกโค้ด
# 1. ข้อมูลนักเรียนในรูปแบบ Dictionary
student_record = {
"student_id": "6701001",
"name": "กานดา พรประสิทธิ์",
"scores": {"homework": 28, "midterm": 32, "final": 35},
"status": "Active"
}
total_score = sum(student_record["scores"].values())
print(f"รหัส: {student_record['student_id']} ชื่อ: {student_record['name']}")
print(f"คะแนนรวม: {total_score}/100")
# 2. การใช้ Set ตรวจสอบสมาชิกชมรมวิชาการ
robotics_club = {"สมชาย", "กานดา", "วิชัย", "สมหญิง"}
coding_club = {"กานดา", "เอกพล", "สมเกียรติ", "สมชาย"}
# นักเรียนที่อยู่ทั้งสองชมรม (Intersection)
active_both = robotics_club & coding_club
print(f"นักเรียนที่อยู่ทั้งสองชมรม: {active_both}")
รหัส: 6701001 ชื่อ: กานดา พรประสิทธิ์
คะแนนรวม: 95/100
นักเรียนที่อยู่ทั้งสองชมรม: {'สมชาย', 'กานดา'}
Pro-Tip: หากต้องการลบสมาชิกที่ซ้ำกันออกจากลิสต์อย่างรวดเร็ว สามารถแปลงเป็นเซตแล้วแปลงกลับเป็นลิสต์ได้ทันที เช่น clean_list = list(set(duplicate_list))
ใบกิจกรรมฝึกปฏิบัติการ 3.2
ให้นักเรียนเขียนโปรแกรมนับความถี่ของคำในประโยคภาษาอังกฤษ โดยใช้ Dictionary เก็บคำเป็น Key และเก็บจำนวนครั้งที่พบเป็น Value
คลิกดูแนวทางการเขียนโค้ดและเฉลย
Solution Guide
คัดลอกเฉลย
text = "python is fun and python is powerful"
words = text.split()
freq = {}
for w in words:
freq[w] = freq.get(w, 0) + 1
for word, count in freq.items():
print(f"คำว่า '{word}': พบ {count} ครั้ง")
K: เข้าใจหลักการ Modular Programming และขอบเขตตัวแปร (LEGB Rule) P: นิยามฟังก์ชันพร้อม Default Arguments และ Type Annotations ได้ A: ออกแบบโค้ดที่มีความกระชับ ไม่เขียนโค้ดซ้ำซ้อน (DRY Principle)
ฟังก์ชัน (Function) คือบล็อกของโค้ดที่มีชื่อเรียก สามารถนำกลับมาใช้ซ้ำได้ตามหลัก Don't Repeat Yourself (DRY) :
การนิยามใช้คีย์เวิร์ด def function_name(params):
การส่งคืนค่าใช้คำสั่ง return
Default Arguments: การกำหนดค่าเริ่มต้นให้พารามิเตอร์
Variable Scope: ขอบเขตตัวแปร Local (ใช้ได้เฉพาะในฟังก์ชัน) เทียบกับ Global (ใช้ได้ทั่วทั้งโปรแกรม)
*args & **kwargs: การรับพารามิเตอร์แบบไม่จำกัดจำนวน
Python 3.10+ Script
คัดลอกโค้ด
# ฟังก์ชันคำนวณภาษีและยอดสุทธิ พร้อม Type Annotations
def calculate_invoice(subtotal: float, vat_rate: float = 0.07) -> dict:
"""ฟังก์ชันคำนวณภาษีมูลค่าเพิ่มและยอดรวมสุทธิ"""
vat_amount = subtotal * vat_rate
net_total = subtotal + vat_amount
return {
"subtotal": round(subtotal, 2),
"vat": round(vat_amount, 2),
"net_total": round(net_total, 2)
}
# ฟังก์ชันรับพารามิเตอร์แบบยืดหยุ่น (*args)
def calculate_class_average(class_name: str, *scores) -> None:
avg = sum(scores) / len(scores) if scores else 0
print(f"ห้องเรียน {class_name}: นักเรียน {len(scores)} คน | เฉลี่ย: {avg:.2f}")
bill = calculate_invoice(1500.0)
print(f"ยอดซื้อ: {bill['subtotal']} บ. | ภาษี: {bill['vat']} บ. | สุทธิ: {bill['net_total']} บ.")
calculate_class_average("ปวช. 2/1", 85, 92, 78, 64, 88)
ยอดซื้อ: 1500.0 บ. | ภาษี: 105.0 บ. | สุทธิ: 1605.0 บ.
ห้องเรียน ปวช. 2/1: นักเรียน 5 คน | เฉลี่ย: 81.40
Docstrings สำคัญมากในงานวิชาการ: การเขียนข้อความอธิบายการทำงานของฟังก์ชันภายในเครื่องหมายคำพูดสามชุด """...""" ใต้ชื่อฟังก์ชัน ช่วยให้ผู้อื่นเข้าใจวัตถุประสงค์และประเภทของข้อมูลได้อย่างรวดเร็ว
ใบกิจกรรมฝึกปฏิบัติการ 3.3
ให้นักเรียนเขียนฟังก์ชันแปลงอุณหภูมิจากเซลเซียสเป็นฟาเรนไฮต์: F = (C * 9/5) + 32 และเควิน: K = C + 273.15 โดยส่งคืนค่าเป็น tuple (F, K)
คลิกดูแนวทางการเขียนโค้ดและเฉลย
Solution Guide
คัดลอกเฉลย
def convert_temperature(celsius: float):
fahrenheit = (celsius * 9/5) + 32
kelvin = celsius + 273.15
return fahrenheit, kelvin
f, k = convert_temperature(35)
print(f"35°C = {f:.1f}°F หรือ {k:.2f}K")
K: รู้จักคลังไลบรารีมาตรฐานที่มาพร้อมกับ Python P: เรียกใช้ฟังก์ชันจากโมดูล math, random และ datetime ได้ถูกต้อง A: นำไลบรารีมาตรฐานมาประยุกต์แก้โจทย์คณิตศาสตร์และวิทยาศาสตร์
Python มีปรัชญา "Batteries Included" ซึ่งหมายถึงมีไลบรารีมาตรฐานคุณภาพสูงให้พร้อมใช้งานทันทีโดยไม่ต้องติดตั้งเพิ่มเติม:
math: ฟังก์ชันทางคณิตศาสตร์ขั้นสูง เช่น math.sqrt(), math.pi, math.ceil(), math.floor()
random: การสุ่มตัวเลขและตัวเลือก เช่น random.randint(a, b), random.choice(list), random.shuffle(list)
datetime: การจัดการวัน เวลา และระยะเวลา เช่น datetime.datetime.now(), การคำนวณวันหมดอายุด้วย timedelta
Python 3.10+ Script
คัดลอกโค้ด
import math
import random
import datetime
# 1. math module: คำนวณพื้นที่วงกลม
radius = 5.0
circle_area = math.pi * math.pow(radius, 2)
print(f"พื้นที่วงกลมรัศมี {radius} = {circle_area:.2f} ตร.ซม.")
# 2. random module: การสุ่มจับฉลากของขวัญ
prizes = ["ทุนการศึกษา 1,000 บ.", "แฟลชไดรฟ์ 64GB", "หนังสือวิทย์", "กระบอกน้ำ"]
winner = random.choice(prizes)
lucky_num = random.randint(100, 999)
print(f"หมายเลขผู้โชคดี: {lucky_num} ได้รับ: {winner}")
# 3. datetime module: แสดงวันที่ตามปฏิทินไทย
now = datetime.datetime.now()
buddhist_year = now.year + 543
print(f"บันทึกข้อมูลเมื่อ: วันที่ {now.strftime('%d/%m/')}{buddhist_year} เวลา {now.strftime('%H:%M:%S')} น.")
พื้นที่วงกลมรัศมี 5.0 = 78.54 ตร.ซม.
หมายเลขผู้โชคดี: 482 ได้รับ: ทุนการศึกษา 1,000 บ.
บันทึกข้อมูลเมื่อ: วันที่ 07/09/2567 เวลา 10:30:00 น.
Pro-Tip การ Import: ควร import เฉพาะโมดูลที่ใช้งานจริง หลีกเลี่ยงการใช้ from module import * เพราะจะทำให้เกิดการชนกันของชื่อฟังก์ชัน (Namespace Pollution)
ใบกิจกรรมฝึกปฏิบัติการ 3.4
ให้นักเรียนเขียนโปรแกรมจำลองการทอยลูกเต๋า 2 ลูกพร้อมกัน 100 ครั้ง แล้วนับว่ามีจำนวนครั้งที่ผลรวมของแต้มเท่ากับ 7 กี่ครั้ง
คลิกดูแนวทางการเขียนโค้ดและเฉลย
Solution Guide
คัดลอกเฉลย
import random
sum_seven_count = 0
trials = 100
for _ in range(trials):
dice1 = random.randint(1, 6)
dice2 = random.randint(1, 6)
if (dice1 + dice2) == 7:
sum_seven_count += 1
print(f"ทอยเต๋า {trials} ครั้ง ได้แต้มรวมเท่ากับ 7 จำนวน: {sum_seven_count} ครั้ง ({(sum_seven_count/trials)*100:.1f}%)")
K: เข้าใจโหมดการเปิดไฟล์ ('r', 'w', 'a') และการเข้ารหัส UTF-8 P: อ่านและบันทึกข้อมูลตาราง CSV และโครงสร้าง JSON ได้ถูกต้อง A: ตระหนักถึงความปลอดภัยของข้อมูลและการปิดไฟล์อย่างถูกวิธี
การจัดเก็บข้อมูลถาวร (Data Persistence) ช่วยให้ข้อมูลไม่สูญหายเมื่อปิดโปรแกรม ใน Python ใช้โครงสร้าง Context Manager (with open(...) as f:) ซึ่งจะปิดไฟล์ให้อัตโนมัติแม้เกิดข้อผิดพลาด:
โหมดไฟล์: 'r' (อ่านอย่างเดียว), 'w' (เขียนทับใหม่), 'a' (เขียนต่อท้าย)
โมดูล csv: สำหรับจัดการข้อมูลแบบตาราง เช่น รายชื่อนักเรียนและคะแนน
โมดูล json: สำหรับจัดการข้อมูลชนิด JSON ที่นิยมใช้ในเว็บแอปพลิเคชันและ API ด้วยเมธอด json.dump() และ json.load()
Python 3.10+ Script
คัดลอกโค้ด
import json
import csv
import io
# 1. การทำงานกับข้อมูล JSON (Configuration Data)
course_metadata = {
"course_id": "CS101",
"course_name": "Python Programming",
"credit": 1.0,
"units": ["Basics", "Control", "Data Structures", "OOP"]
}
# แปลง Dictionary เป็น JSON String
json_string = json.dumps(course_metadata, ensure_ascii=False, indent=2)
print("=== โครงสร้างข้อมูล JSON ===")
print(json_string)
# 2. การสร้างและเขียนข้อมูล CSV จำลองในหน่วยความจำ
csv_buffer = io.StringIO()
csv_writer = csv.writer(csv_buffer)
csv_writer.writerow(["รหัส", "ชื่อ-สกุล", "ผลการเรียน"])
csv_writer.writerow(["6701", "สมชาย เรียนดี", 4.0])
csv_writer.writerow(["6702", "กานดา สดใส", 3.5])
print("\n=== ข้อมูลตาราง CSV ===")
print(csv_buffer.getvalue().strip())
=== โครงสร้างข้อมูล JSON ===
{
"course_id": "CS101",
"course_name": "Python Programming",
"credit": 1.0,
"units": [
"Basics",
"Control",
"Data Structures",
"OOP"
]
}
=== ข้อมูลตาราง CSV ===
รหัส,ชื่อ-สกุล,ผลการเรียน
6701,สมชาย เรียนดี,4.0
6702,กานดา สดใส,3.5
สำคัญมากสำหรับภาษาไทย: ควรกำหนดพารามิเตอร์ encoding='utf-8' เสมอเมื่อเปิดไฟล์ข้อความ เพื่อป้องกันปัญหาตัวอักษรภาษาไทยกลายเป็นภาษาต่างดาว (Mojibake)
ใบกิจกรรมฝึกปฏิบัติการ 4.1
ให้นักเรียนเขียนโปรแกรมบันทึกบันทึกประจำวัน (Diary) ลงในไฟล์ diary.txt โดยใช้โหมด 'a' (Append) พร้อมใส่วันที่และเวลาบันทึกอัตโนมัติ
คลิกดูแนวทางการเขียนโค้ดและเฉลย
Solution Guide
คัดลอกเฉลย
import datetime
now_str = datetime.datetime.now().strftime("%Y-%m-%d %H:%M")
entry = "วันนี้ได้เรียนรู้การเขียนไฟล์ด้วย Python มีประโยชน์มาก!"
# ในการใช้งานจริงเปิดไฟล์: with open('diary.txt', 'a', encoding='utf-8') as f:
output_line = f"[{now_str}] {entry}\n"
print("บันทึกสำเร็จ:\n" + output_line)
K: เข้าใจแนวคิด Class, Object, Instance และ Constructor (__init__) P: ออกแบบและสร้าง Class ที่มี Attributes และ Methods ได้ A: มองปัญหาในโลกแห่งความจริงให้อยู่ในรูปของโมเดลเชิงวัตถุ
การเขียนโปรแกรมเชิงวัตถุ (OOP) เป็นกระบวนทัศน์ที่จำลองสิ่งต่างๆ ในโลกแห่งความเป็นจริงให้อยู่ในรูปของ วัตถุ (Object) ซึ่งประกอบด้วย:
คลาส (Class): พิมพ์เขียวหรือแม่แบบ (Blueprint) ในการสร้างวัตถุ
อินสแตนซ์ (Instance): วัตถุจริงที่สร้างขึ้นจากคลาส
แอตทริบิวต์ (Attributes): คุณลักษณะหรือข้อมูลประจำวัตถุ เช่น ชื่อ, คะแนน, อายุ
เมธอด (Methods): ฟังก์ชันหรือพฤติกรรมที่วัตถุนั้นสามารถกระทำได้
__init__(self, ...): คอนสตรักเตอร์ (Constructor) เมธอดพิเศษที่ถูกเรียกใช้ทันทีเมื่อมีการสร้างวัตถุใหม่
Python 3.10+ Script
คัดลอกโค้ด
# การสร้างคลาสนักเรียน (Student) ตามหลักการ OOP
class Student:
school_name = "โรงเรียนสารสนเทศวิทยา" # Class Attribute
def __init__(self, student_id: str, name: str, midterm: float, final: float):
self.student_id = student_id # Instance Attribute
self.name = name
self.midterm = midterm
self.final = final
def get_total_score(self) -> float:
return self.midterm + self.final
def get_grade(self) -> str:
total = self.get_total_score()
if total >= 80: return "4"
if total >= 70: return "3"
if total >= 60: return "2"
if total >= 50: return "1"
return "0"
def display_info(self):
print(f"[{self.student_id}] {self.name} | รวม: {self.get_total_score():.1f} | เกรด: {self.get_grade()}")
# สร้างวัตถุ (Object) จากคลาส Student
s1 = Student("6701", "สมชาย ภูวนารถ", 42.0, 46.0)
s2 = Student("6702", "สุดา แสนดี", 32.0, 36.5)
s1.display_info()
s2.display_info()
[6701] สมชาย ภูวนารถ | รวม: 88.0 | เกรด: 4
[6702] สุดา แสนดี | รวม: 68.5 | เกรด: 2
พารามิเตอร์ self คืออะไร?: self เป็นตัวแทนของวัตถุแต่ละตัวที่กำลังถูกเรียกใช้งาน ทำให้ Python ทราบว่ากำลังเข้าถึงข้อมูลของวัตถุตัวใดตัวหนึ่งได้อย่างถูกต้อง
ใบกิจกรรมฝึกปฏิบัติการ 4.2
ให้นักเรียนสร้างคลาส Book สำหรับระบบห้องสมุด โดยมี attributes: ชื่อหนังสือ, ผู้แต่ง, สถานะยืม (True/False) และ methods: borrow() และ return_book()
คลิกดูแนวทางการเขียนโค้ดและเฉลย
Solution Guide
คัดลอกเฉลย
class Book:
def __init__(self, title: str, author: str):
self.title = title
self.author = author
self.is_borrowed = False
def borrow(self):
if not self.is_borrowed:
self.is_borrowed = True
print(f"ยืมหนังสือ '{self.title}' สำเร็จ")
else:
print(f"ขออภัย หนังสือ '{self.title}' ถูกยืมไปแล้ว")
b1 = Book("เรียนรู้ Python ฉบับสมบูรณ์", "ครูบาส")
b1.borrow()
b1.borrow()
K: เข้าใจเสาหลัก OOP: การสืบทอด (Inheritance) และการซ่อนข้อมูล (Encapsulation) P: ใช้คำสั่ง super() และกำหนด Private Attributes (__variable) ได้ A: ออกแบบโครงสร้างคลาสแบบลำดับขั้นที่มีความปลอดภัยและยืดหยุ่น
เสาหลักขั้นสูงของการเขียนโปรแกรมเชิงวัตถุ:
การห่อหุ้มข้อมูล (Encapsulation): การปกป้องข้อมูลภายในวัตถุไม่ให้ภายนอกเข้าถึงหรือแก้ไขได้โดยตรง ใน Python ใช้เครื่องหมาย __ นำหน้าชื่อตัวแปร เช่น self.__balance (Private Attribute) และเข้าถึงผ่าน Getter / Setter
การสืบทอดคุณสมบัติ (Inheritance): การสร้างคลาสใหม่ (Subclass / Child Class) โดยต่อยอดจากคลาสเดิม (Superclass / Parent Class) ช่วยให้ไม่ต้องเขียนโค้ดซ้ำ และใช้คำสั่ง super().__init__() เพื่อเรียกใช้งานคอนสตรักเตอร์ของคลาสแม่
Polymorphism / Method Overriding: การที่คลาสลูกสามารถนิยามการทำงานของเมธอดให้แตกต่างจากคลาสแม่ได้
Python 3.10+ Script
คัดลอกโค้ด
# ระบบบัญชีธนาคาร แสดง Encapsulation และ Inheritance
class BankAccount:
def __init__(self, account_no: str, owner: str, balance: float = 0.0):
self.account_no = account_no
self.owner = owner
self.__balance = balance # Private Attribute ป้องกันการแก้ไขโดยตรง
def deposit(self, amount: float):
if amount > 0:
self.__balance += amount
print(f"ฝากเงิน {amount:,.2f} บาท สำเร็จ (คงเหลือ: {self.__balance:,.2f} บ.)")
def withdraw(self, amount: float):
if 0 < amount <= self.__balance:
self.__balance -= amount
print(f"ถอนเงิน {amount:,.2f} บาท สำเร็จ (คงเหลือ: {self.__balance:,.2f} บ.)")
else:
print("ยอดเงินในบัญชีไม่เพียงพอ!")
def get_balance(self) -> float:
return self.__balance
# คลาสลูกที่สืบทอดคุณสมบัติ (Inheritance)
class SavingsAccount(BankAccount):
def __init__(self, account_no: str, owner: str, balance: float = 0.0, interest_rate: float = 0.015):
super().__init__(account_no, owner, balance)
self.interest_rate = interest_rate
def apply_interest(self):
interest = self.get_balance() * self.interest_rate
self.deposit(interest)
print(f"รับดอกเบี้ยเงินฝากอัตรา {self.interest_rate*100}% เรียบร้อย")
acc = SavingsAccount("001-2-34567", "ครูบาส", 10000)
acc.deposit(5000)
acc.apply_interest()
ฝากเงิน 5,000.00 บาท สำเร็จ (คงเหลือ: 15,000.00 บ.)
ฝากเงิน 225.00 บาท สำเร็จ (คงเหลือ: 15,225.00 บ.)
รับดอกเบี้ยเงินฝากอัตรา 1.5% เรียบร้อย
ทำไมต้องใช้ Encapsulation?: ช่วยป้องกันข้อผิดพลาด เช่น ผู้ใช้งานเผลอแก้ค่ายอดเงิน acc.__balance = -9999 ได้โดยตรง ทำให้ระบบมีความน่าเชื่อถือและปลอดภัยตามมาตรฐานสากล
ใบกิจกรรมฝึกปฏิบัติการ 4.3
ให้นักเรียนสร้างคลาส Person (ชื่อ, อายุ) และสร้างคลาสลูก Teacher ที่สืบทอดจาก Person โดยเพิ่มคุณสมบัติ กลุ่มสาระการเรียนรู้ และเงินเดือน
คลิกดูแนวทางการเขียนโค้ดและเฉลย
Solution Guide
คัดลอกเฉลย
class Person:
def __init__(self, name: str, age: int):
self.name = name
self.age = age
class Teacher(Person):
def __init__(self, name: str, age: int, subject: str, salary: float):
super().__init__(name, age)
self.subject = subject
self.salary = salary
t = Teacher("ครูบาส", 32, "วิทยาการคำนวณ", 35000)
print(f"{t.name} (อายุ {t.age} ปี) สอนวิชา {t.subject}")
K: บูรณาการองค์ความรู้ทั้ง 4 หน่วยการเรียนรู้สู่โครงงานจริง P: พัฒนาระบบที่มีการประมวลผล จัดการไฟล์ และคำนวณสถิติ A: มุ่งมั่นในการสร้างสรรค์นวัตกรรมดิจิทัลเพื่อแก้ปัญหาในชีวิตจริง
โครงงานประยุกต์ (Capstone Project) เป็นการประมวลความรู้ตลอดทั้งหลักสูตร เพื่อให้นักเรียนได้ลงมือปฏิบัติจริงตามกระบวนการพัฒนาซอฟต์แวร์:
1. การกำหนดความต้องการ (Requirements Analysis): วิเคราะห์โจทย์ปัญหา เช่น ระบบบันทึกและประมวลผลคะแนนนักเรียน
2. การออกแบบระบบ (System Design): ออกแบบคลาส โมเดลข้อมูล และเมนูควบคุมการทำงาน
3. การลงมือพัฒนา (Implementation): เขียนโค้ดเชื่อมโยงระหว่าง Data, Business Logic และ User Interface
4. การทดสอบและปรับปรุง (Testing & Debugging): ตรวจสอบกรณีทดสอบ (Test Cases) และรับมือข้อผิดพลาด
5. การจัดทำเอกสารและรายงาน (Documentation): จัดทำคู่มือและรายงาน 5 บท สำหรับการประเมินผลสัมฤทธิ์
Python 3.10+ Script
คัดลอกโค้ด
# ระบบประมวลผลและออกรายงานผลการเรียนรายวิชา (Grade Analysis System)
class CourseReport:
def __init__(self, course_name: str):
self.course_name = course_name
self.students = []
def add_student(self, name: str, hw: float, mid: float, fin: float):
total = hw + mid + fin
grade = "4" if total >= 80 else "3" if total >= 70 else "2" if total >= 60 else "1" if total >= 50 else "0"
self.students.append({
"name": name, "total": total, "grade": grade
})
def generate_report(self):
print(f"==================================================")
print(f" รายงานสรุปผลสัมฤทธิ์รายวิชา: {self.course_name}")
print(f"==================================================")
print(f"{'ชื่อ-สกุล':<22} | {'คะแนนรวม':<10} | {'ระดับเกรด':<8}")
print("-" * 50)
total_sum = 0
for s in self.students:
print(f"{s['name']:<22} | {s['total']:<10.1f} | {s['grade']:<8}")
total_sum += s['total']
avg = total_sum / len(self.students) if self.students else 0
print("-" * 50)
print(f"จำนวนนักเรียนทั้งหมด: {len(self.students)} คน")
print(f"คะแนนเฉลี่ยทั้งชั้นเรียน: {avg:.2f} คะแนน")
print(f"==================================================")
report = CourseReport("20901-2006 การเขียนโปรแกรมภาษา Python (ปวช. 2)")
report.add_student("สมชาย สุขเกษม", 28.0, 32.5, 34.0)
report.add_student("กานดา มณีรัตน์", 30.0, 34.0, 35.5)
report.add_student("วิศวะ พัฒนาการ", 22.0, 25.0, 28.0)
report.generate_report()
==================================================
รายงานสรุปผลสัมฤทธิ์รายวิชา: 20901-2006 การเขียนโปรแกรมภาษา Python (ปวช. 2)
==================================================
ชื่อ-สกุล | คะแนนรวม | ระดับเกรด
--------------------------------------------------
สมชาย สุขเกษม | 94.5 | 4
กานดา มณีรัตน์ | 99.5 | 4
วิศวะ พัฒนาการ | 75.0 | 3
--------------------------------------------------
จำนวนนักเรียนทั้งหมด: 3 คน
คะแนนเฉลี่ยทั้งชั้นเรียน: 89.67 คะแนน
==================================================
เกณฑ์การประเมินโครงงาน (ว.PA): ควรเน้นการวัดผลตามสภาพจริง (Authentic Assessment) ทั้งในด้านความถูกต้องของการทำงาน (Functionality), ความเป็นระเบียบของโค้ด (Clean Code), การมีส่วนร่วมในทีม และการนำเสนอผลงาน
กิจกรรมโครงงานประยุกต์ปลายภาคเรียน (Final Capstone Lab)
ให้นักเรียนรวมกลุ่ม 2-3 คน พัฒนาโปรแกรมภาษา Python ขนาดเล็กเพื่อแก้ปัญหาในโรงเรียนหรือชุมชนอย่างน้อย 1 ปัญหา โดยต้องมีส่วนประกอบ: เมนูผู้ใช้, การคำนวณทางคณิตศาสตร์, การใช้ฟังก์ชันหรือคลาส และการบันทึกข้อมูลลงไฟล์
คลิกดูแนวทางการเขียนโค้ดและเฉลย
Solution Guide
คัดลอกเฉลย
# แนวทางหัวข้อโครงงานที่แนะนำ:
# 1. ระบบจัดการคลังพัสดุและยืมคืนอุปกรณ์ห้องปฏิบัติการ
# 2. โปรแกรมคำนวณสารอาหารและพลังงานแคลอรี่ประจำวัน
# 3. ระบบบันทึกเวลาเรียนและการประเมินสถิติการมาเรียน
# 4. เกมตอบคำถามความรู้ทั่วไปเชิงการศึกษา (Educational Quiz Game)