【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. 可以在局部作用域声明一 ...
随机推荐
- IoC 依赖注入容器 Unity
原文:IoC 依赖注入容器 Unity IoC 是什么? 在软件工程领域,“控制反转(Inversion of Control,缩写为IoC)”是一种编程技术,表述在面向对象编程中,可描述为在编译时静 ...
- Codevs1332_上白泽慧音_KEY
题目传送门 裸的模板题,Tarjan求联通量. code: #include <cstdio> #include <vector> #define min(a,b) a< ...
- BZOJ1228: [SDOI2009]E&D(打表SG)
Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 983 Solved: 583[Submit][Status][Discuss] Descriptio ...
- 成都Uber优步司机奖励政策(1月27日)
滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...
- java 类装饰
package TestIo; public class Test8 { public static void main(String[] args) { System.out.println(&qu ...
- Python-内置函数3
'''1.lambda 声明一个匿名函数,并且自动给你返回值2.map()3.float()4.globals()5.locals()6.input()7.print()8.int()9.int()1 ...
- iOS SSL Pinning 保护你的 API
随着互联网的发展,网站全面 https 化已经越来越被重视,做为 App 开发人员,从一开始就让 API 都走 SSL 也是十分必要的.但是光这样就足够了吗? SSL 可以保护线上 API 数据不被篡 ...
- 使用git bash编译安装sysbench时遇到的坑
Preface When I was compiling the sysbench just now,I encountered some failures in the preced ...
- hdu1051 Wooden Sticks(贪心+排序,逻辑)
Wooden Sticks Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Tot ...
- Qt 独立运行时伴随CMD命令窗口
用Qt写了一个小软件,在把程序release后,打包分装后,发现程序运行的时候会伴随cmd命令窗口,可把我愁怀了 不过功夫不负有心人,在老师和我网友的帮助下,终于搞完了 CONFIG:指定工程配置和编 ...