迭代器、迭代对象、生成器、装饰器

迭代器 iter

迭代器定义

  • 当类中定义了__iter__和__next__两人方法
  • __iter__方法要返回对象本身
  • next方法,返回下一个数据,如果没有数据了,则需要抛出一个StopIteration的错误

迭代器的创建

# 创建迭代器
class IT():
    def __init__(self):
        self.counter=0
    def __iter__(self):
        return self
    def next(self):
        self.counter+=1
        if self.counter==3:
            raise StopIteration
        return self.counter

# 实例化迭代器
obj1=IT()
print(obj1.counter)
v1=next(obj1)
print(obj1.counter)
next(obj1)
print(obj1.counter)


obj2=IT()
for num in obj2:
    print(num)
class Fibs:
    def __init__(self):
        self.a=0
        self.b=1
    def next(self):   # 注:python3 版本中为__next__
        self.a,self.b=self.b,self.a+self.b
        if self.a >100000:
            raise StopIteration
        return self.a

    def __iter__(self):
        return self
fibs=Fibs()

for num in fibs:
    print num

迭待器对象支持通过next取值 ,如果取值结束,则自动抛出StopIteration错误
for 循环在内部循环时,先施行__iter__方法,获取一个迭代器对象,然后不断执行的next取值(有异常StopIteration则终止循环)

生成器

创建生成器


def func():
    yield 1
    yield 2

创建生成器对象(内部是根据生成器类generator创建对象),生成器类的内部也声明了:__iter__和__next__方法


obj1=func()
v1=next(obj1)
print(v1)
v2=next(obj1)
print(v2)
obj2=func()
for num in range(10):
    print(next(obj2))‘、

如果按迭代器的规则来看,其实生成器也是一种特殊的迭代器。

可迭代对象

  • 如果一个类中定义了一个__iter__方法,并且返回一个迭代器对象;则我们称这个类创建的对象为可迭代对象。
  • 元组、字典、列表都是可迭代对象。

判断是否为迭代器及可迭代对象


from collections.abc import Iterator,Iterable

v1=[1,2,3,4]
print(isinstance(v1,Iterable))   #判断是否可迭代 frue
print(isinstance(v1,Iterator))  #判断是否为迭代器 false 判断依据__iter__和__next__
v2=v1.__iter__()
print(isinstance(v2,Iterable))   #判断是否可迭代 true
print(isinstance(v2,Iterator))  #判断是否为迭代器 true

装饰器

函数的返回值可以是一个函数

def dec(f):
    pass

@dec
def double(x):
    return x*2


#完全等价
#double=dec(double(x))

参考链接1
参考链接2

posted @ 2022-04-13 08:25  lifei888  阅读(28)  评论(0)    收藏  举报