
บทความสั้นๆเพื่อให้เข้าใจกับการใช้งาน Yield ของ Python
ก่อนที่จะเริ่มรู้จัก Yield ทํางานอย่างไร เราต้องมาเข้าใจกับคํา 3 คําก่อนก็คือ
- Iterables
- Generator
- Yield
Iterables
เวลาเราสร้าง List ขึ้นมาใน python เราก็จะสามารถดึงค่ามาใช้ได้ทีล่ะตัว ทีล่ะตัว อย่างเนี้ยเรียก Iteration
HTAlist = [1,2,3] for i in list: print(i) #ผลก็จะออกมาเป็น #1 #2 #3
เจ้า HTAlist ก็คือ Iterable ที่สามารถจัดการ iterate ได้
เราสามารถใช้ for …. in ….. ได้กับทุกอย่างที่สามารถ iterable ได้ เช่น Lists,string,files โดยมันจะ store ทุกอย่างลง memory
Generators
Generators เป็น iterators แบบที่อธิบายไปข้างบน ที่มันสารถวนลูปได้
แต่จุดน่าสนใจคือเราสามารถเรียกใช้งานมันได้เพียงครั้งเดียว
เพราะว่ามันจะไม่เก็บค่าไว้ใน memory หรือพูดง่ายๆคือ มัน generate ค่า on the fly นั่นเอง ใช้แล้วคือใช้เลย
Yield
มาถึงตัวเด็ดล่ะ จริงๆมันก็ไม่ยากอะไร แค่ Yield คือ Return ที่ยังไม่ได้ทํางาน ….. งงล่ะสิ
เอาใหม่ แบบง่ายๆ มันคือการ เรียก function นั้นๆแต่ code จะยังไม่ทํางาน แต่จะเพียงแค่ Return Generators Object กลับมาเพียงเท่านั้น ซึ่งเจ้า object ตัวนี้ก็นําไปใช้ใน Method อื่นๆที่เราต้องการได้
ส่วนตัวโค้ดจะทํางานต่อเมื่อมีการใช้ for กับ Generators นั้นๆ
ลองคิดง่ายๆคือ
- เรียกไปที่ function ที่ใช้ yield
- function return Generator กลับมาหาเรา
- Generator ถูกวนลูปใน function อื่นๆ
- ส่งค่ากลับมาเมื่อไล่บรรทัดจนถึง yield
- หลังจากนั้นจะวนลูปส่งค่ากลับมาให้เรา
- แล้วถึงจะวนรอบใหม่ไปทีล่ะรอบ ทีล่ะรอบ ทีล่ะรอบ จนหมดลูปนั้นเอง
** ข้อควรระวัง Yield เนี่ยคือ Generator เพราะฉะนั้นมันหมายถึงว่า มันสามารถเรียกได้แค่ครั้งเดียวเท่านั้น แล้วค่าก็จะหายไปไม่ได้เก็บไว้ใน memory
def someFunctionReturnGenerator(): ... mylist = range(3) ... for i in mylist: ... yield i print(someFunctionReturnGenerator) <generator object someFunctionReturnGenerator at 0xb7555c34> for i in someFunctionReturnGenerator: ... print(i) #ผลก็จะออกมาเป็น #0 #1 #2
ใช้งาน Yield เมื่อไร? ทําไมไม่ใช้ Return เอา?
มันมีเหตุผลเสมอที่เราไม่ใช่ Return เลยตรงๆ คือเรื่องของ Performance บางทีเราไม่ได้อยากจะให้ข้อมูลที่จะเกิดขึ้นมาเก็บไว้ใน Memory เลย เราต้องการแค่ให้มันทํางานอย่างที่เราต้องการ ณ เวลานั้นๆ ไม่ได้ต้องการทีเดียว เช่น
การดึงข้อมูลขนาดใหญ่ขึ้นมาใช้ เช่น การอ่าน csv ไฟล์ หรือ text ไฟล์ขนาดใหญ่ เราอาจจะต้องการอ่านแค่ row by row ไม่ใช่ทั้งหมดทีเดียว เราก็สามารถนํา Yield มาใช้ เพื่อลดเรื่อง Performance ได้
Remark:
มีสิ่งน่าสนใจเรื่องของการ Iteration กับ List โดยมีเทคนิคนี้ Stackoverflow หรือดูจะจาก document ของ Python ก็ได้
Ref: http://stackoverflow.com/questions/231767/what-does-the-yield-keyword-do
[…] อ่านเนื้อหาก่อนลองเล่นได้ที่ Python Comprehension & Generator , Yield ใน Python คืออะไร? […]