Iterator และ Iterable ใน Python คืออะไร ?
ในหลายๆ ครั้งที่มีการพูดถึง iterable หลายคนมักมีคำถามว่า มันคืออะไร และมันต่างกับ iterator อย่างไร
2 April, 2021 by
Iterator และ Iterable ใน Python คืออะไร ?
Tewtawat Chakrabandhu Na Ayutthaya (Off)
| No comments yet

 

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 ในวันจันทร์ แต่พอถึงเวลาก่อนสอบ เรามานั่งอ่านหน้าห้อง เป็นต้น ใครเป็นแบบนี้บ้าง (ผู้เขียนยกมือสุดแขน)

นิยามอย่างง่ายของมัน ก็คือ "จะใช้ตอนไหน ทำตอนนั้น"

ซึ่งจะสอดคล้องกับการทำงานของ Iterator มากๆ เพราะเราไม่ต้องเก็บข้อมูลทั้งหมดที่อยู่ iterable ไว้ก่อน ซึ่งบางทีข้อมูลมีเยอะมากจนเกิดปัญหาเรื่องหน่วยความจำหรือเวลาในการประมวลผลที่ช้ามากๆ

 Iterator advantage 

  • ลดพื้นที่ในหน่วยความจำ เพราะหน่วยความจำจะถูกใช้ในการเก็บค่า ล่าสุด ที่เราดึงออกมาใช้งานเท่านั้น ต่างจาก lists หรือ tuple  ที่ค่าทั้งหมดจะถูกเก็บไว้ในครั้งแรกที่เราเรียกใช้งาน

  • ในการจัดการชุดข้อมูลปริมาณมากๆ จะประหยัดทั้งเวลาในการคำนวน และพื้นที่ในการจัดเก็บ

Nothing Special

ขอบคุณทุกคนที่อ่านมาถึงตรงนี้ครับ หวังว่าบทความนี้จะทำให้เข้าใจความหมายของ Iterables และ Iterators มากขึ้น ไม่มากก็น้อยนะครับ แล้วเจอกันใหม่ในบทความหน้าครับ (^_^)

Iterator และ Iterable ใน Python คืออะไร ?
Tewtawat Chakrabandhu Na Ayutthaya (Off) 2 April, 2021
Share this post
Tags
Dev
Archive
Sign in to leave a comment