python大作战之可迭代对象与迭代器之间的渊源

今天,趁着周末,又复习了下Iterable与Iterator之间的关系,所以,跟大家一起再交流下它们之间的联系

from collections.abc import Iterable,Iterator
#下面定义的是可迭代对象,调用test迭代器
class Demo(object):
    def __init__(self):
        pass
    #下面的方法就是调迭代器的__nest__的方法
    def __iter__(self):
        return test()

#下面定义的是一个test迭代器
class test(object):
    def __init__(self):
        self.content=['Are','you','ok','hello']
        self.count=0
    def __next__(self):
        print('for...in循环就是调__next__方法')
        if self.count < len(self.content):
            result=self.content[self.count]
            print(result)
            self.count+=1
        else:
            raise StopIteration
    def __iter__(self):
        return self
d=Demo()
for x in d:
    print()

这里需要理清的知识点:

1:怎样才算一个可迭代对象?

答:重写了object类的__iter__方法以后,它就是可迭代对象

2:怎样才算一个迭代器?

答:重写了object类的__iter__方法和__next__方法,它就是迭代器

依据这两条约定,上述代码的Demo()就是一个可迭代对象,而test()就是一个迭代器,

并且可迭代对象不能直接迭代,需要一个迭代器,而调迭代器调的就是迭代器的__next__方法

所以上述对可迭代对象d进行for遍历时,调的就是迭代器中的__next__方法

注意:

这里说明下for...in...本质,当可迭代对象在遍历时,其实就是通过iter()函数调用iterable的迭代器,然后调用迭代器的__next__方法逐一输出数值,当遇到StopIteration后for循环结束

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值