python 三大器之迭代器

迭代器 - iterator

首先了解一下可迭代对象(iterable)

迭代器一定是可迭代对象,但是可迭代对象不一定是迭代器。
简单而言,可以用for循环遍历的,都是可迭代对象。 list,tuple,str都是可迭代对象,但是他们不一定是迭代器。迭代器本身不知道自己要执行多少次,所以可以理解为不知道有多少个元素,每调用一次next(),就会往下走一步,是惰性的。
迭代器提供了一种不依赖索引取值的方式,这样可以遍历没有索引的可迭代对象,比如字典、集合、文件等等,加载这一个元素至内存中随后释放,相比之下更节省内存,但是我们没有办法获取迭代器的长度,而且只能往后依次取值。
Python中迭代器的本质上每次调用__next__()方法都返回下一个元素或抛出StopIteration的容器对象

迭代器

由于Python中没有“迭代器”这个类,因此具有以下两个特性的类都可以称为“迭代器”类:
  1、有__next__()方法,返回容器的下一个元素或抛出StopIteration异常
  2、有__iter__()方法,返回迭代器本身

#可迭代对象
from collections import  Iterable
# 迭代器
from collections import Iterator
# 将可迭代对象转换成迭代器
list1 = list(range(1,101))
#强转
res = iter(list1)
print(res)
print(type(res))
print(isinstance(res,Iterator))  #print(isinstance({1},Iterable))
print(next(res))

在这里插入图片描述
网上看到一段代码,挺不错,共享给大家:

class Fabs():
    def __init__(self,max):
        self.max=max
        self.n,self.a,self.b=0,0,1

    def __iter__(self):#定义__iter__方法
        return self

    def __next__(self):#定义__next__方法
        if self.n<self.max:
            tmp=self.b
            self.a,self.b=self.b,self.a+self.b
            #等价于:
            #t=(self.a,self.a+self.b)
            #self.a=t[0]
            #self.b=t[1]
            self.n+=1
            return tmp
        raise StopIteration

print(Fabs(5))
for item in Fabs(10):
    print(item,end=' ')

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_42367527/article/details/82760524
今日推荐