บทเรียนขั้นสูง

เรียนรู้การใช้งานภาษาปิยะธอนขั้นสูง รวมถึงเดคอเรเตอร์ เมตาคลาส และคุณสมบัติพิเศษต่างๆ

เดคอเรเตอร์ (Decorators)

เดคอเรเตอร์พื้นฐาน

# สร้างเดคอเรเตอร์
นิยาม จับเวลา(ฟังก์ชัน):
    นิยาม ห่อหุ้ม(*args, **kwargs):
        จาก time นำเข้า time เป็น เวลา
        เวลาเริ่ม = เวลา()
        ผลลัพธ์ = ฟังก์ชัน(*args, **kwargs)
        เวลาสิ้นสุด = เวลา()
        พิมพ์(f"ใช้เวลา: {เวลาสิ้นสุด - เวลาเริ่ม} วินาที")
        คืนค่า ผลลัพธ์
    คืนค่า ห่อหุ้ม

# ใช้เดคอเรเตอร์
@จับเวลา
นิยาม ทำงานนาน():
    จาก time นำเข้า sleep เป็น พัก
    พัก(2)
    คืนค่า "เสร็จแล้ว"

เดคอเรเตอร์ที่รับพารามิเตอร์

นิยาม ทำซ้ำ(จำนวนครั้ง):
    นิยาม เดคอเรเตอร์(ฟังก์ชัน):
        นิยาม ห่อหุ้ม(*args, **kwargs):
            สำหรับ _ ใน ช่วง(จำนวนครั้ง):
                ผลลัพธ์ = ฟังก์ชัน(*args, **kwargs)
            คืนค่า ผลลัพธ์
        คืนค่า ห่อหุ้ม
    คืนค่า เดคอเรเตอร์

@ทำซ้ำ(3)
นิยาม พิมพ์ข้อความ(ข้อความ):
    พิมพ์(ข้อความ)

เมตาคลาส (Metaclasses)

Note

เมตาคลาสอาจจะแปลว่า "อภิชาติชั้น" ในภาษาปิยะธอนรุ่นในอนาคต 😅

การสร้างเมตาคลาส

ชั้น ลงทะเบียนคลาส(ชนิด):
    _คลาส = {}

    นิยาม __เริ่มต้น__(ตัว, ชื่อ, ฐาน, นามานุกรม):
        คลาส = ชนิด.__เริ่มต้น__(ตัว, ชื่อ, ฐาน, นามานุกรม)
        ตัว._คลาส[ชื่อ] = คลาส
        คืนค่า คลาส

    นิยาม รับคลาส(ตัว, ชื่อ):
        คืนค่า ตัว._คลาส.get(ชื่อ)

# ใช้เมตาคลาส
ชั้น สัตว์(metaclass=ลงทะเบียนคลาส):
    นิยาม __เริ่มต้น__(ตัว, ชื่อ):
        ตัว.ชื่อ = ชื่อ

เจเนเรเตอร์และอิเทอเรเตอร์

เจเนเรเตอร์

นิยาม นับเลขคู่(สูงสุด):
    ค่า = 0
    ขณะที่ ค่า < สูงสุด:
        ให้ ค่า
        ค่า += 2

# ใช้เจเนเรเตอร์
สำหรับ เลข ใน นับเลขคู่(10):
    พิมพ์(เลข)

อิเทอเรเตอร์แบบกำหนดเอง

ชั้น ลำดับฟิโบนัชชี:
    นิยาม __เริ่มต้น__(ตัว, จำนวน):
        ตัว.จำนวน = จำนวน
        ตัว.ค่าปัจจุบัน = 0
        ตัว.ถัดไป = 1
        ตัว.นับ = 0

    นิยาม __วนซ้ำ__(ตัว):
        คืนค่า ตัว

    นิยาม __ถัดไป__(ตัว):
        ถ้า ตัว.นับ >= ตัว.จำนวน:
            ยก StopIteration
        ผลลัพธ์ = ตัว.ค่าปัจจุบัน
        ตัว.ค่าปัจจุบัน, ตัว.ถัดไป = ตัว.ถัดไป, ตัว.ค่าปัจจุบัน + ตัว.ถัดไป
        ตัว.นับ += 1
        คืนค่า ผลลัพธ์

ตัวจัดการบริบทขั้นสูง

Higher-level Context Managers

การจัดการทรัพยากร

จาก contextlib นำเข้า contextmanager

@contextmanager
นิยาม จัดการการเชื่อมต่อ():
    ลอง:
        พิมพ์("เชื่อมต่อแล้ว")
        ให้ "การเชื่อมต่อ"
    สุดท้าย:
        พิมพ์("ปิดการเชื่อมต่อ")

# ใช้งาน
ด้วย จัดการการเชื่อมต่อ() เป็น conn:
    พิมพ์(f"กำลังใช้ {conn}")

ฟังก์ชันขั้นสูง

การแคชข้อมูล (Caching)

จาก functools นำเข้า lru_cache

@lru_cache(maxsize=None)
นิยาม ไฟโบนัชชี(n):
    ถ้า n < 2:
        คืนค่า n
    คืนค่า ไฟโบนัชชี(n-1) + ไฟโบนัชชี(n-2)

ฟังก์ชันบางส่วน (Partial Functions)

จาก functools นำเข้า partial

นิยาม ยกกำลัง(ฐาน, เลขชี้กำลัง):
    คืนค่า ฐาน ** เลขชี้กำลัง

ยกกำลังสอง = partial(ยกกำลัง, เลขชี้กำลัง=2)
ยกกำลังสาม = partial(ยกกำลัง, เลขชี้กำลัง=3)

การเขียนโปรแกรมแบบอะซิงโครนัส

การใช้งาน ไม่ประสาน/รอประสาน (async/await)

ไม่ประสาน นิยาม ดึงข้อมูล(url):
    รอประสาน asyncio.sleep(1)  # จำลองการดึงข้อมูล
    คืนค่า f"ข้อมูลจาก {url}"

ไม่ประสาน นิยาม main():
    urls = [
        "http://example1.com",
        "http://example2.com"
    ]
    งาน = [ดึงข้อมูล(url) สำหรับ url ใน urls]
    ผลลัพธ์ = รอประสาน asyncio.gather(*งาน)
    สำหรับ ข้อมูล ใน ผลลัพธ์:
        พิมพ์(ข้อมูล)