博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
迭代器
阅读量:7222 次
发布时间:2019-06-29

本文共 3557 字,大约阅读时间需要 11 分钟。

http://www.cnblogs.com/wuyongqiang/p/6694800.html 写的很好!

 

迭代器是一次性的

1、之前用while循环和for迭代列表l

1
2
3
4
5
6
7
8
9
l
=
[
'a'
,
'b'
,
'c'
,
'd'
,
'e'
]
i
=
0
#用while循环打印出l
while 
i<
len
(l):
    
print
(l[i])
    
i
+
=
1
#用for循环打印出l
for 
in 
range
(
len
(l)):
    
print
(l[i])

2、可迭代对象(Iterable)

  先了解一下可迭代对象(Iterable),可以直接作用于for循环的对象统称为可迭代对象,有两种方法判断一个对象是否为可迭代对象:一是可以使用isinstance()判断一个对对象是否是Iterable对象(再用这个方法的时候一定记得调用模块);另一种是Python内置方法中有 .__iter__ 方法,如果能引用该方法的对象都是可迭代对象(.__iter__方法调用后的执行结果就是迭代器):

1
2
3
4
5
6
7
8
9
10
11
from 
collections 
import 
Iterable
print
(
isinstance
([],Iterable))
# True    列表是可迭代对象
print
(
isinstance
({},Iterable))
# True    字典是可迭代对象
print
(
isinstance
(
'abc'
,Iterable))
# True    字符串是可迭代对象
print
(
isinstance
((x 
for 
in 
range
(
10
)),Iterable))
# True    生成器是可迭代对象
print
(
isinstance
(
100
,Iterable))
# False    数字不是可迭代对象<br><br>
1
l
=
[
'a'
,
'b'
,
'c'
,
'd'
,
'e'
]<br>l.__iter__()
#能够调用__iter__说明l是可迭代对象<br>------------------------------------------<br>#重点是__iter__()函数的作用<br>l.__iter__()等同于调用iter(l)函数<br>我们把函数运行结果赋值给i即:<br>i=l.__iter__   或者  i=iter(l)<br>此时i就是迭代器,i就是迭代器,i就是迭代器

3、迭代器(Iterator)

  可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator 

  由定义就可以看出Iterator特性就是可以被next()调用所以判断是不是迭代器也同样有两种方法:

1
2
3
4
5
6
7
8
9
from 
collections 
import 
Iterator
print
(
isinstance
((x 
for 
in 
range
(
10
)), Iterator))
# True    生成器是迭代器
print
(
isinstance
([], Iterator))
# False    列表不是迭代器
print
(
isinstance
({}, Iterator))
# False    字典不是迭代器
print
(
isinstance
(
'abc'
, Iterator))
# False    字符串不是迭代器<br><br>
1
l
=
[
'a'
,
'b'
,
'c'
,
'd'
,
'e'
]<br>l不能调用.__next__方法,所以l不是迭代器

4、总结可迭代对象(Iterable)与迭代器(Iterator)的区别

  迭代器:  

      独有.__next__方法

      也有.__iter__方法

      迭代器.__iter__()后还是迭代器

  

  可迭代对象:

      有.__iter__方法

  补充:文件句柄既能被next()函数调用又能被iter()函数调用,所以文件既是迭代器,又是可迭代对象

     字符串,列表,元组,字典,集合都不是迭代器,是可迭代对象

     整形不是可迭代对象,所以更不可能是迭代器

5、迭代器while循环简单举例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
d
=
{
'a'
:
1
,
'b'
:
2
,
'c'
:
3
}
i
=
d.__iter__()
#i=iter(d)#和上面的等式一模一样   i就是迭代器
print
(i.__next__())
#等同于下面
print
(
next
(i))
#等同于上面
print
(i.__next__())
print
(i.__next__())
#因为字典中的key只有3个,所以在这里会报错,因为超出了范围
 
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
#报错内容是StopIteration,下面就一起消除这个报错吧
 
d
=
{
'a'
:
1
,
'b'
:
2
,
'c'
:
3
}
i
=
d.__iter__()
#这是一个iter函数,等同于iter(d)  i就是迭代器
#i=iter(d)#和上面的等式一模一样   i就是迭代器
while 
True
:                    
    
try
:   
#try...except捕捉异常,看是否出现StopIteration这个异常,如果出现执行break,相当于一个if判断
        
print
(
next
(i))
    
except 
StopIteration:
        
break
 
列表的例子:
 
l
=
[
'a'
,
'b'
,
'c'
,
'd'
,
'e'
]
i
=
l.__iter__()
# i=iter(i)
while 
True
:
    
try
:                        
#try...except捕捉异常
        
print
(
next
(i))
    
except 
StopIteration:
        
break
<br><br>文件的例子:
f=open("a.txt","r") i=f.__iter__() while True:     try:         print(next(i),end="")     except StopIteration:         break

6、迭代器for循环简单举例

1
2
3
4
5
6
7
8
9
10
11
12
13
d
=
{
'a'
:
1
,
'b'
:
2
,
'c'
:
3
}
for 
in 
d:
#for循环在这里做的事可以理解为 d=d.__iter__(),牛逼!
    
print
(k)
#而且for循环自动加了next()函数,自动next下一个,牛逼!
#而且for循环把while循环当中的try...except所做的是给做了,牛逼!
 
s
=
{
1
,
2
,
3
,
4
}
#for循环列表
for 
in 
s:
    
print
(i)
 
with 
open
(
"a.txt"
,
"r"
) as f:
    
for 
line 
in 
f:
        
print
(line,end
=
"") 

7、for循环与while循环小结

  上边的三个强大功能

  不是索引的取值就是迭代器方式的取值

  任何for循环能够完成的while循环都能够完成

8、为什么要用迭代器

  优点:1.迭代器提供了一种不依赖于索引的取值方式,这样就可以遍历那些没有索引的可迭代对象(比如字典,集合,文件) 

     2.迭代器与列表相比更节省内存,是惰性计算的,时刻保持内存中只有一条在运行

  缺点:1.永远无法获取迭代器的长度,使用不如列表索引取值灵活

     2.迭代器是一次性的,next()只能往后取值,取完就没有了,但是for一次就搞完了

9、为什么要把文件句柄设为一个迭代器

  因为Python是一门简洁的语言,列表,字符串,字典等等只能放到内存中,只有文件能永久保存,而且文件不排除有特别大的,为了避免内存炸掉把他作为一个可迭代对象,一点一点看,read应该就

转载于:https://www.cnblogs.com/jiangshitong/p/6697153.html

你可能感兴趣的文章
Android开发动画效果被遮掉的解决方法
查看>>
Apache2.2.17源码编译安装以及配置虚拟主机
查看>>
2017年开发语言排名
查看>>
读二进制表的显示 Binary Watch
查看>>
我的友情链接
查看>>
linux基础:10、基础命令(4)
查看>>
linux中强大的screen命令
查看>>
放开那个程序员
查看>>
构建高性能数据库缓存之Redis(一)
查看>>
测试驱动开发
查看>>
解决MySQL不允许从远程访问
查看>>
puppet介绍及基于httpd实例部署
查看>>
UML常用工具之三--RSA
查看>>
iis7 appcmd的基础命令及简单用法
查看>>
用脚本实现移动某目录下文件名符合指定规则的文件到另一个目录的功能
查看>>
关于SQL镜像配置报错
查看>>
终于找到解决方案了,Qt的Model/View Framework解析
查看>>
线程信息的获取和设置
查看>>
Databricks Scala 编程风格指南
查看>>
Tkinter,label内容随多选框变化
查看>>