名称空间就是存放变量名和变量值关系的地方
内置名称空间:python解释器自带函数的空间
全局名称空间:定义的变量名和函数名的空间
局部名称空间:函数体定义的变量名名的空间
内置名称空间存活于python解释器使用时
全局名称空间存活于当前py文件中
局部名称空间存活于函数体代码运行时
局部空间——>全局空间——>内置空间
哪怕三个名称空间中都有相同的名字,依旧是按照这个顺序来查找的。
全局有效:内置名称空间、全局名称空间
局部有效:局部名称空间
global
局部名称修改全局空间中的不可变类型声明
nonlocal
局部名称修改局部名称声明
函数内部定义单个或者多个函数的
闭包函数的两大特征
闭:定义在函数内部的函数(嵌套)
包:内部函数使用了外层函数名称空间中的名字
外部函数返回值为内部函数的函数名
闭包函数也可以给函数体传参
内部函数空间中找不到变量名绑定关系时,会在外部函数空间中找
def a(): munber = 1 def b(): print(munber) b函数在当前空间中找不到munber的值,便会向外部空间中找。
装饰器需要运用到这几天所学的所有函数知识点
装饰器的本质:
在不改变被装饰对象原有的调用方式和内部代码的情况下,给被装饰的对象加上新的单个或多个功能。
装饰器原则:
对扩展开放:开放并可增加扩展功能
对修改封闭:封闭主体代码并修改额外功能
import time # 调用时间模块 time.time # 获取当前时间戳 time.sleep # 睡眠设定时间后才继续运行
装饰器
编写装饰器有一套固定的模板格式 def 装饰器函数名(实际功能函数名) def 封包函数名(*arg,**kwargs) 执行实际功能函数前,需要的额外的功能 变量名 = 实际函数功能名(*arg,**kwargs) 执行完实际功能函数后,需要的额外功能 return 变量名 return 封包函数名
作用:让代码写的更简洁 如: 先创建一个装饰器 def 装饰器函数名(实际功能函数名) def 封包函数名(*arg,**kwargs) 执行实际功能函数前,需要的额外的功能 变量名 = 实际函数功能名(*arg,**kwargs) 执行完实际功能函数后,需要的额外功能 return 变量名 return 封包函数名 实际使用装饰器 实际功能函数名 = 装饰器函数名(实际函数功能名) 等价于 @装饰器函数名 实际功能函数名() 使用语法糖 同样也要知道语法糖的实际意义是什么。
from functools import wraps def f1(func): @wraps(func) def f2(): func() return f2 @f1 def f3(): pass print(f3.__name__) 就是使 实际功能函数的参数指向,保持原本的函数名 不影响代码使用,暂时这个阶段感觉不到有啥用。。。
这个星期学习的知识点很多,把装饰器弄明白还是很有成就感的。