可迭代对象iterable:
- 对象字面意思:Python中一切皆对象。一个实实在在存在的值。
- 可迭代:更新迭代。迭代是一个重复的过程,每次重复是基于上一次的结果而继续的,每次都有新的内容。
- 可迭代对象:可以进行循环更新的一个实实在在的值。
- 专业角度:内部含有'_ iter _'方法的对象。
- 目前学过的可迭代对象:
str,list,tuple,dic,set,range()。
获取一个对象的所有方法:dir()
-
dir():将所有方法以字符串的方式,放在一个列表中,返回这个列表。
# 例: s = 'abc'
print(dir(s)) -
判断一个对象是否是可迭代对象:'_iter_' in dir()
例:s = 'abc'
print('__iter__' in dir(s)) # 返回 True 即表示'__iter__'在这个列表中,此对象为可迭代
可迭代对象优点:
- 1.存储的数据能直接显示,比较直观。
- 2.拥有的方法比较多,操作方便。
缺点:
- 1.占内存
- 2.不能直接通过for循环,只能通过索引,key取值
注: for循环能进行取值是因为在底层做了转换,将可迭代对象转换成迭代器,然后取值。
迭代器对象iterator:
- 字面意思:可迭代取值的工具(数据结构)。
- 专业角度:内部含有' _ _iter_ _'方法并且含有'_ _next_ _' 方法的对象就是迭代器。
- 比如:文件句柄。
# 判断是否是迭代器:
'__iter__' in dir(对象) and '__next__ in dir(对象)
可迭代对象转换成迭代器:
s = 'abc'
obj = iter(s) # 将s转换为迭代器,也可用 s.__iter__()
print(obj) # <str_iterator object at 0x0000000001E1B040>
print(next(obj)) # a 对迭代器进行取值
print(next(obj)) # b 执行一次取一个值
print(next(obj)) # c 多一个next会报错 StopIteration
迭代器调用iter()方法得到的是迭代器本身,这样做是使for循环的工作机制一致
for 循环工作机制(也可称之为迭代器循环):
1、调用iter()方法得到一个可迭代对象
2、迭代器对象调用next()得到一个返回值,将该值赋值给变量.
-
3、循环步骤2,直到抛出Stopiteration异常,for循环会捕捉异常然后停止循环
d = {'a':1,'b':2,'c':3}
for i in d: # for会将d调用iter()方法,若d本身为迭代器,那么调用iter方法相当于迭代器本身
print(i)- list() 原理同for循环
迭代器优点:
- 1.节省内存
- 迭代器在内存中相当于只占一个数据的空间:因为每次取值上一条数据会在内存中释放,再加载当前的此条数据。
- 2.惰性机制
- next一次取一个值,绝不多取值。
迭代器缺点:
- 1.速度慢,以时间换空间。
- 2.只能往下取值,不走回头路
- 3.不直观。操作方法单一。
while循环模拟for循环对可迭代对象进行取值的机制:
# while循环也称为条件循环
li = [11,22,33,44,55,66,77,88]
obj = iter(li)
while 1:
try:
print(next(obj))
except StopIteration:
break