python22期第4天(课程总结:装饰器)
课程大纲:
1、名称空间,作用域
2、函数的嵌套
3、内置函数:globals(),locals() 关键字:global,nonlocal
4、函数的应用
5、闭包函数
6、装饰器初识
7、装饰器进阶
名称空间及作用域:
名称空间概念:名称空间:当程序运行时,代码从上之下一次执行,他会将变量与值的关系存储在一个空间中,这个空间叫做名称空间,命名空间,全局名称空间。当程序遇到函数时,
他会将函数名存在内存中,函数体莫不关心。当函数执行时,内存会临时开辟一个空间,存放函数体里面的代码(变量,代码等),函数外面访问不到临时空间的内容,随着函数的执行完毕,
python中名称空间分类:
内置名称空间。
全局名称空间。
局部名称空间。
作用域:
全局作用域:
内置名称空间。
全局名称空间。
局部作用域
局部名称空间。
加载顺序:
内置名称空间 ---> 全局名称空间(当程序执行时) ---> 局部名称空间(当函数调用时)
取值顺序:单向不可逆
局部名称空间(当函数调用时) -->全局名称空间(当程序执行时) -->内置名称空间
例子:
name = 'alex' age = 12 def func1(): name1 = 'wusir' print(666) func1() def func1(): pass func1() name = 'alex' def func1(): pass func1() print(name)
内置函数:
'''
globals() 返回一个字典,字典里面的内容是全局作用域的内容。
locals():返回一个字典,当前位置 的所有变量。
'''
例子:
name = 'alex' age = 1000 sex = '男' # def func1(): # name1 = 'oldboy' # age = 10000 # print(globals()) # print(locals()) # # func1() # print(globals()) # print(locals()) def func1(): name1 = 'oldboy' age = 10000 def func2(): name2 = 'wusir' age2 = 25 print(globals()) print(locals()) func2() func1()
关键字:global,nonlocal
'''
取值顺序:单向不可逆
局部名称空间(当函数调用时) -->全局名称空间(当程序执行时) -->内置名称空间
引用
'''
#global
# 1 引用并改变一个全局变量#
# 2 在局部作用域声明一个全局变量
count = 1 def func1(): global count count = count + 1 count = count + 100 print(count) func1() print(count) print(globals()) def func1(): global name name = 'alex' print(name) func1() print(name)
nonlocal
不能操作全局变量
从哪层引用的该变量,从那层开始全部改变。
local variable 'count' referenced before assignment def func1(): count = 1 def inner(): nonlocal count count = count + 3 print(count) def inner2(): pass inner() print(count) func1()
# 取值:引用而不是改变
# 取值是从小到大取值 LEGB
# 想改变上层空间的变量 要用到global nonlocal
# 对于可变的数据类型 list dict set 不用global nonlocal
list = [] def func1(): list.append(666) func1() print(list)
# 如果默认参数是一个可变的数据类型,那么他在内存中永远是一个。
def extendList(val,list=[]): list.append(val) return list list1 = extendList(10) print('list1=%s'%list1) # [10,] list2 = extendList(123,[]) print('list2=%s'%list2) # [123,] list3 = extendList('a') print('list3=%s'%list3) #[10,'a'] print('list1=%s'%list1) print('list2=%s'%list2) print('list3=%s'%list3)

浙公网安备 33010602011771号