Iterable สามารถนิยามได้แบบ鬆散 ว่าเป็นอ็อบเจกต์ที่จะสร้าง iterator เมื่อส่งผ่าน built-in method iter() มีเงื่อนไขสองสามอย่าง สำหรับอ็อบเจกต์ให้เป็น iterable อ็อบเจกต์ของคลาสต้องกำหนด instance method สองตัว: __len__ และ __getitem__ อ็อบเจกต์ที่เงื่อนไขเหล่านี้เมื่อส่งผ่านเมธอด iter() จะสร้าง iterator
มาเข้าใจตัวอย่างด้านล่าง เพื่อเข้าใจ iterable −
string = "Tutorialspoint" for char in string: print (char)
ผลลัพธ์
T u t o r i a l s p o i n t
ข้างต้นโค้ดใช้เมธอด __getitem__(index) ซึ่งจะคืนค่า element ที่ตำแหน่งที่ระบุโดย index
ดังนั้นโค้ดข้างต้นของเรา −
- เริ่มต้นที่ index 0
- เรียก string.__getitem__(index)
- IndexError ถูกยกขึ้น? หยุด
- รัน body ของลูป
- เพิ่ม index, กลับไปขั้นตอนที่ 2
Iterators (ตัววนซ้ำ)
Iterators ถูกนิยามว่าเป็นอ็อบเจกต์ที่นับ iteration ผ่าน internal state variable ตัวแปรในกรณีนี้ ไม่ถูกตั้งค่าเป็นศูนย์เมื่อ iteration ข้ามรายการสุดท้าย แต่ StopIteration() จะถูกยกขึ้นเพื่อบ่งชี้ถึงการสิ้นสุดของ iteration นี่ยังหมายถึงว่า iterated item จะถูก iterate เพียงครั้งเดียวเท่านั้น เช่นในตัวอย่างด้านล่าง −
my_list = ['itemOne', 'TutorialsPoints'] iterators_of_some_list = iter(my_list) for i in iterators_of_some_list: print(i) for j in iterators_of_some_list: # doesn't work print(j) #However for k in my_list: print(k) for l in my_list: # it worked print(l)
ผลลัพธ์
itemOne TutorialsPoints itemOne TutorialsPoints itemOne TutorialsPoints
โค้ดข้างต้นเป็นจริงเพราะเมธอด iter() บน iterator คืนค่าตัวมันเอง (คือจำสถานะปัจจุบัน) ดังนั้นข้างต้นเรามีการ implement แบบลูปคล้าย "for" เพื่อยุติมัน