目录://www.greatytc.com/p/863c446364a8
一、迭代
1、迭代:
在Python中,如果给定一个list或tuple,我们可以通过for循环来遍历这个list或tuple,这种遍历我们成为迭代(Iteration)。
2、可迭代对象:
(1)、定义
字面意思:可以进行循环更新的一个实实在在的值。
专业角度:内部含有'__iter__'方法的对象。
我们之前学过的可迭代对象有:列表、字符串、元组、字典,集合、range、文件。
(2)、获取对象的所有方法并且以字符串的形式表现:dir()
st1="python"
li1=[1,2,3]
print(dir(st1)) #这是将会运行出st1所有的方法
print(dir(li))
(3)、判断一个对象是否是可迭代对象
st1="python"
print('__iter__' in dir(st1)) #判断st1是否为可迭代对象
print('__iter__' in dir(range(10))) #判断range(10)是否为可迭代对象
运行结果为:
True
True #当对象为可迭代对象是返回True
或者
from collections import Iterable #判断之前需导入内置库
s='hello'
print(isinstance(s,Iterable)) #判断是不是可迭代对象
运行结果为:
True
(4)、可迭代对象的优缺点
优点:
1、存储的数据直接能显示,比较直观。
2、拥有的方法比较多,操作方便。
缺点:
1、占用内存
2、不能直接通过for循环,不能直接取值(索引,key)
二、迭代器
1、定义:
内部含有'__iter__'方法并且含有'__next__'方法的对象就是迭代器。
2、判断是否为迭代器:
'__iter__'and '__next__'在不在dir(对象)(我们之前学过的迭代器只有文件)
f=open("1.txt","r")
print('__iter__'in dir(f)and '__next__'in dir(f))
运行结果为:
True
3、可迭代对象可以转换为迭代器
st1="python"
obj=iter(st1) #将st1转换为迭代器
print(obj) #输出的结果是字符串迭代器对象的地址
运行结果为:
<str_iterator object at 0x03716CB0>
##当st1为迭代器时就可以用'__next__'方法了
print(next(obj)) #注意这时是把obj作为一个迭代器,并不是st1,st1还是可迭代对象。
运行结果为:
p #运行一次next方法就输出一次字符,直到字符串中所有字符全部输出时,再
次运行就会报错。
print(next(obj))
print(next(obj))
print(next(obj))
print(next(obj))
print(next(obj)) #这时字符全部输出
print(next(obj)) #这时在print时就会报错
报错为:
print(next(obj))
StopIteration
4、遍历可迭代对象和遍历迭代器的区别:
#可迭代对象
li=[1,2,3,4,5,6,7,,8,9,10]
count=0
for i in li:
if count ==4:
break
else:
print(i)
count +=1
count=0
for i in li:
if count ==6:
break
else:
print(i)
count +=1
运行结果为:
1 2 3 4 1 2 3 4 5 6
#迭代器
li=[1,2,3,4,5,6,7,,8,9,10]
obj=iter(li)
for i in range(4):
print(next(obj))
for i in range(6):
print(next(obj))
运行结果为:
1
2
3
4
5
6
7
8
9
10
当我们遍历可迭代对象时,每一次循环都会开头遍历。而当我们遍历迭代器时,会接着上次执行到的位置再次执行。
5、迭代器的优缺点:
优点:
1、节省内存
2.、惰性机制,next一次,去一个值。
缺点:
1、速度慢
2、不走回头路
6、迭代器和可迭代对象的对比:
可迭代对象是一个操作方法比较多,比较直观,存储数据相对少的一个数据集。
当你侧重于对于数据可以灵活处理,并且内存空间足够,将数据集设置为可迭代对象是明确的选择。
迭代器是一个非常节省内存,可以记录取值位置,可以直接通过循环+next方法取值,但是不直观,操作方法比较单一的数据集。
当你的数据量过大,大到足以撑爆你的内存或者你以节省内存为首选因素时,将数据集设置为迭代器是一个不错的选择。
7、while模拟for的内部循环机制:
for循环的循环对象一定要是可迭代对象,但是这不意味着可迭代对象就可以取值,因为for循环的内部机制是:将可迭代对象转换成迭代器,然后利用next进行取值,最后利用异常处理处理StopIteration抛出的异常。
l1 = [1, 2, 3, 4, 5, 6]
# 1 将可迭代对象转化成迭代器
obj = iter(l1)
# 2,利用while循环,next进行取值
while 1:
# 3,利用异常处理终止循环
try:
print(next(obj))
except StopIteration:
break