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

  

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

  

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

  

<>强索引取值和分片取值

  

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

  

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

  

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

  

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

  

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

  

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

  

<强> <>强getitem

  

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

  

例如:   

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

  

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

  

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

  

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

  

<>强分片和<强> getitem

  

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

  

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

  

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

  

<强> <>强setitem 和<强> delitem

  

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

  

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

  

<强> <>强getitem 强索引迭代

  

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

  

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

  

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

  

<>强可迭代对象:<强> iter 和<强>下

  

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

  

例如:   

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

  

运行结果:

  

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

  

因为上面的类中同时定义了<强> <强> iter 和<强> <强> 强,且<强> <强> iter

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