前言

上次我们简单分享了迭代器和生成器,本次我们来更加深入的了解相关概念和使用方法,希望能对你有所帮助。

自定义迭代器

首先,我们来看看怎么自定义迭代器,自定义迭代器的类需要下面几个组成。

(1)类中需要定义iter和next魔术方法。
(2)iter魔术方法返回对象本身。
(3)next方法返回下一个数据,如果没有数据,就报异常StopIteration。

class Test:def __init__(self):self.counter = 0def __iter__(self):return selfdef __next__(self):self.counter += 1if self.counter == 3:raise StopIterationreturn self.countert = Test()
print(next(t))
print(next(t))
print(next(t))1
2
StopIteration

当然,我们可以直接使用for循环来调用这个迭代器对象。

 for i in t:print(i)1
2

for循环里面到底是怎么执行的了?首先for循环会先调用对象的iter魔术方法,返回一个迭代器对象,然后不断调用next魔术方法(异常就停止循环)。

生成器

我们之前学习过,函数中有yield关键字,那这个函数就是生成器。

def func():yield 1yield 2f = func()
print(next(f))
print(next(f))1
2

其实这个生成器对象内部其实是调用的生成器类generator创建的对象,生成器类的内部其实也声明了iter和next魔术方法。

生成器也完全符合迭代器声明的规则,所以,生成器也是一种特殊的迭代器。最后,如果你的时间不是很紧张,并且又想快速的python提高,最重要的是不怕吃苦,建议你可以架微♥信:762459510 ,那个真的很不错,很多人进步都很快,需要你不怕吃苦哦!大家可以去添加上看一下~

可迭代对象

最后,我们再聊聊可迭代对象,我们都知道,列表就是可迭代对象。

l = [1, 2, 3]
for i in l:print(i)

字符串,字典等等能够循环的,都是可迭代对象。其定义是,如果类中有iter魔术方法,并且返回的是迭代器对象,那这个类创建的对象就是可迭代对象。

class Test:def __init__(self):self.counter = 0def __iter__(self):return selfdef __next__(self):self.counter += 1if self.counter == 3:raise StopIterationreturn self.counterclass Foo:def __iter__(self):return Test()foo = Foo()
for item in foo:print(item)1
2

这里的foo就是可迭代对象,当使用for循环时,先调用iter魔术方法,返回一个迭代器对象,接着就是不断的调用next魔术方法返回值。

我们可以验证下,列表是可迭代对象,那他就应该有iter方法,没有next方法。

l = [1, 2, 3]
print(dir(l))#['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']
print(dir(l.__iter__()))

调用iter方法后,就会有iter和next方法了。

自定义range函数

学了这么多,我们来自定义一个range函数来巩固下学习内容。

class RangeIter:def __init__(self, num):self.num = numself.counter = -1def __iter__(self):return selfdef __next__(self):self.counter += 1if self.counter == self.num:raise StopIterationreturn self.counterclass Xrange:def __init__(self, maxnum):self.maxnum = maxnumdef __iter__(self):return RangeIter(self.maxnum)for i in Xrange(10):print(i)

生成器也可以实现该功能。

class Xrange:def __init__(self, maxnum):self.maxnum = maxnumdef __iter__(self):counter = 0while counter < self.maxnum:yield countercounter += 1for i in Xrange(5):print(i)

今天的分享就到这了,我们下期再见~

python福利教程领取方式:
1、点赞+评论(勾选“同时转发”)
2、关注小编。并私信回复关键字【19】
(一定要私信哦~点击我的头像就能看到私信按钮了)

【python教程入门学习】迭代器、生成器和可迭代对象相关推荐

  1. 【python教程入门学习】Python实现自动玩贪吃蛇程序

    这篇文章主要介绍了通过Python实现的简易的自动玩贪吃蛇游戏的小程序,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学一学 实现效果 先看看效果 这比我手动的快多了,而且是单机的,自动玩没惹 ...

  2. 【python教程入门学习】普通人学python有意义吗

    普通人学python有意义吗?普通人能不能学习python语言,难不难,是否容易上手,学了python能做那些事情,能挣多少钱?这些问题是很多同学关心的问题,今天python教程入门学习就从小白同学的 ...

  3. 【python教程入门学习】学python要多久,0基础学python有多难

    学python要多久,0基础学python有多难,这是很多想学习python语言同学绕不开的问题,都害怕花完钱最终没有应有的回报!对于毫无经验0基础的同学来说学习python什么最重要,方向选对坚持下 ...

  4. 【python教程入门学习】第一个Pygame程序

    Pygame 作为一个入门级的游戏开发库,其实并不难学,只要掌握 Python 编程的相关知识就能很轻松地掌握它. Pygame 语法简单.明了,秉持了 Python 语言一贯的风格.同时,它作为一个 ...

  5. 【python教程入门学习】Python新年炫酷烟花秀代码

    先介绍下 Pygame 绘制烟花的基本原理,烟花从发射到绽放一共分为三个阶段: 1,发射阶段:在这一阶段烟花的形状是线性向上,通过设定一组大小不同.颜色不同的点来模拟"向上发射" ...

  6. 【python教程入门学习】Python扑克牌21点游戏实例代码

    大家好,本篇文章主要讲的是Python扑克牌21点游戏实例代码,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览 废话还是说太多了 直接上代码 | `import` `random ...

  7. 【python教程入门学习】python能做什么

    python能做什么?[python教程入门学习]介绍,最近许多的朋友咨询,听说python很火,甚至可以超越JAVA,因此很想学这个python,但是不知道python能做什么,能完成一些什么项目呢 ...

  8. python 列表生成式_深度好文:Python之列表生成式、生成器、可迭代对象与迭代器(一)...

    作者:云游道士 原文:https://www.cnblogs.com/yyds/p/6281453.html 本节内容 语法糖的概念 列表生成式 生成器(Generator) 可迭代对象(Iterab ...

  9. 【python教程入门学习】什么是生成器?

    往期好文推荐 学习Python不需要程基础? 0基础不用怕,从0到1轻松教你入门Python python系统学习流线图,教你一步一步学会python 成为一名做大数据开发的女程序员,并不是二狗进入大 ...

最新文章

  1. 又来搞事情了,这次女友让我研究如何实现一个文件系统
  2. python使用方法-Python的使用方法
  3. TransmittableThreadLocal详解
  4. 门限回归模型的思想_Stata+R:门槛回归教程
  5. 积分和人民币比率_通过比率路由到旧版和现代应用程序–通过Spring Cloud的Netflix Zuul...
  6. cache数据库和mysql_并发环境下,先操作数据库还是先操作缓存?
  7. 记一次MySQL数据库恢复(附方案)
  8. 分析Cocos2d-x横版ACT手游源 1、登录
  9. net core 模型绑定与之前版本的不同-FromBody 必须对应Json格式
  10. 【转】利用匿名namespace解决C++中重复定义的问题
  11. python简明教程中文pdf-简明Python教程-中文版.pdf
  12. 基于SSH房地产销售系统
  13. android 图层绘画分析,Android-绘图机制总结
  14. outlook2016 打不开超链接
  15. HGDB pg_stat_statements 用法
  16. ubuntu18.04安装PCL点云库踩坑指南
  17. 挑战华为社招:字节跳动上千道精选面试题还不刷起来
  18. 分治法 divide and conquer
  19. linux查看远程kafka安装目录,Linux系统中KafKa安装和使用方法
  20. 席南华院士:数学的意义(2020.5.30)

热门文章

  1. [Editor][001][vim]VIM的辅助工具们
  2. javascript进制转换_《算法笔记》3.5小节——入门模拟-gt;进制转换
  3. python中socket模块常用吗_python中socket模块详解
  4. python人工自动抠图_python实现人工智能Ai抠图功能
  5. 用java实现etcd分布式锁_etcd分布式锁及事务
  6. pg 定时删除_postgresql AutoVacuum系统自动清理进程
  7. python模拟购物模块_python -模拟购物 -赊账版 粗糙之极
  8. python 输入输出转web_云计算开发学习笔记:Python3 输入和输出方式
  9. c# 判断是否为数组_c# – 如何检查反射类型是否为数组
  10. Kubernetes 使用 ingress 配置 https 集群(十五)