迭代器
一、引入迭代器
有一个列表l=['a','b','c','d','e'],我想取列表中的内容,有几种方式?
1. 索引取值l[0],
2. 用for循环来取值两种取值区别:
索引取值l[0],其次我们是不是还可以用for循环来取值
用for循环来取值,我们把每一个值都取到,不需要关心每一个值的位置,因为只能顺序的取值,并不能跳过任何一个直接去取其他位置的值
二、为什么要有迭代器
迭代: 可以将某个数据集内的数据“一个挨着一个的取出来”,就叫做迭代。
迭代器: 不依赖于索引的迭代方式,这就是迭代器。对于序列类型:字符串、列表、元组,我们可以使用索引的方式迭代取出其包含的元素。但对于字典、集合、文件等类型是没有索引的,若还想取出其内部包含的元素,则必须找出一种不依赖于索引的迭代方式
# 1. 可迭代对象:指的是内置有__iter__方法的对象,即obj.__iter__,如下 'hello'.__iter__ (1,2,3).__iter__ [1,2,3].__iter__ {'a':1}.__iter__ {'a','b'}.__iter__ open('a.txt').__iter__ # 2. 迭代器对象:可迭代对象执行obj.__iter__()得到的结果就是迭代器对象,而迭代器对象指的是即内置有__iter__又内置有__next__方法的对象 文件类型是迭代器对象 open('a.txt').__iter__() open('a.txt').__next__() # 迭代器对象一定是可迭代对象,而可迭代对象不一定是迭代器对象
四、for循环迭代器
4.1 while True循环的问题
# 直接用while True循环在迭代器对象中通过__iter__()取值,终究会有取空的时候,取空再取值,会报StopIteriation异常 ls = [1,2,3,4,5] iter_ls = ls.__iter__() while True: try: print(iter_ls.__next__()) except StopIteration: print('取完了') break
4.2 for循环原理
for循环就是对while循环去迭代器对象的封装
for循环的工作原理:
for k in obj:
pass1. 先调用in后面那个对象的__iter__方法,得到一个迭代器对象
2. 迭代器调用__next__方法进行取值,将得到的返回值赋值给变量名k
3. 循环往复直到__next__取值,抛出异常,for会自动捕捉异常StopIteration然后结束循环
五、枚举对象
# 给可迭代对象及迭代器对象添加迭代索引 s = 'abc' for k in enumerate(s): print(k,end=' ') # (0, 'a') (1, 'b') (2, 'c') dic = {'a': 1, 'b': 2, 'c': 3} obj = enumerate(dic) print(obj.__next__()) # (0, 'a') dic = {'a': 1, 'b': 2, 'c': 3} for i,k_v in enumerate(dic.items()): k,v = k_v print(k_v,end='') # ('a', 1)('b', 2)('c', 3) print(i,k,v,end=' ') # 0 a 1 1 b 2 2 c 3