zoukankan      html  css  js  c++  java
  • 函数名的应用(第一对象) 闭包 装饰器

    函数名的应用(第一对象)。
    # 1,直接打印函数名得到的是函数的内存地址 <function func1 at 0x0000000002876B70>
    # print(func1)
    #2,函数名可以赋值运算。
    # def func1():
    #     print(666)
    # f1 = func1
    # f1()
    
    
    # 3, 函数名可以作为函数的参数。
    复制代码
    # def func1():
    #     print(666)
    #
    # def func2(x):
    #     x()
    #     print(555)
    # func2(func1)
    复制代码
    
    
    
     
    # 4,函数名可以作为容器类数据类型的元素。
    复制代码
    # def func1():
    #     print(666)
    #
    # def func2():
    #     print(222)
    #
    # def func3():
    #     print(111)
    #
    # def func4():
    #     print(777)
    # l1 = [func1, func2, func3, func4]
    # for i in l1:
    #     i()
    # dic1 = {
    #     1:func1,
    #     2:func2,
    #     3:func3,
    #     4:func4,
    # }
    # dic1[1]()
    复制代码
    
    
    
     
    # 5,函数名可以当做函数的返回值

      运行流程为再给ret赋值操作时调用了一次func2函数,并把func1函数名赋值给x,此时print 222,并且返回x也就是返回func1,此时:x = func1 = ret,然后执行ret()打印666。

    或者写成:

    输出结果一样,x = func1 ,x() = func1()

    03,闭包。
    # 内层函数对外层函数非全局变量的引用就叫闭包
    #判断是不是闭包 函数名.__closure__
    # 返回的None则不是闭包,返回的是cell.... 则是闭包
    # 闭包有什么用?
    #当执行一个函数时,如果解释器判断此函数内部闭包存在,这样
    #Python就一个机制,闭包的所在的临时名称空间不会随着函数的执行完毕而消失。

      关于输出结果:函数内的print打印的都是函数内的name,函数内的name的初始值为sky,在func2的nonlocal name 修改为alex。函数外的print打印的为全局变量,被func3修改后的wit。

    from urllib.request import urlopen
    
    def index():
        url = 'http://www.xiaohua100.cn/index.html'
        def get():
            return urlopen(url).read()
        return get
    
    scf = index()
    content = scf()
    print(content)

    等于 content = index()() 

      print(content)

    04,装饰器。

    #装饰器功能:在不改变原函数的基础上,为原函数增加一些额外的功能,log,登录注册,等等.


    测试程序的效率
    import time
    '''第一版本,测试函数low'''
    # def login():
    #     time.sleep(0.3)
    #     print('洗洗更健康...')
    #
    # def timmer():
    #     start_time = time.time()
    #     login()
    #     end_time = time.time()
    #     print('此函数的执行时间%s' % (end_time - start_time))
    # timmer()
    复制代码
    复制代码
    # 改变了我原来执行函数的执行方式,不好
    # def login():
    #     time.sleep(0.3)
    #     print('洗洗更健康...')
    # # login()
    #
    # def register():
    #     time.sleep(0.4)
    #     print('洗洗更健康22222...')
    # # register()
    # def timmer(f):
    #     start_time = time.time()
    #     f()
    #     end_time = time.time()
    #     print('此函数的执行时间%s' % (end_time - start_time))
    #
    # timmer(login)
    # timmer(register)
    复制代码
    复制代码
    # 虽然执行函数的方式已经无限接近于原方式,但是更麻烦了,增加了两步代码。改
    # def login():
    #     time.sleep(0.3)
    #     print('洗洗更健康...')
    # # login()
    #
    # def timmer(f):
    #     start_time = time.time()
    #     f()
    #     end_time = time.time()
    #     print('此函数的执行时间%s' % (end_time - start_time))
    #
    # f1 = login  # 将login函数名给了f1
    # login = timmer  # 将timmer函数名给了login
    # login(f1)  # timmer(login)
    # 初级装饰器
    # def login():
    #     time.sleep(0.3)
    #     print('洗洗更健康...')
    # # login()
    #
    # def timmer(f):  # f = login函数名
    #
    #     def inner():
    #         start_time = time.time()
    #         f()  # login()
    #         end_time = time.time()
    #         print('此函数的执行时间%s' % (end_time - start_time))
    #     return inner
    #
    # login = timmer(login)  # inner 此login是新变量
    # login()  # inner()
    # 简单版装饰器  语法糖
    # def timmer(f):  # f = login函数名
    #     def inner():
    #         start_time = time.time()
    #         f()  # login()
    #         end_time = time.time()
    #         print('此函数的执行时间%s' % (end_time - start_time))
    #     return inner
    #
    # @timmer  # login = timmer(login)  # inner 此login是新变量。@timmer就相当于把long函数名传给timeer函数然后再赋值给login
    # def login():
    #     time.sleep(0.3)
    #     print('洗洗更健康...')
    # login()
    
    # @timmer  # register = timmer(register)
    # def register():
    #     time.sleep(0.2)
    #     print('洗洗更健康22...')
    复制代码

    
    
  • 相关阅读:
    桌面图标有蓝底
    创建与删除SQL约束或字段约束
    (转)ASP.NET(C#) 读取EXCEL ——另加解决日期问题
    ASP连接11种数据库的语法
    GridView 合并列、行类
    Office对应ContentType
    (解决办法)ASP.NET导出Excel,打开时提示“您尝试打开文件'XXX.xls'的格式与文件扩展名指定文件不一致
    (转)js判断只能输入数字或小数点
    vscode设置字体大小
    springsecurity+jwt实现登录
  • 原文地址:https://www.cnblogs.com/wenxingxu/p/9529540.html
Copyright © 2011-2022 走看看