小说python中的迭代器(Iterator)

小说python2和python3的差异一文中, 在说明range,xrange,map的差异时 提到IterableIterator,有朋友反馈没留意过这两个东东, 这里就小说一把,认识一下

Iterable和Iterator

Iterable: 可迭代对象

直接作用于for循环的对象统称为可迭代对象

list tuple dict set str等集合数据类型 还有Iterator generator map等迭代器或是迭代器子类

Iterator: 迭代器

官方说明

被next()函数调用并不断返回下一个值的对象

本质上是实现了__iter__,__next__方法(python2是__iter__,next方法)

相互关系:

对于众多的对象, 实在不知道是什么类型就这么判断下吧

1from collections import Iterable,Iterator
2isinstance([], Iterable)   # True
3isinstance(map(lambda x: x-1,range(5)),Iterator)  # True

迭代器的特性

最大特点是延迟计算(lazy evaluation)方式返回元素,按需调用call by need的方式 不是与list等集合数据类型一样一次性将所有元素加载到内存中

它还具备下面几个特点:

  • 不能向后移动
  • 不能回到开始
  • 只能一次迭代
  • 不能切片和索引

一次迭代

无法切片和索引

迭代器应用

节省内存

典型应用: 操作大文件

read readlines 方法都是将文件一次读到内存中, 文件太大,就会造成内存溢出

通常的做法是

1with open(filename, 'r') as flie:
2    for line in file:
3        print(line)

适用场景:

  • 不关心元素的随机访问
  • 元素的个数不确定

后记

迭代器在python中是个很重要的对象,很多对象都具有迭代器的特性,或是其子对象 生成器是迭代器的一个重要子对象 而python的协程与生成器又有千丝万缕的关系 迭代器->生成器->协程层层递进 迭代器作为一个基础,清楚的认知是很有必要的


原文发布于微信公众号 - chafezhou(gh_5b8f0c59b682)

原文发表时间:2018-04-06

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏菩提树下的杨过

python:函数的高级特性

1693
来自专栏前端黑板报

一个数字截取引发的精度问题(二)

上篇文章只是简单介绍了Number的 toFixed 方法,周末抽时间把 Number 里的一些方法又看了一下,其中有个方法引起我的注意: Number.pro...

1896
来自专栏指尖下的Android

由单例模式的双判空所展开的思考

相信很多朋友对于单例模式都很熟悉,一般常见的就七八种,百度一大堆,这里聊一下双判空情况下的单例模式。 双判空单例是由单判空所演变而来的,是原来的一些程序员为了...

641
来自专栏java一日一条

降低Java垃圾回收开销的5条建议

随着一再拖延而即将发布的 Java9,G1(“Garbage First”)垃圾回收器将被成为 HotSpot 虚拟机默认的垃圾回收器。从 serial 垃圾回...

432
来自专栏java一日一条

请不要再说 Java 中 final 方法比非 final 性能更好了

总结:你说final的性能比非final有没有提升呢?可以说有,但几乎可以忽略不计。如果单纯地追求性能,而将所有的方法修改为 final 的话,我认为这样子是不...

602
来自专栏Java爬坑系列

Java强引用、软引用、弱引用及虚引用深入探讨

引用类型在日常开发中并不常关注,也很少注意到,因此很多人忽略了它们的存在,而事实上,引用类型在Java体系中扮演着十分重要的角色,要想对Java体系有一个更深层...

642
来自专栏任浩强的运维生涯

mongodb基础篇

一、  关于mongodb 两种非关系数据库 Redis:满足极高读写性能的Key-Value数据库       键值式储存,可以通过键快速查询到值。     ...

3268
来自专栏Linux驱动

27.C++- 智能指针

智能指针 在C++库中最重要的类模板之一 智能指针实际上是将指针封装在一个类里,通过对象来管理指针. STL中的智能指针auto_ptr 头文件: <memor...

33710
来自专栏企鹅号快讯

Python模块知识2:时间日期日历模块Time、Datetime、Calendar

1、time模块 时间为什么从1970年开始:因为Linux系统那一年开始使用;通常由以下几种方式表示时间: 时间戳:1970年1月1日之后的秒,即:time....

1965
来自专栏编程

浅谈Go语言中闭包的使用

闭包(Closure),又称词法闭包(Lexical Closure)或函数闭包(function closures),是引用了自由变量的函数。这个被引用的自由...

2738

扫码关注云+社区