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)

 

posted @ 2018-05-28 17:09  MR_dy  阅读(86)  评论(0)    收藏  举报