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. 迭代器 迭代器是访问集合元素的一种方式.迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不会后退,不过这也没什么,因为人们很少在迭代途中往后退.另外,迭代器的一大 ...
随机推荐
- 美团小程序框架mpvue蹲坑指南
美团小程序框架mpvue(花名:没朋友)蹲坑指南 第一次接触小程序大概是17年初,当时小程序刚刚内侧,当时就被各种限制折腾的死去活来的,单向绑定, 没有promise,请求数限制,包大小限制,各种反人 ...
- Round#534 div.2-B Game with string
唔,第一次参加,掉了好多分. http://codeforces.com/contest/1104/problem/B 不用考虑太多,string真的好厉害. #include<stdio.h& ...
- 理解ActivityManagerService
--摘自<Android进阶解密> *AMS家族* 1.Android 7.0的AMS家族 2.AMP和AMS进行通信 3.(Android 7.0)AMP是AMN的内部类,它们都实现了I ...
- web服务-3、epoll高效率实现并发服务器
知识点: 之前写的四种方法实现并发服务效率都还是低,早期的服务器采用的是select和poll方式,select这种方式的特点是轮询所有套接字去一个个看有没有事件发生,但是装套接字的列表长度是有限制的 ...
- Android Studio 常用快捷键及常用设置
Android Studio 常用快捷键及常用设置 一.常用快捷键 快捷键 描述 Ctrl + Alt + L 格式化代码 Ctrl + ( +/- ) 展开/折叠 代码块 Ctrl + Shift ...
- 微信小程序做radio,可以拖动进度条
很简单的一个音乐播放器 data:{ src: 'http://ws.stream.qqmusic.qq.com/M500001VfvsJ21xFqb.mp3?guid=ffffffff82def4a ...
- 开源搜索引擎solr elasticsearch学习计划
其实不单单是研究solr elasticsearch把,进行调研性技术学习时,应该制定一些目标以及里程碑.新的技术调研 学习是一件很爽的事,能学到新技术新东西.但是在学习新技术同时,有几个问题是需要我 ...
- Petrozavodsk Summer-2017. Warsaw U Contest
A. Connectivity 设$f[i][j]$为第$i$张图中$j$点所在连通块的编号,加边时可以通过启发式合并在$O(dn\log n)$的时间内维护出来. 对于每个点,设$h[i]$为$f[ ...
- EasyUI 分页 偶遇 问题
当 存在大量 重复 数据字段的 时候 entity.AsNoTracking().ToList().Skip((page.pageNumber - 1) * page.rows).Take(page. ...
- FJUT3260
不是啊..不是说双栈嘛,,怎么是个**题啊. 链接: http://120.78.128.11/Problem.jsp?pid=3260 从左到右扫一遍,把相交的区间扔到一起算,那么就变成了一 ...