【Python】迭代器
一、前言
有时候写代码时需要对一个对象的内部数据进行遍历,而且希望可以for ... in ... 的操作来方便使用,那么就可以使用迭代器来解决。
二、使用函数来包装迭代
具体代码如下,例子使用list列表来简单介绍,在实际使用场景中可以复杂多变。虽然是一个while True的循环,但里面用yield实现迭代器功能,包含yield的函数不再是普通函数。通过raise StopIteration异常来完成迭代。
def generator(list_obj): index = 0 size = len(list_obj) while True: if index >= size: # 中止迭代就需要用到这个 raise StopIteration v = list_obj[index] index += 1 # 返回数据 yield v
迭代器方法写好了,以下就是调用方式,简单对list数据进行遍历。
iter = generator([1,2,3,4,5,6,7]) for i in iter: print(i) # 1 2 3 4 5 6 7 # 也可以手动一个个取出 v = iter.next() # py2.7 在py3中使用iter.__next__()获取
三、使用类来包装迭代
同样是为了方便用了list,具体代码如下,需要注意方法__iter__和next。注释中有py2和py3的区别和用法。
class Generator: def __init__(self, list_obj): self.index = 0 self.list_obj = list_obj self.size = len(list_obj) # 此方法必不可少,返回的对象就是具有next方法的迭代器 def __iter__(self): self.index = 0 return self # 在py2使用next方法,在py3中为__next__(self)方法 def next(self): if self.index >= self.size: raise StopIteration # 同样中止是这个 v = self.list_obj[self.index] self.index += 1 return v
调用方式和上面的函数包装的一样iter = Generator([1,2,3,4,5,6,7]);平时在开发中如果需要使用便捷的迭代功能时,不妨使用上面的介绍的两种方式。
欢迎微信搜索"游戏测试开发"关注一起沟通交流。