迭代器解决了不依赖索引取值的问题
一、可迭代对象
特征: 有__iter__()
方法的对象就是可迭代对象
x = 1 # 不可迭代对象
s = 'nick' # 可迭代对象
lt = [1, 2, 3] # 可迭代对象
dic = {'a': 1, 'b': 2} # 可迭代对象
tup = (1,) # 可迭代对象,元组只有一个元素必须得加逗号
se = {1, 2, 3} # 可迭代对象
f = open('time.py') # 可迭代对象
def func(): # 不可迭代对象
pass
总结:除了数字类型和函数之外Python内置str、list、tuple、dict、set、file都是可迭代对象
二、迭代器对象
只有字符串和列表都是依赖索引取值的,而其他的可迭代对象都是无法依赖索引取值的。因此我们得找到一个方法能让其他的可迭代对象不依赖索引取值。
特征: 具有__iter__()
以及__next__()
方法的叫做迭代器对象
s = 'nick' # 可迭代对象,不属于迭代器对象
lt = [1, 2, 3] # 可迭代对象,不属于迭代器对象
dic = {'a': 1, 'b': 2} # 可迭代对象,不属于迭代器对象
tup = (1,) # 可迭代对象,不属于迭代器对象
se = {1, 2, 3} # 可迭代对象,不属于迭代器对象
f = open('time.py') # 可迭代对象,迭代器对象
def func(): # 不可迭代对象,不属于迭代器对象
pass
总结:只有文件是迭代器对象
三、for循环原理
for循环 == 迭代循环
lt = [1,2,3]
lt_iter = lt.__iter__()
# li_iter = iter(lt) # iter(lt) 和 lt.__iter__() 功能相同,都可以使用
while 1:
try:
print(lt_iter.__next__())
# print(next(lt_iter)) # next(lt_iter) 和 lt_iter.__next__() 功能相同,都可以使用
except StopIteration:
break
总结:
- (可迭代对象/迭代器对象)可以用
__iter__()
方法转换成迭代器对象 - 使用
__next__()
取出迭代器里的所有值 - 使用
__next__()
方法取尽迭代器中的所有值,一定会报错,通过异常捕捉退出while循环
可迭代对象: 具有__iter__()
方法的对象就是可迭代对象,除了数字类型和函数都是可迭代对象
迭代器对象: 具有__iter__()
和__next__()
方法的都是迭代器对象,只有文件是迭代器对象
迭代器对象一定是可迭代对象; 可迭代对象不一定是迭代器对象