5 Concepts ของ Python ที่คุณควรรู้จัก

17-พ.ค.-19

คัมภีร์เทพ IT

Python เป็นอีกหนึ่ง Programming Language ที่ทรงพลังในยุคนี้ มันได้ถูกนำไปใช้ในหลากหลายด้าน ไม่ว่าจะเป็น Web Development, Data Science & Machine Learning เนื่องจากมี Frameworks ที่มีประสิทธิภาพอย่าง Django, Flask, Tornado, Dash เป็นต้น ดังนั้นใครที่อยากเชี่ยวชาญภาษานี้ ก็ควรรู้จัก 5 Concepts ของ Python ดังต่อไปนี้

1. CONTEXT MANAGERS

คุณเคยเปิด File เพื่อทำการ Read/Write หรือไม่? และคุณจำได้ไหมว่าต้องปิด File และ Release ตัว File-Handle หลังจากการดำเนินการเสร็จสิ้นแล้ว? โดยส่วนใหญ่แล้วเรื่องเหล่านี้เกี่ยวข้องกับ Context Managers
Context Managers จะอนุญาตให้ Programmer สามารถเปิดและปิด File หรือ Connection Object โดยใช้ ‘with’ และ ‘as’ ได้ มันจะคอยจัดการกับ Object หลังจากเสร็จสิ้นการ Execution มันจะตรวจสอบให้แน่ใจว่า Connection หรือ File Object ถูก Release ออกมาหรือถูกปิดแล้ว Object จะถูกปิดอย่างปลอดภัยแม้ในขณะที่มี Error เกิดขึ้นขณะที่มีการ Execute Processing Logic ภายใน Block ของ Code ดังนั้น จาก Code ของตัวอย่างนี้:

สามารถแทนได้ด้วย Code นี้:

จะเห็นว่ามันค่อนข้างง่าย และมีความปลอดภัย

2. IMPLICIT TUPLE UNPACKING

Python มีการรองรับ Feature นี้เพื่อให้สามารถใช้งาน Function อย่าง Multiple Assignments และ Multiple Returns ได้ภายในคำสั่งเดียว ซึ่งมันจะทำให้ชีวิต Programmer ง่ายขึ้น โดย Multiple Assignments ในที่นี้หมายถึงสิ่งนี้:

  

ในที่นี้ Python กำลังสร้าง tuple (10, 20) จาก Value ที่ให้มาและทำการ Iterate ตัวแปรให้สำหรับแต่ละ Assignment การสร้าง tuple ชั่วคราว หมายถึงว่า มีการใช้ตัว Copy(สำเนา) ของ Value ที่ให้มาและหาก r_values เป็นตัวแปร (เช่น x, y = amount, name) มันจะทำงานเหมือนเทคนิค ‘pass-by-value’ ซึ่งนั่นหมายถึง คุณสามารถทำได้โดยไม่ต้องสร้าง Race-Condition:

สิ่งนี้ช่วยในเรื่องคำถามสัมภาษณ์งานเกี่ยวกับการ Swap 2 ตัวแปร โดยไม่ต้องใช้ตัวแปรที่ 3 เข้ามาช่วย แต่นั่นก็ไม่ใช่ทั้งหมด ซึ่ง Functionality นี้สามารถนำไปใช้กับ Data Types ที่แตกต่างกันได้ ดังตัวอย่างนี้:

ผลลัพธ์ใน x = ’O’ และ y = ’K’ โดย Python อนุญาตให้คุณส่งคืนค่าหลายค่าจาก Function ได้โดยไม่จำเป็นต้องมีการ Define  'Structure' สามารถเติมค่าทั้งหมดลงใน Object และทำการ Return Object โดยคุณสามารถทำได้ดังตัวอย่างนี้:

นี่คือ Feature ของภาษาที่ช่วยให้คุณสามารถ Unpack Elements ใน List ด้วยการใช้ Loop ได้:

3. MAGIC METHODS

Magic Methods เป็น Function ที่ถูกเรียกใช้เมื่อมีการ Operate บางอย่างเกิดขึ้นกับ Object ของ Class นั้น ๆ โดย Function เหล่านี้จะมี Double-Underscores อยู่ทั้งด้านหน้าและด้านหลังชื่อของพวกมัน และแต่ละ Function สามารถถูก Define ในขณะที่สร้าง Class เพื่อให้ง่ายต่อการระบุ Properties บางอย่าง ลองดูตัวอย่าง Code ต่อไปนี้:

เมื่อ Run ตัวอย่าง Code ด้านบน จะได้ Output ดังนี้:

จะเห็นว่า __str__() method จะถูกเรียก เมื่อ print() ถูกเรียกใช้บน Object สำหรับ __repr__() method กำหนดให้เป็นตัวแทนของ Class Object ซึ่งมันก็ดูสมเหตุสมผล ส่วน method __add__() ช่วยให้คุณ Define สิ่งที่เกิดขึ้นเมื่อมีการใช้ Operator  ‘+’ กับ Objects ของ Class ส่วน __init__() method ก็เหมือนเป็น Constructor ของ Class 

โดยสรุปแล้ว Magic Methods จะช่วยให้ Programmer สามารถ Define ว่า อะไรจะเกิดขึ้นเมื่อมีการใช้ Operators และ Functions บน Object หากไม่มีการ Define __add__() method ในตัวอย่างด้านบนแล้ว ตัว Interpreter จะไม่ทราบว่า ต้องทำอย่างไรเมื่อมีการเพิ่ม 2 Object ของ Class เข้าไป การใช้ Magic Methods ภายใน Class Definition นั้น Programmer สามารถควบคุม Behavior ของมันเมื่อต้องใช้งานกับพวก Operators ต่าง ๆ

4. GENERATORS

Generators เป็น Lazy Iterators ที่ประมวลผล Elements ใน List เฉพาะเมื่อมันถูกใช้งาน ลองพิจารณาถึง Function ที่ต้องประมวลผลใน List ที่มีขนาดใหญ่มาก ๆ ดู โดยปกติ List ที่มีขนาดใหญ่ จำเป็นต้องถูก Load เข้าไปใน Memory (ใน Container, Variable) ก่อนที่ Function อื่นจะสามารถประมวลผลได้ ซึ่งหมายความว่า คลังข้อมูลที่มีขนาดใหญ่มาก ๆ จะมีปัญหาเรื่องความซับซ้อนของ Space สำหรับ Program ลองนึกภาพถึงเทคนิคที่จะดึงข้อมูลเข้ามาใน memory ก็ต่อเมื่อข้อมูลนั้นจะถูกเรียกใช้เท่านั้น โดยไม่ดึงข้อมูลที่ไม่ได้ใช้เข้ามารอใน Memory ก่อน การทำแบบนี้จะช่วยลดปัญหาเรื่องใช้ Memory เยอะลงไปได้มาก ซึ่งเทคนิคนั้นเรียกว่า Generators ใน Python ลองพิจารณาที่ Code ต่อไปนี้:

จะได้ Output ดังต่อไปนี้:

จะสังเกตว่าใน Normal Function จะมีการสร้างทุก Element ใน List นั้นทันทีและทำการคืน List นั้นไปเก็บไว้ในตัวแปร 'numList' ซึ่งจะใช้ Memory จำนวนมากจนกระทั่งการประมวลผลเสร็จสมบูรณ์  ซึ่งอาจกลายเป็นปัญหาที่ร้ายแรงได้ในการประมวลผลข้อมูลที่มีขนาดใหญ่มาก ๆ ได้ เช่น ประมวลผล File ขนาดใหญ่ เป็นต้น ในขณะที่  Generator Function ที่สอง จะไม่ ทำการสร้างทุก Element ใน List ในทันที  แต่จะทำการสร้างทีละ Element เมื่อมีการเรียกเพื่อขอ Element ไป Process ดังนั้น เวลาและความซับซ้อนของ Space ของ Program ยังคงต่ำอยู่ แม้ในขณะที่ประมวลผลข้อมูลขนาดใหญ่ (Big Data)

ข้อดีของการใช้ Generators อีกข้อนึง คือ คำสั่ง  'yield' จะทำการคืน Control Object กลับไปให้กับผู้เรียกใช้ ซึ่งทำให้ผู้เรียกใช้สามารถเลือกได้ว่าเมื่อไหร่จะหยุดการ Process Data จาก Generators โดยไม่ต้องดึงข้อมูลเข้ามาใน Memory จนหมดทุกตัว ยกตัวอย่างเช่น คุณต้องการหา Prime Number(จำนวนเฉพาะ) 3 ตัวที่ติดกัน จาก File ที่มีตัวเลขอยู่ 1,000 ตัว เมื่อใช้ Generators คุณจะสามารถดึงตัวเลขเข้ามาทีละตัวและทันทีที่เจอ Prime Number ติดกัน 3 ตัว คุณสามารถหยุดดึงข้อมูลจาก Generators ได้ทันที โดยที่ไม่ต้องดึงข้อมูลที่เหลือจากไฟล์เข้ามาจบหมด

5. DECORATORS

สำหรับใน Python แล้ว Function ก็คือ Objects ซึ่งหมายถึง พวกมันสามารถถูกส่งผ่านเป็น Argument และถูก Return จาก Function อื่น ๆ ได้ Decorators ใช้ประโยชน์จาก Feature นี้ โดยการสร้าง Function ใหม่เพื่อห่อ Function เก่าไว้ในภายในและเพิ่มหน้าที่ของ Function มากขึ้นโดยไม่ไปเปลี่ยนแปลงพฤติกรรมของ Function เก่า ลองมาดู Use case นี้กัน ลองนึกภาพว่า คุณเขียน Program ที่ต้องใช้เวลาในการ Operation มาก ๆ เช่น การ Load File ที่มีขนาดใหญ่, สร้าง API call, สร้าง Summary Report เป็นต้น หลังจากที่คุณเขียนทุกอย่างแล้ว คุณต้องการคำนวณเวลาที่ใช้ในแต่ละ Operation  ซึ่ง Method ที่ใช้กันมากที่สุดคือการใช้ Time Module ดังที่แสดงด้านล่างนี้:

ทุกอย่างดูจะเป็นไปได้ด้วยดี แต่จะเป็นอย่างไรหากต้องทำเช่นนี้ในหลายๆ Method? คุณจะต้องเพิ่ม Code ไปอีก 3 บรรทัดในแต่ละ Function call ใน Program ของคุณ ซึ่งจะต้องใช้ความพยายามอย่างมากในการทำให้ครอบคลุม Function call ทั้งหมด และจะเป็นอย่างไร ถ้าหลังจากที่วิเคราะห์แล้ว คุณกลับไม่ต้องการทำสิ่งนั้นอีกต่อไป? คุณต้องกลับไปที่ Code base ของคุณแล้วทำการลบ Code ที่เพิ่งเพิ่มเข้าไป เพื่อยกเลิกสิ่งที่คุณเพิ่งทำทั้งหมด มันต้องมี Method ที่ดีกว่านี้สิ นั่นก็คือ Decorators นั่นเอง ลองดู Code ที่อยู่ด้านล่าง:

คุณจะเห็นได้ว่า มีการ Define บาง Function และ Wrapper Method คือ timeIt() ขึ้นมา ซึ่งมี Code ในการคำนวณเวลาของการส่งผ่าน Function Object เพียงการเพิ่ม ‘@timeIt’ ก่อน Function ที่มีการ Define มันจะสามารถ Wrap Function call ภายใน TimeIt() Wrapper ซึ่งสิ่งนี้ก็เท่ากับการทำตามด้านล่าง:

และเมื่อไรที่เราไม่ต้องการ Wrap Functions แล้ง เราก็สามารถไปที่ Definitions ของพวกมันและทำการลบ '@timeIt' เพื่อย้อนกลับเป็น 'Decoration' ไม่เพียงแค่นั้น Python ยัง Support การมีหลาย Decorators ที่จะนำไปใช้กับ Function เดียวกันในช่วงเวลาเดียวกัน ในกรณีนั้น Wrapping จะเกิดขึ้นตามลำดับที่ Decorators ถูกนำไปใช้

จากที่บทความนี้ได้กล่าวถึง Feature ที่ซ่อนอยู่ของ Python พร้อมทั้งอธิบายด้วย Code ตัวอย่างให้เข้าใจมากขึ้น แต่ Python ก็ยังมีจุดเด่นอื่น ๆ อีกมากมายนอกเหนือจากที่กล่าวไว้ข้างต้น ขอแนะนำให้อ่าน Official Documentation เพิ่มเติมด้วย การใช้Generators และ Decorators จะช่วยทำให้ Code ของคุณ Clean ขึ้นและ Maintain ได้ง่ายขึ้น คุณสามารถดู Code จากบทความนี้และอื่น ๆ อีกมากมายใน Git ได้ที่ Repository ของผู้เขียนบทความนี้คือ PyProwess

ที่มา:  https://medium.com/

 

 

รับตำแหน่งงานไอทีใหม่ๆ ด้วยบริการ IT Job Alert

 

อัพเดทบทความจากคนวงในสายไอทีทาง LINE ก่อนใคร
อย่าลืมแอดไลน์ @techstarth เป็นเพื่อนนะคะ

เพิ่มเพื่อน

 

บทความล่าสุด