【迭代器与生成器】
一、什么是迭代?
迭代通俗的讲就是一个遍历重复的过程。
维基百科中 迭代(Iteration) 的一个通用概念是:重复某个过程的行为,这个过程中的每次重复称为一次迭代。具体对应到Python编程中就是,对于一个可迭代对象,比如Python中的list、tuple、string、dictionary,set等,使用某种循环结构来遍历其中的元素,这种遍历就是迭代。
1 #对列表进行遍历! 2 3 l=['a','b','c','d','e'] 4 5 #while循环的方式 6 i=0 7 while i < len(l): 8 print(l[i]) 9 i+=1 10 11 #for 循环的方式 12 for i in range(len(l)): 13 print(l[i])
二、迭代器
1、迭代器定义
首先先明确 可迭代对象
在现所学的数据类型中,只有 文件 是迭代器,其他的数据类型:元组,字符串,字典,集合,列表都是 可迭代对象。
判断是否可迭代:只要判断对象本身是否内置了_iter_方法,那它就是可迭代的。
1 #可迭代的:只要对象本身有__iter__方法,那它就是可迭代的 2 d={'a':1,'b':2,'c':3} 3 d.__iter__ #iter(d)
可迭代对象实现了 __iter__ 和 __next__ 方法,这两个方法对应内置函数 iter() 和 next() 。__iter__ 方法返回可迭代对象本身,这使得他既是一个可迭代对象同时也是一个迭代器。
#执行对象下的__iter__方法,就会得到一个返回值,得到的返回值就是迭代器。 # 使用next()就能依次取出迭代器中的值(在迭代器元素个数之内,超出会报错,也是一次性的元素,不可重复取值),这样就不用再依赖下标的方式。 d={'a':1,'b':2,'c':3} d.__iter__ #iter(d) i=d.__iter__() #返回值,迭代器 print(i.__next__()) #print(next(i)) print(i.__next__()) print(i.__next__()) #3个元素,依次取三次,由于迭代器中的元素是一次性的,超出个数会报错! print(i.__next__())
执行结果如下:
a
b
c
Traceback (most recent call last):
File "H:/迭代器.py", line 29, in <module>
print(i.__next__())
StopIteration
迭代器
迭代器是访问集合中元素的一种方式,从集合中的第一个元素开始访问,直到所有的元素都被访问一遍后结束。迭代器不能回退,只能往前进行迭代。
迭代器提供了一个统一的访问的接口,只要是定义了iter()方法的对象,就可以使用迭代器进行访问。只要可以进行访问,就能被next()方法调用并不断返回下一个值的对象称为迭代器。换句话说,迭代器对象具有next()方法。
对于迭代器的理解,可以把迭代器看成是一个数据流,迭代器对象被next()函数调用不断返回下一个数据,直到没有数据时抛出StopIteration错误。
把这个数据流看做是一个有序序列,但却不能提前知道这个数据流到底有多长,而对于list、tuple等可迭代对象来说,对象的长度是可知的。这也是可迭代对象和迭代器的区别所在。
StopIteration异常:是迭代终止的信号,迭代器内的内容是有限的,迭代器内元素已全部取完,及取值结束再继续取的话,会报错。
异常捕捉:迭代器正常执行代码的过程中,print(next(*)) *代表迭代器 会抛出异常。为保证代码的正常运行,此时就用到了 try 和 except。
1)while:循环
1 l=['a','b','c','d','e'] 2 i=l.__iter__() 3 while True: 4 try: #监听代码是否会报异常 StopIteration 5 print(next(i)) 6 except StopIteration: #判断异常是否为 StopIteration,是break 7 break
执行结果如下:
a b c d e
2)for 循环 :for 循环本质就是内部封装了迭代器,对 可迭代的对象 进行遍历取值,同时会在遇到异常捕获的时候会自行处理,所以for 循环作用在迭代器上不报错。
d={'a':1,'b':2,'c':3}
print(d.__iter__())
for k in d: #d.__iter__()
print(k)
执行结果如下:
<dict_keyiterator object at 0x00000000021A7728>
a
b
c
1 #集合及文件 for 循环 迭代形式 2 s={1,2,3,4} 3 for i in s: 4 print(i) 5 #a.txt ="aaaaaa bbb cccc eee ffffff" 6 with open('a.txt','r') as f: 7 for line in f: 8 print(line.strip())
1 1 2 2 3 3 4 4 5 aaaaaa 6 bbb 7 cccc 8 eee 9 ffffff 10 11 执行结果