迭代器:迭代的工具。迭代是更新换代,如你爷爷生了你爹,你爹生了你,迭代也可以说成是重复,并且但每一次的重复都是基于上一次的结果来的。如计算机中的迭代开发,就是基于软件的上一个版本更新。以下代码就不是迭代,它只是单纯的重复
while True:
print('*'*10)
一、可迭代对象
python中一切皆对象,如
x = 1
name = 'nick'
lis = [1, 2]
tup = (1, 2)
dic = {'name': 'nick'}
s1 = {'a', 'b'}
def func():
pass
f = open('49w.txt', 'w', encoding='utf-8)
对于这一切的对象中,但凡有__iter__
方法的对象,都是可迭代对象。
# x = 1.__iter__ # SyntaxError: invalid syntax
# 以下都是可迭代的对象
name = 'nick'.__iter__
lis = [1, 2].__iter__
tup = (1, 2).__iter__
dic = {'name': 'nick'}.__iter__
s1 = {'a', 'b'}.__iter__
f = open('49w.txt', 'w', encoding='utf-8')
f.__iter__
f.close()
1.1 总结
可迭代的对象:Python内置str、list、tuple、dict、set、file都是可迭代对象。
特点:
- 内置有
__iter__
方法的都叫可迭代的对象。
二、迭代器对象
只有字符串和列表都是依赖索引取值的,而其他的可迭代对象都是无法依赖索引取值的。因此我们得找到一个方法能让其他的可迭代对象不依赖索引取值。
在找到该方法前,首先我们给出迭代器对象的概念:可迭代的对象执行__iter__
方法得到的返回值。并且可迭代对象会有一个__next__
方法。
# 不依赖索引的数据类型迭代取值
dic = {'a': 1, 'b': 2, 'c': 3}
iter_dic = dic.__iter__()
print(iter_dic.__next__())
print(iter_dic.__next__())
print(iter_dic.__next__())
# print(iter_dic.__next__()) # StopIteration:
a
b
c
# 依赖索引的数据类型迭代取值
lis = [1, 2, 3]
iter_lis = lis.__iter__()
print(iter_lis.__next__())
print(iter_lis.__next__())
print(iter_lis.__next__())
# print(iter_lis.__next__()) # StopIteration:
1
2
3
上述的方法是非常繁琐的,我们可以使用while循环精简下。其中使用的try...except...
为异常处理模块,以后会详细讲解。
s = 'hello'
iter_s = s.__iter__()
while True:
try:
print(iter_s.__next__())
except StopIteration:
break
h
e
l
l
o
2.1 总结
迭代器对象:执行可迭代对象的__iter__
方法,拿到的返回值就是迭代器对象。
特点:
- 内置
__next__
方法,执行该方法会拿到迭代器对象中的一个值 - 内置有
__iter__
方法,执行该方法会拿到迭代器本身 - 文件本身就是迭代器对象。
缺点:
- 取值麻烦,只能一个一个取,并且只能往后取,值取了就没了
- 无法使用len()方法获取长度
三、for循环原理
for循环称为迭代器循环,in后必须是可迭代的对象。
lis = [1, 2, 3]
for i in lis:
print(i)
1
2
3
因为迭代器使用__iter__
后还是迭代器本身,因此for循环不用考虑in后的对象是可迭代对象还是迭代器对象。
由于对可迭代对象使用__iter__
方法后变成一个迭代器对象,这个迭代器对象只是占用了一小块内存空间,他只有使用__next__
后才会吐出一个一个值。如lis = [1,2,3,4,5,...]
相当于一个一个鸡蛋,而lis = [1,2,3,4,5,...].__iter__
相当于一只老母鸡,如果你需要蛋,只需要__next__
即可。
Python2中
print(range(10)) # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Python3中
print(range(10)) # range(0, 10)
ASP.NET页面与IIS底层交互和工作原理详解
深入理解 __doPostBack
DataList控件显示图片要的是效果
Below is a nice utility class for Enums
ExtensionMethods Class
showModalDialog中打开新页面Session丢失
Delegate,Action,Func,匿名方法,匿名委托,事件
异步编程:IAsyncResult异步编程模型 (APM)
C#线程系列讲座(1):BeginInvoke和EndInvoke方法
- 最新文章
-
.Net/C# 实现真正的只读的 Hashtable 类型的属性 (ReadOnly Hashtable Property)
VS.Net IDE 与 csc.exe 各自生成的 exe 在某些特殊情况下竟然有区别?!
我提了愚蠢的问题: 如何在 Codebehind 中访问 WebUserControl (.ascx)?
数据结构习作之应用 "栈(Stack)" 实现: 解析算术表达式及计算求值 (C#/Java) (技术含量少许)
.Net/C#: 利用反射编写通用的 rss 2.0 的 reader
TSQL: 17 个与日期时间相关的自定义函数(UDF),周日作为周的最后一天,均不受 @@DateFirst、语言版本影响
ArcGIS Server SOE服务器扩展错误解决【arcgis server10计算机名中不能有 横杠字符】
Oracle SQLPlus的使用和管理Oracle
linux下C语言编写的一个socket服务器.linux c的chm手册
ArcGIS shape文件 要素类包括点,面,折线,多点,多面数据表字段以及数据的查看,添加,删除,修改四大操作
- 热门文章
-
在CentOS6.0上配置Oracle数据库可以远程使用的远程配置。
ASP一个比较怪异的错误'80004005'
ArcGIS Server部署 services 和发布 Applications。以及部署本地 JavascriptAPI
C语言零碎记录之Linux下C语言关于时间的函数
在CentOS6.0上安装Oracle 11gR2 (11.2.0.1)以及基本的配置
坐标系
javascript判断浏览器 和 完美兼容IE和chrome的对联广告。
Linux C语言调用libxml2的库文件。格式化xml文件,让rootElement的闭合标签新起一行!
在CentOS6上 ArcSDE for Oracle11gR2安装与配置
关于ArcGIS的文件格式
Copyright © 2011-2022 走看看