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. 迭代器 迭代器是访问集合元素的一种方式.迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不会后退,不过这也没什么,因为人们很少在迭代途中往后退.另外,迭代器的一大 ...
随机推荐
- selenium之使用chrome浏览器测试(附chromedriver与chrome的对应关系表)
https://www.cnblogs.com/JHblogs/p/7699951.html
- 2017-10-22—光电二极管
光通信基本每天都会接触光电二极管,光模块说简单点就是电光转换和光电转换. 光传输模块在整体产品架构上则包括光学次模块(Optical Subassembly;OSA)及电子次模块(Electrical ...
- centos6.5安装nginx+python+uwsgi+django
nginx+uwsgi+django环境部署及测试 默认系统自带的python2.6.6 第一步(安装setuptools) wget https://pypi.python.org/packages ...
- [LeetCode] N-ary Tree Preorder Traversal N叉树的前序遍历
Given an n-ary tree, return the preorder traversal of its nodes' values. For example, given a 3-ary ...
- 黑盒测试实践——day05
一.任务进展情况 今天主要对web系统的“员工管理模块”和“招聘管理模块”进行测试.测试用例选取之前已经做好的excel文件. 二.存在的问题
- n&m位运算
在C/C++语言里,&代表取地址或者“位与”运算 1.取变量的地址:&变量名,这将获得该变量的地址,例:int a = 1, &p = a. 2.进行位与运算,格式是:变量1& ...
- 解决 AutoMapper ProjectTo 不起作用的问题
这两天在一个 ASP.NET Core 项目中遭遇了 AutoMapper ProjectTo 不起作用的奇怪问题,虽然在 ProjectTo 中指定了 DTO ,但 EF Core 生成的 SQL ...
- request之额外路径
谈到额外路径 ,首先要明白映射路径,映射路径是servlet处理的路径,在web.xml中配置.比如配置一个/emp的映射路径,意味着客户端可以通过http:+项目路径+/emp访问服务器的项目,而所 ...
- .net不同集合类型及使用场合
1.Dictionary-相当于字典[可以通过过索引(hash值)速添加.删除.查找]:如果需要非常快地添加.删除和查找项目,而且不关心集合中项目的顺序,那么首先应该考虑使用 System.Colle ...
- 动态规划 hdu 1024
Max Sum Plus Plus Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others ...