可迭代对象 和 迭代器

迭代器是访问集体内元素的一种方式,一般用来遍历数据

迭代器和以下标的访问方式不一样,迭代器是不能返回的,迭代器提供了一种惰性方式数据的方法(即不像list一样,一次性把所有数据存储,而是每次临时生成一个数据)


可迭代对象 实现了 __iter__魔法函数(例如list,是一个可迭代的对象)

而迭代器实现了不仅实现了__iter__(可以通过继续Iterator类而不用在自己定义的类内部重新定义),还要实现__next__方法

from collections.abc import Iterable, Iterator
class Company:
    def __init__(self, employ_list):
        self.employ = employ_list

    # def __getitem__(self, item):
    #     return self.employ[item]

    def __iter__(self):               # 因为实现这个方法,所以Company类的对象是可迭代的对象
        return MyIterator(self.employ)   # 这个方法要返回一个迭代器


class MyIterator(Iterator):             # 继承了Iterator类
    def __init__(self, employ_list):
        self.employ_list = employ_list
        self.index = 0

    def __next__(self):             # 实现__next__方法,从而使整个MyIterator类是个迭代器
        try:
            person = self.employ_list[self.index]
        except IndexError:
            raise StopIteration
        self.index += 1
        return person


if __name__ == '__main__':
    company = Company(['john', 'mary', 'sam'])
    company_itor = iter(company)    # 如果生成company对象的类Company不是可迭代对象,这步会报错
    for employ in company:          # company_itor是可迭代的,可以就算Company类没有__getitem__方法也可以遍历
        print(employ)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值