什么是迭代器:
迭代是一个重复的过程,每一次重复都是基于上一次的结果而来的(单纯的重复并不是迭代)
为什么要用迭代器:
基于索引的迭代器取值方式只适用于列表,元组,字符串类型,而对于没有索引的字典,集合,文件则不能通过索引取值。
而迭代器是一种通用的不依赖于索引的迭代器取值方式
迭代器适用于可迭代的数据类型
可迭代的对象包含(即可以调用python内置_iter_方法的对像):
1.字符串
2.类表
3.元祖
4.字典
5.集合
迭代器对象:(指即内置有_iter_方法也有_next_方法)
执行迭代对象的_iter_方法---------》》》得到的就是内置的就是迭代器对象
(迭代器一旦取值干净,再继续取就会抛出StopIterable错误)
迭代器对象一定是可迭代对象
文件不用转本身就是迭代器对象
例如1:字典通过转成迭代器对象取值
dic={'a':1,'b':2,'c':3}
dic_iter=dic.__iter__()
print(dic_iter.__next__()) # a
print(dic_iter.__next__()) # b
print(dic_iter.__next__()) # c
例如2:
user={'name':'yangzhizong','age':21,}
info=user.__iter__()
k1=info.__next__()
print(k1)
k2=info.__next__()
print(k2)
例如3:
另外一种方式通过while循环取值,并且限定取值结束后自动结束
user={'name':'yangzhizong','age':21,}
info=user.__iter__()
while True:
try:
print(info.__next__())
except StopIteration:
break
重点:其实for循环的工作原理,就是基于迭代器工作的
in后面跟的一定要是可迭代的对象,进而拿到迭代器对象
user={'name':'yangzhizong','age':21,'hobbies':'study'}
for k in user: #user_iter=user_iter_()
print(k)
执行迭代器对象的_next_得到的是迭代器的下一个值
执行迭代器对象的_iter_得到的仍是迭代器本身
(为了把for循环统一起来,in后面不用判断是可迭代对象还是迭代器对象(文件))
优点:
1.提供一种统一的、不依赖于索引的迭代方式
2.惰性计算,节省内存
缺点:
1.无法获取长度(只有在next完毕才知道到底有几个值)
2.一次性的,只能往后走,不能往前退
l=['a','b','c','d']
l1=l.__iter__()
print(list(l1)) #第一次会把l里面的参数全部取出,后面就不会再取
print(list(l1)) #为空
print(l)
s=[1,2,3,4]
print(s.__len__())
print(len(s)) #可以简化书写方式
name=['a','b','c']
iter_name=iter(name) #可以简化书写方式
print(next(iter_name))