python基础7-函数闭包/装饰器

  • pythonic,python风格的代码,简洁优美
  • 生成器产生时不会生成值,只有next时才会产生值,且只能遍历一次
  • def test():
        for i in range(4):
            yield i
    t = test()
    
    t1=(i for i in t)
    t2=(i for i in t1)#生成器在产生时不做任何操作,只有执行时才会遍历,所以t2此刻没有值
    print(list(t1))
    print(list(t2))
  • 把一个对象变成迭代器,l = [1,3],l.__iter__()或者直接itel(l)也行
  •  装饰器

  • 本质就是函数,功能是为其他函数添加附加功能
  • 原则
  1. 不修改被修饰函数的源代码,一点也不能动
  2. 不修改被修饰函数的调用方式
  • 程序上线后,不能修改函数源代码
  • 装饰器 = 高阶函数+函数嵌套+闭包
  • 接受的参数是函数名,返回值也是函数名,差一步实现装饰器,只有高阶函数不能实现装饰器
  • 函数嵌套,在函数中定义另外一个函数
  • 闭包就是作用域的概念
  • python基础7-函数闭包/装饰器
    import time
    # 装饰器的架子
    def timmer(func):  # func=test
        def wrapper():
            # print(func)
            start_time = time.time()
            func()  # 就是在运行test()
            stop_time = time.time()
            print('运行时间是%s' % (stop_time - start_time))
        return wrapper
    def test():
        time.sleep(3)
        print('test函数运行完毕')
    test = timmer(test)#返回的是wrapper的地址
    test()#执行的是wrapper() 
    装饰器1.0
  • 语法糖,@timmer 就相当于 test=timmer(test)
  • python基础7-函数闭包/装饰器
    import time# 装饰器的架子
    def timmer(func):  # func=test
        def wrapper():
            start_time = time.time()
            res = func()  # 就是在运行test()
            stop_time = time.time()
            print('运行时间是%s' % (stop_time - start_time))
            return res
        return wrapper
    
    @timmer #相当于test = timmer(test)
    def test():
        time.sleep(3)
        print('test函数运行完毕')
        return'这是test的返回值'
    
    res = test()
    print(res)
    @timmer装饰器加上返回值 
  • 运行加上装饰器的test,实际是执行装饰器,test如果有返回值/参数,都应该加到装饰器对应位置,包括形参和实参
  • import time# 装饰器的架子
    def timmer(func):  # func=test
        def wrapper(*args,**kwargs):#*args接受所有参数,**kwargs接受关键字参数,位置参数必须在关键字参数左边
            start_time = time.time()
            res = func(*args,**kwargs)  # 就是在运行test()
            stop_time = time.time()
            print('运行时间是%s' % (stop_time - start_time))
            return res
        return wrapper 
  • 解压序列a,b,c=(1,2,3),a获取1,b获取2,c获取3
  • #技巧
    >>> m [10, 3, 2, 3, 5, 1, 2] >>> a,*_,c=m #_没有意义,写*d也行>>> a 10 >>> c 2 
  • python中变量互相换值,a=1,b=2,然后a,b = b,a即可
  • for  else语句,表示for非正常结束,则执行else语句
  • 如何给装饰器加参数,再外加一层定义,装饰器最外层新增参数,则内层均可以获取。先研究无参的,再研究有参的

 

上一篇:python极简教程05:生成器和匿名函数


下一篇:C#中如何截取Windows消息来触发自定义事件