python22期自动化-Day4

命名空间:

当程序运行时,代码从上至下依次执行,它会将变量和值的关系存储在一个空间中
这个空间叫做名称空间,也叫做命名空间,全局名称空间

当程序遇到函数时,它会将函数名存储在内存中,函数体漠不关心
当函数执行时,内存会临时开辟一个空间,存放函数体里面的代码
函数访问不到临时空间的内容,随着函数的执行完毕,临时空间释放
临时开辟的空间叫做临时名称空间,也叫做局部名称空间

python中名称空间分三种:
    内置名称空间
    全局名称空间
    局部名称空间

作用域
    全局作用域:
    内置名称空间
    全局名称空间

局部作用域:
    局部名称空间

加载顺序:
    1、内置名称空间
    2、全局名称空间(当程序执行时)
    3、局部名称空间(当函数调用时)

取值顺序:
    1、局部名称空间
    2、全局名称空间
    3、内置名称空间
    从小到大,单向不可逆的寻找

函数嵌套:

函数内调用函数

内置函数globals() locals()

globals()
返回一个字典,字典里面的内容是全局名称空间的内容
locals()
返回一个字典,当前位置的所有变量

关键字global nonlocal

局部空间只能引用全局变量,不能改变
global
1、引用并改变全局变量
2、声明全局变量,声明后可修改
nonlocal
1、不能操作全局变量
2、声明非当前临时空间变量,并依次向上查找变量,声明后可修改

函数名的应用:

1、可以被引用
2、作为容器类数据的元素
3、作为函数的参数
4、作为函数的返回值
5、如变量,可以任意赋值
像这样的函数名,有一个叫法:第一类对象

闭包:

内层函数对外层函数非全局变量引用
用函数名.__closure__  判断是否为闭包

装饰器初识

含义;本质是闭包
根本作用;在不影响原函数执行的基础上,增加一些额外的功能登陆打印等

def log(func):
"""
保存日志装饰器
:param func: 函数对象
:return: 新函数对象
"""""
def inner():
    if status_dict['login']:
        user = status_dict['login']
    else:
        user = 'guest'

    with open(file='blog.log', encoding='utf-8', mode='a') as log_file:
        log_file.write('[%s] %s用户访问%s\n'
                       % (time.strftime('%Y-%m-%d'), user, choice_list[choice.strip()]))
    func()

return inner

如果默认参数是一个可变的数据类型,那么它在内存中,永远是一个

def extendList(val, list=[]):
        list.append(val)
        return list

list1 = extendList(10)
list2 = extendList(123, [])
list3 = extendList('a')

print('list1=%s' % list1)
print('list2=%s' % list2)
print('list3=%s' % list3)
'''
[10, 'a']
[123]
[10, 'a']
'''

猜你喜欢

转载自blog.51cto.com/wlmint/2122657