名称空间-作用域-装饰器-创新互联
1.名称空间
1.1含义
名称空间正是存放名字x与1绑定关系的地方
创新互联长期为成百上千家客户提供的网站建设服务,团队从业经验10年,关注不同地域、不同群体,并针对不同对象提供差异化的产品和服务;打造开放共赢平台,与合作伙伴共同营造健康的互联网生态环境。为淇滨企业提供专业的成都网站设计、做网站、成都外贸网站建设公司,淇滨网站改版等技术服务。拥有十余年丰富建站经验和众多成功案例,为您定制开发。1.2名称空间种类
locals:是函数内的名称空间,包括局部变量和形参
globas:全局变量,函数定义所在模块的名字空间
builtins:内置模块的名字空间
1.3作用域
作用域即范围:
全局范围:全局存货,全局有效
局部范围:临时存活,局部有效
查看作用域的方法globals(),locals()
>>> locals()
{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': , '__spec__': None, '__annotations__': {}, '__builtins__': , '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__': , '__spec__': None, '__annotations__': {}, '__builtins__': , '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: vita
level = 'L0'
n = 22
def 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} 44
Process finished with exit code 0
LEGB代表变量查找顺序:locals->enclosing function ->globals ->builtins
locals:函数内的名字空间,包括局部变量和形参
enclosing外部嵌套函数的名字空间
globals全局变量,函数定义所在模块的名字空间
builtins内置模块的名字空间
1.5闭包
在外部函数中定义了一个内部函数,内函数中使用了外部函数中的临时变量,并且外部函数的返回值是内部函数的引用,这样就形成了闭包。
一般情况下我们认为,如果一个函数结束,函数内部所有的东西都会在内存中被释放掉,还给内存,局部变量消失。但是闭包是一种特殊情况,如果外部函数结束的时候,发现自己的局部变量还会在内部函数中使用,就会把这个局部变量绑定给内部函数,然后自己再结束。
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author: vita
def outer(a):
b = 23
def inner():
print(a+b)
return inner
inner_fun = outer(12)
inner_fun()
E:\PythonProject\python-test\venvP3\Scripts\python.exe E:/PythonProject/python-test/BasicGrammer/test.py
35
Process finished with exit code 0
1.6装饰器
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author: vita
user_status = False
def 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函数
@login
def america():
print("----欧美专区----")
america()
# 上面代码相当于下面的内容
"函数开始执行到@login时做的事"
# inner_fun = login(america)
"真正调用america()函数,执行inner函数"
# inner_fun()
def japan():
print("----日韩专区----")
@login
def henan():
print("----河南专区----")
henan()
E:\PythonProject\python-test\venvP3\Scripts\python.exe E:/PythonProject/python-test/BasicGrammer/test.py
user:vita
pasword:123
welcome login....
----欧美专区----
----河南专区----
Process finished with exit code 0
1.7函数带参数的装饰器
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author: vita
user_status = False
def 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函数
@login
def america(style):
print("style:",style)
print("----欧美专区----")
america("america")
# 上面的代码相当于
# inner_fun = login(america)
# inner_fun("america")
def japan():
print("----日韩专区----")
@login
def henan(style):
print("style:", style)
print("----河南专区----")
henan("china")
E:\PythonProject\python-test\venvP3\Scripts\python.exe E:/PythonProject/python-test/BasicGrammer/test.py
user:vita
pasword:123
welcome login....
style: america
----欧美专区----
style: china
----河南专区----
Process finished with exit code 0
1.8带参数的装饰器
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author: vita
user_status = False
def 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.py
user:vita
pasword:123
welcome login....
style: america
----欧美专区----
Process finished with exit code 0
另外有需要云服务器可以了解下创新互联cdcxhl.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。
分享标题:名称空间-作用域-装饰器-创新互联
网页链接:http://pwwzsj.com/article/cedcop.html