1、名称空间
名称空间分为三种:
(1)内置名称空间:python解释器内部自己定义的程序占用内存的空间为内置名称空间,在解释器启动时就会自行加载到内存中,如我们常用的print,input,str,list等等。
(2)全局名称空间:用户在全局位置自定义的变量占用内存的空间称为全局名称空间,在程序执行时,才会加载到内存中。
(3)局部名称空间:定义一个函数,在函数内部定义的程序占用的内存空间称为局部名称空间,在执行函数时,程序加载到内存,开辟一个临时内存空间,程序执行完成后释放。
名称空间的加载顺序为:内置名称空间(启动python解释器时加载) --> 全局名称空间(执行程序时加载,从上到下依次加载) --> 局部名称空间(执行函数时加载,只果定义则不加载)
2、作用域
作用域分为两种:
(1)全局作用域:全局作用域包括内置命名空间和全局命名空间,在整个程序任意部位都可以调用,全局有效。
(2)局部作用域:局部作用域指的就是局部命名空间,只在局部位置适用。
3、取值顺序
局部调用时:局部名称空间 --> 全局名称空 --> 内置名称空间
全局调用时:全局名称空间 --> 内置名称空间
4、函数的嵌套
(1) 函数的调用:
def reg(a,b): ret = a if a > b else b return ret def reg1(c,d,e,f): res1 = reg(c,d) res2 = reg(res1,e) res3 = reg(res2,f) return res3 print(reg1(10,2,25,6))
(2) 函数的嵌套:
def fun1(): name = 'alex' def fun2(): name1 = 'eric' print(name1) fun2() return name print(fun1())
(3) 函数链:
def fun1(): print(444) #第1步 def fun2(): print(222) #第2步 def fun3(): print(111) #第3步 def fun4(): print(555) #第4步 fun4() #第4步 fun3() #第3步 fun2() #第2步 fun1() #第1步
5、内置函数globals() locals()
globals()作用:取全局作用域内的所有变量
locals()的作用:去指定位置的作用域的所有变量
name = 'alex' age = 19 def func1(): name1 = 'eric' return name1 func1() print(globals()) #globals()和locals()都在全局作用域执行 print(locals())
结果:
name = 'alex' age = 19 def func1(): name1 = 'eric' print(locals()) #locals()在局部作用域执行 return name1 func1() print(globals()) #globals()在全局作用域执行
结果:
6、关键字global,nonlocal
global:在局部作用域执行global可以修改全局作用域的变量,一旦修改全局生效。
nonlocal:在更深层次的函数内部,可以修改它上一层或更上层函数内部的变量,一旦修改整个局部生效。
不加global的时候:(只能引用不能修改)
name = 'alex' def func1(): name = name.capitalize() print(name) func1() print(name)
结果:
加上global:
name = 'alex' def func1(): global name name = name.capitalize() print(name) func1() print(name)
结果:
nonlocal:(在不加nonlocal的情况下,报的错和不加global一样)
def func1(): name = 'alex' def func2(): nonlocal name name = name.upper() print(name) func2() print(name) func1()
结果:
7、函数名的应用
(1) 函数名可以当做参数传给另一个函数。
def func1(): name = 'alex' print(name) def func2(x): x() func2(func1)
结果:
(2) 函数名可以当做一个函数的返回的值。
def func1(): name = 'alex' print(name) def func2(x): x() return x #返回一个值,就必须有一个值去接收这个值的内容 f1 = func2(func1) #f1就是接收return返回的值 f1() #由于返回的是函数名,所以加个括号才能运行,如果是一个普通值,则直接print运行就可以
(3) 可以给函数名随便定义变量名。
def func1(): name = 'alex' return name f1 = func1() f2 = f1 f3 = f2 print(f3)
结果:
(4) 可以当做容器数据类型的元素。
def func1(): name = 'alex' return name def func2(): name = 'eric' return name def func3(): name = 'twonss' return name def func4(): name = 'tom' return name l = [func1,func2,func3,func4] for line in l: print(line())
结果:
8、闭包函数
概念:(1)内部函数包含对于外部作用域而非全局作用变量的引用,这个内部的函数称为闭包函数。
(2)闭包函数常用于定义装饰器上,因为闭包函数在执行完成后,不会释放内部的临时空间。
区分一个函数是不是闭包用__closure__
def func1(): name = 'alex' def inner(): print(name) print(inner.__closure__) return inner func1()()
结果: