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()
  • 相关阅读:
    Java Socket通信读取相关信息代码
    Java Socket编程如何建立两者关系
    浅谈JAVA中如何利用socket进行网络编程(二)
    浅谈JAVA中如何利用socket进行网络编程(一)
    【Java TCP/IP Socket】TCP Socket(含代码)
    HTTP协议
    HTTP协议详解
    TCP/IP协议与Http协议的区别
    MultipartResolver实现文件上传功能
    ***CodeIgnite/CI 去掉 index.php的 配置
  • 原文地址:https://www.cnblogs.com/stfei/p/8692418.html
Copyright © 2011-2022 走看看