''''
什么是迭代器?
迭代的工具
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迭代器的原理及应用的更多相关文章

  1. python学习Day14 带参装饰器、可迭代对象、迭代器对象、for 迭代器工作原理、枚举对象、生成器

    复习 函数的嵌套定义:在函数内部定义另一个函数 闭包:被嵌套的函数 -- 1.外层通过形参给内层函数传参 -- 2.返回内部函数对象---->  延迟执行, 开放封闭原则: 功能可以拓展,但源代 ...

  2. Python 迭代器 & __iter__方法

    转载来自: http://blog.csdn.net/bluebird_237/article/details/38894617 迭代器就是重复地做一些事情,可以简单的理解为循环,在python中实现 ...

  3. Python迭代器,可迭代对象,生成器

    迭代器 迭代器(iterator)有时又称游标(cursor)是程式设计的软件设计模式,可在容器物件(container,例如链表或阵列)上遍访的界面,设计人员无需关心容器物件的内存分配的实现细节. ...

  4. python迭代器与iter()函数实例教程

    python迭代器与iter()函数实例教程 发布时间:2014-07-16编辑:脚本学堂 本文介绍了python迭代器与iter()函数的用法,Python 的迭代无缝地支持序列对象,而且它还允许程 ...

  5. Python分布式爬虫原理

    转载 permike 原文 Python分布式爬虫原理 首先,我们先来看看,如果是人正常的行为,是如何获取网页内容的. (1)打开浏览器,输入URL,打开源网页 (2)选取我们想要的内容,包括标题,作 ...

  6. Python: 迭代器与生成器小结

    迭代器与生成器的区别: 1. 迭代器由Class对象创建. 生成器由包含yield表达的Function对象或者Generator Expression创建. 2. 迭代器的原理: (1)由Itera ...

  7. Python Socket通信原理

    [Python之旅]第五篇(一):Python Socket通信原理   python Socket 通信理论 socket例子 摘要:  只要和网络服务涉及的,就离不开Socket以及Socket编 ...

  8. Python 迭代器和列表解析

    Python 迭代器和列表解析 1)迭代器 一种特殊的数据结构,以对象形式存在 >>> i1 = l1.__iter__() >>> i1 = iter(l1) 可 ...

  9. Python迭代器,生成器--精华中的精华

    1. 迭代器 迭代器是访问集合元素的一种方式.迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不会后退,不过这也没什么,因为人们很少在迭代途中往后退.另外,迭代器的一大 ...

随机推荐

  1. centos没有可用软件包 libgtk2

    在编写一个C程序,使用基于文本的终端图形编程库(curses)或图形界面(QT/GTK),分窗口显示三个并发进程的运行,因为centos并未安装gtk,所以运行命令行安装gtksudo yum -y ...

  2. C# 数据为空,不能对NULL调用此方法或属性的解决办法

    在运行C#项目时,报出了以下错误,错误原因是数据库中的值为null时,查询时会触发该错误提示 部分源代码如下: public List<Student> findData2() { ; / ...

  3. 设备唯一标识方法(Unique Identifier):如何在Windows系统上获取设备的唯一标识 zz

    原文地址:http://www.vonwei.com/post/UniqueDeviceIDforWindows.html 唯一的标识一个设备是一个基本功能,可以拥有很多应用场景,比如软件授权(如何保 ...

  4. H5实现全屏与F11全屏

    最近做项目用到全屏,现总结一下全屏: 1.局部全屏:H5全屏和F11有区别,在这种情况下判断全屏只需要通过H5全屏属性,无论全屏后有无滚动条都可判断. /** * [isFullscreen 判断浏览 ...

  5. 执行Android后台任务的最佳实践

    灵活执行后台任务可以帮助提升应用性能,并最小化电量损耗. Android后台任务主题包含以下三个子主题: 1. 在IntentService中执行后台任务: 2. 使用CursorLoader在后台加 ...

  6. X Open Cup named after E.V. Pankratiev. European Grand Prix

    A. Arithmetic Rectangle 对于一行或者一列的情况可以递推求出最大值. 对于至少一行或者一列的情况,可以定义四个格子一组横向和纵向的相等关系,然后悬线法求最大子矩阵. 时间复杂度$ ...

  7. goroutine 和线程的区别

    好久没写点儿啥了,强行更新一下. 1,从使用上讲 1,goroutine 比线程更轻量级,可以创建十万.百万不用担心资源问题. 2,goroutine 和 chan 搭配使用,实现多线程.高并发 实现 ...

  8. python之面向对象深入探测

    一 __doc__ 表示类的描述信息 #!/usr/bin/env python # -*- coding: utf-8 -*- class C: """ 这是个大美女 ...

  9. 变量类型-Tuple

    教程:一:元组的创建        元组(tuple)与列表类似,不同之处在于元组的元素不能修改    (1)tuple写在圆括号之间,元素用逗号隔开    (2)元组元素的类型可以不同    (3) ...

  10. swust oj 971

    统计利用先序遍历创建的二叉树的深度 10000(ms) 10000(kb) 3331 / 8436 利用先序递归遍历算法创建二叉树并计算该二叉树的深度.先序递归遍历建立二叉树的方法为:按照先序递归遍历 ...