มารู้จัก yield ใน Python กันเถอะ!!! (เบื้องต้น)

Supayut Raksuk
CODIUM
Published in
2 min readMay 29, 2018

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

ลองดูนะครับ ปกติ สมมติ ผมจะเขียนโปรแกรมให้ ฟังก์ชั่น return list ของจำนวนเฉพาะออกมา หน้าตาก็จะเป็นอะไรแบบนี้นะครับ

เมื่อเรียกใช้งาน function primes() จะ return ค่าออกมาเป็น list ของ จำนวนเฉพาะ 6 ตัวแรก

ถัดมา ลองมาดูหน้าตาของ การใช้ yield กันนะครับ ว่าจะเขียนออกมาหน้าตาแบบไหน

เมื่อเรียกใช้งาน function primes() จะ ได้ เป็น generator ที่มีผลลัพธ์ของ จำนวนเฉพาะ อยู่ข้างใน

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

ให้เราลองมอง เจ้า function primes() ที่มีคำสั่ง yield อยู่ข้างในเนี่ยเป็น generator คืออะไรสักอย่างที่ จะใช้สร้าง output อะไรออกมานะครับซึ่ง ไอ้เจ้า generator เนี่ยมันก็จะคืนค่าออกมาเป็น iterator ซึ่งมันสามารถเอามาวน loops ได้ เพื่อให้ได้ผลลัพธ์ออกมานะครับ ตามตัวอย่างข้างล่างนี้

แบบปกตินะครับ

แถมให้นิดนึงครับเผื่อใครสงสัยแบบ แล้วถ้า อยากได้แค่ บางค่าล่ะ ปกติ ถ้าเป็น list ทั่วไปเราคงใช้ primes()[:3] อะไรประมาณนี้ใช่ไหมครับ พอเป็น generator แบบนี้จะทำยังไง ลองดูนะครับ แล้วลองไปปรับใช้ดู

พระเอกของเรา ในที่นี้คือ islice() ครับ

ลอง ไป run ดูผลลัพธ์ กันเองนะครับ อยากให้ลองหัดเขียนดูมาถึงตรงนี้ หลายคนอาจจะงงว่า อ้าวแล้วมันต่างจาก return ยังไง ในกรณีปกติ ก็คงไม่ต่างเท่าไหร่เพราะข้อมูล มีไม่มาก แต่ถ้าข้อมูล มีมากๆล่ะ สมมติ มีข้อมูล 10000 ชุด ถ้าใช้ return แสดงว่าทุกค่าจะต้องถูกสร้างขึ้นมาทั้งหมด แต่ถ้า เป็น yield เราค่อยๆ เอาออกมาได้และถ้าเจอเงื่อนไขที่กำหนดไว้ แล้วก็ให้มันหยุดทำงาน

อ้าว!!! แล้วมันต่างจาก return ยังไง

ลองดูตัวอย่าง ทั้งสองข้างล่างนี้เพื่อเปรียบเทียบนะครับ

ตัวอย่างแรกนี้เราจะใช้ return นะครับ

ตัวอย่างแรกใช้ return
ผลลัพธ์ตามนี้

ตัวอย่างแรกนี้ ผลลัพธ์ที่ได้ คือ 2,3,5 นั่นเอง แต่ function primes() นั้น ต้องสร้างข้อมูลออกมาก่อนแล้ว เป็น list ที่มี จำนวน 6 ค่า (2, 3, 5, 7, 11, 13) ถ้ามีเป็น หมื่นๆค่าล่ะ โหวววววว ก็ต้องสร้างออกมา ทั้งหมดก่อน แล้วค่อย เลือกมาแค่ 3 งั้นคงไม่ดีเท่าไหร่มั้ง…

ลองมาดูตัวอย่างการใช้ yield กันบ้างดีกว่า

ผมขออนุญาตเพิ่ม print(‘*’) ลงไปก่อนที่จะ yield ทุกๆค่านะครับ เพื่อให้เห็นภาพที่ชัดเจนยิ่งขึ้น

ตัวอย่างการใช้ yield
ผลลัพธ์ก็ยังคงเป็น 2,3,5 เพียงแต่ผม ขอใส่ * เพื่อจะได้อธิบาย ให้ง่ายขึ้นนะครับ

โอเค ดูเผินๆ ก็เหมือนจะไม่ต่างกัน แต่เราลองมาคิดดูดีๆกันนะครับ ในที่นี้ ผมใส่ print(*) ไว้หน้า yield ทุกตัวเพื่อจะทำให้เห็นว่ามันมีการ yield ออกมากี่ครั้ง จากตัวอย่างแรก(return)ที่ต้องสร้าง ข้อมูล มาทั้ง 6 ค่า ในตัวอย่างนี้หลังจากเปลี่ยนมาใช้ yield เราจะสร้างข้อมูลเพียง 3 ค่าเท่านั้นครับ ยิ่งถ้าข้อมูลมีเป็นหมื่นๆ เราก็จะเห็นความแตกต่างได้ครับ

บทความนี้เป็นเพียงตัวอย่างให้หลายๆคน ได้รู้จักกับ yield เพียงเท่านั้นนะครับ เพื่อนำไปประยุกต์ หรือ ต่อยอด ใช้งานกันครับจากตัวอย่างอาจจะไม่ได้ชัดเจนมากนักต้องขออภัยจริงๆนะครับ ผู้เขียน คิดตัวอย่างไม่ออก 555 แต่ก็เชื่อว่าหลายๆคนจะเห็นถึงพลังและ ความสามารถของ yield ไม่มากก็น้อยนะครับ ไม่แน่สักวันนึงคุณอาจต้องใช้มันครับ อิอิ

--

--

Supayut Raksuk
CODIUM
Writer for

(@nookskill) I'm a software developer, musician, song writer from Thailand supayut.com