Python/迭代器
外觀
< Python
迭代器是一個可以記住遍歷的位置的對象。迭代器對象從序列的第一個元素開始訪問,直到所有的元素被訪問完結束。迭代器只能往前不會後退。字符串,列表或元組對象等序列數據結構都可用於創建迭代器。
迭代器必須實現__iter__和__next__兩個方法。
可迭代對象必須實現__iter__方法。
iter() 和 next()
[編輯]全局方法iter() 和 next()可用於迭代器:
list=[1,2,3,4] it = iter(list) # 创建迭代器对象 print (next(it)) # 输出迭代器的下一个元素
判斷一個對象是否可迭代
[編輯]>>> from collections import Iterable >>> isinstance(myObj,Iterable) #myObj是否可迭代
編寫自己的可迭代對象
[編輯]編寫自己的可迭代對象(Collections::Iterable),有兩種規格。
第一種規格要求類實現特殊函數__getitem__;如果迭代完成,應raise IndexError
第二種規格要求實現一個特殊函數__iter__,該函數應該返回一個iterator對象(通常獨立設置自己的迭代index)。iterator對象是一個帶狀態的對象,調用next()方法的時候返回容器中的下一個值。iterator對象必須實現特殊函數 __next__。所以一般的做法就是在類中同時實現__iter__和__next__,然後在__iter__中返回自己。__next__函數要求依次返回需要迭代的項目,結束後raise StopIteration
class MyStringIterator:
def __init__(self, string):
# 将字符串存储为属性
self.string = string
# 将索引初始化为 0
self.index = 0
def __iter__(self):
# 返回自身以指示它是迭代器
return self
def __next__(self):
# 检查是否已到达字符串末尾
if self.index < len(self.string):
# 获取当前索引处的字符
item = self.string[self.index]
# 将索引增加 1 以指向下一个字符
self.index += 1
# 返回字符
return item
else:
# 引发 StopIteration 异常以指示迭代结束
raise StopIteration
my_string = "Hello, world!"
# 使用自定义迭代器遍历字符串
for item in MyStringIterator(my_string):
print(item)