Python迭代器的基本方法:iter()、next()

迭代器:

  • 迭代器是一个可以记住遍历的位置的对象。
  • 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。

通常在我们对iter()、next()进行简单使用时是这样的:

a=[1,2,3]
it=iter(a) #创建迭代器对象
next(it)   #输出迭代器下一项
next(it)
next(it)
#输出:
#1
#2
#3

当看到使用自定义迭代器时,有些问题着实疑惑,看如下代码:

class MyNumbers:def __iter__(self):self.a = 1return selfdef __next__(self):x = self.aself.a += 1return xmyclass = MyNumbers()
myiter = iter(myclass)print(next(myiter))
print(next(myiter))
print(next(myiter))
print(next(myiter))
print(next(myiter))

这是菜鸟教程给的实例
我的疑惑点:
1.iter()咋直接对实例化对象myclass直接操作了起来?
2.iter()、next()如上操作的原理是啥?内部过程是啥?

随着这些问题继续探究

2.魔法方法的解释

魔法方法是python内置方法,不需要主动调用,存在的目的是为了给python的解释器进行调用,几乎每个魔法方法都有一个对应的内置函数,或者运算符,当我们对这个对象使用这些函数或者运算符时就会调用类中的对应魔法方法可以理解为重写这些python的内置函数

我们在调用python类中的某个方法时,通常会看到某些特殊的方法,它们总被双下划线所包围,像这种格式:"__ 方法名__",这些方法很强大,充满魔力,可以让你实现很多功能。如果你的对象实现(重载)了这些方法中的某一个,那么这个方法就会在特殊的情况下被 Python 所调用,你可以定义自己想要的行为,而这一切都是自动发生的。

重点提取:
1.魔法方法:__ 方法名 __,如:

__iter__(self)
__next__(self)

2.当我们对一个实例化对象使用内置函数时(这个实例化对象中我们自定义了与这个内置函数对应的魔法方法),相当于我们对这个内置函数进行了重写再使用

3.以内置函数iter()为例详解魔法函数的重写(自定义)

3.1首先来看iter():


        重点:当我们不考虑设置iter()的第2个参数时,第一个参数object必须是支持__iter__()方法的(可迭代的),也即iter()调用其__iter__()返回一个迭代器对象

3.2由迭代器对象及其方法next()来分析:



        提取重点:
1.对迭代器对象使用__next__()方法或next()方法来以此输出迭代器对象数据项
2.next()调用__next__()方法

经以上分析,我们可以得到最开始的示例代码的实际内涵了:
        1.在类中我们对__iter__()和__next__()进行了重写,这俩方法是魔法方法
        2.在对该类实例化对象使用iter()内置函数时,iter()调用我们重写的__iter__()而不是其原本的,返回self。同样的,对myiter 使用next()内置函数时也即调用我们重写的__next__()而不是原来的。

class MyNumbers:def __iter__(self):self.a = 1return selfdef __next__(self):x = self.aself.a += 1return xmyclass = MyNumbers()
myiter = iter(myclass)print(next(myiter))
print(next(myiter))
print(next(myiter))
print(next(myiter))
print(next(myiter))

Python迭代器基本方法iter()及其魔法方法__iter__()原理详解相关推荐

  1. python装饰器性能_python装饰器的特性原理详解

    这篇文章主要介绍了python装饰器的特性原理详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 今天发现了装饰器的另一种用法,下面就先上代码: d ...

  2. python中图片绘制和输出相关库的原理详解

    Python在图片绘制和输出方面的发展历史可以追溯到20世纪90年代,当时的主要库是Python Imaging Library (PIL),用于处理图像文件和生成图像.PIL是Python中最早的图 ...

  3. java实现线程同步的方法_Java实现线程同步方法及原理详解

    一.概述 无论是什么语言,在多线程编程中,常常会遇到多个线同时操作程某个变量(读/写),如果读/写不同步,则会造成不符合预期的结果. 例如:线程A和线程B并发运行,都操作变量X,若线程A对变量X进行赋 ...

  4. cordova监听事件中调用其他方法_Laravel模型事件的实现原理详解

    模型事件在 Laravel 的世界中,你对 Eloquent 大多数操作都会或多或少的触发一些模型事件,下面这篇文章主要给大家介绍了关于Laravel模型事件的实现原理,文中通过示例代码介绍的非常详细 ...

  5. python协程系列(三)——yield from原理详解

    声明:本文将详细讲解python协程的实现机理,为了彻底的弄明白它到底是怎么一回事,鉴于篇幅较长,将彻底从最简单的yield说起从最简单的生成器开始说起,因为很多看到这样一句话的时候很懵,即" ...

  6. [Python人工智能] 十二.循环神经网络RNN和LSTM原理详解及TensorFlow编写RNN分类案例

    从本专栏开始,作者正式开始研究Python深度学习.神经网络及人工智能相关知识.前一篇讲解了TensorFlow如何保存变量和神经网络参数,通过Saver保存神经网络,再通过Restore调用训练好的 ...

  7. python 魔法方法常用_Python魔法方法指南

    有很多人说学习Python基础之后不知道干什么,不管你是从w3c还是从廖雪峰的教程学习的,这些教程都有一个特点:只能引你快速入门,但是有关于Python的很多基础内容这些教程中都没介绍,而这些你没学习 ...

  8. python笔记14介绍几个魔法方法

    python笔记14介绍几个魔法方法 先声明一下 各位大佬,这是我的笔记. 如有错误,恳请指正. 另外,感谢您的观看,谢谢啦! (1).__doc__ 输出对应的函数,类的说明文档 print(pri ...

  9. python request.post 字典参数以json_Python requests.post方法中data与json参数区别详解

    在通过requests.post()进行POST请求时,传入报文的参数有两个,一个是data,一个是json. data与json既可以是str类型,也可以是dict类型. 区别: 1.不管json是 ...

  10. python中的items方法_Python 字典的items()方法和iteritems()方法有什么不同?【面试题详解】...

    今天爱分享给大家带来Python 字典的items()方法和iteritems()方法有什么不同?[面试题详解],希望能够帮助到大家. 字典是 Python 语言中唯一的映射类型.映射类型对象里哈希键 ...

最新文章

  1. 深入理解Java中的内存泄漏
  2. LVS TUN模式搭建
  3. Oracle 字符串函数
  4. linux 进程映射空间 libc,为什么不能在64位内核的32位Linux进程中映射(MAP_FIXED)最高虚拟页面?...
  5. http://www.iteye.com/topic/114392
  6. 浅析OpenLayer3加载WMS一些问题
  7. python写乘法口诀表好记方法_如何用python编写乘法口诀表
  8. Android AIDL实例解析
  9. mysqldump备份所有数据库,恢复单个库的场景预演
  10. c++反向输出一个三位数
  11. ArcGis利用栅格处理工具进行影像裁剪
  12. 计算机专业毕业祝福语,大学毕业生祝福语
  13. Mac上使用IE浏览器
  14. 【Activiti工作流】5. 简单请假流程
  15. thinkphp6 jwt扩展
  16. visio的图在word中空白处太大的问题
  17. 计算机等级考试二级要学PS,计算机二级考试PS要考什么,和考试的方式是什么?...
  18. serialize()方法
  19. Python 实现握手定理
  20. 巴斯卡三角形(Pascal)

热门文章

  1. Hadoop之HDFS的使用
  2. 苹果怎么给软件加密码_给SIM卡设置密码被锁了怎么办?解锁的PUK码在哪?
  3. Ubuntu Firefox浏览器安装Flash插件
  4. 深度学习:深度复数网络(Deep Complex Networks)-从论文到pytorch实现
  5. SV中的浅拷贝和深拷贝
  6. postfix dovecot邮件服务器搭建
  7. WebDriverException: Message: unknown error: cannot find Chrome binary(ChromeDriver及谷歌官网下载地址)
  8. Linux-DNS学习记录01-安装部署
  9. 一张厚度为0.1MM的纸对折多少次后,高度超过珠穆朗玛峰(8848米)?
  10. 什么是跨域?跨域解决方法