名称空间-作用域-装饰器
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

相关内容

热门资讯

空调连续工作多久需要停机休息 空调连续工作的时间取决于多个因素,包括空调的型号、功率、使用环境和维护情况等。一般来说,空调可以连续...
空调哪个符号是除湿的 空调除湿功能通常用一个水滴形状的符号表示。不同品牌和型号的空调遥控器可能会有所差异,但一般来说,除湿...
格力空调多长时间加一次氟利昂 1、一般情况下,空调对氟利昂的使用量是非常小的,所以在空调使用了四年左右的时候再考虑加也没问题。2、...
空调用多长时间需要加氟一次 一般情况下是五年。当出现以下这几种情况时,空调才需要加氟。1、空调的室内机和室外机各有两个接口,当接...
格调生活·C标思享荟:卡萨帝在... 9月12日的郑州龙湖金融岛,夜风轻拂,灯光璀璨。“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑...
品牌价值破千亿、高端份额持续领... 9月12日,“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑州站”在郑州龙湖金融岛举办。2026...
空调主板坏了修800还是换新的 空调主板坏了是修还是换新,需要考虑多个因素,以下是一些建议:1. 维修成本:如果维修费用较低,比如 ...
空调开多久需要休息多长时间 问题:空调开多久需要休息多长时间回答:1、在使用空调的过程中,一般空调开7~8个小时左右需要休息2~...
中央空调多长时间清洗一次 1、一般空调开机前清洗一次即可,空调开机中间时段再清洗一次,空调关机时清洗一次,这样比较合理。2、空...
中央空调氟利昂多久加一次 看空调制热和制冷程度,很多人的观点认为氟利昂必须一年放一次,其实这个观点是错误的,理解上面有点偏差,...