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. 迭代器 迭代器是访问集合元素的一种方式.迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不会后退,不过这也没什么,因为人们很少在迭代途中往后退.另外,迭代器的一大 ...
随机推荐
- [数据结构] 快速排序C语言程序
//由大到小//快速排序(待排序数组,左侧起点,右侧起点) void quickSort(int *array, int l, int r) { if ( l >= r) return; int ...
- [PA2014]Budowa
[PA2014]Budowa 题目大意: 有A和B两名候选人.共有\(n(n\le1000)\)个人参加投票.他们之间形成了一个树结构,树上的结点有两种身份:专家(叶子结点)或领导(非叶子结点).每位 ...
- Ubuntu安装并使用sogou输入法
1.下载搜狗输入法的安装包 下载地址为:http://pinyin.sogou.com/linux/ ,如下图,要选择与自己系统位数一致的安装包,我的系统是64位,所以我下载64位的安装包 2.按键C ...
- 【安全性测试】Android测试中的一点小发现
在执行某个项目中的APP测试发现的两个问题,自然也是提供参考,作为经验记录下来. 一.通过apk的xml文件获取到某项目APP的账号和密码 使用eclipsel或者drozer,获得apk的xml文件 ...
- css样式兼容各个浏览器时的部分总结
[本文基本是在网络转发过来的,网站就忘记了,这文本都是保存在自己电脑本地的,还有些自己添加了些内容,这内容还会有不断的完善和更行的] 什么是浏览器兼容:当我们使用不同的浏览器(Firefox IE7 ...
- 【java】i++与++i、i--运算
package test; //i++与--i运算 public class test { public static void main(String[] args) { int b=0; int ...
- 关于redis分布式锁实现原理
具体详情 http://www.cnblogs.com/SUNSHINEC/p/8302540.html
- Dynamics365 WebAPI ADFS token 获取
public class CrmAuth { ///<summary> /// Token /// </summary> public string access_token ...
- 如何设置 jenkins 任务执行的历史记录在左侧显示的格式?
java -jar I:\CDC\jenkins\jenkins-cli.jar -s http://$ENV:MasterHost.us.oracle.com set-build-display-n ...
- day28:hashlib
1,继续上一小节,讲解双下内置方法,双下getitem,setitem,delitem方法,是对象可以像字典一样的来访问属性 # 普通的字典是像下面这样操作的 dic = {'k' : 'v'} di ...