Python学习:自定义迭代器,索引取值和分片取值
admin
2023-07-02 06:44:02
0次

本文介绍如何自定义迭代器,涉及到类的运算符重载,包括getitem的索引迭代,以及iter、next和contains。对python感兴趣的朋友可以仔细看看!

Python学习:自定义迭代器,索引取值和分片取值

索引取值和分片取值

元组、列表、字典、集合、字符串都支持索引取值操作和分片操作。

Python学习:自定义迭代器,索引取值和分片取值

分片操作实际上将一个slice对象当作索引位传递给序列,然后以索引取值的方式取得所需元素。

Python学习:自定义迭代器,索引取值和分片取值

slice对象由slice()函数创建,它有3个参数:起始索引位、结束索引位、步进值。例如:

Python学习:自定义迭代器,索引取值和分片取值

getitem

列表、元组等序列之所以可以索引取值、分片取值,是因为它们实现了getitem方法。

例如:

Python学习:自定义迭代器,索引取值和分片取值

如果自定义类并实现getitem方法,它们会重载索引取值:

Python学习:自定义迭代器,索引取值和分片取值

上面的自定义类只支持索引取值,不支持分片取值。因为getitem中没有编写索引取值的方式,也就不支持传递slice对象来进行分片取值。

分片和getitem

如果想要getitem支持分片取值,需要在getitem中使用索引取值的方式,以便支持slice对象作为索引。

下面是一个简单的支持分片操作的自定义类:

Python学习:自定义迭代器,索引取值和分片取值

setitem和delitem

如果想要索引或者分片赋值,那么会调用setitem()方法,如果想要删除索引值或分片值,会调用delitem()方法。

Python学习:自定义迭代器,索引取值和分片取值

getitem索引迭代

getitem重载了索引取值和分片操作,实际上它也能重载索引的迭代操作。以for为例,它会循环获取一个个的索引并向后偏移,直到超出索引边界抛出IndexError异常而停止。

此外,getitem重载使得它可以被迭代,也就是它通过数值索引的方式让这个对象变成可迭代对象,所有迭代工具(比如zip/map/for/in)都可以对这个对象进行迭代操作。

Python学习:自定义迭代器,索引取值和分片取值

可迭代对象:iter和next

定以了getitem的类是可迭代的类型,是通过数值索引的方式进行迭代的,但这是退而求其次的行为,更好的方式是定义iter方法,使用迭代协议进行迭代。当同时定义了iter和getitem的时候,iter()函数优先选择iter,只有在iter不存在的时候才会选择getitem。

例如:

Python学习:自定义迭代器,索引取值和分片取值

运行结果:

Python学习:自定义迭代器,索引取值和分片取值

因为上面的类中同时定义了iter和next,且iter返回的是自身,所以这个类型的每个迭代对象都是单迭代的。

Python学习:自定义迭代器,索引取值和分片取值

自定义多迭代类型

要定义多迭代的类型,要求iter返回一个新的迭代对象,而不是self自身,也就是说不要返回自身的迭代器。

例如:

Python学习:自定义迭代器,索引取值和分片取值

每个for迭代工具都会先调用iter()来获取可迭代对象,然后调用next()获取下一个元素。而这里的iter()会调用MultiIterator的iter来获取可迭代对象,而MultiIterator所返回的可迭代对象是相互独立的Next对象,因此for x in x和for y in s所迭代的是不同迭代对象,它们都有记录着自己的迭代位置信息。

觉得文章还不错的话不妨收藏起来慢慢看,有任何建议或看法欢迎大家在评论区分享讨论!

相关内容

热门资讯

空调连续工作多久需要停机休息 空调连续工作的时间取决于多个因素,包括空调的型号、功率、使用环境和维护情况等。一般来说,空调可以连续...
空调哪个符号是除湿的 空调除湿功能通常用一个水滴形状的符号表示。不同品牌和型号的空调遥控器可能会有所差异,但一般来说,除湿...
格力空调多长时间加一次氟利昂 1、一般情况下,空调对氟利昂的使用量是非常小的,所以在空调使用了四年左右的时候再考虑加也没问题。2、...
空调用多长时间需要加氟一次 一般情况下是五年。当出现以下这几种情况时,空调才需要加氟。1、空调的室内机和室外机各有两个接口,当接...
格调生活·C标思享荟:卡萨帝在... 9月12日的郑州龙湖金融岛,夜风轻拂,灯光璀璨。“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑...
品牌价值破千亿、高端份额持续领... 9月12日,“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑州站”在郑州龙湖金融岛举办。2026...
空调主板坏了修800还是换新的 空调主板坏了是修还是换新,需要考虑多个因素,以下是一些建议:1. 维修成本:如果维修费用较低,比如 ...
空调开多久需要休息多长时间 问题:空调开多久需要休息多长时间回答:1、在使用空调的过程中,一般空调开7~8个小时左右需要休息2~...
中央空调多长时间清洗一次 1、一般空调开机前清洗一次即可,空调开机中间时段再清洗一次,空调关机时清洗一次,这样比较合理。2、空...
中央空调氟利昂多久加一次 看空调制热和制冷程度,很多人的观点认为氟利昂必须一年放一次,其实这个观点是错误的,理解上面有点偏差,...