มารู้จัก yield ใน Python กันเถอะ!!! (เบื้องต้น)
ทุกคนที่เขียนโปรแกรมเป็นก็คงรู้จัก return กันอยู่แล้วถูกไหมครับ แต่สำหรับใน Python เนี่ยมันมี เจ้า yield ด้วย แล้วมันทำงานต่างจาก return ยังไงกันล่ะ? เดี๋ยวผมจะมาอธิบายในสไตล์ของผมให้ได้อ่าน พร้อมตัวอย่างประกอบกันนะครับ ต้องบอกไว้ก่อนว่า ผมไม่ได้รู้ลึกซึ้งอะไรนะครับ แค่อยากจะมาแนะนำ การใช้งาน และความสามารถของมัน
ลองดูนะครับ ปกติ สมมติ ผมจะเขียนโปรแกรมให้ ฟังก์ชั่น return list ของจำนวนเฉพาะออกมา หน้าตาก็จะเป็นอะไรแบบนี้นะครับ
ถัดมา ลองมาดูหน้าตาของ การใช้ yield กันนะครับ ว่าจะเขียนออกมาหน้าตาแบบไหน
มาถึงตรงนี้ อาจจะงง กันบ้างนะครับ สำหรับมือใหม่ มีคำศัพท์ แปลกๆ โผล่มาเช่น generator แต่นั่นล่ะครับ แสดงว่าคุณ กำลังจะได้ความรู้เพิ่มเติมขึ้นมาอีกอย่างแล้ว
ให้เราลองมอง เจ้า function primes() ที่มีคำสั่ง yield อยู่ข้างในเนี่ยเป็น generator คืออะไรสักอย่างที่ จะใช้สร้าง output อะไรออกมานะครับซึ่ง ไอ้เจ้า generator เนี่ยมันก็จะคืนค่าออกมาเป็น iterator ซึ่งมันสามารถเอามาวน loops ได้ เพื่อให้ได้ผลลัพธ์ออกมานะครับ ตามตัวอย่างข้างล่างนี้
แถมให้นิดนึงครับเผื่อใครสงสัยแบบ แล้วถ้า อยากได้แค่ บางค่าล่ะ ปกติ ถ้าเป็น list ทั่วไปเราคงใช้ primes()[:3] อะไรประมาณนี้ใช่ไหมครับ พอเป็น generator แบบนี้จะทำยังไง ลองดูนะครับ แล้วลองไปปรับใช้ดู
ลอง ไป run ดูผลลัพธ์ กันเองนะครับ อยากให้ลองหัดเขียนดูมาถึงตรงนี้ หลายคนอาจจะงงว่า อ้าวแล้วมันต่างจาก return ยังไง ในกรณีปกติ ก็คงไม่ต่างเท่าไหร่เพราะข้อมูล มีไม่มาก แต่ถ้าข้อมูล มีมากๆล่ะ สมมติ มีข้อมูล 10000 ชุด ถ้าใช้ return แสดงว่าทุกค่าจะต้องถูกสร้างขึ้นมาทั้งหมด แต่ถ้า เป็น yield เราค่อยๆ เอาออกมาได้และถ้าเจอเงื่อนไขที่กำหนดไว้ แล้วก็ให้มันหยุดทำงาน
อ้าว!!! แล้วมันต่างจาก return ยังไง
ลองดูตัวอย่าง ทั้งสองข้างล่างนี้เพื่อเปรียบเทียบนะครับ
ตัวอย่างแรกนี้เราจะใช้ return นะครับ
ตัวอย่างแรกนี้ ผลลัพธ์ที่ได้ คือ 2,3,5 นั่นเอง แต่ function primes() นั้น ต้องสร้างข้อมูลออกมาก่อนแล้ว เป็น list ที่มี จำนวน 6 ค่า (2, 3, 5, 7, 11, 13) ถ้ามีเป็น หมื่นๆค่าล่ะ โหวววววว ก็ต้องสร้างออกมา ทั้งหมดก่อน แล้วค่อย เลือกมาแค่ 3 งั้นคงไม่ดีเท่าไหร่มั้ง…
ลองมาดูตัวอย่างการใช้ yield กันบ้างดีกว่า
ผมขออนุญาตเพิ่ม print(‘*’) ลงไปก่อนที่จะ yield ทุกๆค่านะครับ เพื่อให้เห็นภาพที่ชัดเจนยิ่งขึ้น
โอเค ดูเผินๆ ก็เหมือนจะไม่ต่างกัน แต่เราลองมาคิดดูดีๆกันนะครับ ในที่นี้ ผมใส่ print(*) ไว้หน้า yield ทุกตัวเพื่อจะทำให้เห็นว่ามันมีการ yield ออกมากี่ครั้ง จากตัวอย่างแรก(return)ที่ต้องสร้าง ข้อมูล มาทั้ง 6 ค่า ในตัวอย่างนี้หลังจากเปลี่ยนมาใช้ yield เราจะสร้างข้อมูลเพียง 3 ค่าเท่านั้นครับ ยิ่งถ้าข้อมูลมีเป็นหมื่นๆ เราก็จะเห็นความแตกต่างได้ครับ
บทความนี้เป็นเพียงตัวอย่างให้หลายๆคน ได้รู้จักกับ yield เพียงเท่านั้นนะครับ เพื่อนำไปประยุกต์ หรือ ต่อยอด ใช้งานกันครับจากตัวอย่างอาจจะไม่ได้ชัดเจนมากนักต้องขออภัยจริงๆนะครับ ผู้เขียน คิดตัวอย่างไม่ออก 555 แต่ก็เชื่อว่าหลายๆคนจะเห็นถึงพลังและ ความสามารถของ yield ไม่มากก็น้อยนะครับ ไม่แน่สักวันนึงคุณอาจต้องใช้มันครับ อิอิ