python笔记(九)


迭代器从表面上看是一个数据流对象或容器,但每次从中取数据不会重复

迭代器的主要协议:

__iter__():返回对象本身

__next__():返回容器中下一个元素或数据

可以用for循环来遍历(迭代)他


自定义迭代器:

class MyIterator:


    def __init__(self,x=2,xmax=100):
        self.__mul,self.__x=x,x
        self.__xmax=xmax


    def __iter__(self):
        return self


    def __next__(self):
        if self.__x and self.__x !=1:
            self.__mul*=self.__x
            if self.__mul<=self.__xmax:
                return self.__mul
            else:
                raise StopIteration


        else:
            raise StopIteration


if __name__=='__main__':
    myiter = MyIterator()
    for i in myiter:
        print('迭代的数据元素为:',i)


迭代器一定要在某个条件下引发StopIterator 错误,以结束遍历循环,否则会产生死循环

每次调用是产生一个序列 节约了空间


内建迭代器函数: iter(iterable) 参数是可迭代的类型

                              iter(callable,sentinel)      第一个参数是调用类型,一般为函数;第二个为终止条件

第二种方法:

class Counter():


    def __init__(self,x=0):
        self.x=x


counter = Counter()


def use_iter():
        counter.x+=2
        return counter.x


for i in iter(use_iter,8):
    print('本次遍历的数值:',i)


第一次调用生成器时不能传送给生成器None以外的值,否则会引发错误


如果生成器表达式生成的事有限序列则可以用列表转换:

a= (i for i in range(5))

list(a)


装饰器装饰类或函数:

@disp_run_time

def deconrated_fun():

pass


装饰器用来装饰对象之前必须先定义:

def demo_decorater(fun):

def new_fun(*args,**kwargs):

pass

fun(*args,**kwargs)          #被装饰的函数或者类

pass

return new_fun


装饰器装饰类采用的方法是 定义内嵌类的函数,并返回新类





你可能感兴趣的:(python笔记(九))