下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
了解Python数据结构迭代对象、迭代器、生成器的概念在了解Python的数据结构时,容器(container)、可迭代对象(iterable)、迭代器(iterator)、生成器(generator)、列表/集合/字典推导式(list,set,dictcomprehension)众多概念参杂在一起,难免让初学者一头雾水,我将用一篇文章试图将这些概念以及它们之间的关系捋清楚。容器(container)容器是一种把多个元素组织在一起的数据结构,容器中的元素可以逐个地迭代获取,可以用in,notin关键字判断元素是否包含在容器中。通常这类数据结构把所有的元素存储在内存中(也有一些特例,并不是所有的元素都放在内存,比如迭代器和生成器对象)在Python中,常见的容器对象有:
list,deque,....
set,frozensets,....
dict,defaultdict,OrderedDict,Counter,....
tuple,namedtuple,…
str容器比较容易理解,因为你就可以把它看作是一个盒子、一栋房子、一个柜子,里面可以塞任何东西。从技术角度来说,当它可以用来询问某个元素是否包含在其中时,那么这个对象就可以认为是一个容器,比如list,set,tuples都是容器对象:
>>>assert1in[1,2,3]#lists
>>>assert4notin[1,2,3]
>>>assert1in{1,2,3}#sets
>>>assert4notin{1,2,3}
>>>assert1in(1,2,3)#tuples
>>>assert4notin(1,2,3)询问某元素是否在dict中用dict的中key:
>>>d={1:'foo',2:'bar',3:'qux'}
>>>assert1ind
>>>assert'foo'notind#'foo'不是dict中的元素询问某substring是否在string中:
>>>s='foobar'
>>>assert'b'ins
>>>assert'x'notins
>>>assert'foo'ins尽管绝大多数容器都提供了某种方式来获取其中的每一个元素,但这并不是容器本身提供的能力,而是可迭代对象赋予了容器这种能力,当然并不是所有的容器都是可迭代的,比如:Bloomfilter,虽然Bloomfilter可以用来检测某个元素是否包含在容器中,但是并不能从容器中获取其中的每一个值,因为Bloomfilter压根就没把元素存储在容器中,而是通过一个散列函数映射成一个值保存在数组中。可迭代对象(iterable)刚才说过,很多容器都是可迭代对象,此外还有更多的对象同样也是可迭代对象,比如处于打开状态的files,sockets等等。但凡是可以返回一个迭代器的对象都可称之为可迭代对象,听起来可能有点困惑,没关系,先看一个例子:
>>>x=[1,2,3]
>>>y=iter(x)
>>>z=iter(x)
>>>next(y)
1
>>>next(y)
2
>>>next(z)
1
>>>type(x)
>>>type(y)这里x是一个可迭代对象,可迭代对象和容器一样是一种通俗的叫法,并不是指某种具体的数据类型,list是可迭代对象,dict是可迭代对象,set也是可迭代对象。y和z是两个独立的迭代器,迭代器内部持有一个状态,该状态用于记录当前迭代所在的位置,以方便下次迭代的时候获取正确的元素。迭代器有一种具体的迭代器类型,比如list_iterator,set_iterator。可迭代对象实现了__iter__方法,该方法返回一个迭代器对象。当运行代码:
x=[1,2,3]
foreleminx:
...实际执行情况是:反编译该段代码,你可以看到解释器显示地调用GET_ITER指令,相当于调用iter(x),FOR_ITER指令就是调用next()方法,不断地获取迭代器中的下一个元素,但是你没法直接从指令中看出来,因为他被解释器优化过了。
>>>importdis
>>>x=[1,2,3]
>>>dis.dis('for_inx:pass')
10SETUP_LOOP14(to17)
3LOAD_NAME0(x)
6GET_ITER
>>7FOR_ITER6(to16)
10STORE_NAME1(_)
13JUMP_ABSOLUTE7
>>16POP_BLOCK
>>17LOAD_CONST0(None)
20RETURN_VALUE迭代器(iterator)那么什么迭代器呢?它是一个带状态的对象,他能在你调用next()方法的时候返回容器中的下一个值,任何实现了__iter__和__next__()(pyt
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年度某学校门窗安装工程承包劳务合同
- 2024年度化学品仓储安全承包合同
- 2024年度旅游度假区标识标牌安装合同
- 2024年度建筑施工合同变更合同
- 2024年度工业废弃物回收服务合同
- 2024年度电子政务系统设计与实施合同
- 2024年度人力资源服务合同:人力资源公司为某企业提供人才招聘和培训服务
- 2024年度技术转让合同:某高科技公司技术成果转让合同
- 2024年度物流仓储服务合同(服务内容和仓储地点)
- 2024年度工程采购合同的复杂条款解析
- 电气控制及可编程控制技术
- 老年社会工作PPT全套教学课件
- 双减背景下小学数学作业设计研究共5篇范文
- 急性缺血性脑卒中血管内治疗流程图
- 高中英语高考读后续写动作描写素材(手上动作+脚上动作+笑的动作)
- 浅谈学科核心素养视角下的高中化学教学策略获奖科研报告-2
- 2022-2023学年天津市高二(上)期末物理试卷、答案解析(附后)
- 大众Polo 2016款说明书
- 易制毒化学品仓储管理制度
- DB32T 4301-2022装配式结构工程施工质量验收规程(修订)
- 建筑施工扣件式钢管脚手架安全技术规范JGJ-130-2011
评论
0/150
提交评论