名称空间-作用域-装饰器
1.3作用域名称空间正是存放名字x与1绑定关系的地方
1.2名称空间种类locals:是函数内的名称空间,包括局部变量和形参
globas:全局变量,函数定义所在模块的名字空间
builtins:内置模块的名字空间
作用域即范围:
全局范围:全局存货,全局有效
局部范围:临时存活,局部有效
查看作用域的方法globals(),locals()
>>> locals(){'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <class '_frozen_importlib.BuiltinImporter'>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins'(built-in)>, 'l': [2, 3, 4, 5, 6, 7], 's': bytearray(b'aoaini'), 'd': {10: 2, 12: 1, 9: 0}, 'a': [1, 2, 3, 4, 5], 'b': ['a', 'b', 'c']}>>> globals(){'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <class '_frozen_importlib.BuiltinImporter'>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins'(built-in)>, 'l': [2, 3, 4, 5, 6, 7], 's': bytearray(b'aoaini'), 'd': {10: 2, 12: 1, 9: 0}, 'a': [1, 2, 3, 4, 5], 'b': ['a', 'b', 'c']}>>>
1.4作用域查找顺序
#!/usr/bin/env python# -*- coding:utf-8 -*-# Author: vitalevel = 'L0'n = 22def func(): level = 'L1' n = 33 print(locals()) def outer(): n = 44 level = 'L2' print(locals(),n) def inner(): level = 'L3' print(locals(),n) #此外打印的n是多少? inner() outer()func()E:\PythonProject\python-test\venvP3\Scripts\python.exe E:/PythonProject/python-test/BasicGrammer/test.py{'n': 33, 'level': 'L1'}{'level': 'L2', 'n': 44} 44{'level': 'L3', 'n': 44} 44Process finished with exit code 0
1.5闭包LEGB代表变量查找顺序:locals->enclosing function ->globals ->builtins
locals:函数内的名字空间,包括局部变量和形参
enclosing外部嵌套函数的名字空间
globals全局变量,函数定义所在模块的名字空间
builtins内置模块的名字空间
在外部函数中定义了一个内部函数,内函数中使用了外部函数中的临时变量,并且外部函数的返回值是内部函数的引用,这样就形成了闭包。
一般情况下我们认为,如果一个函数结束,函数内部所有的东西都会在内存中被释放掉,还给内存,局部变量消失。但是闭包是一种特殊情况,如果外部函数结束的时候,发现自己的局部变量还会在内部函数中使用,就会把这个局部变量绑定给内部函数,然后自己再结束。
#!/usr/bin/env python# -*- coding:utf-8 -*-# Author: vitadef outer(a): b = 23 def inner(): print(a+b) return innerinner_fun = outer(12)inner_fun()E:\PythonProject\python-test\venvP3\Scripts\python.exe E:/PythonProject/python-test/BasicGrammer/test.py35Process finished with exit code 0
1.6装饰器
#!/usr/bin/env python# -*- coding:utf-8 -*-# Author: vitauser_status = Falsedef login(func): #把要执行的模块从这里传进来 def inner():#再定义一层函数 _username = "vita" #假装这是DB里存的用户信息 _password = "123" #假装这是DB里存的用户信息 global user_status if user_status == False: username = input("user:") password = input("pasword:") if username == _username and password == _password: print("welcome login....") user_status = True else: print("wrong username or password!") if user_status == True: func() # 看这里看这里,只要验证通过了,就调用相应功能 return inner #用户调用login时,只会返回inner的内存地址,下次再调用时加上()才会执行inner函数@logindef america(): print("----欧美专区----")america()# 上面代码相当于下面的内容 "函数开始执行到@login时做的事"# inner_fun = login(america) "真正调用america()函数,执行inner函数"# inner_fun() def japan(): print("----日韩专区----")@logindef henan(): print("----河南专区----")henan()E:\PythonProject\python-test\venvP3\Scripts\python.exe E:/PythonProject/python-test/BasicGrammer/test.pyuser:vitapasword:123welcome login....----欧美专区--------河南专区----Process finished with exit code 0
1.7函数带参数的装饰器
#!/usr/bin/env python# -*- coding:utf-8 -*-# Author: vitauser_status = Falsedef login(func): #把要执行的模块从这里传进来 def inner(*args,**kwargs):#再定义一层函数 _username = "vita" #假装这是DB里存的用户信息 _password = "123" #假装这是DB里存的用户信息 global user_status if user_status == False: username = input("user:") password = input("pasword:") if username == _username and password == _password: print("welcome login....") user_status = True else: print("wrong username or password!") if user_status == True: func(*args,**kwargs) # 看这里看这里,只要验证通过了,就调用相应功能 return inner #用户调用login时,只会返回inner的内存地址,下次再调用时加上()才会执行inner函数@logindef america(style): print("style:",style) print("----欧美专区----")america("america")# 上面的代码相当于# inner_fun = login(america)# inner_fun("america")def japan(): print("----日韩专区----")@logindef henan(style): print("style:", style) print("----河南专区----")henan("china")E:\PythonProject\python-test\venvP3\Scripts\python.exe E:/PythonProject/python-test/BasicGrammer/test.pyuser:vitapasword:123welcome login....style: america----欧美专区----style: china----河南专区----Process finished with exit code 0
1.8带参数的装饰器
#!/usr/bin/env python# -*- coding:utf-8 -*-# Author: vitauser_status = Falsedef login(login_type): def auth(func): #把要执行的模块从这里传进来 def inner(*args,**kwargs):#再定义一层函数 _username = "vita" #假装这是DB里存的用户信息 _password = "123" #假装这是DB里存的用户信息 global user_status if user_status == False and login_type == "qq": username = input("user:") password = input("pasword:") if username == _username and password == _password: print("welcome login....") user_status = True else: print("wrong username or password!") if user_status == True and login_type == "qq": func(*args,**kwargs) # 看这里看这里,只要验证通过了,就调用相应功能 return inner #用户调用login时,只会返回inner的内存地址,下次再调用时加上()才会执行inner函数 return auth@login("qq")def america(style): print("style:",style) print("----欧美专区----")america("america")# 上面的代码相当于# auth = login("qq")# inner_fun = auth(america)# inner_fun("america")def japan(): print("----日韩专区----")# 由于这里是不是qq登录,所以没有执行@login("weixin")def henan(style): print("style:", style) print("----河南专区----")henan("china")E:\PythonProject\python-test\venvP3\Scripts\python.exe E:/PythonProject/python-test/BasicGrammer/test.pyuser:vitapasword:123welcome login....style: america----欧美专区----Process finished with exit code 0
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。