可迭代对象
1. 什么是迭代
迭代即更新换代 每次更新都必须依赖于上一次的结果(与递归差不多)
迭代其实就是给我们提供了一种不依赖索引取值的方式
2. 可迭代对象判断方法
内置有__iter__方法的都称之为可迭代对象
内置方法可通过局点符'.'查看
"""
针对双下滑线开头 双下滑线结尾的方法 最为专业标准的读法为
双下+方法名
"""
3. 可迭代对象有哪些
"""
含有__iter__的有
字符串 列表 字典 元组 集合 文件对象
上述通常为可迭代对象
"""
d = {'username':'jason','pwd':123} # 有
print(d)
print(d.__iter__()) # 等价于调用了一个内置方法 d.get()
print(iter(d))
print(d.__len__())
print(len(d))
"""
可迭代对象调用__iter__方法会变成迭代器对象
__iter__方法在调用的时候还有一个简便的写法iter()
一般情况下所有的双下方法都会有一个与之对应的简化版本 方法名()
"""
迭代器对象
"""
迭代器对象
即含有__iter__方法 又含有__next__方法
如何生成迭代器对象
让可迭代对象执行__iter__方法
文件对象本身即是可迭代对象又是迭代器对象
迭代器对象无论执行多少次__iter__方法 还是迭代器对象(本身)
迭代器给我们提供一种了不依赖于索引取值的方式
"""
l = [111,222,333,444] # 可迭代对象
res = l.__iter__() # 迭代器对象 也可以用 iter(l)
print(res.__next__()) # 111 迭代取值
print(next(res)) # 222
'迭代器取完值之后再取就会报错'
注意:
print(l.__iter__().__next__()) # 111
print(l.__iter__().__next__()) # 111
print(l.__iter__().__next__()) # 111
'''这里每次都是形成了一个新的迭代器再进行取值的,并不是一个迭代器中取值'''
for循环的本质
l1 = [1,2,3,4,5,6,7,8,9,11,22,33,44,55]
# 循环打印出列表中每个元素 但是不能使用for循环
# 1.先将列表转为迭代器对象
res = l1.__iter__()
# 2.循环执行__next__取值
while True:
try:
print(res.__next__())
except StopIteration as e:
break
# 虽然取完值之后会报错,但是还是可以将值全部取出来
"""
for循环内部原理
1.将关键字in后面的数据先调用__iter__方法转为迭代器对象
2.循环执行__next__方法
3.取完之后__next__会报错 但是for循环会自动捕获该错误并处理
res = 数据.__iter__()
while True:
检测代码是否会报错
res.__next__()
如果报错了则自动处理掉并结束while循环
"""
迭代取值与索引取值对比
'''
迭代取值
优点:
1.不依赖于索引的一种通用取值方式
缺点:
1.取值的顺序永远都是固定的从左往右
索引取值
优点:
1.可以重复取值
缺点:
1.需要提供容器类型才可以取值(不是一种通用的取值方式)
'''