Python学习笔记014——迭代器 Iterator
1 迭代器的定义
凡是能被next()函数调用并不断返回一个值的对象均称之为迭代器(Iterator)
2 迭代器的说明
Python中的Iterator对象表示的是一个数据流,被函数next()函数调用后不断返回下一个数据,直到没有数据时抛出StopIteration错误;在存储空间中,迭代器并非全部数据,而是通过next()函数不断按需计算下一个数据,可以把Iterator看成序列,但是这个序列长度却是“未知的”,所以Iterator的计算是惰性的,只有在需要返回下一个数据时它才会计算。
3 迭代对象
凡是可作用于for循环的对象都是Iterable类型
4 迭代器与迭代对象的差别
4.1 迭代对象的长度是可知的,迭代器的长度是“未知的”
>>> a = [1,2,3,4,5] >>> a [1, 2, 3, 4, 5] >>> b = iter(a) >>> b <list_iterator object at 0x7f27f6b02710> >>> len(a) 5 >>> len(b) Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: object of type 'list_iterator' has no len()
4.2 迭代对象Iterable和迭代器Iterator可以相互转化
集合数据类型list、tuple、dict、set、str均是迭代对象Iterable,但不是迭代器Iterator;
但是可以通过iter()函数将上述的迭代对象转变成Iterator。
另外迭代器只能向前取值,不能后退,迭代对象则可任意取值
>>> a = [1,2,3,4] >>> b = iter(a) >>> next(b) 1 >>> c = list(b) >>> c [2, 3, 4] >>> next(b) Traceback (most recent call last): File "<stdin>", line 1, in <module> StopIteration >>> d = b >>> d <list_iterator object at 0x7fc895d4c668> >>> next(d) Traceback (most recent call last): File "<stdin>", line 1, in <module> StopIteration
注意:生成器均是Iterator对象
4.3 均可用isinstance()判断对象
可以使用isinstance()来判断一个对象是否是Iterable()和Iterator()对象。
迭代对象
>>> isinstance([],Iterable) Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name 'Iterable' is not defined >>> from collections import Iterable >>> isinstance([],Iterable) True >>> isinstance((),Iterable) True >>> isinstance((x for x in range(10)),Iterable) True >>> isinstance(1,Iterable) False
迭代器
>>> from collections import Iterator >>> isinstance([],Iterator) False >>> isinstance(iter([]),Iterator) True
4.4 存储数据形式
Iterator对象可以表示一个无限大的数据流,例如全体自然数,占用较小的存储空间;但是Iterable对象则是直接存储全体自然数,会占用较大的存储空间。
L = [1, 3, 5, 7] # for 语句实现遍历 for x in L: print(x) # 用while 语句来实现遍历 it = iter(L) while True: try: x = next(it) except StopIteration: break print(x) print("程序结束")
运行
1 3 5 7 1 3 5 7 程序结束
5 迭代器相关函数
iter(Iterable) 从一个对象中返回迭代器(Iterable必须是可迭代对象)
next(Iterator) 从迭代器Iterator中获取下一个记录,如果无法获取,则会触发StopIteration异常
L = [1, 3, 5, 7] it = iter(L) # 用 L 来返回一个迭代器 v = next(it) # 返回1 next(it) # 返回3 next(it) # 返回5 next(it) # 返回7 next(it) # StopIteration 异常
Python学习笔记014——迭代器 Iterator的更多相关文章
- Python学习笔记014——迭代工具函数 内置函数enumerate()
1 描述 enumerate() 函数用于将一个可遍历的数据对象(如列表.元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中. 2 语法 enumerate(sequ ...
- python学习笔记之迭代器和函数(第三天)
一.collection系列: 1.counter计数器 如果counter(dict)是对字典的一个补充,如果counter(list)则是对列表的补充,初步测试对字典的值进行排序. ####### ...
- Python学习笔记:迭代器(Iterator)详解
一.可迭代的对象(Iterable) 1.定义:可以直接用在循环的数据类型,如list,tuple,dict,set,str,还有generator(生成器), 和带yield的函数,这些直接可以用在 ...
- python学习笔记(5)--迭代器,生成器,装饰器,常用模块,序列化
生成器 在Python中,一边循环一边计算的机制,称为生成器:generator. 如: >>> g = (x * x for xin range(10)) >>> ...
- Python学习笔记014——生成器Generator
1 生成器定义 在Python中,一边循环一边计算的机制,称之为生成器(generator). 生成器是一个迭代器. 含有yield语句的函数是生成器函数,该函数被调用时返回一个生成器对象(yield ...
- python学习笔记四 迭代器,生成器,装饰器(基础篇)
迭代器 __iter__方法返回一个迭代器,它是具有__next__方法的对象.在调用__next__方法时,迭代器会返回它的下一个值,若__next__方法调用迭代器 没有值返回,就会引发一个Sto ...
- Python学习笔记010_迭代器_生成器
迭代器 迭代就类似于循环,每次重复的过程被称为迭代的过程,每次迭代的结果将被用来作为下一次迭代的初始值,提供迭代方法的容器被称为迭代器. 常见的迭代器有 (列表.元祖.字典.字符串.文件 等),通常 ...
- Python学习笔记014——迭代工具函数 内置函数zip()
1 描述 zip() 函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表. 如果各个迭代器的元素个数不一致,则返回列表长度与最短的对象相同,利用 * 号操 ...
- python学习笔记014——错误和异常
Python有两种错误很容易辨认:语法错误和异常. 1 什么是语法错误 Python 的语法错误或者称之为解析错,是初学者经常碰到的,如下实例 if i>4 print("if语句输出 ...
随机推荐
- 如何使用Octave 在Ubuntu上科学处理音频
Octave 是一个类似于 Linux 上的 Matlab 的软件,它拥有数量众多的函数和命令,支持声音采集.记录.回放以及音频信号的数字化处理,用于娱乐应用.研究.医学以及其它科学领域.在本教程中, ...
- hadoop fs:du & count统计hdfs文件(目录下文件)大小的用法
hadoop fs 更多用法,请参考官网:http://hadoop.apache.org/docs/r1.0.4/cn/hdfs_shell.html 以下是我的使用hadoop fs -du统计文 ...
- 使用(function() {}).call(this);包裹代码有什么好处,什么时候应该这样做?
转自:http://segmentfault.com/q/1010000002519489 1.严格模式下函数调用的 this 并不会默认成为全局对象. 使用 func.call(this) 确保函数 ...
- (LeetCode74)Search a 2D Matrix
Write an efficient algorithm that searches for a value in an m x n matrix. This matrix has the follo ...
- C#.NET常见问题(FAQ)-控制台程序如何输出Messagebox
1 添加如下引用 2 添加引用和Messagebox的代码. 3 测试可行 更多教学视频和资料下载,欢迎关注以下信息: 我的优酷空间: http://i.youku.com/aceta ...
- sse float 转int 截断和不截断
之前, 我用sse指令, 想把float 型转成int, 不过其中遇到了一些困惑,就是截断和不截断的问题, 这个问题一直困扰我好集体, 最后终于解决了, 原来sse本身就有截断和不截断的指令. _mm ...
- uva 10721 - Bar Codes(dp)
题目链接:uva 10721 - Bar Codes 题目大意:给出n,k和m,用k个1~m的数组成n,问有几种组成方法. 解题思路:简单dp,cnt[i][j]表示用i个数组成j, cnt[i][j ...
- CentOS(学习笔记一)
菜鸟记录 一.配置网络.防火墙等 setup命令 二.查看网络 ifconfig 重启网络 /ect/init.d/network restart 或者ifup ethx(,,)等 查看网络配置文件 ...
- alias的使用
alias,即别名.可以通过较短的别名,来实现对应的真实的命令.将alias定义在.bash_profile文件中,即可在任意目录下执行自己定义的这些命令了. 1. 命令 alias myDir='c ...
- 在VC中创建DLL文件的方法步骤
一.Win32动态链接库 1.制作的步骤: (1)新建WIN32 Dynamic-link Library工程,工程名为MyDll,选择A simple DLL project类型. (2)MyDll ...