10 เทคนิค Python One-Liners เขียนโค้ดสั้น กระชับ และทำงานไวขึ้น

10 Python One-Liners That Will Make Your Code Cleaner and Faster

เบื่อกับการต้องพิมพ์โค้ดยาวๆ หรือเปล่า? หากคุณต้องการทำงานให้เสร็จโดยใช้จำนวนคำที่น้อยลง คุณมาถูกทางแล้ว นี่คือ 10 เทคนิค Python One-Liners ที่ใช้งานได้จริง ซึ่งแต่ละรายการจะช่วยปรับปรุงโค้ดของคุณให้ดีกว่าการเขียนแบบหลายบรรทัดทั่วไป ช่วยให้คุณประหยัดเวลาและลดความซับซ้อนของโปรแกรมได้อย่างเห็นผล

อย่างไรก็ตาม มีข้อกำหนดเบื้องต้นบางประการสำหรับตัวอย่างเหล่านี้ โดยในข้อ 2, 6, 9 และ 10 จำเป็นต้องมีการ import itertools, import functools และ from collections import Counter ไว้ที่ต้นสคริปต์ นอกจากนี้ควรระวังเวอร์ชันขั้นต่ำของ Python ที่ระบุไว้ในข้อ 3, 5, 6 และ 10 เพื่อป้องกันข้อผิดพลาดที่อาจเกิดขึ้นกับ Python เวอร์ชันเก่า

มาดู 10 เทคนิคที่จะช่วยให้ชีวิตนักพัฒนาง่ายขึ้นกันเลย

1. ลบรายการที่ซ้ำกันโดยคงลำดับเดิมไว้

เทคนิคนี้ใช้แทนการวนลูปด้วยตนเองเพื่อหาค่าที่ไม่ซ้ำกัน นอกจากนี้ยังรักษาลำดับเดิมของข้อมูลไว้ได้ ซึ่งแตกต่างจากการใช้ list(set(items)) ที่ลำดับมักจะเพี้ยนไป

unique = list(dict.fromkeys(items))

คำสั่งนี้จะสร้าง Dictionary จากไอเทมต่างๆ โดยใช้เป็น Key ซึ่งจะคัดรายการที่ซ้ำออกโดยอัตโนมัติในขณะที่ยังรักษาลำดับการปรากฏครั้งแรกไว้ (รองรับตั้งแต่ Python 3.7) จากนั้นจึงแปลง Keys กลับมาเป็น List

2. ทำให้ List ของ List แบนราบ (Flatten)

วิธีนี้เร็วกว่าและอ่านง่ายกว่าการใช้ Nested Loops หรือเทคนิค sum(nested, []) ที่มักทำงานช้าลงเมื่อข้อมูลมีปริมาณมาก

flat = list(itertools.chain.from_iterable(nested))

โค้ดนี้จะวนลูปผ่านแต่ละ Sublist ในลักษณะ Lazy ตามลำดับ และรวบรวมทุกองค์ประกอบเข้าเป็น List เดียวอย่างมีประสิทธิภาพ

3. การผสาน Dictionary

แทนที่จะใช้ .copy() ตามด้วย .update() หรือการ Unpacking {**a, **b} ที่อ่านยาก คุณสามารถใช้ตัวดำเนินการที่ชัดเจนได้ทันทีใน Python 3.9 ขึ้นไป

merged = defaults | overrides

Dictionary ใหม่จะถูกสร้างขึ้นจากการรวมข้อมูลทั้งสองชุด หากมี Key ซ้ำกัน ค่าจาก Dictionary ฝั่งขวา (overrides) จะถูกนำมาใช้เป็นค่าหลัก

4. ตรวจสอบเงื่อนไขในคอลเลกชันด้วย Short-Circuiting

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

has_negative = any(x < 0 for x in values)

ฟังก์ชันจะคืนค่า True ทันทีที่พบองค์ประกอบตามเงื่อนไข และคืนค่า False หากไม่พบเลย (หรือใช้ all() สำหรับการตรวจสอบว่าตรงตามเงื่อนไขทุกตัวหรือไม่)

5. คำนวณครั้งเดียว กรองออก และจัดเก็บ

การใช้ Walrus Operator ช่วยหลีกเลี่ยงการเรียกฟังก์ชันเดิมซ้ำสองครั้ง ทั้งในขั้นตอนการกรองและการเก็บค่า ช่วยลดความไร้ประสิทธิภาพที่มักพบใน List Comprehensions (รองรับ Python 3.8+)

results = [y for x in data if (y := transform(x)) is not None]

โค้ดนี้จะใช้ transform กับแต่ละองค์ประกอบแล้วกำหนดค่าให้ y ทันที โดยจะเก็บเฉพาะผลลัพธ์ที่ไม่เป็น None เท่านั้น

6. เพิ่ม Memoization ให้ฟังก์ชันทันที

Decorator เพียงบรรทัดเดียวนี้สามารถเปลี่ยนฟังก์ชัน Recursive ที่ทำงานช้า หรือการคำนวณซ้ำซ้อนให้กลายเป็นการค้นหาข้อมูลที่รวดเร็ว (Python 3.9+ หรือใช้ @lru_cache(maxsize=None) ในเวอร์ชันเก่า)

@functools.cache

ระบบจะเก็บค่าที่ส่งกลับสำหรับอาร์กิวเมนต์แต่ละชุดไว้ เมื่อมีการเรียกใช้ด้วยค่าเดิมอีกครั้ง จะดึงผลลัพธ์จากหน่วยความจำมาตอบทันทีโดยไม่ต้องคำนวณใหม่

7. ทรานสโพสเมทริกซ์ (Transpose a Matrix)

สลับแถวและคอลัมน์ของตารางข้อมูลได้ในบรรทัดเดียว โดยไม่ต้องเขียนตัวเลขดัชนีหรือพึ่งพา NumPy เหมาะสำหรับการปรับรูปแบบตารางอย่างรวดเร็ว

 

แต่ละแถวจะถูก Unpacked ส่งเข้าไปใน zip ซึ่งจะทำหน้าที่จับกลุ่มองค์ประกอบลำดับเดียวกันจากทุกแถวเข้าด้วยกันจนกลายเป็นคอลัมน์

8. ค้นหา Key ที่มี Value สูงสุดใน Dictionary

บรรทัดนี้สามารถใช้แทนการเขียนลูปเพื่อเปรียบเทียบค่าสูงสุดและเก็บ Key ไว้ด้วยตนเอง

best = max(scores, key=scores.get)

โปรแกรมจะวนลูปผ่าน Keys ทั้งหมดใน Dictionary และส่งคืน Key ที่มีค่า Value สูงที่สุดออกมา

9. ค้นหาไอเทมที่ปรากฏบ่อยที่สุด

ลดขั้นตอนการนับด้วย Dictionary และการเรียงลำดับด้วยตนเอง โดยใช้เครื่องมือมาตรฐานที่ออกแบบมาเพื่อการนี้โดยเฉพาะ

top3 = Counter(words).most_common(3)

คำสั่งนี้จะนับจำนวนการปรากฏของแต่ละองค์ประกอบ และส่งคืน List ของ Tuple (item, count) 3 อันดับแรกที่พบมากที่สุด

10. แบ่ง Iterable ออกเป็นกลุ่มขนาดคงที่ (Chunks)

ช่วยลดความผิดพลาดจากการคำนวณ Slicing เหมาะสำหรับการเตรียมข้อมูลเพื่อส่งเข้า API หรือโมเดลในลักษณะ Batch (รองรับ Python 3.12+)

batches = list(itertools.batched(records, 100))

โค้ดจะจัดกลุ่มข้อมูลเป็น Tuple ขนาดตามที่กำหนด (เช่น 100 องค์ประกอบ) โดยกลุ่มสุดท้ายจะเก็บข้อมูลส่วนที่เหลือทั้งหมด

สรุป

เทคนิค One-Liners เหล่านี้ไม่ใช่เรื่องมหัศจรรย์ แต่คือการใช้ประสิทธิภาพของภาษา Python อย่างเต็มที่เพื่อสร้างคำสั่งที่มีพลังและกระชับ การฝึกใช้เครื่องมือเหล่านี้ไม่เพียงแต่ช่วยให้โค้ดสะอาดขึ้น แต่ยังช่วยเพิ่มประสิทธิภาพในการพัฒนาซอฟต์แวร์ของคุณในระยะยาวอีกด้วย

Source: KDnuggets
ดูแลงานแปลและเรียบเรียงโดย SirilukP

ความคิดเห็น (0)

เข้าสู่ระบบเพื่อร่วมแสดงความเห็น

สมัครสมาชิก

มาเป็นคนแรกที่แสดงความเห็นกันเลยโบร