zoukankan      html  css  js  c++  java
  • 闭包函数,装饰器

    闭包函数

    函数的对象:就是可以将定义在函数内的函数返回到全局使用,从而打破函数的层级限制。

    名称空间与作用域:作用域的关系在函数定义阶段就已经固定死了,与函数的调用位置无关,即在任意位置调用函数都需要在函数定义时找到作用域的关系。

    def f1():
        x = 13
        def func():
    		print(x)
        return func
    
    f = f1()
    
    x = 2
    
    def f2():
        x = 14
        f()
        
    f2()
    
    # 13
    

    什么是闭包

    闭包:封闭包裹。就是指,函数内部函数对外部作用域而非全局作用域名字的引用。
    def outter():   
        x = 999       
        def inner(): 
            print(x) 
    	return inner
    
    f = outter()  # f 就是 inner 函数的内存地址
    
    def func():
        x = 666
        f()
    
    func()
    
    # 999
    

    两种为函数传参的方式

    方式一:参数传参
    def func(x,y):  # 位置形参
        print(x)
        print(y)
        
    func(1,2)
    func(3,4)		# 位置实参,一一对应
    
    # 1 2
    # 3 4
    
    方式二:闭包
    def outter(func):
        # func = 123456
        def inner():
            print(func)
        return inner
    
    f = outter(123456)  # f = inner
    f()  # inner()
    
    # 123456
    

    装饰器

    什么是装饰器

    器:

    器指的就是工具。而程序中的函数就是具备某一功能的工具,所以装饰器就是指 为被装饰器对象添加新的功能。因此定义装饰器就是定义一个函数,只不过该函数的功能是用来为其他函数添加额外功能的。

    需要注意:
    • 装饰器本身其实是可以任意 可调用的对象
    • 被装饰的对象也可以是任意 可调用的对象

    为什么要用装饰器

    开发封闭原则:

    开发:对扩展开发

    封闭:对修改封闭

    装饰器必须遵循两大原则:

    1:不修改被装饰对象的源代码

    2:不修改被装饰对象的调用方式

    怎么用装饰器

    统计函数运行时间

    # 不使用装饰器
    import time
    
    def func():
        time.sleep(1)
        print('计算函数运行时间!')
    
    start = time.time()
    func()
    end = time.time()
    result = end - start
    
    print(f'func 函数的运行时间为{result}')
    
    # 计算函数运行时间!
    # func 函数的运行时间为1.0007097721099854
    
    # 简易版装饰器
    import time
    
    def func():
        time.sleep(1)
        print('计算函数运行时间!')
    
    def outter(a):
        def inner():
            start = time.time()
            a()
            end = time.time()
            result = end - start
            print(f'func 函数的运行时间为{result}')
        return inner
    func = outter(func)
    func()
    
    # 升级版装饰器
    import time
    def func():
        time.sleep(1)
        print('计算函数运行时间!')
        return 'func'
    
    def login(name):
        time.sleep(2)
        print(f'就打印这个名{name}')
        return 'login'
    
    def outter(a):
        def inner(*args,**kwargs):
            start = time.time()
            res = a(*args,**kwargs)
            end = time.time()
            print('func 函数的运行时间为%s'%{end - start})
            return res
        return inner
    
    func = outter(func)
    func()
    login = outter(login)
    login('jin')
    

    装饰器语法糖

    import time
    def outter(a):
        def inner(*args,**kwargs):
            start = time.time()
            res = a(*args,**kwargs)
            end = time.time()
            print('函数的运行时间为%s'%{end - start})
            return res
        return inner
    
    @outter
    def func():
        time.sleep(1)
        print('计算函数运行时间!')
        return 'func'
    func()
    @outter
    def login(name):
        time.sleep(2)
        print(f'******{name}******')
        return 'login'
    login('鸡哥')
    
    千里之行,始于足下。
  • 相关阅读:
    camke 参数
    17.计算1-100之和+1-50的平方和+1-10的倒数
    16.求Sn=a+aa+aaa+aaaa.......之值
    15.计算1!+2!+3!+.....20!=?
    14.输出所有的“水仙花”
    13.企业发放的奖金根据利润提成
    12.输入一个成绩计算其A,B,C,D,E等级
    11.键盘输入小于1000的整数
    10.求方程的根
    2019考研历程回顾
  • 原文地址:https://www.cnblogs.com/jincoco/p/11184603.html
Copyright © 2011-2022 走看看