小说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学习

python基础-字符串与编码

转载于:廖雪峰的官方网站-python教程 字符编码 我们已经讲过了,字符串也是一种数据类型,但是,字符串比较特殊的是还有一个编码问题。 因为计算机只能处理数字...

44411
来自专栏九彩拼盘的叨叨叨

JavaScript 的变量和数据类型

信息是由数据组成的。变量可以理解成装数据的“盒子”。操作某个数据,首先要做是找到数据所在的盒子(变量)。放在变量里的数据称为变量值。

502
来自专栏http://www.cnblogs.com

内置函数filter()和匿名函数lambda解析

一.内置函数filter filter()函数是 Python 内置的一个高阶函数,filter()函数接收一个函数 f 和一个list,这个函数 f 的作用是...

30912
来自专栏云霄雨霁

Java--深入理解内部类

1605
来自专栏码洞

看完Java的动态代理技术——Pythoner笑了

Java的动态代理常用来包装原始方法调用,用于增强或改写现有方法的逻辑,它在Java技术领域被广为使用,在阿里的Sofa RPC框架序列化中你能看到它的身影,H...

743
来自专栏小樱的经验随笔

【正则表达式学习笔记之一】简单认识正则表达式

一、引言   正则表达式是什么东东?   在编写处理字符串的程序或网页时,经常会有查找符合某些复杂规则的字符串的需要。正则表达式就是用于描述这些规则的工具。换句...

1933
来自专栏编程

给初学者:JavaScript 中数组操作注意点

作者:CarterLi https://segmentfault.com/a/1190000012463583 不要用 for_in 遍历数组 这是 JavaS...

1766
来自专栏鸿的学习笔记

Scala简单入门之变量

Scala是一门神奇的语言,作为一个JVM上的编译型语言,它居然有着自己的解释器(Java其实也有)。例如在shell上面输入scala就会进入下面的页面:

873
来自专栏C语言及其他语言

数组越界为什么没有出错

数组越界 在C语言中, 数组属于构造数据类型。一个数组可以分解为多个数组元素,这些数组元素可以是基本数据类型或是构造类型。因此按数组元素的类型不...

34210
来自专栏技术点滴

《Effective C++》读书摘要

《Effective C++》读书摘要 最近刚读完侯捷的《Effective C++》,相对来说,这本书的内容比较贴近基础,对于刚掌握C++基础的人会有不少的提...

1686

扫码关注云+社区