python迭代器

迭代器

什么是迭代器?

迭代器是访问集合元素的一种方式。迭代器对象从集合的第一个元素开始访问,直到所有的元素都被访问完结束。迭代器只能往前不会后退。

使用迭代器的优点

​ 迭代器的一个大优点是不要求事先准备好整个迭代过程中所有的元素。迭代器仅仅在迭代到某个元素时候才会计算该元素,而在这之前或者之后,元素可以不存在或者被销毁。这个特点使得它特别适合用于遍历一些巨大的或者是无限的集合,比如几个G的文件,或者斐波那契数列等。

​ 迭代器另外一个优点是它提供了一个统一的访问集合的接口,只要定义了__iter__()方法的对象,都可以使用迭代器来访问。

  • next():访问迭代器的下一个元素
  • __iter__方法:返回迭代器对象本身

用一个斐波那契数列的case来看看:

def febonac(num)
	a,b,n=1,0,0
	while n<num:
		print(a)
		b+=a
		a,b=b,a
		n+=1
febonac(5)
output:
1
1
2
3
5

这是没有使用迭代器来创建的一个斐波那契数列,可以看到它会直接打印前nun个数,可复用率低。

现在我们来使用迭代器生成一个斐波那契数列:


class Febonaci():
    def __init__(self,num):
        self.a,self.b,self.n=1,0,0
        self.num=num
    def __iter__(self):
        return self
    def __next__(self):
        if self.n<self.num:
            self.b+=self.a
            self.a,self.b=self.b,self.a
            self.n+=1
            return self.b
        else:
            raise StopIteration

f=Febonaci(5)
print(next(f))
print(next(f))
print(next(f))
print(next(f))
print(next(f))

output:
1
1
2
3
5

至此,一个简单的利用迭代器的斐波那契数列就写成了,可以看出这样写能够节省尽可能多的内存,不用一上来就创建一块大内存用来创建斐波那契数列,每次调用的时候,它才会生成下一个数。

对于内置的一些函数,像列表、元祖,我们可以用内置函数iter获取迭代器对象:

b=[1,2,3,4,5]
it=iter(b)  #利用iter()方法获取迭代器对象
next(it)  #利用next()方法获得下一个值
next(it)
output:
1
2

如果你拥有一个无线长的数列,那么你可以无限next()。为了防止迭代器越界,你可以加入StopIteration用来提醒越界了。在python中,for循环的作用实际上是创建了一个迭代器,并且为每个循环调用了next()方法。还可以捕捉StopIteration错误。

b=[1,2,3,4,5]
for i in b:
	print(i)
___________________________________
output:
1
2
3
4
5
posted @ 2020-02-18 15:00  Magic-Dater  阅读(155)  评论(0)    收藏  举报