python 中的iter()

iter(self)

在定义一个类时,添加这个函数,其返回的类就是一个可迭代对象

和其一起使用的还有__next__(self)

其作用是在调用next函数时执行这个函数下的内容,并返回return后的内容

先来看一个示例:

class Test(object):
    n = 0
    def __iter__(self):
        print('iter',self.n)
        self.n+=1
        return self
    def __next__(self):
        self.n+=1
        print('next',self.n)
        return self.n
a = Test()
for i in range(5):
    print(next(a))

在上面的示例中首先实例化了一个Test对象

然后调用了5次的next函数,输出的结果如下:

next 1
1
next 2
2
next 3
3
next 4
4
next 5
5

可以看出并没有调用iter函数,那么在什么情况下会调用iteration呢?

还是上面的类的定义,换一种方式输出

a = Test()
print(list(a))

结果是:

iter 0
next 2
next 3
next 4
next 5
next 6
next 7
next 8
...

可以看到调用了一次iter然后就无限循环的调用next函数,不会停止的原因是没有 StopIteration 异常,for循环的原理也是如此,不断的调用__next__(self)函数,直到抛出异常表示没有下一个元素停止.我们尝试添加一个异常抛出

class Test(object):
    n = 0
    def __iter__(self):
        print('iter',self.n)
        self.n+=1
        return self
    def __next__(self):
        if self.n>=5:
            raise StopIteration
        self.n+=1
        print('next',self.n)
        return self.n
a = Test()
print(list(a))

结果为:

iter 0
next 2
next 3
next 4
next 5
[2, 3, 4, 5]

问题依然存在,__iter__的作用究竟是什么

按照我的理解,这个__iter__的作用是在对实例对象进行迭代(for/list等操作)时,调用这个函数,并对其返回值调用next函数

尝试的示例如下

首先__iter__不返回任何东西即返回值为None

class Test(object):
    n = 0
    def __iter__(self):
        print('iter',self.n)
        self.n+=1
a = Test()
print(list(a))
#TypeError: iter() returned non-iterator of type 'NoneType'
#iter 0

会在输出时报错

其次是和前面的示例一样,直接将self返回出去,就会调用a的next方法获取值,就不演示了

最后一种就是返回一个其他的可迭代对象(yield),此时就不会再调用a的next而是直接使用返回的可迭代对象:

class Test(object):
    n = 0
    def __iter__(self):
       for i in range(5):
           print('iter',self.n)
           self.n+=1
           yield self.n
    def __next__(self):
        if self.n>=5:
            raise StopIteration
        self.n+=1
        print('next',self.n)
        return self.n
    
#输出
iter 0
iter 1
iter 2
iter 3
iter 4
[1, 2, 3, 4, 5]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值