Day 10 函数进阶
名称空间与作用域
python中,名称空间分三种:全局名称空间, 局部名称空间(临时),内置名称空间
代码在运行初始,创建的存储“变量名与值的关系”的空间叫做全局命名空间;
在函数的运行中开辟的临时的空间叫做局部命名空间。
Python解释器中已经内置好的函数空间叫做内置名称空间
作用域:
全局作用域 全局名称空间 内置名称空间
局部作用域 局部名称空间(临时)
取值顺序: 就近原则
局部名称空间 ----> 全局名称空间 ----->内置名称空间 单向从小到大范围
加载顺序:
内置名称空间 ----> 全局名称空间(当程序执行时) --- > 局部名称空间(当函数调用的时候)
global与nonlocal关键字
count = 1
def ake():
count = count + 1 # local variable 'count' referenced before assignment
print(count)
ake()
如果你在局部名称空间 对一个变量进行修改,那么解释器会认为你的这个变量在局部中已经定义了,
但是对于上面的例题,局部中没有定义,所以它会报错,
global: 1,在局部名称空间声明一个全局变量。
def func2():
global name
name = 'alex'
func2()
print(name)
2,在局部名称空间可以对全局变量进行修改。
count = 1
def func1():
global count
count = count + 1
print(count)
func1()
print(count)
nonlocal:子函数对父函数的变量进行修改。
此变量不能是全局变量。
def func1():
count = 666
def inner():
print(count)
def func2():
nonlocal count
count += 1
print('func2',count)
func2()
print('inner',count)
inner()
print('func1',count)
func1()
函数名的应用
1 ,函数名就是函数的内存地址。
2, 函数名可以作为变量。
def func1():
print(666)
return True
f1 = func1
f2 = f1
f2()
if f2():
print(1)
3,函数名可以作为函数的参数。
def func1():
print(666)
def func2(x):
print(x)
x()
func2(func1)
4,函数名可以当做函数的返回值。
def func1():
def func2():
print(666)
return func2
ret = func1()
print(ret)
print(ret())
5,函数名可以作为容器类类型的元素
def func1():
print(111)
def func2():
print(222)
def func3():
print(333)
def func4():
print(444)
l1 = [func1,func2,func3,func4]
for i in l1:
i()
globals()与locals()
globals()#返回全局变量的一个字典,几乎不变
locals()#返回当前位置的局部变量的字典
def func1():
a = 2
b = 3
print(globals())
print(locals())
def func2():
c = 5
d = 6
print(globals())
print(locals())
func2()
print(globals())
print(locals())
func1()
闭包
内层函数对外层函数变量(非全局变量)的引用,并返回,这样就形成了闭包(主要应用在爬虫)。
def func1():
name = 1
def func2():
print(name)
print(func2.__closure__)#返回(<cell at 0x0000020E9DC395B8: int object at 0x000000005F2D60E0>,)
func2()
return func2
func1()
name = 1
def func1():
def func2():
print(name)
print(func2.__closure__)#返回None
func2()
return func2
func1()
浙公网安备 33010602011771号