python用户定义的迭代器

1、迭代器基于下面两个个方法:

(1)__next__ 返回容器的下一个项目
(2)__iter__ 返回迭代器本身

2、当序列遍历完时,将抛出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(1, 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(1, 5):
    print(i, end=" ")

运行结果:

1 4 9 16 25
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值