4.5 迭代器
4.5.1 可迭代对象
**字面意思分析**:可以重复的迭代的实实在在的东西。
list,dict(keys(),values(),items()),tuple,str,set,range, 文件句柄(待定)
**专业角度**: **内部含有`__iter__`方法的对象,就是可迭代对象。**
**内置函数**:dir() print(dir(str))
判断一个对象是否是可迭代对象有以下两种方式:
#方法一
print('__iter__' in dir(list)) #输出True
#方法二
from collections import Iterable
l = [1,2,3,4]
s = 'asdf'
print(isinstance(l,Iterable))
print(isinstance(s,Iterable)) #输出True
优点:直观;操作方法多;
缺点:占用内存;除去索引和字典的key,不能迭代取值
4.5.2 迭代器iterator
字面意思:可重复迭代的工具
专业角度:含有__int__
和__next__
方法的对象就是迭代器
使用.__iter__()
和iter()
可以将可迭代对象转换成迭代器
#方法一:
s = 'asasasa'
a = iter(s)
s = 'asasasa'
a = iter(s)
item = a.__next__()
print(item)
item = a.__next__()
print(item)
item = a.__next__()
print(item)
item = a.__next__()
print(item)
#方法二:
l = [1,2,3,4]
l_iter = l.__iter__() #将可迭代对象转换成迭代器
item = l_iter.__next__()
print(item)
item = l_iter.__next__()
print(item)
item = l_iter.__next__()
print(item)
item = l_iter.__next__()
print(item)
迭代器遵循迭代器协议:必须拥有__iter__方法和__next__方法。
for循环,能遍历一个可迭代对象,他的内部到底进行了什么?
- 将可迭代对象转化成迭代器。(可迭代对象.iter())
- 内部使用__next__方法,一个一个取值。
- 加了异常处理功能,取值到底后自动停止。
利用while循环,模拟for循环内部循环可迭代对象的机制。
- 先要将可迭代对象转化成迭代器。
- 利用next对迭代器进行取值。
- 利用异常处理try一下防止报错。
l = [1,2,3,4,5,6]
count = 0
ite = iter(l)
while 1:
try : #try是一个问题处理机制,配合except返回的错误来终止循环
print(next(ite))
except StopIteration:
break
for循环就是基于迭代器协议提供了一个统一的可以遍历所有对象的方法,即在遍历之前,先调用对象的__iter__方
法将其转换成一个迭代器,然后使用迭代器协议去实现循环访问,最重要的一点,转化成迭代器,在循环时,同一时
刻在内存中只出现一条数据,极大限度的节省了内存。
迭代器的优点:
·非常节省内存
·惰性机制
迭代器的缺点:
·不直观
·操作不灵活
·效率相对低