บทเรียนขั้นสูง¶
เรียนรู้การใช้งานภาษาปิยะธอนขั้นสูง รวมถึงเดคอเรเตอร์ เมตาคลาส และคุณสมบัติพิเศษต่างๆ
เดคอเรเตอร์ (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(*งาน)
สำหรับ ข้อมูล ใน ผลลัพธ์:
พิมพ์(ข้อมูล)