重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
本文介绍如何自定义迭代器,涉及到类的运算符重载,包括getitem的索引迭代,以及iter、next和contains。对python感兴趣的朋友可以仔细看看!
甘井子ssl适用于网站、小程序/APP、API接口等需要进行数据传输应用场景,ssl证书未来市场广阔!成为创新互联建站的ssl证书销售渠道,可以享受市场价格4-6折优惠!如果有意向欢迎电话联系或者加微信:18980820575(备注:SSL证书合作)期待与您的合作!元组、列表、字典、集合、字符串都支持索引取值操作和分片操作。
分片操作实际上将一个slice对象当作索引位传递给序列,然后以索引取值的方式取得所需元素。
slice对象由slice()函数创建,它有3个参数:起始索引位、结束索引位、步进值。例如:
列表、元组等序列之所以可以索引取值、分片取值,是因为它们实现了getitem方法。
例如:
如果自定义类并实现getitem方法,它们会重载索引取值:
上面的自定义类只支持索引取值,不支持分片取值。因为getitem中没有编写索引取值的方式,也就不支持传递slice对象来进行分片取值。
如果想要getitem支持分片取值,需要在getitem中使用索引取值的方式,以便支持slice对象作为索引。
下面是一个简单的支持分片操作的自定义类:
如果想要索引或者分片赋值,那么会调用setitem()方法,如果想要删除索引值或分片值,会调用delitem()方法。
getitem重载了索引取值和分片操作,实际上它也能重载索引的迭代操作。以for为例,它会循环获取一个个的索引并向后偏移,直到超出索引边界抛出IndexError异常而停止。
此外,getitem重载使得它可以被迭代,也就是它通过数值索引的方式让这个对象变成可迭代对象,所有迭代工具(比如zip/map/for/in)都可以对这个对象进行迭代操作。
定以了getitem的类是可迭代的类型,是通过数值索引的方式进行迭代的,但这是退而求其次的行为,更好的方式是定义iter方法,使用迭代协议进行迭代。当同时定义了iter和getitem的时候,iter()函数优先选择iter,只有在iter不存在的时候才会选择getitem。
例如:
运行结果:
因为上面的类中同时定义了iter和next,且iter返回的是自身,所以这个类型的每个迭代对象都是单迭代的。
要定义多迭代的类型,要求iter返回一个新的迭代对象,而不是self自身,也就是说不要返回自身的迭代器。
例如:
每个for迭代工具都会先调用iter()来获取可迭代对象,然后调用next()获取下一个元素。而这里的iter()会调用MultiIterator的iter来获取可迭代对象,而MultiIterator所返回的可迭代对象是相互独立的Next对象,因此for x in x和for y in s所迭代的是不同迭代对象,它们都有记录着自己的迭代位置信息。
觉得文章还不错的话不妨收藏起来慢慢看,有任何建议或看法欢迎大家在评论区分享讨论!
另外有需要云服务器可以了解下创新互联cdcxhl.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。