名称空间-作用域-装饰器
admin
2023-07-09 10:04:24
0

1.名称空间

1.1含义

名称空间正是存放名字x与1绑定关系的地方

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

相关内容

热门资讯

美前副总统:共和党失去了方向,... 2026年是美国的中期选举年,共和党选情不利,可能在年底的选举中遭遇挫败。美国前副总统彭斯5月31日...
南枝原来去过中国?《给阿嬷的情... 《给阿嬷的情书》票房口碑双丰收,目前票房已突破13亿。凤凰卫视最新一期《问答神州》专访了该片导演蓝鸿...
法国海军扣押一艘俄“影子舰队”... 近日,法国海军在大西洋海域扣押了一艘据称从俄罗斯摩尔曼斯克出发的油轮,引发俄方强烈不满。俄新社6月1...
凤凰晚报丨面粉染头模仿黄仁勋,... 今日人物【面粉染头模仿黄仁勋,农村青年走红后称遭“法务”警告】“先赔偿5000元肖像侵权使用费,再删...
亲特朗普极右派候选人领跑哥伦比... 【文/观察者网 熊超然】当地时间5月31日,哥伦比亚总统选举拉开帷幕,首轮投票计票工作已完成逾99%...
2026年度网络举报系列宣传活... 5月28日至29日,以“每一件举报,都是共治的力量——豫你e行 同心护网”为主题的2026年度网络举...
中原首例帝企鹅DNA性别鉴定!... 近日,郑州海昌海洋公园正式对外公布中原首对人工繁育的帝企鹅萌宝的DNA性别鉴定报告。这是中原首个将 ...
我国科学家为细胞信号“导航”开... 新华社济南5月31日电(记者张力元)人体细胞犹如一座精密的通信城市,每天都有大量“指令”穿梭传递,调...
极端大风突袭哈尔滨!过山车停摆... 极目新闻记者 詹钘5月31日,受强对流天气影响,哈尔滨国际会展中心体育场相关设施受到损坏,原计划当晚...
三原电缆取得电缆接头连接用防护... 国家知识产权局信息显示,上海三原电缆附件有限公司取得一项名为“一种电缆接头连接用防护结构”的专利,授...