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()