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()()
结果:

浙公网安备 33010602011771号