python contains类似函数_Python自定义迭代器,索引取值和分片取值

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

1e7f4a1ea9e089b8e4a872cdf0b400e3.png

索引取值和分片取值

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

9fb97782e0aaef05d0121ebee4744810.png

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

5316f5bc09d6757c6c0869384735bc99.png

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

6d4e04539d05d789a7353e2fc5fce1be.png

__getitem__

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

例如:

f4e6d8d74ece65ff2bff8b6cd530af59.png

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

66a4b8ed0b9171c1c0af4cf3b78b3e32.png

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

分片和__getitem__

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

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

9f059797d48cb5559484e05bbb341871.png

__setitem__和__delitem__

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

5cdb4a6f947cefbafa0eac641af070e2.png

__getitem__索引迭代

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

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

1db90670b553fce068fd58cf582c4f42.png

可迭代对象:__iter__和__next__

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

例如:

cdb9d0816c7b35971b64d75bd36a44e5.png

运行结果:

2acc48c41fab835eb62ae13c0f3e3b91.png

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

0e3595fc263181c2c1297e8dbfb19148.png

自定义多迭代类型

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

例如:

cbf04f64142871ff024cfacda241eb26.png

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

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

我是一名python开发工程师,整理了一套python的学习资料,如果你想提升自己,对编程感兴趣,关注我并在后台私信小编:“08”即可免费领取资料!希望对你能有所帮助!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值