发布时间:2021-11-11 11:33:30 人气:223 作者:多测师
Python迭代器是什么?如何使用?
迭代是重复反馈过程的活动,其目的通常是为了逼近所需目标或结果。每一次对过程的重复称为一次“迭代”,而每一次迭代得到的结果会作为下一次迭代的初始值。
(1)可迭代对象和迭代器
在具体讲迭代器之前,先了解一个概念:可迭代对象(Iterable)。之前在数据类型中介绍的容器对象(列表,元组,字典,集合等)都是可迭代对象;从语法形式上讲,能调用__iter__方法的数据对象就是可迭代对象:
>>> [1,2,3].__iter__() <listiterator object at 0x10221b150> >>> {'name':'alvin'}.__iter__() <dictionary-keyiterator object at 0x1022180a8> >>> {7,8,9}.__iter__() <setiterator object at 0x1021ff9b0>
obj.__iter__()方法调用后返回的就是一个迭代器对象(Iterator)。迭代器对象的特性就是能够调用__next__方法依次计算出迭代器中的下一个值。基于此就可以实现无论是否数据为序列对象,都可以通过迭代取值的方式完成查询功能。
>>> s={1,2,3} >>> i=s.__iter__() # 返回可迭代对象s的迭代器对象i >>> i.__next__() # 从第一个元素开始,i通过__next__方法就可以得到可迭代对象s的下一个值。 1 >>> i.__next__() 2 >>> i.__next__() 3 >>> i.__next__() #迭代结束,没有下一个值时调用__next__()抛出StopIteration的异常 Traceback (most recent call last): File "<stdin>", line 1, in <module> StopIteration
1、针对一个没有索引的可迭代数据类型,我们执行s.__iter__()方法便得到一个迭代器,每执行一次i.__next__()就获取下一个值,待所有值全部取出后,就会抛出异常StopIteration,不过这并不代表错误发生,而是一种迭代完成的标志。需要强调的是:此处我们迭代取值的过程,不再是通过索引而是通过__next__方法。
2、可以用iter(s)取代s.__iter__(),其实iter(s)本质就是在调用s.__iter__(),这与len(s)会调用s.__len__()是一个原理,同理,可以用next(i)取代i.__next__()。obj.__iter__()方法的调用后返回的就是一个迭代器对象
(2)你不了解的for循环
之前的学习只知道for循环是用来遍历某个数据对象的。但for循环内部到底是怎么工作的,关键字in后面可以放什么数据类型呢?让我们带着这些疑问一起去解析for循环的实现机制。
#for循环的形式: for val in obj: print(val)
解析:关键字in后面数据对象必须是可迭代对象。for 循环首先会调用可迭代对象内的__iter__方法返回一个迭代器,然后再调用这个迭代器的next方法将取到的值赋给val,即关键字for后的变量。循环一次,调用一次next方法,直到捕捉StopIteration异常,结束迭代。解析:关键字in后面数据对象必须是可迭代对象。for 循环首先会调用可迭代对象内的__iter__方法返回一个迭代器,然后再调用这个迭代器的next方法将取到的值赋给val,即关键字for后的变量。循环一次,调用一次next方法,直到捕捉StopIteration异常,结束迭代。
l = [11, 22, 33] for i in l: # 调用iter方法返回一个关于[11,22,33]的迭代器 print(i) # 迭代器调用next方法返回的值赋值给i,即i=next(iter(l)) it = [1, 2, 3, 4, 5].__iter__() for j in it: print(j) forj in it: print(j)
(3)自定义迭代器
class Fib(object): def __init__(self, max): self.max = max self.n, self.a, self.b = 0, 0, 1 def __iter__(self): return self def __next__(self): if self.n < self.max: r = self.b self.a, self.b = self.b, self.a + self.b # 这次结果作为下次的初始值 self.n = self.n + 1 return r raise StopIteration() for i in Fib(10): print(i)
迭代器协议要求迭代对象具有 __iter__()和__next__()两个方法,__next__之前讲过,是用于计算下一个值的,而__iter__则是返回迭代器本身,目的是使for循环可以遍历迭代器对象,for循环的本质是调用被迭代对象内部的__iter__方法将其变成一个迭代器然后进行迭代取值的操作,如果对象没有__iter__方法则会报错。所以可以说,迭代器对象都是可迭代对象就是因为其内部定义了__iter__方法。
以上内容为大家介绍了Python迭代器是什么以及如何使用,希望对大家有所帮助,如果想要了解更多Python相关知识,请关注多测师。https://www.e70w.com/