迭代器

迭代器只不过是一个实现了迭代器协议的容器对象。它基于以下两个方法。

__ next __:返回容器的下一个元素。

__ iter __:返回迭代器本身。

实际上,迭代器表现了程序底层的概念和特性,在程序中,你可以不必使用迭代器,但是理解迭代器,却是对生成器这样一个常用特性理解很有帮助。

学习迭代器,我基本上通过2个例子来理解迭代器的特性。(PS:我发现我之前记得笔记不是很详细,所以这一篇记录详细一些……不然我有时候一些点我自己看的时候都要想一下,吐血,果然没什么灵性……)

好了,上代码:

a = iter([11,22,33])print(next(a))print(next(a))print(next(a))-------------------------

11

22

33[Finishedin 0.2s]

这里,我创建了一个非常简陋的迭代器,使用iter()函数,这个函数在上述的代码中接收了一个列表作为参数,并赋值给a这个变量。

那么此时,a就是一个迭代器了。当然,此时创建的这个a的迭代器非常的简陋,就好比我要造飞机,结果你用纸给我叠了一个。不过飞机的特性还是有的,可以算是飞机了,只不过是纸飞机。

迭代器使用:通过函数next()来使用,next()函数参数接收一个迭代器,并在每一次执行的时候,依次调取迭代器中的值,并返回出来。

简单理解:next()函数呢,就好比游戏登录器,游戏就好比迭代器,没有登录器你玩不了游戏,所以,没next()这玩意你用不了迭代器,想用迭代器,你需要用next()这个方法调,next()这个方法有一个特点,从头开始调,每次调一个。

那么,为什么说我们用iter()创建的迭代器是纸飞机呢?

看代码思考2个问题:

1,每次调用是进行依次调用的,上述代码调用的刚好是个列表,如果,调用列表中最后一个值之后,继续调用,会怎么样呢?

a = iter([11,22,33])print(next(a))print(next(a))print(next(a))print(next(a))-------------------------StopIteration

[Finishedin 0.2s with exit code 1]

可以看到,迭代器中只有3个值,而我调用了4次,所以在第四次调用的时候,返回了一个StopIteration异常。这是好事,异常代表着迭代的完结,我们可以利用异常做点事情。

2,为什么说纸飞机呢,这个迭代器有一个非常不好的点,那就是迭代的次数并非我们想要的,如果我们想迭代100次,总不至于写一个有100个元素的列表吧?当然,你可以说我可以用range()来解决这个问题呀。

a = iter(range(4))print(next(a))print(next(a))print(next(a))print(next(a))-------------------------------01

2

3[Finishedin 0.2s]

可是,实际上,并没有解决触发异常的问题。并且每一次的迭代,都需要next()来手工进行,那么,我们来做一个真正的迭代器。

classCountDown():def __init__(self,step):

self.step=stepdef __next__(self):if self.step <=0:raiseStopIteration

self.step= self.step - 1

returnself.stepdef __iter__(self):returnself

ff= CountDown(5)for i inff:print(i)-------------------------------------

4

3

2

10

[Finishedin 0.2s]

__ next __:返回容器的下一个元素。

__ iter __:返回迭代器本身。

这个类就非常明确了,接收迭代次数,并且每次迭代减1,触发异常停止迭代。实际上,迭代只是一种概念,迭代器则提供了一种专门的方法,并非在python程序中唯一的迭代动作!

生成器

生成器是一种优雅的方法,他可以让编写返回元素序列的函数代码变得简单,高效。

实际上,我们常用的方法:range()

for i in range(10):print(i)

也是生成了一个列表来供我们遍历,在python3中,本质也是生成器。

当然,我们也可以自己写一个列表生成器,不使用range()

defMaker(num):

a=0whileTrue:

b=a

a= a + 1num= num - 1

yieldbif num <=0:breakff= Maker(10)

a= [i for i in Maker(10)]

b= [x for x in range(10)]print(a)print(b)--------------------------------------------[0,1, 2, 3, 4, 5, 6, 7, 8, 9]

[0,1, 2, 3, 4, 5, 6, 7, 8, 9]

[Finishedin 0.2s]

看,我们自己写了一个生成器方法Maker(),这个方法接收一个参数,来表示生成列表数量,与range()函数的方法是一样的。(起码在调用看来是的)

代码中的:yield语句,表示暂停生成器,返回结果。是不是有点像return?可以想一想,是有区别的,一个是暂停,返回后继续执行后面的代码,return返回后就不在执行啦。

实际上,生成器可以执行复杂的生成过程,不过具体还是要看你要实现什么需求。

python的装饰器、迭代器、yield_Python学习日记(5)简单了解迭代器、生成器、装饰器、上下文管理器...相关推荐

  1. 神经网络与深度学习——TensorFlow2.0实战(笔记)(四)(python上下文管理器)

    with语句 使用with语句替代try-finally 语句,代码更加的简洁清晰 对于需要对资源进行访问的任务,无论在代码运行过程中,是否发 生异常,都会执行必要的清理操作,释放资源. 1. wit ...

  2. Python 上下文管理器和 with 语句

    1. 上下文管理器概念 什么是 Python 的上下文管理器(Context Managers)呢? ​ 含有 __enter__ 和 __exit__ 方法的对象就是.上下文管理器存在的目的是管理 ...

  3. Python 上下文管理器与with语句

    Python中把进入代码块前调用__enter__ 方法并在离开代码块后调用__exit__方法的对象作为上下文管理器,本文中我们就来深入解析Python中的上下文管理器,来看看上下文管理器的作用及用 ...

  4. python的上下文管理用哪个关键字_正确理解python中的关键字“with”与上下文管理器...

    正确理解python中的关键字"with"与上下文管理器 来源:中文源码网    浏览: 次    日期:2018年9月2日 [下载文档:  正确理解python中的关键字&quo ...

  5. python教程:上下文管理器详细教程

    我想你对 Python 中的with语句一定不陌生,尤其是在文件的读写操作中,不过我想,大部分人可能习惯了它的使用,却并不知道隐藏在其背后的"秘密". 那么,究竟with语句要怎么 ...

  6. 读书笔记:《流畅的Python》第15章 上下文管理器和else块

    # 第15章 上下文管理器和else块""" 本章内容提要:with语句和上下文管理器for while try语句的else子句 """# ...

  7. python 上下文管理器、 else 块、@contextmanager

    文章目录 1. else 2. with上下文管理器 3. contextlib模块实用工具 4. @contextmanager 装饰器 learn from <流畅的python> 1 ...

  8. python with关键字_完全理解Python关键字with与上下文管理器

    如果你有阅读源码的习惯,可能会看到一些优秀的代码经常出现带有 "with" 关键字的语句,它通常用在什么场景呢?今天就来说说 with 和 上下文管理器. 对于系统资源如文件.数据 ...

  9. python 计时器_Python上下文管理器的魔力

    点击关注我哦 一篇文章带你了解Python上下文管理器的魔力 小编将为您准备一份很棒的Python上下文管理器使用指南,这将使您的代码更具可读性和可靠性,降低您的错误发生率. 资源管理器是我们在任何编 ...

  10. Python 上下文管理器和with块 二

    标准库中还有个contextlib 模块,提供一些实用工具, closing 如果对象提供了 close() 方法,但没有实现 __enter__/__exit__ 协议,那么可以使用这个函数构建上下 ...

最新文章

  1. spring mvc velocity 配置备忘
  2. ML之SVM:基于SVM(sklearn+subplot)的鸢尾花iris数据集的前两个特征(线性不可分的两个样本),判定鸢尾花是哪一种类型
  3. Python中遍历字符串和字典
  4. config之安全(用户认证)
  5. 温故知新-[CPP]-Eclipse-CPP中一个Project多个Main
  6. python (八)迭代器、生成器、列表推导式
  7. 多进程fork()函数
  8. Android RecyclerView 向上偏移解决、添加自定义分割线,瀑布流,ScrollView嵌套RecyclerView滑动卡顿
  9. 印度数据工厂驱动全球 AI 发展
  10. ASP.NET 5 入门 (3) – Logging
  11. 日记背景 android,只是意外 - 用这些 APP 来记录生活,再也不用担心无法坚持写日记 - Android 应用 - 【最美应用】...
  12. 信息服务器的设置,设置服务器SSH信息
  13. ubuntu安装redis_在Ubuntu上安装Redis
  14. Go语言跨平台预编译
  15. 用JFreeChart 来分析Cassandra/Oracle插入海量数据的性能
  16. curl的php多线程类,php利用curl实现多线程类的示例
  17. 计算机说课稿模板小学数学,小学数学说课万能模板精简
  18. 3分钟阿里云商标智能注册申请及申请流程图文详解
  19. 腾讯云TCA运维工程师认证题库及例题示范
  20. erp系统的优点和不足?云系统给企业带来的好处?

热门文章

  1. ffmpeg-20160517-git-bin
  2. js字符串转日期类型
  3. sql limit offset 的用法 但在SqlServer中用不了
  4. 网络编程~socket
  5. python入门第二十五天--反射 通过字符串的形式操作对象中的成员
  6. IEEP-网络实施-项目交付流程
  7. UITableViewCell的选中时的颜色设置
  8. linux modprobe.conf怎么不见了—-CentOS 6
  9. LinkButton 传递多个参数
  10. C语言的变量作用域及头文件