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

索引取值和分片取值

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

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

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

getitem

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

例如:

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

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

分片和__getitem__

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

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

setitem__和__delitem

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

__getitem__索引迭代

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

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

可迭代对象:iter__和__next

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

例如:

运行结果:

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

自定义多迭代类型

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

例如:

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

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

一般人不知晓的10个“高能”网站,学编程和赚钱两不误相关推荐

  1. 11个“高能”网站,学编程和赚钱两不误!

    0.GitHub - 开发者最最最重要的网站:https://github.com 这个不用多说了吧,代码托管网站,上面有很多资源,想要什么轮子,上去搜就好了.并且呢,上面有很多优秀的程序员,你可以在 ...

  2. 儿童节礼包!10 后都开始学编程了,你需要这个阿里技术电子书大全

    简介: 技术人的成长,其实很像一场武林修炼.大学毕业,学成下山,初出茅庐,但真正的考验才刚刚开始.知识爆炸.技术更新迭代,技术人所面对的成长压力前所未有,就连过儿童节的 10 后孩子们都已经开始学习编 ...

  3. 学编程没人带?推荐10个免费学编程的最佳网站给你

    学习编程是开启你的移动端应用开发和Web开发职业生涯的一种绝佳方式和必要途径.本文将分享10个有助你学编程的最佳网站. 1.Codecademy 它是学编程最流行的网站之一.事实上,2000万人已经使 ...

  4. 国外10大IT网站和博客网站

    国外10大IT网站 1.http://news.com.com/ IT第一新闻网站,每天值得浏览一番,IT天下的大事基本不会错过.其中名为"观察Perspectives"的专栏,也 ...

  5. 【10个精品网站】找素材、找图片、PDF在线工具、免费图片降噪修复、免费可商用字体、PPT模板

    [资源来源]:https://www.bilibili.com/video/BV11b4y1973wspm_id_from=333.851.b_7265636f6d6d656e64.9 记得给up主三 ...

  6. 购房置业者必上的10大房产网站

    和国外的房产网站比较起来,中国的房产网具有其自身的特点.目前各大房产网站中,以媒体.门户定位的居多.还有一部分就是细分市场的网站.以下10大网站是从目前几十个房产类网站里整理出的有一定规模一定特色的网 ...

  7. 10种常见网站安全攻击手段及防御方法

    在某种程度上,互联网上的每个网站都容易遭受安全攻击.从人为失误到网络罪犯团伙发起的复杂攻击均在威胁范围之内. 网络攻击者最主要的动机是求财.无论你运营的是电子商务项目还是简单的小型商业网站,潜在攻击的 ...

  8. 10个优秀设计网站盘点

    从平面广告设计.包装设计和标志设计到游戏特效,都与我们的生活息息相关.过去,设计师依靠一张图纸和一支笔,但进入数字时代后,设计工作从图纸转移到了电脑上. 各种设计网站和在线设计工具相继衍生,简化了工作 ...

  9. 前端开发者必去的10个国外网站

    2019独角兽企业重金招聘Python工程师标准>>> Web开发者目前主要分为前端和后端,本文收集的10个国外网站主要针对网站前端开发,里面包括浏览器兼容性检测.JS脚本下载.CS ...

最新文章

  1. 如何将本地项目上传到自己的GitHub上
  2. 本文把TCP/IP讲绝了!
  3. Sqlserver中格式化日期作为查询条件的语句写法
  4. POJ-2773 欧几里得 + 二分 + 容斥
  5. 调用图片文件夹中的任意图片随机显示_他来了,他来了,Mathpix拜拜了~~~文字、表格、公式图片识别神器V0.1测试版...
  6. python分行打印list_python如何用print打印出列表
  7. AndroidTV开发7实现仿小米电视和各种盒子TV焦点放大缩小效果
  8. android sim卡pin,如何设置手机的SIM卡的PIN码?
  9. C语言分号总是报错,问什么C程序里总是提示缺少分号;,而明明有分号?
  10. 工业机器人的应用有哪些
  11. oracle asm omf,Oracle Managed Files,OMF
  12. oracle12C以逗号隔开怎么写,10g之后支持中文逗号作为查询分隔符
  13. DPC(Defect Point Correction)------坏点校正
  14. 用c语言制作一个简单的答题系统
  15. 公钥、密钥和数字证书
  16. 关于Access to register of unclocked peripheral at 0x40010800 cause BUS_FAULT [U1_CM3CORE]的错误
  17. HCIE考试考哪些?
  18. 常见的产品生命周期模型
  19. C++switch语句 | 判断某年某月有几天
  20. 夏日将尽:以太坊的ERC-777能否顺利取代ERC-20?

热门文章

  1. 2022-2028年中国玫瑰花产业发展动态及投资前景预测报告
  2. opkg 安装软件到别的分区或者U盘
  3. Android蓝牙打印机例子
  4. 数字信号处理_ 第2个编程实例
  5. 强大的Java Json工具类
  6. div+css网页设计-心得
  7. python3.5从零开始学豆瓣_Python 3.5从零开始学
  8. android intent 导航,Android 通过Intent调取导航
  9. Java---面向对象编程三大特征【封装、继承、多态】及super关键字、方法重写/覆盖(不定期更新补充)---B站韩顺平老师视频总结
  10. java 将微信录音amr转换为mp3格式