• python之闭包+装饰器


    闭包

    https://www.bilibili.com/video/av18586448?from=search&seid=6330694885542181095

    内部函数对外部函数作用域变量的引用。

    函数内的属性都是有生命周期的,都是在函数执行期间

    闭包内的闭包函数私有化了变量,类似于面向对象

    图片解析

    示例一

    https://www.bilibili.com/video/av18586448/?spm_id_from=333.788.videocard.16

    def func():#外部函数
        a=1  #外部函数作用域的变量 
        print("this is func.")
        def func1(num):#内部函数其实是闭包函数
            print("this is func1")
            print(num+a)
        return func1#函数保存了变量a
     #func()运行外部函数,内部函数就被创建了
    var=func()#创建过程在func函数的执行过程中
    #var==func1
    var(3)#当del var时a就不存在了

    示例二

    mylist=[1,2,3,4,5]
    def func(obj):
        print('func:',obj)
        def func1():
            obj[0]+=1
            print('func1',obj)
        return func1
    var=func(mylist)
    #var:obj,print('func1',obj)

    装饰器

    装饰器,是语法糖 用@
    @func1
    def func():
        print('aaa')
        不影响原有函数的功能,还能添加新功能
        >@func1
        >def myprint():
        myprint()==func2()+myprint()
        普通装饰器 zsq(bzs)()
        装饰器函数带参数:dczsq(cs='man')(bza)()
                         多一层包装来接收装饰器的参数
        被装饰的函数带参数:只需在最内部函数传入参数即可

    示例一

    def arg_fun(sex)
        def func(b_func):
            def func2()
             if sex=='man':
                print('你不可以生娃')
             if sex=='woman':
                print('你可以生娃')
    
             return b_func()
            return func2
        return fun1
    
    #arg_func(sex='man')()()>func1
    #func1()>func2
    #func2()>(''你不可以生娃'')or('你可以生娃') 
    
    @ arg_fun()
    def  man(sex='man'):
        print('好好上班')
    @ arg_fun()
    def  woman(sex='woman'):
        print('好好上班')
    
    
    man()
    woman()

    示例二

    def func1(func)
          def func2(x,y)
                print(x,y)
                x+=5
                y+=5
                return func(x,y)
           return func2
    @func1
    def mysum(a,b)
          print(a+b)
    mysum(1,2)

    示例三

    import time
    def display_time(func):#装饰器函数,func指的是 prime_nums()
    def wrapper(*args):
    t1 = time.time()
    result=func(*args)#执行装饰器里面的函数,count结果保存在result中
    t2 = time.time()
    print("Total time:{:.4}s".format(t2 - t1))
    return result
    return wrapper()

    def is_prime(num):#判断是否是质数
    if num < 2:#num为1,
    return False#判断不是质数
    elif num == 2:
    return True
    else:
    for i in range(2,num):
    if num % i == 0:#如果存在某个数i使得num除以i的结果是9,那么num就不是质数,
    return False#结果判断不是质数
    return True
    #装饰器函数需要执行额部分
    @display_time
    def count_prime_nums(maxnum):#统计质数个数
    count=0
    for i in range(2,maxnum):
    if is_prime(i):
    #print(i)
    count=count+1
    return count
    count=count_prime_nums(10000)
    #prime_nums()
    print(count)
    #注意函数1中的执行顺序:先计算time1,再执行装饰器里面的函数,当遇到func,执行函数3,最后计算time2
    #当函数3中有多个参数,且不确定个数的时候,通过*args以元组的形式进行收集
  • 相关阅读:
    VC(VISUAL_C++)虚拟键VK值列表
    关于新一轮QQ Tencent://Message 在线联系
    (记录) sql exists 应用及 order by注意点
    (记录)IE8 ..样式错乱解决
    jquery 关于ajax 中文字符长度过长后不执行
    DataList 嵌套绑定CheckBoxList [记录, 以免忘记哈.]
    (记录)MSSQL 的一些应用 查询数据统计适用 添加月份日号作为行记录
    数据结构回顾算法
    Modeling Our World笔记
    数据结构2数组
  • 原文地址:https://www.cnblogs.com/tengteng0520/p/11261686.html
Copyright © 2020-2023  润新知