#创建迭代器类 class EvenIterator: def __init__(self,min_value,max_value): # 初始化参数 self.min_value = min_value self.max_value = max_value def __iter__(self): return self def __next__(self): # 在这里定义好累加条件 if self.min_value % 2 != 0:#判断最小值是不是偶数,不是则加1 self.min_value += 1 if self.min_value <= self.max_value: x = self.min_value self.min_value += 2 return x else:#抛出 StopIteration异常,结束代码 raise StopIteration min_value = int(input("输入需要生成偶数序列范围的最小值")) max_value = int(input("输入需要生成偶数序列范围的最大值")) num2 = EvenIterator(min_value,max_value) #创建迭代器对象 print([i for i in num2],end="")#输出偶数数组
(1)__next__
返回容器的下一个项目
(2)__iter__
返回迭代器本身
将抛出StopIteration异常,所以通过捕获这个异常来停止循环
下面是自定义迭代器的示例代码:
class MyIterator(object): def __init__(self, step): self.step = step def __next__(self): if self.step == 0: raise StopIteration self.step -= 1 return self.step def __iter__(self): return self for i in MyIterator(6): print(i)
运行结果:
5
4
3
2
1
0
如今,Python中所有的迭代坏境都会先尝试_iter_
二方法,再尝试_getite_
也就是说,它们宁愿使角第13章所学到的迭代协议,然后才是重复对对象进行索弓l运算。
如果对象不支持迭代协议,就会尝试索引运算。
从技术角度来讲,迭代环境是通过调用内置函数iter去尝试寻找iter方法来实现的,而这种方法应该返回一个迭代器对象。
如果已经提供了,Python就会重复调用这个迭代器对象的next方法,直到发生stop工teration异常。
如果没找到这类__iter__
方法,Python会改用__getitem__
机制,就像之前那样通过偏移量重复索引,直到引发 IndexError异常。
下面的文件iters.py定义了用户定义的迭代器类来生成平方值。
class Squares: def __init__(self, start, stop): self.value = start - 1 self.stop = stop def __iter__(self): return self def __next__(self): if self.value == self.stop: raise StopIteration self.value += 1 return self.value **2 #Python小白学习交流群:711312441 for i in Squares(null, 5): print(i)
运行结果:
1
4
9
16
25
用生成器函数编写
def gsquares(start, stop): for i in range(start, stop+1): yield i ** 2 for i in gsquares(null, 5): print(i, end=" ")
运行结果:
1 4 9 16 25
以上为个人经验,希望对您有所帮助。