python迭代器的原理及应用
''''
什么是迭代器?
迭代的工具
1.什么是迭代?
迭代是一个重复的过程,每一次重复都是基于上一次结果而进行的
while True:
print('hello world')
像上面做这种单纯的重复并不是迭代
2.为什么要用迭代器?
找到一种不依赖索引的迭代取值方式
3.怎么用迭代器? 可迭代对象:在python在,但凡内置有__iter__方法的数据类型或者对象都是可迭代对象
执行可迭代对象__iter__方法得到的返回值就是一个迭代器对象
迭代器对象是内置有__next__方法的
迭代器对象也内置有__iter__方法:执行该方法得到任然是迭代器本身
dic = {"a":1,"b":2,"c":3}
res = dic.__iter__()
print(res)
res2 = res.__iter__()
print(res2)
# <dict_keyiterator object at 0x0000020A90BE9458>
# <dict_keyiterator object at 0x0000020A90BE9458>
迭代器对象一定是可迭代对象
可迭代的对象不一定是迭代器对象 ls = [1,2,3]
res = ls.__iter__()
print(res)###3<list_iterator object at 0x000001BD59BC03C8>
print(res.__next__())
print(res.__next__())
print(res.__next__()) dic = {"a":1,"b":2,"c":3}
res = dic.__iter__()
print(res)###<dict_keyiterator object at 0x0000012E99889A98>
print(res.__next__())
print(res.__next__())
print(res.__next__())
##在PYTHON的语法中,字典应该是无序的,但是在python3的语法中,新加入了一种算法使得
字典看起来好像是有序的,但是我们要把他当做无序的对待
'''
###这种做法只能针对优势索引的数据类型:
# ls = [1,2,3,5,6,7]
# index = 0
# while index < len(ls):
# print(ls[index])
# index += 1 # a = 1
# b = 1.1
# c = []
# d = '123e'
# e = (1,2,3)
# f = {"name":124}
# c.__iter__()
# d.__iter__()
ls = [1,2,3]
res = ls.__iter__()
print(res)###3<list_iterator object at 0x000001BD59BC03C8>
print(res.__next__())
print(res.__next__())
print(res.__next__()) dic = {"a":1,"b":2,"c":3}
res = dic.__iter__()
print(res)###<dict_keyiterator object at 0x0000012E99889A98>
print(res.__next__())
print(res.__next__())
print(res.__next__()) print("=".center(100,'*'))
dic = {'k1':'v1','k2':'v2','k3':'v3'}
iter_obj = dic.__iter__()
while True:
try:
print(iter_obj .__next__())
except StopIteration:
break####捕捉异常,当没有出现except中的错误时,执行try中的代码
##for循环的底层运行机制:for循环可以称之为迭代器循环
##上面while的循环也就是下面for循环的底层运行机制,一样的功能
for k in dic:
print(k)
'''
1.先调用in 后面那个对象的__iter__方法,得到该可迭代的对象的迭代器对象
2.执行迭代器对象的__next__方法,将得到的返回值赋值给in 前面的变量名,然后执行一次循环体代码
3.循环往复,直到取干净迭代器内所有的值,自动捕捉异常结束循环
'''
##范例
# dic = {'k1':'v1','k2':'v2','k3':'v3'}
# # obj = dic.__iter__()
# #
# # print('第一次迭代取值')
# # for i in obj:
# # print(i)
# # print('第二次迭代取值')
# # for i in obj:
# # print(i)
#####结果:
# 第一次迭代取值
# k1
# k2
# k3
# 第二次迭代取值
#范例
dic = {'k1':'v1','k2':'v2','k3':'v3'}
obj = dic.__iter__() print('第一次迭代取值')
for i in obj:
print(i) obj = dic.__iter__()
print('第二次迭代取值')
for i in obj:
print(i)
##结果:
# 第一次迭代取值
# k1
# k2
# k3
# 第二次迭代取值
# k1
# k2
# k3 '''
总结迭代器的优缺点:
优点:
1,提供了一种不依赖索引的迭代取值方式
2,节省内存
缺点:
1,只能往后取,不能往前取,而且是一次性的,值取干净之后无法再取值,除非重新得到新的迭代器对象
不如按索引取值的方式灵活
2,值取不干净,永远无法预测迭代器的长度 现在我们使用的都是官方内部定义还的迭代器,在今后中,如果我们需要用到比较大的数据,可以用一个自定义的迭代器来实现,
而不是用列表或者文件字典等实现。这样更加节省内存,那么,如果自定义迭代器呢?
请看下一章节:生成器
'''
python迭代器的原理及应用的更多相关文章
- python学习Day14 带参装饰器、可迭代对象、迭代器对象、for 迭代器工作原理、枚举对象、生成器
复习 函数的嵌套定义:在函数内部定义另一个函数 闭包:被嵌套的函数 -- 1.外层通过形参给内层函数传参 -- 2.返回内部函数对象----> 延迟执行, 开放封闭原则: 功能可以拓展,但源代 ...
- Python 迭代器 & __iter__方法
转载来自: http://blog.csdn.net/bluebird_237/article/details/38894617 迭代器就是重复地做一些事情,可以简单的理解为循环,在python中实现 ...
- Python迭代器,可迭代对象,生成器
迭代器 迭代器(iterator)有时又称游标(cursor)是程式设计的软件设计模式,可在容器物件(container,例如链表或阵列)上遍访的界面,设计人员无需关心容器物件的内存分配的实现细节. ...
- python迭代器与iter()函数实例教程
python迭代器与iter()函数实例教程 发布时间:2014-07-16编辑:脚本学堂 本文介绍了python迭代器与iter()函数的用法,Python 的迭代无缝地支持序列对象,而且它还允许程 ...
- Python分布式爬虫原理
转载 permike 原文 Python分布式爬虫原理 首先,我们先来看看,如果是人正常的行为,是如何获取网页内容的. (1)打开浏览器,输入URL,打开源网页 (2)选取我们想要的内容,包括标题,作 ...
- Python: 迭代器与生成器小结
迭代器与生成器的区别: 1. 迭代器由Class对象创建. 生成器由包含yield表达的Function对象或者Generator Expression创建. 2. 迭代器的原理: (1)由Itera ...
- Python Socket通信原理
[Python之旅]第五篇(一):Python Socket通信原理 python Socket 通信理论 socket例子 摘要: 只要和网络服务涉及的,就离不开Socket以及Socket编 ...
- Python 迭代器和列表解析
Python 迭代器和列表解析 1)迭代器 一种特殊的数据结构,以对象形式存在 >>> i1 = l1.__iter__() >>> i1 = iter(l1) 可 ...
- Python迭代器,生成器--精华中的精华
1. 迭代器 迭代器是访问集合元素的一种方式.迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不会后退,不过这也没什么,因为人们很少在迭代途中往后退.另外,迭代器的一大 ...
随机推荐
- python 几个简单算法详解
一.冒泡排序 基本思想:它的思路很有特点循环,两两向后比较.它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作是重复地进行直到没有再需要交换,也就是说该数 ...
- Python垃圾回收机制--完美讲解!
转自: http://www.jianshu.com/p/1e375fb40506 先来个概述,第二部分的画述才是厉害的. Garbage collection(GC) 现在的高级语言如java,c# ...
- [CF542D]Superhero's Job
[CF542D]Superhero's Job 题目大意: 定义函数 \[ J(x) = \sum_{\substack{1 \leq k \leq x \\ k \mid x \\ \gcd \le ...
- Java 接口 新特性(Java8)
Java8新特性之接口增强 在Java7以及以前的版本中,接口里的方法都是抽象的,并且不存在静态方法,属性默认修饰符是public static final.所有方法的声明都是public [返回类型 ...
- hadoop2-hive
hadoop2-hive 1.What,Why,How? 1.Hive是数据仓库,在MySQL或其他关系型数据库中存放元数据信息,而把真正的Data存放在HDFS上面. 2.主要使用Hive来对历史数 ...
- jmeter--接口自动化jmeter+ant+jenkins
的 一.介绍 接口自动化工具:jmeter+ant+jenkins 流程: -1.jmeter已录制或手动设置好脚本后 -2.配置ant,使用Ant工具,进行批量执行jmeter的脚本 -3.使用Je ...
- HTML5_新标签
HTML5 是定义 HTML 标准的最新版本. 是一个新版本的 HTML 语言,具有新的元素,属性,行为, 是一个技术及,允许更多样化和强大的网站和应用程序 优势: 跨平台: 通吃 MAC PC Li ...
- ubuntu16.04 anaconda的安装和卸载
第一次安装: 1.直接从官网下载了anaconda安装包,然后bash ...sh安装. 2.过程中主要需要选择安装路径,为了把安装的软件都放在一起,我新建了一个install_software在系统 ...
- php 二维数组根据值进行排序
// 先获取要排序的值 $createTime = array_column($data, 'create_time'); // 排序成功 array_multisort($createTime, S ...
- php删除文件夹
function deldir($dir) { $dh=opendir($dir); while ($file=readdir($dh)) { if($file!="." & ...