zoukankan      html  css  js  c++  java
  • python's twelth day for me

    闭包:

      内层函数对外层函数的变量(非全局变量)的引用。

      python 遇到闭包,有一个机制,会开辟一个空间,将闭包中的全部变量放入其中。且不会随着函数的结束而关闭。

      闭包的完美体现:装饰器。

    打印函数的注释:

    def func1():
        '''
        此函数是完成登陆的功能,参数分别是...作用。
        :return:返回值是登陆的成功与否(True,False)
        '''
        print(666)
        print(func1.__name__)    #打印函数名
        print(func1.__doc__)     #打印注释
        return True
    func1()
    
    # 666
    # func1
    # 
    # 此函数是完成登陆的功能,参数分别是...作用。
    # :return:返回值是登陆的成功与否(True, False)

    放在函数执行外也可以打印:

    def func():
        '''
        此函数是完成登陆的功能,参数分别是...作用。
        :return:返回值是登陆成功与否。(True,False)
        '''
        print(666)
        return True
    func()
    print(func.__name__)
    print(func.__doc__)
    
    # 666
    # func
    # 
    #     此函数是完成登陆的功能,参数分别是...作用。
    #     :return:返回值是登陆成功与否。(True,False)

    打印日志:

    from functools import wraps
    def wrapper(f):     # f = func1
        @wraps(f)
        def inner(*args,**kwargs):    # 聚合
            '''执行函数之前的相关操作'''
            ret = f(*args,**kwargs)    #打散 1,2,3
            '''执行函数之后的相关操作'''
            return ret
        return inner
    @wrapper     #func1 = wrapper(func1)   func1 = inner
    def func1():
        '''
        此函数是完成登录功能,参数分别是...作用。
        :return: 返回值是成功与否(True,False)
        '''
        print(666)
        return True
    func1()
    print(func1.__name__)
    print(func1.__doc__)
    
    # 666
    # func1
    #
    #     此函数是完成登录功能,参数分别是...作用。
    #     :return: 返回值是成功与否(True,False)

    多个装饰器装饰一个函数:

    def wrapper1(func):    #func == f 函数名
        def inner1():
            print('wrapper1,before func')  # 2
            func()
            print('wrapper1,after func')   # 4
        return inner1
    
    def wrapper2(func):
        def inner2():
            print('wrapper2,before func')   # 1
            func()
            print('wrapper2,after func')   # 5
        return inner2
    
    @wrapper2  # 后 # f = warpper2(f) 里面的f == inner1  外面的 f == inner2
    @wrapper1  # 先  # f = wrapper1(f) 里面的f == 函数名 f 外面的 f == inner1
    def f():
        print('in f')   # 3
    f()
    
    # wrapper2,before func
    # wrapper1,before func
    # in f
    # wrapper1,after func
    # wrapper2,after func

    多个装饰器装饰一个函数的打印顺序:

    可引用全局变量,但不能修改,用global 才能修改。

    a = 6
    def func1():
        global a
        a = a+1
        print(a)
    func1()

     用标志位,来决定是否执行装饰器:

    import time
    def timer(*args,**kwargs):
        def wrapper(f):
            def inner(*args,**kwargs):
                if flag:
                    start_time = time.time()
                    ret = f(*args,**kwargs)
                    time.sleep(0.3)
                    end_time = time.time()
                    print('此函数的执行效率%f' % (end_time-start_time))
                else:
                    ret = f(*args,**kwargs)
                return ret
            return inner
        return wrapper
    flag = True
    @timer(flag)     #两步: 1. timer(flag) --> wrappen   2. @wrapper
    def func1():
        print(666)
    @timer(flag)
    def func2():
        print(777)
    func1()
    func2()
  • 相关阅读:
    实现一个程序两套快捷键
    SystemC中文教程一
    logback的使用和logback.xml详解
    mysql语句练习50题
    Intellij IDEA中使用Debug调试详解
    用node-webkit把web应用打包成桌面应用
    Idea导入项目详解
    iReport 5.6.0 Error: net.sf.jasperreports.engine.JRException: Error executing SQL statement for : data 最优解决方案
    CentOS 7.X 关闭防火墙
    将 MySQL root 的远程访问密码由空密码改为 password
  • 原文地址:https://www.cnblogs.com/stfei/p/8692418.html
Copyright © 2011-2022 走看看