函数

1.函数对象

  在面向对象编程中,一切皆对象

  具体体现:1.函数可以引用  2.函数可以作为函数的参数  3.函数可以作为函数的返回值 4.函数可以被存入到容器类型中

2.函数嵌套

  1.嵌套调用:在一个函数中调用另外一个函数

  2.嵌套定义:在一个函数中定义另外一个函数[定义在函数内的函数只能在函数内使用,不能被外界访问]

3.名称空间
    存储名称的空间
    存储名字与内存地址关联关系的空间
    名称空间分类:
        内置名称空间:存储解释器自带的名称与值的对应关系(python解释器启动创建时创建,所有代码执行完毕关闭解释器时销毁)
        全局名称空间:只要名字的定义是顶着最左边,就在全局空间(执行py文件创建全局名称空间 所有代码执行完毕)

                  除了内置的和函数内的都在全局中
                  文件级别的名称会存储在全局名称空间
        局部名称空间:只要是函数里的名称就是局部的
            (调用函数时候创建 函数执行完毕之后销毁)
            
        名称空间的加载顺序
        内置的 -> 全局的 -> 局部的
        名称空间的查找顺序
        局部的 -> 全局的 -> 内置的

4.作用域(作用范围)
     域 指的是区域 范围的意思
     全局名称空间和内置名称空间在使用上没什么区别
     局部的和全局的,内置的有区别
        局部定义只能在局部使用
    三个空间划分范围:
        全局的和内置的 可以划分为同一个范围
        global(表示全局范围,就是所谓的全局作用域)
        局部的单独为一个范围
        local 局部作用域
    
        globals 查看全局作用域中的内容
            _builtins_
        locals  查看局部作用域中的内容(在全局作用域使用locals就是全局作用域的内容globals)

        global 关键字:明确声明使用全局中的参数
        
        nonlocal 明确声明使用外上一层中的参数 如果上一层没有则找上上层的,不能找到全局中的

5.闭包函数
    闭包函数也是一个函数
    与普通函数的区别:
            1.定义在另一个函数中的函数
            2.在这个内部函数中访问了外部的名称(数据)[不包含全局的数据]
    函数的作用域在定义的时候已经固定,与调用的位置没有关系    
    在返回这个内部函数时,不是单纯的返回函数,还将函数中访问到的局部名称一起打包了
    相当于将内部函数与访问的数据打包在一起.
    闭包函数的模板:
    def func2():
        a = 1
        def inner():
            print(a)
        return inner
    f = func2()
    print(f._closure_[0].cell_contents)
    print(f._closure_[1].cell_contents)
    访问闭包时,打包的函数

6.装饰器
    什么是装饰器? 本质上就是一个工具
        什么是装饰? 给一个已有的对象(函数)加上新功能
        为什么要装饰?  增强功能
        器 指一个工具,在python中指的是具备某个功能的函数
        装饰器就是一个用于给其他函数增加新功能的函数
    print(time.time()) #返回一个时间戳,是从1970年1月1日(unix元年)到现在一共经过多少秒
    
    装饰器和闭包函数的关系:
        装饰器是一种设计代码的套路:不修改源代码的和调用方式的情况下,增加新功能
        要完成装饰器就要用闭包函数

装饰器实例:

import time


def upload():
print('开始上传')
time.sleep(2)
print('上传成功')


def download():
print('开始下载')
time.sleep(2)
print('下载成功')


def auter(func):
def inner():
start_time = time.time()
func()
end_time = time.time()
print(end_time - start_time)

return inner


download = auter(download)
upload = auter(upload)
download()
upload()
posted @ 2018-11-28 20:30  yyf1  阅读(121)  评论(0编辑  收藏  举报