• 函数对象,名称空间和作用域以及闭包函数和装饰器


    重点:函数func() 两层含义:

      第一层: func 指函数对象,指向内存地址

      第二层: 括号表示触发函数功能

    一. 函数对象(可以理解为函数名):在面对对象中,一切皆对象

      具体体现:1.函数可以引用

           2.可以作为函数的参数

           3.可以作为函数返回值

              4.可以被储藏在容器中

    二. 函数嵌套: 在一个函数中调用了另一个函数

      嵌套:在一个函数中定义了另一个函数,定义在内部的函数只能在函数内部使用。

    三.  名称空间:存储名字和内存地址关系的空间

      分类:1. 内置名称空间: 存储解释器自带的一些名称与值的对应关系(print,  len, max, min,pop 等)

                   在解释器启动时创建

         2. 全局名称空间:文件级别的名称(除了内置和函数内的都为全局)

                 在执行py 文件时创建,所有文件代码执行完毕结束

           3. 局部名称变量:在内部函数内的名称。

                 调用函数时创建,函数执行完销毁

      比较: 加载顺序: 内置变量 ===> 全局变量====> 局部变量

          查找顺序: 局部变量===> 全局变量 ====> 内置变量

    四. 作用域: 域指范围: 函数的作用域在定义时就固定了,与调用为止无关

          全局名称空间和内置的名称空间在使用上没有什么本质区别, 而局部名称只能局部使用

          global: 定义全局变量,其变量可以在全局范围内使用

          local: 局部作用域

          globals(): 以字典类型返回当前位置的全部全局变量

          dir() : 不带参数时返回当前范围内的变量,方法和定义的类型列表,带参数时,返回参数的属性方法列表。 ???

          locals() : 查看局部作用域中的内容(相对概念)

          global a:明确要使用全局中的变量 a

          nonlocal a: 使用上一层中的a, 如果上一层没有就在上上层找,找到为止,但不表示使用全局变量

    四. 闭包函数:满足两个条件

      条件一: 定义在另一个函数中

      条件二: 在内部的函数中使用了外部的名称(也就是数据值)

      重点: 在返回内部函数时,不是单纯的返回函数,还把函数中访问到的局部名称一起打包了

          相当于将内部函数与访问的数据打包在一起了

          __closure__用于访问闭包时打包的数据 print(f.__closure__[0].cell_contents)

          如果为全局变量没必要包走,外部可直接访问

    def fun1():
        name='iris'
        def inner():
            print(name)
            print('hello')
        return inner
    f=fun1()  # f 就是inner
    f()  

    五. 装饰器:在不修改源代码和调用方式的条件下为其他函数增加功能的函数

      特点:开闭原则(对扩展开放,对修改封闭)

         装饰器通过闭包函数实现

    #源代码:
    def download():
        print('开始下载')
        time.sleep(2)
        print('下载结束')
    download()
    # 为源代码加上统计开始时间和结束时间并计算总耗时的功能
    # 方法一:修改源代码方法
    import time
    def download():
        start_time=time.time()
        print('开始下载')
        time.sleep(2)
        print('下载结束')
        end_time=time.time()
        print('下载耗时',(end_time-start_time))
    download()
    
    # 方法二:修改调用方式
    import time
    def download2():
        start_time=time.time()
        download()
        end_time = time.time()
        print('下载耗时',(end_time-start_time))
    download2()
    
    # 方法三:装饰器
    def download():
        print('开始下载')
        time.sleep(2)
        print('下载结束')
    
    def outter(func):
        def inner():
            start_time=time.time()
            func()
            end_time=time.time()
            print('下载耗时', (end_time-start_time))
        return inner
    import time
    download=outter(download)
    download()

    六. 时间戳: time.time()

      用秒表示当时的时间,指从1970年一月一日零点零分到现在经过的秒数。

  • 相关阅读:
    linux常用命令的英文单词缩写
    Servlet Struts2 SpringMVC 获取参数与导出数据 方法比较
    Spring 整合Mybatis Mapper动态代理方法
    Spring 整合Mybatis dao原始方法
    Mybatis Mapper动态代理方式 typeAliases 别名的使用
    MySQL 高性能优化实战总结
    Chrome 浏览器最牛插件之一 Vimium
    Spring Cloud-微服务架构集大成者
    单点登录原理与简单实现
    Spring-WebSocket 教程
  • 原文地址:https://www.cnblogs.com/Afrafre/p/10034305.html
Copyright © 2020-2023  润新知