一。名称空间,作用域,取值顺序
1.名称空间:将变量与值的对应关系存储于内存
Name = ‘baozi'
| 名称空间 | 值 |
| Name 对应的内存位置 | baozi |
解释:
1)。当程序运行时,代码从上倒下依次执行,他会将变量与值的对应关系存储在一个空间中
2)。当程序遇到函数时,将(第一层)函数名存在内存中,函数体暂时不管
3)。当函数执行时,会临时开辟空间,存放函数体内的代码(变量,代码等),函数外边访问不到这个临时空间里的内容,且当函数执行完成时,临时空间将被释放
4)。临时空间:局部名称空间
2.名称空间分为三种:
1)。内置名称空间
2)。全局名称空间
3)。局部名称空间
3.作用域:
全局作用域:内置名称空间+全局名称空间
局部作用域:局部名称空间
4.加载过程:
打开软件:内置名称空间。
当程序执行时:全局名称空间
当函数调用时:局部名称空间
5.取值顺序(单向,不可逆,从小到大)
先找局部 ,再找全局,最后找内置,如果都找不到就报错
例如:
Name = ‘baozi’
Def fun1():
Name = ‘abc’
Print(name)
Fun1() #输出===> abc
二。函数嵌套: 多个临时空间互不影响
def func1():
print(666)
def func2():
func1()
print(222)
def func3():
func2()
print(333)
print(111)
func3()
print(444)
#输出如下:
111
666
222
333
444
三。内置函数 :
1.globals()返回一个字典,字典的内容是全局空间内容
2. locals()返回一个字典,当前位置的所有变量
name = 'zfeng'
age = 1000
print(globals())
def func1():
global name
name = 'baozi'
age = 477788
global sex
print(globals())
print(locals())
func1()
#输出:
{'name': 'zfeng', 'age': 1000}
{'name': 'baozi', 'age': 1000, 'func1': <function func1 at 0x3936a4>}
{'age': 477788}
四。关键字
1.global:
作用:应用并改变全局变量
做局部作用域中声明一个全局变量
| 未定义global | 指定global 变量count , |
|
count = 1
def func1():
print(count) #应用全局变量
count += 1 #在函数内对全局变量做修改,会报错
print(count)
func1()
|
count = 1
def func1():
global count #指定global
print(count) #应用全局变量
count += 1 #可在函数内对全局变量做修改
print(count)
func1()
|
| 在函数内对全局变量的修改应该先定义count |
2.nonlocal
作用:不能操作全局变量
从哪层应用的该变量,就从哪层开始全部改变
| 未定义上层函数内变量(非全局变量),进行修改 | 定义非全局变量, |
|
def func1():
count = 1
def func2():
count += 1
print(count)
func2()
func1()
|
def func1():
count = 1
def func2():
nonlocal count
count += 1
print(count)
func2()
print(count)
func1()
|
| 报错 |
2
2
|
五。函数名应用:
1.函数名为一个内存地址
def func1():
print('1111')
print(func1)
#<function func1 at 0x3936a4>
2.函数名作为容器类的元素
l1 = [func1,func2,func3,func4]
for i in l1:
i()
3.作为函数的参数
def func5():
print('func5执行')
return ('func5执行')
def func6(x):
print('x=',x)
x()
return ('func6执行')
print(func6(func5))
4.作为函数的返回值
六。闭包
1.定义:内层函数对外层函数的非全局变量的应用,就叫闭包
2.测试方法:函数名.__closure__,返回cell 和none
Cell :闭包
None:非闭包
|
name = 'baozi'
def wrapper(x):
def inner():
print(x)
inner()
wrapper(name)
|
闭包 x参数为wrapper函数的参数,inner函数应用的wrapper这上一层函数的变量 |
3.特点:如果python解释器遇到闭包,这个闭包不会随着函数执行结束而释放
4.用途:装饰器/爬虫
七。装饰器:
1.定义:装饰器本质上就是一个python函数,他可以让其他函数在不需要做任何代码变动的前提下,增加额外的功能,装饰器的返回值也是一个函数对象。
2.格式
|
def wrapper(func):
def inner(*args,**kwargs):
ret = func(*args,**kwargs)
return ret
return inner
|
3.语法糖:@
@wrapper
def func1():
print('1111’)
4.总结:装饰器本质是闭包,在不影响原函数的基础上,增加了一些额外的功能
浙公网安备 33010602011771号