1.名称空间 a.全局名称空间(命名空间):运行程序时,变量与值的内存地址的对应关系,不包括函数。 b.局部名称空间:如果是函数,会将函数名存在内存中,函数体不管。执行函数时会临时开辟一个空间,存放函数体里面的代码,函数外面访问不到临时空间的内容,函数执行完后,临时空间会释放掉。 c.内置名称空间:存放python内置内容的空间,比如print()等 d.全局作用域:全局名称空间 内置名称空间 局部作用域:局部名称空间

2.加载顺序:内置名称空间---全局名称空间(程序执行时)---局部名称空间(函数调用时) 取值顺序(单向不可逆):局部名称空间(函数调用时)---全局名称空间(程序执行时)---内置名称空间。取值只是引用,不能改变

3.函数的嵌套:嵌套中的函数执行完后,才会执行下面的代码。函数中的函数是不同的临时空间

  1. global():返回一个字典,存放全局名称空间的内容。 print(globals()) locals():返回一个字典,当前位置所有的变量,如果函数中嵌套多个函数,只返回locals()所在的那一层 print(locals())

5.gloabal:引用并改变一个全局变量;在局部作用域声明一个全局变量 count = 1 def func1(): global count #引用全局的count变量,如果全局没有此变量,也可以在此处声明一个新count count = count + 1 #可以在函数体内改变count的值,如果没有global,此处只能引用count而不能改变 count = count + 100 print(count) func1() print(count) #全局的count也改变

noloacal:不能操作全局变量;从哪层引用的该变量,从那层开始全部改变 def func1(): count = 1 def inner(): nonlocal count #引用上一级的count count = count + 3 #改变原count的值 print(count) #在inner函数内改变后的值 inner() print(count) #上一级的count也改变,此count是局部变量,全局不能访问 func1()

6.函数名的运用(可以把函数名理解为一个变量名): a.函数名可以打印 print(func1) <function func1 at 0x000000000258F9D8> b.函数名可以作为容器类数据的元素 list = [func1, func2, func3] c.函数名可以作为函数的参数 func2(func1) func1相当于一个变量名 d.函数名可以作为函数的返回值 return func1 把func1返回给当前函数的执行者

7.闭包函数 定义:内层函数对外层函数非全局变量的引用 作用:闭包函数不会随着父级函数的结束而释放

def fun1(): name = 'cc' def inner1(): print(name) #引用父级的name inner1() print(inner1.closure) #判断inner1是否是闭包,如果返回None则不是闭包函数,如果返回一段内存地址则是闭包函数 fun1()

8.装饰器 本质:闭包函数 作用:在不影响原函数执行的基础上,增加一些额外的功能 通用语法: def timmer(f):
def inner(*args,**kwgrgs): ''' 被装饰函数之前的操作''' ret = f(*args,**kwgrgs) ''' 被装饰函数之后的操作''' return ret return inner