Skip to content

Latest commit

 

History

History
472 lines (323 loc) · 30.9 KB

File metadata and controls

472 lines (323 loc) · 30.9 KB

Data Structures and Algorithms

06066301 วิชาโครงสร้างข้อมูลและอัลกอริทึม (Data Structures and Algorithms)

Link to slide (.pptx)

Python Class

Python

  • เป็น ภาษาระดับสูง (High-level language)
  • เป็น Dynamic Programming Language (ภาษาที่สามารถแยกชนิดตัวแปรได้)
  • สามารถรองรับการเขียนได้หลายรูปแบบ ได้แก่
    • โครงสร้างเชิงวัตถุ (Object Oriented Programming)
    • การเขียนเชิงฟังก์ชัน (Functional Programming)
    • มีส่วนขยายเสริมสำหรับการเขียนเชิงตรรกะ
  • เป็น Open Source สามารถโหลดแล้วใช้งานได้เลย
  • ใช้ Interpreter ในการแปลงโค้ด
  • Python เวอร์ชั่นล่าสุดคือ 3.13.0

วิธีลง Python

  • Windows
  • Mac OS: สามารถลงผ่าน Homebrew โดยใช้คำสั่ง: https://brew.sh/
    • /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
  • Ubuntu: ลงผ่าน apt โดยใช้คำสั่ง:
    • sudo apt install python3
    • python3 --version คำสั่งในการเช็ค Version ของ Python ใน MacOS, Ubuntu

Interpreter

คือ ตัวแปรภาษา ระหว่างภาษามนุษย์กับภาษาคอมพิวเตอร์ให้เป็น 1 กับ 0 เพราะคอมพิวเตอร์อ่านได้แค่นั้นทำให้ต้องแปลงภาษาเป็นภาษาที่มนุษย์เข้าใจให้เป็นภาษาของ machine language ก่อนที่คอมพิวเตอร์ถึงจะประมวณผลได้

Interpreter VS Compiler

Interpreter Compiler
แปลงทีละบรรทัดระหว่างทำงานทีละบรรทัด แปลงให้หมดก่อนแล้วค่อยทำงาน
ระหว่างรัน ถ้าเจอ Error ในบรรทัดที่ทำงานอยู่ก็หยุดการรันทันที ระหว่างแปลง ถ้าเจอ Error ก็ไม่รันเลย
ตัวอย่างภาษาที่ใช้: Python, Ruby และ JavaScript ตัวอย่างภาษาที่ใช้: C, C++ และ Java

Interpreter.png

ชนิดของตัวแปรทั่วไปใน Python

ชนิดของข้อมูลในภาษา Python จะมีอยู่ 4 ตัวหลักๆ คือ

  1. String

    • String คือชุดข้อความที่คลุมด้วย "" (Double Quote), '' (Single Quote) หรือ """ """ (Triple Quote)
    • ไม่สนว่าจะเป็นอะไรแค่คลุมด้วย Double Quote หรือ Single Quote เช่น “0.01” นับเป็นข้อมูลประเภท String
  2. Integer

    • Int คือข้อมูลตัวเลขจำนวนเต็ม เช่น 1, 0, -5
    • ใช้แยกกับ float ที่เป็นจำนวนจริง
  3. Float

    • float คือข้อมูลตัวเลขจำนวนจริงและทศนิยม เช่น 1.0, 3.141592653589 เป็นต้น
  4. Boolean

    • bool คือชนิดข้อมูลตรรกศาสตร์ มี 2 ค่าคือ True กับ False

การประกาศตัวแปร

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

โมดูล (Module) ใน Python

นอกจากนี้ Python ยังเปิดโอกาสให้เพิ่มเติมโมดูลพิเศษที่นอกเหนือจากที่ Python โมดูลพิเศษเหล่านี้ก็ได้รับการพัฒนาจาก Python, C, C++, Java, Dot Net หรือภาษาอื่นๆ

PythonModule.png

การเรียกใช้โมดูล

คำสั่งที่เราใช้ในการอ้างอิงโมดูลมาตรฐานหรือโมดูลเพิ่มเติมพิเศษใน Python ประกอบไปด้วย 2 คำสั่งดังนี้

  1. คำสั่ง import เป็นการอ้างอิงโมดูลที่เราต้องการโดยใช้กลุ่มคำสั่งภายในตัวโมดูล

    import datetime
    import datetime, decimal, os
  2. คำสั่ง from เป็นการอ้างอิงโมดูลที่เราต้องการเฉพาะกลุ่มคำสั่งภายในตัวโมดูลที่เราต้องการ

    from os import error, chdir, getcwd

การสร้างฟังก์ชัน

function.png

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

  • def ย่อมาจากคำว่า “define” ทำหน้าที่เป็นคำสั่งในการประกาศฟังก์ชัน
  • main() คือการตั้งชื่อของฟังก์ชัน อย่างในตัวอย่าง ฟังก์ชันนี้มีชื่อว่า “main” (น้อง ๆ สามารถเปลี่ยนชื่อฟังก์ชันได้)

*ในบรรทัดแรกฟังก์ชันและโปรแกรมต้องมีการสร้าง docstring ขึ้นมาด้วย เพื่อไม่ให้ผิดหลัก PEP-8 ใน <i>Judge

รูปแบบการสร้างฟังก์ชัน

ลักษณะการสร้างฟังก์ชันมีรูปแบบของการเขียนที่ค่อนข้างง่าย มีวิธีการเขียนฟังก์ชันที่แบ่งตามการนำไปใช้งาน 4 รูปแบบ ได้แก่

  1. การสร้างฟังก์ชันที่ไม่มีการส่งค่าใดๆ กลับ
  2. การสร้างฟังก์ชันมีไม่มีการส่งค่าใดๆ กลับแต่มีการส่งผ่านค่าร่วมกับตัวแปรอาร์กิวเมนต์
  3. การสร้างฟังก์ชันร่วมกับการส่งค่าผลลัพธ์กลับ
  4. การสร้างฟังก์ชันที่มีการใช้ตัวแปรอาร์กิวเมนต์และการส่งค่าผลลัพธ์กลับ

การเขียนโปรแกรมเชิงวัตถุ (OOP)

การเขียนโปรแกรมเชิงวัตถุ (OOP)

  • นอกจากการใช้งานฟังก์ชันที่เป็นแบบทั่วไปแล้ว ก็มีการสร้างหรือเขียนฟังก์ชันเพื่อใช้งานภายใต้รูปแบบการเขียนโปรแกรมเชิงวัตถุ (Object-Oriented Programming)
    • เราจะเรียกว่าเป็น Class Module
    • เปลี่ยนชื่อเรียกฟังก์ชันใหม่เป็นคำว่า Method ของ Class Module
    • แบ่งลักษณะการใช้งาน Method ออกเป็น 2 ลักษณะการใช้งาน คือ
      • Internal Method หรือ Private Method
      • Interface Method

ลักษณะการใช้งาน Method ของ Class

  1. Internal Method หรือ Private Method

    • Method ลักษณะนี้คือ ฟังก์ชันที่สร้างขึ้นเพื่อใช้งานเฉพาะภายใน Class Method
    • ฟังก์ชันลักษณะนี้ไม่สามารถเรียกใช้งานโดยตรงจากภายนอก
    • อีกทั้งในแต่ละ Class Method ยังมี Internal Method แบบ Built-in ภายในแต่ละ Class Module ซึ่งบางครั้งก็เรียกว่า Operation Internal Method
      • เช่น __init__, __format__, __len__ ฯลฯ
  2. Interface Method

    • เป็น Method ที่ต้องการสร้างใน Class เพื่อเรียกใช้งานจากภายนอกได้
    • จะใช้วิธีประกาศใช้ Class Object ซึ่งรูปแบบการเขียนโปรแกรมเพื่อสร้าง Method
    • มีวิธีเขียนเหมือนกับการสร้างฟังก์ชันทั่วไป

class.png

Python Class

คลาส (Class) เปรียบเสมือนเป็นพิมพ์เขียว (Blueprint) หรือต้นแบบที่ใช้สร้างวัตถุ (Object) โดยจะมีแอตทริบิวต์ ( attributes) และเมธอด (methods)

คลาสใน Python

  • การสร้างคลาส: ใช้คีย์เวิร์ด class
  • แอตทริบิวต์: คือตัวแปรที่อยู่ภายในคลาส
  • แอตทริบิวต์เป็น public เสมอ: เข้าถึงได้โดยใช้จุด (.) เช่น peter.age

Class Diagram

Class Diagram คือ Diagram ในรูปแบบของ UML ที่ใช้แสดงโครงสร้างของระบบเชิงโดยแสดง Class, Relationship, Attributes และ Method

class-diagram-1.png

Python Objects

Object (วัตถุ) คือเอนทิตีที่มี สถานะ (State) และ พฤติกรรม (Behavior)

ใน Python จะนับ Integer, String, arrays, and dictionaries เป็นวัตถุทุกตัว

โครงสร้างของวัตถุ (Object Structure):

  1. State (สถานะ): แสดงผ่าน attributes ซึ่งสะท้อนคุณสมบัติของวัตถุ เช่น สี อายุ หรือชนิด
  2. Behavior (พฤติกรรม): แสดงผ่าน methods ซึ่งสะท้อนการตอบสนองของวัตถุต่อการโต้ตอบ เช่น การกินหรือการนอน

องค์ประกอบของคลาส

class-structure.png

  1. Constructor

    • __init__ เป็นเมธอด constructor ที่ใช้สำหรับกำหนดค่าเริ่มต้นให้กับ instance ของคลาส Character
    • มีพารามิเตอร์สองตัวคือ self (อ้างถึง instance ที่ถูกสร้างขึ้น), name (ชื่อของตัวละคร) และ catchphrase
    • พารามิเตอร์ name, catchphrase นี้จะถูกใช้เพื่อกำหนดค่าให้กับแอตทริบิวต์ของ instance แต่ละตัวของคลาส Character
  2. เมธอด speak

    • ทำหน้าที่คืนข้อความที่รวมชื่อของตัวละครและวลีประจำตัวในรูปแบบ "ชื่อของตัวละครที่พูด: วลีประจำตัว"
    • self: เมธอดนี้เป็นเมธอดในคลาส ดังนั้นจะรับพารามิเตอร์ self ซึ่งหมายถึง instance ของคลาสที่เรียกใช้งานเมธอด
    • ภายในเมธอด speak ใช้ self.name เพื่อดึงค่าชื่อ (name) ของตัวละคร และใช้ self.catchphrase เพื่อดึงค่าของวลีประจำตัว (catchphrase) ของตัวละครใน instance ที่กำลังทำงาน

การสร้างวัตถุ

creating-object.png

  1. สร้างอ็อบเจ็กต์ peter

    • peter คืออ็อบเจ็กต์ที่ถูกสร้างจากคลาส Character
    • เมื่อสร้างอ็อบเจ็กต์นี้ จะเรียกใช้งานคอนสตรัคเตอร์ __init__ ของคลาส Character
    • Constructor จะได้รับค่าพารามิเตอร์สองค่า:
      • "Peter Griffin" จะถูกเก็บในแอตทริบิวต์ self.name
      • "Bird is the word" จะถูกเก็บในแอตทริบิวต์ self.catchphrase
  2. เรียกเมธอด speak

    • เมธอด speak จะถูกเรียกใช้จากอ็อบเจ็กต์ peter
    • ในเมธอด speak ข้อความจะถูกสร้างโดยการเข้าถึงค่าของแอตทริบิวต์ self.name และ self.catchphrase

ตัวอย่างการใช้คลาส

Student Class

  • คุณฉงนต้องการโปรแกรมรับรายละเอียดนักศึกษาโดยรับรายละเอียดนักศึกษาทั้งหมด 3 คน
  • หลังจากรับค่ามาครบแล้วคุณฉงนสามารถเลือกได้ว่าจะให้แสดงผลข้อมูลของนักศึกษาคนไหนผ่านรหัสนักศึกษาของนักศึกษาคนนั้น
  • โปรแกรมนั้นจะต้องเก็บข้อมูลของนักศึกษาทั้งหมด 3 คนโดยที่ในแต่ละคนต้องเก็บข้อมูลดังนี้
    • ชื่อ, เพศ, อายุ, รหัสนักศึกษา, เกรดเฉลี่ย
  • ถ้าไม่เจอข้อมูลของนักศึกษาให้แสดงคำว่า "Student not found"

เราต้องสร้าง Object นักศึกษาจากคลาส Student

example1.png

ถ้าเขียนโปรแกรมโดยไม่ใช้ Class ก็จำเป็นต้องประกาศตัวแปรให้ครบทุกตัว เช่น

example2.png

จากตัวอย่างที่ผ่านมา หากนำข้อมูลของตัวละครมาประกอบกันเป็นโครงสร้างวัตถุของตัวละครและใช้งานตัวแปรชนิดวัตถุแทนการประกาศตัวแปรแบบปกติที่เรียนมาสามารถประกาศตัวแปรได้ดังนี้

example3.png

คลาสสามารถใช้สร้างวัตถุได้หลายตัว

example4.png

Creating a Student Class

Step-by-Step Guide

1. Define the Class

เริ่มต้นด้วยการสร้างคลาสที่ชื่อว่า Student โดยคลาสใน Python ทำหน้าที่เป็นโครงสร้างที่ใช้สำหรับสร้างออบเจกต์ ซึ่งในกรณีนี้จะเป็นตัวแทนของนักศึกษาแต่ละคน

class Student:
    ...

2. Initialize Attributes

เมธอด __init__ จะถูกใช้เพื่อกำหนดค่าเริ่มต้นให้กับแอตทริบิวต์ของออบเจกต์เมื่อมีการสร้างคลาส

  • Attributes:
    • name: ชื่อของนักศึกษา
    • gender: เพศของนักศึกษา
    • age: อายุของนักศึกษา
    • student_id: รหัสนักศึกษาที่ไม่ซ้ำกัน
    • gpa: เกรดเฉลี่ยสะสม (GPA)
class Student:
    def __init__(self, name, gender, age, student_id, gpa):
        self.name = name
        self.gender = gender
        self.age = age
        self.student_id = student_id
        self.gpa = gpa

เวลาสร้าง Object ชึ้นมา

student = Student(name, gender, age, student_id, gpa)

3. Add Methods for Functionality

a) display_info()

เมธอดนี้จะแสดงข้อความที่จัดรูปแบบข้อมูลของนักศึกษา

  • Logic:
    • ใช้คำนำหน้าชื่อ (Mr สำหรับเพศชาย, Miss สำหรับเพศหญิง)
    • แสดง GPA ด้วยทศนิยม 2 ตำแหน่ง
def display_info(self):
    prefix = "Mr" if self.gender.lower() == "male" else "Miss"
    return f"{prefix} {self.name} ({self.age}) ID: {self.student_id} GPA {self.gpa:.2f}"

b) Override the __str__ Method

การ Override ใน OOP (Object-Oriented Programming) หมายถึงการเขียนเมธอดในคลาสลูก (Subclass) เพื่อแทนที่หรือปรับเปลี่ยนพฤติกรรมของเมธอดที่มีอยู่แล้วในคลาสแม่ (Superclass) โดยที่เมธอดในคลาสลูกมีชื่อและพารามิเตอร์เหมือนกับในคลาสแม่

เมธอด __str__ ช่วยให้สามารถแปลงออบเจกต์เป็นสตริงได้โดยตรงเมื่อใช้ฟังก์ชัน str() หรือ print() และจะเรียกใช้งานเมธอด display_info() เพื่อแสดงข้อมูลนักศึกษา

def __str__(self):
    return self.display_info()

str.png


Full Implementation

class Student:
    def __init__(self, name, gender, age, student_id, gpa):
        self.name = name
        self.gender = gender
        self.age = age
        self.student_id = student_id
        self.gpa = gpa

    def __str__(self):
        return self.display_info()

    def display_info(self):
        prefix = "Mr" if self.gender.lower() == "male" else "Miss"
        return f"{prefix} {self.name} ({self.age}) ID: {self.student_id} GPA {self.gpa:.2f}"

Testing the Student Class

Example Usage:

familyguy.jpg

  1. Creating Objects
    สร้างออบเจกต์ของคลาส Student
peter = Student("Peter Griffin", "Male", 43, 67070067, 2.50)
quagmire = Student("Glenn Quagmire", "Male", 47, 67070112, 3.10)
herbert = Student("Herbert Pervert", "Male", 69, 67070275, 1.90)
  1. Displaying Information
    ใช้ฟังก์ชัน print() เพื่อแสดงข้อมูลนักศึกษา
print(peter)
print(quagmire)
print(herbert)

Output:

Mr Peter Griffin (43) ID: 67070067 GPA 2.50
Mr Glenn Quagmire (47) ID: 67070112 GPA 3.10
Mr Herbert Pervert (69) ID: 67070275 GPA 1.90

Labs Week01 – Python Class

Lab Documentation (Lab 1)

วิธีการอ่าน Class Diagram

Class Diagram จะมี 3 ส่วนคือ

  1. Class Name (ชื่อคลาส)
  2. Attributes (คุณลักษณะ)
    • int คือคุณลักษณะที่มีชนิดเป็น int
    • float คือคุณลักษณะที่มีชนิดเป็น float
    • Object คือคุณลักษณะที่มีชนิดเป็น Object
  3. Methods (เมธอด)
    • void คือเมธอดที่ไม่มีการ return ค่าใดๆ เลย
    • float คือเมธอดที่ return ค่าเป็น float
    • int คือเมธอดที่ return ค่าเป็น int
    • tuple คือเมธอดที่ return ค่าเป็น tuple

how-to-read-class-diagram.png

Lab 01.01 - Is_Even

  • จงเขียนฟังก์ชัน is_even() ที่รับค่าตัวเลขจำนวนเต็ม 1 ค่า (k) และทำการคืนค่า (return) ผลลัพธ์เป็นค่า True หรือ False

    • คืนค่า True ก็ต่อเมื่อ k เป็นเลขคู่
    • ไม่เช่นนั้น ให้คืนค่า False
  • ไม่อนุญาตให้ใช้โอเปอเรเตอร์สำหรับการคูณ การ mod หรือ การหาร

  • ตัวอย่าง

    • is_even(22)
    • ผลลัพธ์ คือ True

Lab 01.02 - Min Max Avg

  • สร้างฟังก์ชันที่รับค่าลิสต์ข้อมูลคะแนนและทำการคืนค่าผลลัพธ์ต้องออกมาเป็นข้อมูล tuple ความยาว 3 ข้อมูลที่ประกอบไปด้วยค่ามากสุด, ค่าน้อยสุดและค่าเฉลี่ยของข้อมูลที่รับเข้ามา

    • ข้อมูลทุกตัวจะต้องโดนปัดทศนิยมให้เหลือ 2 ตำแหน่งผ่านคำสั่ง round(x, 2)
  • ไม่อนุญาตให้ใช้ Built-In function min(), max()

  • ตัวอย่าง

    • your_function([22, 54, 7, 87, 12, 9, 63, 55, 48])
    • ผลลัพธ์ คือ (7, 87, 39.67)

Lab 01.03 - SwapVar

  • สร้างฟังก์ชันที่ทำหน้าที่สลับค่าของตัวแปรทั้งสองตัวนี้จากข้อมูล tuple ขนาด 2 ข้อมูล

    • ชนิดของข้อมูลใน tuple ผลลัพธ์ต้องเป็น float เท่านั้น
  • ตัวอย่าง

    • เช่น function((6, 8))
    • ผลลัพธ์ คือ (8.0, 6.0)

(โค้ด Python สำหรับรับ input)

Lab 01.04 - Student Class (No Class)

คุณฉงนต้องการโปรแกรมรับรายละเอียดนักศึกษาโดยรับรายละเอียดนักศึกษาทั้งหมด 3 คน หลังจากรับค่ามาครบแล้วคุณฉงนสามารถเลือกได้ว่าจะให้แสดงผลข้อมูลของนักศึกษาคนไหนผ่านรหัสนักศึกษาของนักศึกษาคนนั้น โดยที่โปรแกรมนั้นจะต้องเก็บข้อมูลของนักศึกษาทั้งหมด 3 คนโดยที่ในแต่ละคนต้องเก็บข้อมูลดังนี้

  • ชื่อ, เพศ, อายุ, รหัสนักศึกษา, เกรดเฉลี่ย

ถ้าไม่เจอข้อมูลของนักศึกษาให้แสดงคำว่า "Student not found"

REMARK: ในข้อนี้ให้ลองเขียนแบบไม่ใช้ Class ในการสร้าง Object, ให้เก็บเป็นตัวแปรของนักศึกษา 3 คนแทน ห้ามนักศึกษาใช้ OOP, Dictionary หรือสร้างคลาสในข้อนี้โดยเด็ดขาด

Lab 01.05 - Student Class (With Class)

คุณฉงนต้องการโปรแกรมรับรายละเอียดนักศึกษาโดยรับรายละเอียดนักศึกษาทั้งหมด 3 คน หลังจากรับค่ามาครบแล้วคุณฉงนสามารถเลือกได้ว่าจะให้แสดงผลข้อมูลของนักศึกษาคนไหนผ่านรหัสนักศึกษาของนักศึกษาคนนั้น โดยที่โปรแกรมนั้นจะต้องเก็บข้อมูลของนักศึกษาทั้งหมด 3 คนโดยที่ในแต่ละคนต้องเก็บข้อมูลดังนี้

  • ชื่อ, เพศ, อายุ, รหัสนักศึกษา, เกรดเฉลี่ย

ถ้าไม่เจอข้อมูลของนักศึกษาให้แสดงคำว่า "Student not found"

REMARK: ในข้อนี้ให้ลองใช้ Class ในการสร้าง Object ของนักศึกษาแต่ละคนขึ้นมาดู, ลองออกแบบและสร้างคลาสเอง ห้ามใช้ Dictionary ในข้อนี้โดยเด็ดขาด

Lab 01.06 - Rectangle

ให้สร้างคลาสที่ชื่อว่า Rectangle ขึ้นมาโดยที่ภายในคลาสนี้จะมี Attribute 2 ตัวและ Method 2 ตัวดังนี้

  • Attributes (คุณลักษณะ) ได้แก่
    • ค่าความสูง (จำนวนจริง)
    • ค่าความกว้าง (จำนวนจริง)
  • Methods (เมธอด) ได้แก่
    • calculate_area() ทำหน้าที่คำนวณค่าของพื้นที่ของสี่เหลี่ยมและ return ค่ากลับ
    • calculate_perimeter() ทำหน้าที่คำนวณหาความยาวรอบรูปของสี่เหลี่ยมและ return ค่ากลับ

exercise-6.png

วิธีการรับ Input ใน <i>Judge จะรับมาเป็นลำดับตามนี้

  1. ค่าความสูง
  2. ค่าความกว้าง
  3. ค่าเงื่อนไข มี 2 ตัวได้แก่ {"area", "perimeter"}
    1. ถ้าค่าที่รับเข้ามาเป็น "area" ให้เรียกเมธอด calculate_area() พร้อมกับแสดงผลค่าพื้นที่ของสี่เหลี่ยม
    2. ถ้าค่าที่รับเข้ามาเป็น "perimeter" ให้เรียกเมธอด calculate_perimeter() พร้อมกับแสดงผลค่าความยาวรอบรูปของสี่เหลี่ยม