美文网首页
2017.7.14总结(迭代器、闭包、装饰器)

2017.7.14总结(迭代器、闭包、装饰器)

作者: Irlans | 来源:发表于2017-07-14 20:40 被阅读0次

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

    import collections     #导入模块
    
    isinstance(object,collections.Iterable)  #判断一个对象是否可迭代
    
    isinstance(object,collections.Iterator)  #判断对象是否是迭代器
    

    生成器都是 Iterator 对象,但 list 、 dict 、 str 虽然是 Iterable ,却不是 Iterator 。
    把 list 、 dict 、 str 等 Iterable 变成 Iterator 可以使用 iter() 函数:

    ls = [x for x in range(10)]
    it = iter(ls)
    

    迭代器同样可被next()调用

    from xxx import xxx 等同于 xxx.xxx

    from collections import Iterator == collections.Iterator
    

    闭包:
    在函数内部再定义一个函数,并且这个函数用到了外边函数的变量,那么将这个函数以及用到的一些变量称之为闭包

    def outside(a,b):
            def inner(x):
                   return a*x+b
             return inner
    
    ret = outside(2,5)
    print(ret(10))
    >>25
    

    1.闭包似优化了变量,原来需要类对象完成的工作,闭包也可以完成
    2.由于闭包引用了外部函数的局部变量,则外部函数的局部变量没有及时释放,消耗内存

    装饰器:
    装饰器,功能就是在运行原来功能基础上,加上一些其它功能,比如权限的验证,比如日志的记录等等。不修改原来的代码,进行功能的扩展。
    比如java中的动态代理,python的注解装饰器
    其实python的装饰器,是修改了代码。

    def outside(func):
           def  inner():
                print('这是装饰器')
                func()
           return inner
    
    @outside
    def run():
          print('这是主体')  
    
    run()
    
    >>这是装饰器
    >>这是主体
    

    @outside可将run函数当参数调用

    多个装饰器,按照从里往外(从下往上)先后顺序执行

    def outside1(func):
        def inner1():
            return '——1——'+func()+'——1——'
        return inner1
        
    def outside2(func):
        def inner2():
            return '——2——'+func()+'——2——'
        return inner2
        
    @outside1
    @outside2
    def run():
        return('Irlans')
    
    print(run())
    >>——1————2——Irlans——2————1——
    

    被装饰的函数有参数

    def outmost(pre):
        def outside(func):
            def inner():    
                print('%s%s'%(pre,func()))
            return inner
        return outside
    
    
    @outmost('wangcai')
    def run():
        return('今年5岁了')
        
    run()
    >>wangcai今年5岁了
    

    被装饰参数有不定长参数:

    from time import ctime, sleep
    
    def timefun(func):
        def wrappedfunc(*args, **kwargs):
            print(args)
            print(kwargs)
            print("%s called at %s"%(func.__name__, ctime()))
            func(*args,**kwargs)
        return wrappedfunc
    
    @timefun
    def foo(a, b, c,num):
        print(a+b+c)
        print(num)
    
    foo(3,5,7,num=123)
    >>(3, 5, 7)
    >>{'num': 123}
    >>foo called at Fri Jul 14 20:31:06 2017
    >>15
    >>123
    

    类装饰器:

    class Test(object):
    
        def __init__(self, func):
            print("---初始化---")
            print("func name is %s"%func.__name__)
            self.__func = func
    
        def __call__(self):
            print("---装饰器中的功能---")
            self.__func()
    
    
    def laowang():
        print("----laowang---")
    
    
    t = Test(laowang)
    t()
    >>---初始化---
    >>func name is laowang
    >>---装饰器中的功能---
    >>----laowang---
    
    class Test(object):
    
        def __init__(self, func):
            print('id(self)=%s,id(func)=%s,func=%s'%(id(self),id(func),func))
            print("---初始化---")
            print("func name is %s"%func.__name__)
            self.__func = func
    
        def __call__(self):
            print("---装饰器中的功能---")
            return self.__func()
    
    @Test           #laowang = Test(laowang)
    def laowang():
        return "----laowang---"
    
    print(laowang())
    
    print(id(laowang))
    print(laowang)
    >>func name is laowang
    >>---装饰器中的功能---
    >----laowang---
    >>18534296
    >><__main__.Test object at 0x00000000011ACF98>
    

    相关文章

      网友评论

          本文标题:2017.7.14总结(迭代器、闭包、装饰器)

          本文链接:https://www.haomeiwen.com/subject/ehuohxtx.html