วิธีใช้คีย์เวิร์ด Yield ใน Python
Generators (ตัวสร้าง) ไม่ใช่แนวคิดที่เข้าใจง่ายที่สุดใน Python ทำให้เรื่องร้ายขึ้น พวกมันใช้คีย์เวิร์ดพิเศษชื่อ "yield" แม้ว่า generators จะเป็นฟังก์ชันด้วยตัวเอง คีย์เวิร์ด yield คืออะไร? มันเปรียบเทียบกับคำสั่ง return อย่างไร?
นี่คือคำถามที่ดี ในคู่มือนี้ เราพูดถึงว่าคำสั่ง yield คืออะไรและวิธีการใช้งานในโค้ดของคุณ เราจะเดินทางผ่านตัวอย่างของคีย์เวิร์ด yield ในการทำงาน มาเริ่มกันเลย!
เราแนะนำให้อ่านบทความของเราเกี่ยวกับ Python iterators และ generators ก่อนต่อไป นี่ให้บริบทที่มีประโยชน์ซึ่งคุณสามารถใช้เพื่อเพิ่มความเข้าใจของคุณเกี่ยวกับคีย์เวิร์ด yield
กลับสู่พื้นฐาน: Iterators และ Generators
รายการ (Lists) ถูกอธิบายว่าเป็นออบเจ็กต์ที่วนซ้ำได้ (iterable objects) เนื่องจากคุณสามารถดูเนื้อหาของพวกมันได้โดยใช้ลูป "for" ทุกครั้งที่ลูป execute รายการในรายการจะถูกเข้าถึงโดย Python ดิกชันนารี (Dictionaries), ทูเพิล (tuples), และสตริง (strings) ก็เป็นออบเจ็กต์ที่วนซ้ำได้เช่นกัน
ฟังก์ชันที่เข้าถึงรายการจากออบเจ็กต์ที่วนซ้ำได้ เรียกว่า iterator มาสร้างรายการและวนซ้ำผ่านมันโดยใช้ลูป for:
peppers = ["Scotch Bonnet", "Piri Piri", "Cayenne"] for p in peppers: print(p) for p in peppers: print(p)
โค้ดนี้พิมพ์พริกทั้งหมดในรายการ "peppers" ไปยังคอนโซล:
Scotch Bonnet Piri Piri Cayenne Scotch Bonnet Piri Piri Cayenne
เราใช้ iterator ของเราได้ไม่จำกัดครั้ง ในตัวอย่างล่าสุด เราวนซ้ำผ่านออบเจ็กต์ "peppers" สองครั้ง
Python generators เหมือน iterator ที่ใช้ซ้ำออบเจ็กต์ มีความแตกต่างใหญ่หนึ่งประการ: คุณสามารถวนซ้ำผ่าน generator ได้เพียงครั้งเดียว ในขณะที่เราสามารถวนซ้ำผ่าน "peppers" ได้เท่าไหร่ก็ได้ generator จะถูกเข้าถึงเพียงครั้งเดียว
มากำหนด generator สำหรับรายการพริกของเรา:
def print_peppers(peppers): for p in peppers: yield p peppers = ["Scotch Bonnet", "Piri Piri", "Cayenne"] pepper_generator = print_peppers(peppers) for p in pepper_generator: print(p)
เรากำหนดฟังก์ชันชื่อ print_peppers() นี่คือฟังก์ชัน generator ของเรา มันรับอาร์กิวเมนต์หนึ่ง: รายการพริกที่เราต้องการพิมพ์ไปยังคอนโซล
ในโปรแกรมหลักของเรา เราเรียกฟังก์ชัน print_peppers() และกำหนดให้กับตัวแปร pepper_generator ต่อไป เราวนซ้ำผ่าน generator โดยใช้ลูป "for" ลูป for ของเราเรียกออบเจ็กต์ generator และวนซ้ำผ่านมัน
มารันโค้ดของเรา:
Scotch Bonnet Piri Piri Cayenne
เอาต์พุตเหมือนกับตัวอย่างแรกของเรา ความแตกต่างคือเราสามารถวนซ้ำผ่านรายการของเราได้เพียงครั้งเดียว มาลองวนซ้ำผ่าน generator ของเราอีกครั้ง:
... for p in pepper_generator: print(p) for p in pepper_generator: print(p)
โค้ดของเราคืนค่า:
Scotch Bonnet Piri Piri Cayenne
เราวนซ้ำผ่าน generator ของเราหนึ่งครั้ง เราไม่สามารถทำซ้ำได้ นั่นคือเหตุผลที่ลูป for ที่สองของเราไม่คืนค่าใดๆ
คีย์เวิร์ด Yield ใน Python
สังเกตคำว่า "yield" ในตัวอย่างล่าสุด นี่คือการเตือน:
def print_peppers(peppers): for p in peppers: yield p
คีย์เวิร์ด "yield" ปรากฏภายในฟังก์ชันของเรา มันคืนค่าในฟังก์ชัน generator มันคล้ายกับคีย์เวิร์ด "return"
ใช้ yield เมื่อคุณต้องการสร้าง generator ที่คุณสามารถวนซ้ำได้ ในตัวอย่างล่าสุด เราใช้ yield เพื่อสร้าง generator สำหรับรายการพริกของเรา
ฟังก์ชันใดๆ ที่มี yield จะคืนค่า generator เราเห็นได้โดยการตรวจสอบประเภทของตัวแปร pepper_generator โดยใช้เมธอด type():
<class 'generator'>
นี่บอกเราว่า pepper_generator ซึ่งถูกกำหนดให้กับฟังก์ชัน print_peppers เป็น generator
สรุป
คีย์เวิร์ด yield คืนค่าภายใน generator Generator เป็นประเภทพิเศษของ iterator ที่ค่าของมันสามารถวนซ้ำได้เพียงครั้งเดียว คีย์เวิร์ด yield คล้ายกับคำสั่ง return ยกเว้นคำสั่ง return ไม่สามารถใช้ใน generators ได้
ตอนนี้คุณพร้อมที่จะใช้คีย์เวิร์ด yield อย่าง Pythonista แล้ว!