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()