名稱空間-作用域-裝飾器-創(chuàng)新互聯(lián)

1.名稱空間

1.1含義

名稱空間正是存放名字x與1綁定關(guān)系的地方

創(chuàng)新互聯(lián)長(zhǎng)期為成百上千家客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊(duì)從業(yè)經(jīng)驗(yàn)10年,關(guān)注不同地域、不同群體,并針對(duì)不同對(duì)象提供差異化的產(chǎn)品和服務(wù);打造開放共贏平臺(tái),與合作伙伴共同營(yíng)造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為淇濱企業(yè)提供專業(yè)的成都網(wǎng)站設(shè)計(jì)、做網(wǎng)站、成都外貿(mào)網(wǎng)站建設(shè)公司,淇濱網(wǎng)站改版等技術(shù)服務(wù)。擁有十余年豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制開發(fā)。

1.2名稱空間種類

locals:是函數(shù)內(nèi)的名稱空間,包括局部變量和形參
globas:全局變量,函數(shù)定義所在模塊的名字空間
builtins:內(nèi)置模塊的名字空間

1.3作用域

作用域即范圍:
全局范圍:全局存貨,全局有效
局部范圍:臨時(shí)存活,局部有效
查看作用域的方法globals(),locals()

>>> locals()
{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <class '_frozen_import
lib.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_import
lib.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: 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:函數(shù)內(nèi)的名字空間,包括局部變量和形參
enclosing外部嵌套函數(shù)的名字空間
globals全局變量,函數(shù)定義所在模塊的名字空間
builtins內(nèi)置模塊的名字空間

1.5閉包

在外部函數(shù)中定義了一個(gè)內(nèi)部函數(shù),內(nèi)函數(shù)中使用了外部函數(shù)中的臨時(shí)變量,并且外部函數(shù)的返回值是內(nèi)部函數(shù)的引用,這樣就形成了閉包。
一般情況下我們認(rèn)為,如果一個(gè)函數(shù)結(jié)束,函數(shù)內(nèi)部所有的東西都會(huì)在內(nèi)存中被釋放掉,還給內(nèi)存,局部變量消失。但是閉包是一種特殊情況,如果外部函數(shù)結(jié)束的時(shí)候,發(fā)現(xiàn)自己的局部變量還會(huì)在內(nèi)部函數(shù)中使用,就會(huì)把這個(gè)局部變量綁定給內(nèi)部函數(shù),然后自己再結(jié)束。

#!/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): #把要執(zhí)行的模塊從這里傳進(jìn)來

    def inner():#再定義一層函數(shù)
        _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() # 看這里看這里,只要驗(yàn)證通過了,就調(diào)用相應(yīng)功能

    return inner #用戶調(diào)用login時(shí),只會(huì)返回inner的內(nèi)存地址,下次再調(diào)用時(shí)加上()才會(huì)執(zhí)行inner函數(shù)
@login
def america():

    print("----歐美專區(qū)----")
america()
# 上面代碼相當(dāng)于下面的內(nèi)容
 "函數(shù)開始執(zhí)行到@login時(shí)做的事"
# inner_fun = login(america) 
 "真正調(diào)用america()函數(shù),執(zhí)行inner函數(shù)"
# inner_fun()  
def japan():
    print("----日韓專區(qū)----")

@login
def henan():
    print("----河南專區(qū)----")
henan()

E:\PythonProject\python-test\venvP3\Scripts\python.exe E:/PythonProject/python-test/BasicGrammer/test.py
user:vita
pasword:123
welcome login....
----歐美專區(qū)----
----河南專區(qū)----

Process finished with exit code 0

1.7函數(shù)帶參數(shù)的裝飾器

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author: vita
user_status = False
def login(func): #把要執(zhí)行的模塊從這里傳進(jìn)來

    def inner(*args,**kwargs):#再定義一層函數(shù)
        _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) # 看這里看這里,只要驗(yàn)證通過了,就調(diào)用相應(yīng)功能

    return inner #用戶調(diào)用login時(shí),只會(huì)返回inner的內(nèi)存地址,下次再調(diào)用時(shí)加上()才會(huì)執(zhí)行inner函數(shù)
@login
def america(style):
    print("style:",style)
    print("----歐美專區(qū)----")
america("america")
# 上面的代碼相當(dāng)于
# inner_fun = login(america)
# inner_fun("america")
def japan():
    print("----日韓專區(qū)----")

@login
def henan(style):
    print("style:", style)
    print("----河南專區(qū)----")
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
----歐美專區(qū)----
style: china
----河南專區(qū)----

Process finished with exit code 0

1.8帶參數(shù)的裝飾器

 #!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author: vita
user_status = False
def login(login_type):
    def auth(func): #把要執(zhí)行的模塊從這里傳進(jìn)來

        def inner(*args,**kwargs):#再定義一層函數(shù)
            _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) # 看這里看這里,只要驗(yàn)證通過了,就調(diào)用相應(yīng)功能

        return inner #用戶調(diào)用login時(shí),只會(huì)返回inner的內(nèi)存地址,下次再調(diào)用時(shí)加上()才會(huì)執(zhí)行inner函數(shù)
    return auth
@login("qq")
def america(style):
    print("style:",style)
    print("----歐美專區(qū)----")
america("america")
# 上面的代碼相當(dāng)于
# auth = login("qq")
# inner_fun = auth(america)
# inner_fun("america")
def japan():
    print("----日韓專區(qū)----")

# 由于這里是不是qq登錄,所以沒有執(zhí)行
@login("weixin")
def henan(style):
    print("style:", style)
    print("----河南專區(qū)----")
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
----歐美專區(qū)----

Process finished with exit code 0

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)cdcxhl.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。

本文題目:名稱空間-作用域-裝飾器-創(chuàng)新互聯(lián)
分享地址:http://bm7419.com/article8/cedcop.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供移動(dòng)網(wǎng)站建設(shè)、App設(shè)計(jì)網(wǎng)站內(nèi)鏈、建站公司網(wǎng)站建設(shè)、網(wǎng)站維護(hù)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

營(yíng)銷型網(wǎng)站建設(shè)