【python】 可迭代对象、迭代器、生成器
可迭代对象 iterable
可直接作用于for循环的对象统称为可迭代对象。
有 list、 dict、tuple、set、str等数据类型,还有 generator(包括生成器和带yield的generator function)。包括了有序和无序对象。
要判断一个对象是否为iterable对象。方法如下:
from collections import Iterable
isinstance([],Iterable)
迭代器 iterator
迭代,即一些事要重复好多次,就像在循环中做的那样。
一个对象是否可迭代,全都取决于这个对象是否有__iter__方法,只要该对象实现了__iter__方法,调用对象的__iter__方法,就回返回一个迭代器,这个迭代器一定具有next方法(调用这个方法时不需要任何参数),在调用这个迭代器的next方法时,迭代器就回返回它的下一个值,当迭代器中没有值可以返回了,就回抛出一个名为StopIteration的异常,停止迭代。
准确的说,一个实现了__iter__方法的对象是可迭代的,一个实现了next方法的对象则是迭代器。
例如文件既有iter方法又有next方法,是可迭代对象也是迭代器,为什么还要iter方法呢。iter方法要使所有可迭代对象生成统一的迭代器格式。
每次调用next()方法的时候会做两件事:
1、为下一次调用next()方法修改状态
2、为当前这次调用生成返回结果
特性:不可逆,只能前进,不能后退。只能不断通过next()函数获取下一个数据,有需要的时候才生成值返回,没调用的时候就处于休眠状态等待下一次调用。
for循环就是这样工作的,for循环在循环一个对象的时候,会调用这个对象的__iter__方法,得到迭代器,然后在调用这个迭代器的next方法,去获得这个迭代器中包涵的每个值。
要判断一个对象是否为iterator对象。方法如下:
from collections import Iterator
isinstance((x for x in range(9)),Iterator)
迭代器与列表的区别
迭代器是惰性的,一个接着一个的获取值,只能往后取值。但无法获取迭代器的长度。
列表,一次性获取所有的值。如果有很多值,列表就会占用太多的内存。
例:
class test_class:
def __init__(self,start_num,stop_num):
self.start_num = start_num
self.stop_num = stop_num
def next(self):
if self.start_num < self.stop_num:
self.start_num += 1
return self.start_num
def __iter__(self):
return self
test_obj = test_class(0,3)
print test_obj.next()
>>>1
print test_obj.next()
>>>2
print test_obj.next()
>>>3
生成器
一种特殊的迭代器。(用普通函数语法定义的迭代器)
生成器的两种表达形式:
函数式生成器:使用yield关键字每次返回一个结果,一个函数中可以出现多个yield。函数之中每一个yield都会返回一个结果。每执行一个yield后,函数都会变成“挂起”(暂停)状态,下次再调用时,会从上次挂起的位置继续向下执行。
生成器表达式:使用类似于列表推导式的方法,但返回的结果不再是一个列表,而是一个生成器。
例: (i for i in range(5))
可以作用于for循环,也可以被next()函数不断调用并返回下一个值,只到最后抛出stopiteration错误表示无法继续返回下一个值。
总结:
可用于for循环的对象都是iterable类型,
可用于next()函数的对象都是iterator类型,
生成器都是iterator对象,但list、dict、str等虽然是iterable,却不是iterator。
可以使用iter()函数可以把list等iterable变成iterator。
【python】 可迭代对象、迭代器、生成器的更多相关文章
- python 可迭代对象 迭代器 生成器总结
可迭代对象 只要有魔法方法__iter__的就是可迭代对象 list和tuple和dict都是可迭代对象 迭代器 只要有魔法方法__iter__和__next__的就是可迭代对象 生成器 只要含有y ...
- 可迭代对象&迭代器&生成器
在python中,可迭代对象&迭代器&生成器的关系如下图: 即:生成器是一种特殊的迭代器,迭代器是一种特殊的可迭代对象. 可迭代对象 如上图,这里x是一个列表(可迭代对象),其实正如第 ...
- 【Python】【容器 | 迭代对象 | 迭代器 | 生成器 | 生成器表达式 | 协程 | 期物 | 任务】
Python 的 asyncio 类似于 C++ 的 Boost.Asio. 所谓「异步 IO」,就是你发起一个 IO 操作,却不用等它结束,你可以继续做其他事情,当它结束时,你会得到通知. Asyn ...
- 深入理解python中可迭代对象,迭代器,生成器
英文原文出处:Iterables vs. Iterators vs. Generators 在python学习中,通常会陷入对以下几个相关概念之间的确切差异的困惑中: a container(容器) ...
- Python--可迭代对象,迭代器,生成器
记得在刚开始学Python的时候,看到可迭代对象(iterable).迭代器(iterator)和生成器(generator)这三个名词时,完全懵逼了,根本就不知道是啥意识.现在以自己的理解来详解下这 ...
- Python迭代器,可迭代对象,生成器
迭代器 迭代器(iterator)有时又称游标(cursor)是程式设计的软件设计模式,可在容器物件(container,例如链表或阵列)上遍访的界面,设计人员无需关心容器物件的内存分配的实现细节. ...
- Python可迭代对象、迭代器和生成器
Python可迭代对象.迭代器和生成器 python 函数 表达式 序列 count utf-8 云栖征文 python可迭代对象 python迭代器 python生成器 摘要: 8.1 可迭代对象( ...
- 搞清楚 Python 的迭代器、可迭代对象、生成器
很多伙伴对 Python 的迭代器.可迭代对象.生成器这几个概念有点搞不清楚,我来说说我的理解,希望对需要的朋友有所帮助. 1 迭代器协议 迭代器协议是核心,搞懂了这个,上面的几个概念也就很好理解了. ...
- 11.Python初窥门径(函数名,可迭代对象,迭代器)
Python(函数名,可迭代对象,迭代器) 一.默认参数的坑 # 比较特殊,正常来说临时空间执行结束后应该删除,但在这里不是. def func(a,l=[]): l.append(a) return ...
- Python进阶(三)----函数名,作用域,名称空间,f-string,可迭代对象,迭代器
Python进阶(三)----函数名,作用域,名称空间,f-string,可迭代对象,迭代器 一丶关键字:global,nonlocal global 声明全局变量: 1. 可以在局部作用域声明一 ...
随机推荐
- [Real World Haskell翻译]第24章 并发和多核编程 第一部分并发编程
第24章 并发和多核编程 第一部分并发编程 当我们写这本书的时候,CPU架构正在以比过去几十年间更快的速度变化. 并发和并行的定义 并发程序需要同时执行多个不相关任务.考虑游戏服务器的例子:它通常是由 ...
- Openstack Havana的两个排错过程
问题一:Timeout wating on RPC response, topic:"network" 描述: 启动实例一直等待,然后变为error.查看日志,是 timeout ...
- MySQL 存储过程常用SQL语句收集
1,select curdate() /*2016-10-08*/ 2,select date_sub(curdate(), INTERVAL 6 DAY) /*2016-10-02*/ 3,case ...
- 百度地图 ver2.0 api
百度地图JavaScript API是一套由JavaScript语言编写的应用程序接口,可帮助您在网站中构建功能丰富.交互性强的地图应用,支持PC端和移动端基于浏览器的地图应用开发,且支持HTML5特 ...
- JavaScript事件及BOM和DOM
1. 事件 1.1 事件绑定 # 写在html元素中<button onclick="code..."></div># 把事件当做元素对象的方法btnEl ...
- poj3984迷宫问题(dfs+stack)
迷宫问题 Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 35426 Accepted: 20088 Descriptio ...
- 汽车后市场:数据入口在哪里?不看你就OUT啦!
当前中国汽车后服务市场基本可分七个大类:包括养护.维修.改装.二手车.汽车配件.相关电商及金融保险等,汽车后市场整个产业链对数据服务都有刚性需求. 数据能为行业服务提高效率,提升商家对于客户以及业务的 ...
- 【JAVA】关于java中 类.class.getResource("/").getPath()获取路径有空格的问题
写了一个web工程,在本地测试正确,但是部署到服务器上就出现错误.原因是读取不到配置文件. 后来从打印出来的文件路径中发现是用Java的class.getResource("/") ...
- 初学Direct X (2)
初学Direct X (2) 这一次要学习如何现实位图,尽管看过对双缓冲机制还有很多疑问,但是这并不阻碍我对他的入门了解 Direct3D提供了一个双重/后台缓冲区,在调用CreateDevice之时 ...
- Python 的非正式介绍
在下面的例子中,通过提示符 (>>> 与 ...) 的出现与否来区分输入和输出:如果你想复现这些例子,当提示符出现后,你必须在提示符后键入例子中的每一个词:不以提示符开头的那些行是解 ...