What is Iterable ?
Iterable คือ object ใด ๆ ที่เราสามารถทำการวนซ้ำกับมันได้
ซึ่งรวมไปถึง lists, tuples หรือแม้แต่ strings ก็ถือเป็น iterable เช่นกัน ดังนั้น ในชีวิตจริงสำหรับนักพัฒนาทุกคนนั้น เราเคยผ่านการใช้งาน iterables มาแล้ว แม้ว่าเราจะไม่รู้ว่ามันคือ iterables ก็ตาม
ที่นี้เราลองมาดูใน code สั้น ๆ นี้ ว่าเรากำลัง พูดถึงอะไร
จากตัวอย่าง จะเห็นว่าประเภทของตัวแปร msg ในบรรทัดแรก เป็นตัวแปรประเภท strings แต่เมื่อเรานำมันไปใช้ในการวนซ้ำ โดยการใช้ for เราก็สามารถเข้าไปในแต่ละตัวอักษรของตัวแปรตัวนั้นได้
Output:
ถึงตรงนี้สงสัยกันไหมว่า ทำไมตัวแปรที่เป็น stings
ถึงสามารถทำการวนซ้ำได้ (Loops)
มาทำความรู้จักพระเอกของเรากัน "Iterators"
Introduce Iterators
Iterator เป็น object ที่สามารถเข้าถึง collection ที่ถูกสร้างขึ้นได้ครั้งเดียว ประกอบไปด้วย method 2 ตัว คือ
__iter__() ทำหน้าที่ในการสร้าง iterators โดยจะสอดคล้องกับข้อมูลใน iterable
__next__()
ดึงข้อมูลตัวต่อไปออกจาก iterators
โดยพื้นฐานเมื่อเราใช้ object ใด ๆ ในการทำงานวนซ้ำ จากตัวอย่างเป็นการวนซ้ำแบบ for (for loop) จะมีการสร้าง iterator ขึ้นจาก method: iter() ตรงนี้จะได้ iterable ออกมา จากนั้นทุก ๆ ครั้งที่ loops มีการทำงาน มันจะไปเรียก method: next() เพื่อดึงข้อมูลตัวต่อไปใน iterable มาทำงาน
ยังงง ๆ อยู่ใช่ไหม ถ้างั้นเราลองสร้าง iterator แบบง่าย ๆ ขึ้นมา
ดังตัวอย่าง จะเป็น list object ธรรมดา ซึ่งตัว lists object นั้น python ใส่ความสามารถให้มันเป็น iterable มาแล้ว นั่นคือ มันสามารถทำตัวเองเป็น iterators ได้เลย
ถ้าเราลองตรวจสอบประเภทของตัวแปร foo_iter เราจะเห็นตาม output ข้างล่างนี้
Output:
ที่นี้ foo_iter ของเราก็จะทำการวนซ้ำใดกับการวนซ้ำใด ๆ ได้ เช่น for, while เป็นต้น ซึ่งการวนซ้ำนั้น จะเข้าถึงข้อมูลในแต่ละ item ที่อยู่ใน iterator ผ่าน method ชื่อ next()
Output:
เมื่อเราใช้ next อีกครั้ง เราจะไปถึงข้อมูลต่อไปใน iterator ซึ่งเราไม่สามารถกำหนดตำแหน่งในการเข้าถึงหรือกลับไปดึงข้อมูลที่ตำแหน่งก่อนหน้าได้
Output:
และเมื่อข้อมูลใน iterators หมดแล้ว แต่เรายังพยายามใช้ next() เพื่อดึงข้อมูลอยู่ เราจะได้ exception ตัวนี้
Output:
Summary สรุปก็คือ...
- Iterables คือ object ใด ๆ ที่เราสามารถทำการวนซ้ำกับมันได้
- Iterators คือ วิธีการในการเข้าถึง object ใด ๆ ผ่านการวนซ้ำ (Python จัดการให้เองแค่มี method iter กับ next)
What is lazy evaluation ?
สำหรับใครที่ยังไม่เคยได้ยินคำนี้เลย ก่อนอื่นให้ลองจินตนาการถึงเช้าวันหนึ่งคุณแม่ให้เราล้างจานเพื่อนำไปใช้ทานข้าวในตอนเย็น เรายังไม่ล้างจาน แต่พอถึงเวลาทานข้าวเย็นเราถึงค่อยไปล้างจานให้คุณแม่ หรือวันศุกร์เย็นอาจารย์บอกจะสอบ mid term ในวันจันทร์ แต่พอถึงเวลาก่อนสอบ เรามานั่งอ่านหน้าห้อง เป็นต้น ใครเป็นแบบนี้บ้าง (ผู้เขียนยกมือสุดแขน >w</)
นิยามอย่างง่ายของมัน ก็คือ "จะใช้ตอนไหน ทำตอนนั้น"
ซึ่งจะสอดคล้องกับการทำงานของ Iterator มาก ๆ เพราะเราไม่ต้องเก็บข้อมูลทั้งหมดที่อยู่ iterable ไว้ก่อน ซึ่งบางทีข้อมูลมีเยอะมากจนเกิดปัญหาเรื่องหน่วยความจำหรือเวลาในการประมวลผลที่ช้ามาก
Iterator advantage
- ลดพื้นที่ในหน่วยความจำ เพราะหน่วยความจำจะถูกใช้ในการเก็บค่าล่าสุด ที่เราดึงออกมาใช้งานเท่านั้น ต่างจาก lists หรือ tuple ที่ค่าทั้งหมดจะถูกเก็บไว้ในครั้งแรกที่เราเรียกใช้งาน
- ในการจัดการชุดข้อมูลปริมาณมาก ๆ จะประหยัดทั้งเวลาในการคำนวน และพื้นที่ในการจัดเก็บ
• Nothing Special •
ขอบคุณทุกคนที่อ่านมาถึงตรงนี้ครับ หวังว่าบทความนี้จะทำให้เข้าใจความหมายของ Iterables และ Iterators มากขึ้น ไม่มากก็น้อยนะครับ แล้วเจอกันใหม่ในบทความหน้าครับ (^_^)
Iterator และ Iterable ใน Python คืออะไร?