Iterator และ Iterable ใน Python คืออะไร?

เมื่อมีการพูดถึง Iterable หลายคนมักมีคำถามว่า มันคืออะไร แล้วแตกต่างกับ Iterator อย่างไร? เรามีคำตอบ!
10 มิถุนายน ค.ศ. 2022 โดย
Administrator

What is Iterable ?

Iterable คือ object ใด ๆ ที่เราสามารถทำการวนซ้ำกับมันได้

​ซึ่งรวมไปถึง lists, tuples หรือแม้แต่ strings ก็ถือเป็น iterable เช่นกัน ดังนั้น ในชีวิตจริงสำหรับนักพัฒนาทุกคนนั้น เราเคยผ่านการใช้งาน iterables มาแล้ว แม้ว่าเราจะไม่รู้ว่ามันคือ iterables ก็ตาม

ที่นี้เราลองมาดูใน code สั้น ๆ นี้ ว่าเรากำลัง พูดถึงอะไร

ประเภทของตัวแปร msg ในบรรทัดแรก เป็นตัวแปรประเภท strings แต่เมื่อเรานำมันไปใช้ในการวนซ้ำ โดยการใช้ for เราก็สามารถเข้าไปในแต่ละตัวอักษรของตัวแปรตัวนั้นได้

​จากตัวอย่าง จะเห็นว่าประเภทของตัวแปร msg ในบรรทัดแรก เป็นตัวแปรประเภท strings แต่เมื่อเรานำมันไปใช้ในการวนซ้ำ โดยการใช้ for เราก็สามารถเข้าไปในแต่ละตัวอักษรของตัวแปรตัวนั้นได้
Output:
ประเภทของตัวแปร msg ในบรรทัดแรก เป็นตัวแปรประเภท strings แต่เมื่อเรานำมันไปใช้ในการวนซ้ำ โดยการใช้ for เราก็สามารถเข้าไปในแต่ละตัวอักษรของตัวแปรตัวนั้นได้

ถึงตรงนี้สงสัยกันไหมว่า ทำไมตัวแปรที่เป็น 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 ได้เลย

​ดังตัวอย่าง จะเป็น list object ธรรมดา ซึ่งตัว lists object นั้น python ใส่ความสามารถให้มันเป็น iterable มาแล้ว นั่นคือ มันสามารถทำตัวเองเป็น iterators ได้เลย
 list object ธรรมดา ซึ่งตัว lists object นั้น python ใส่ความสามารถให้มันเป็น iterable มาแล้ว นั่นคือ มันสามารถทำตัวเองเป็น iterators ได้เลย

ถ้าเราลองตรวจสอบประเภทของตัวแปร foo_iter เราจะเห็นตาม output ข้างล่างนี้
Output: 
ประเภทของตัวแปร foo_iter เราจะเห็นตาม output นี้

ที่นี้ foo_iter ของเราก็จะทำการวนซ้ำใดกับการวนซ้ำใด ๆ ได้ เช่น for, while เป็นต้น ซึ่งการวนซ้ำนั้น จะเข้าถึงข้อมูลในแต่ละ item ที่อยู่ใน iterator ผ่าน method ชื่อ next()
ซึ่งการวนซ้ำนั้น จะเข้าถึงข้อมูลในแต่ละ item ที่อยู่ใน iterator ผ่าน method ชื่อ next()

Output:
Output

เมื่อเราใช้ next อีกครั้ง เราจะไปถึงข้อมูลต่อไปใน iterator ซึ่งเราไม่สามารถกำหนดตำแหน่งในการเข้าถึงหรือกลับไปดึงข้อมูลที่ตำแหน่งก่อนหน้าได้
ใช้ next อีกครั้ง จะไปถึงข้อมูลต่อไปใน iterator ซึ่งไม่สามารถกำหนดตำแหน่งในการเข้าถึงหรือกลับไปดึงข้อมูลที่ตำแหน่งก่อนหน้าได้

Output:
Output

และเมื่อข้อมูลใน iterators หมดแล้ว แต่เรายังพยายามใช้ next() เพื่อดึงข้อมูลอยู่ เราจะได้ exception ตัวนี้
พยายามใช้ next() เพื่อดึงข้อมูลอยู่ เราจะได้ exception

Output:
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 มากขึ้น ไม่มากก็น้อยนะครับ แล้วเจอกันใหม่ในบทความหน้าครับ (^_^)

Administrator 10 มิถุนายน ค.ศ. 2022
แชร์โพสต์นี้
แท็ก
Dev