zoukankan      html  css  js  c++  java
  • py 5.15

    一、函数的有用信息

    #函数的有用信息
    #打印出函数名print(login.__name__)
    #打印出login函数中的注释print(login__doc__)
    #装饰器外,login已经被重新赋值成为inner,所以,要正常在函数体外打印函数名和注释,需要在内层函数inner上面加一个带
    #参数(参数就是login)的装饰器。
    # from functools import wraps
    # def func(f):
    #     @wraps(f)            #参数为代表login的形参f
    #     def inner():
    #         f()
    #     return inner
    # @func
    # def login():
    #     '''此函数是用来测试的'''
    # login()
    #
    # print(login.__name__)
    # print(login.__doc__)
    View Code

    二、带参数的装饰器

    #带参数的装饰器
    #局部变量只能引用全局变量,不能修改!#局部变量只能引用父级或上一层的局部变量,不能修改!
    #一、引用
    # count = 1
    # def func():
    #     count = 2     #在局部作用域中,count变成了2,但是全局中依然没有改变
    # func()
    #二、引用
    # count =  1
    # def func():
    #     print(count)    #引用全局变量,但是依然没有将其改变
    # func()
    #三、内存产生歧义
    # count = 1
    # def func():
    #     count = count + 1  #=右边的count可以取到全局中的值1,但是左边,内存无法识别到底是1还是新定义的变量。出错。
    # func()
    #四、局部对局部,同理
    # def func1():
    #     count = 1
    #     def func2():
    #         count = count + 1 #左边的count无法识别,出错
    #     func2()
    # func1()
    #五、解决办法1 : 若想修改,用global或者nonlocal
    # flag = True
    # def func1():
    #     name = input('请输入')
    #     global flag            #然后在最前面加上global flag,让第一个flag明确自己的身份,就不出错了
    #     if flag :                #flag本来是可以引用的,但是由于后面做了修改动作,所以内存产生歧义。出错
    #         print('flag是真')
    #         if name == 'lg':
    #             print('将flag变成假的')
    #             flag = False      #将flag的值改变
    # func1()
    
    #***解决办法2:传参  (内层函数引用全局变量的一种方法)
    #例:将多个函数同时加上装饰器,或者同时取掉装饰器。依靠全局变量flag。
    # def time_out(flag1):     #将flag的值传给形参flag1  #带参数的装饰器,为了将全局的变量传入装饰器函数中。
    #     def wrapper(f):
    #         def inner(*args,**kwargs):
    #             if flag:                      #在内层函数中,可以引用flag的值。但是不能对其修改。
    #                 '''执行函数之前的操作'''
    #                 f(*args, **kwargs)
    #                 '''执行函数之后的操作'''
    #             else:
    #                 f(*args, **kwargs)    #如果flag是假。则不加任何修饰,直接执行下面的各个函数。
    #         return inner
    #     return wrapper
    #
    # flag = True            #只要靠更改flag,就可以随意控制是否要给以下函数加装饰器了。
    # @time_out(flag)        #看到有参数的装饰器,先执行带有此函数名的函数。结果为@wrapper: 以前普通的装饰器。
    # def func1():
    #     pass
    # @time_out(flag)
    # def func2():
    #     pass
    # ...
    View Code

    三、多个装饰器装饰一个函数

    #多个装饰器装饰一个函数:(结果为一个套一个,最中间夹着被装饰的函数的值)
    # def wrapper1(f):
    #     def inner1():
    #         print('执行inner1之前')  #二
    #         f()                       #此f依然是第一次传进来的func,所以执行被装饰的函数。
    #         print('执行inner1之后')  #四
    #     return inner1
    #
    # def wrapper2(f):
    #     def inner2():
    #         print('执行inner2之前')  #一
    #         f()                     #f = func = inner1 , f() = inner1(),执行inner1
    #         print('执行inner2之后') #五       #inner1执行完之后又回到这里。
    #     return inner2
    #                    # 多个装饰器,由内而外执行。
    # @wrapper2  #func=wrapper2(func),func = inner1,f = func = inner1,
    # @wrapper1  #func=wrapper1(func) 返回inner1,func = inner1
    # def func():
    #     print('in f')                #三
    # func()
    View Code
  • 相关阅读:
    Review Python装饰器
    Python自动化开发三元运算 列表解析 生成器表达式
    Python自动化开发函数02
    Python自动化开发函数03
    Python自动化开发文件
    ELK02ELK收集Linux系统平台应用系统日志
    ELK01Elasticsearch
    html5调用摄像头并拍照
    Docker 安装 PostgreSQL
    《TensorFlow+Keras自然语言处理实战》图书介绍
  • 原文地址:https://www.cnblogs.com/liujjpeipei/p/9041869.html
Copyright © 2011-2022 走看看