最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python基礎globlal nonlocal和閉包函數(shù)裝飾器語法糖

 更新時間:2022年11月04日 11:36:08   作者:Kkkkangsh  
這篇文章主要為大家介紹了Python基礎globlal nonlocal和閉包函數(shù)裝飾器語法糖示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

一、global與nonlocal

1、global

  • 在py文件中,一般無法調用函數(shù)體內(nèi)變量名,而global可使函數(shù)體代碼內(nèi)的變量名直接在函數(shù)體外部調用,條件是在需要調用的代碼體中使用global 調用需要的變量名

未使用global情況:

# 在外部綁定一個變量名
name = 'kangkng'
# 定義一個函數(shù)體代碼
def func():
    # 函數(shù)體內(nèi)部重新綁定一個變量名
    name = 'zhangzhang'
# 調用函數(shù)func
func()
# 這時無法打印函數(shù)體內(nèi)部的變量名
print(name)
------------------------------------------------------------------------ kangkang   

使用global情況:

# 在函數(shù)體內(nèi)部使用global時,可在外部直接調用函數(shù)內(nèi)部變量名
name = 'kangkng'
# 定義一個函數(shù)體代碼
def func():
    # 使用global調用變量名
    global name
    # 函數(shù)體內(nèi)部重新綁定一個變量名
    name = 'zhangzhang'
# 調用函數(shù)func
func()
# 外py中打印name
print(name)
------------------------------------------------------------------------
zhangzhang

2、nonlocal

  • 在函數(shù)嵌套使用時,通常在父代碼體中無法調用子代碼中變量名,

而nonlocal的作用是,可以在父代碼中直接調用子代碼中的變量名,條件是需要在子代碼中使用nonlocal 調用需要的變量名

未使用nonlocal情況:

# 定義一個函數(shù)體代碼
def outer():
    # 綁定一個變量名
    name = 'kangkang'
    # 代碼體內(nèi)部再次定義一段函數(shù)體
    def subcoat():
        # 內(nèi)層中綁定變量名
        name = 'zhangzhang'
    # 在函數(shù)外層打印變量名
    print(name)
# 調用外層函數(shù)體代碼
outer()
----------------------------------------------------------------------- 
kangkang

使用nonlocal情況:

# 在函數(shù)體內(nèi)部使用global時,可在外部直接調用函數(shù)內(nèi)部變量名
def outer():
    # 函數(shù)外層綁定一個變量名
    name = 'kangkang'
    # 代碼體內(nèi)部再次定義一段函數(shù)體
    def subcoat():
        # 在函數(shù)體內(nèi)層使用nonlocal,調用變量名
        nonlocal name
        # 內(nèi)層中綁定變量名
        name = 'zhangzhang'
    # 調用內(nèi)層函數(shù)
    subcoat()
    # 在函數(shù)外層打印變量名
    print(name)
# 調用外層函數(shù)體代碼
outer()   
----------------------------------------------------------------------
zhangzhang

二、函數(shù)名的多種用法

引言:

? 函數(shù)名就相當于變量名,只不過函數(shù)名綁定的是一段函數(shù)體代碼,在我們使用這個函數(shù)名加括號時就可以調用這段代碼體,具體由以下幾種用法:

1、當做變量名賦值

def func():
    print('我是func函數(shù)體代碼')
res = func
print(res())
------------------------------------------------------------------------
我是func函數(shù)體代碼
None

2、當作函數(shù)的參數(shù)

def func():
    print('我是func函數(shù)體代碼')
def func1(a):
    print('我是func1函數(shù)體代碼', a)
    a()
func1(func)
------------------------------------------------------------------------
我是func1函數(shù)體代碼 <function func at 0x000001D0C14D6310>
我是func函數(shù)體代碼

3、當作函數(shù)的返回值

def func():
    print('我是func函數(shù)體代碼')
def func1():
    print('我是func1函數(shù)體代碼')
    return func
res = func1()
print(res)
res()
------------------------------------------------------------------------
我是func1函數(shù)體代碼
<function func at 0x00000218F95B6310>
我是func函數(shù)體代碼

4、當作容器類型的數(shù)據(jù)

def spring():
    print('我是春季,生機盎然')
def summer():
    print('我是夏季,活力四射')
def autumn():
    print('我是秋季,翩翩起舞')
def winter():
    print('我是冬季,大雪紛飛')
while True:
    season_dict = { '1': spring,
               '2': summer,
               '3': autumn,
               '4': winter
                   }
    season_select = input('根據(jù)編號,選擇您喜歡的季節(jié)>>>:').strip()
    if season_select in season_dict:
        season_dict.get(season_select)()
    else:
        print('你選擇的編號不存在')
------------------------------------------------------------------------

三、閉包函數(shù)

1、什么是閉包函數(shù)

  一個函數(shù)的返回值是另外一個函數(shù),返回的函數(shù)調用父函數(shù)內(nèi)部的變量,如果返回的函數(shù)在外部被執(zhí)行,就產(chǎn)生了閉包

2、閉包函數(shù)需滿足的條件

滿足以下兩個條件的就是閉包函數(shù):

條件一:定義在函數(shù)內(nèi)部的函數(shù)

條件二:用到了外部函數(shù)空間名稱中的名子

3、閉包函數(shù)的作用

作用:使函數(shù)外部能夠調用函數(shù)內(nèi)部放入屬性和方法

缺點:閉包操作導致整個函數(shù)的內(nèi)部環(huán)境被長久保存,占用大量內(nèi)存

4、閉包函數(shù)的實際應用

1.函數(shù)內(nèi)部變量名在外部被訪問

def fun1():
    name = 'python'
    def inner():
        print(name)
    return inner
result = fun1()
result()
------------------------------------------------------------------------
python

2.函數(shù)體內(nèi)部函數(shù)體代碼可以通過外部訪問

def fun2():
    def inner():
        print("執(zhí)行了內(nèi)部函數(shù)inner")
    def all():
        return inner
    return all
result = fun2()
result()()
------------------------------------------------------------------------
執(zhí)行了內(nèi)部函數(shù)inner

四、裝飾器

? 當我們需要將一段函數(shù)體代碼在不改變調用方式和源代碼的情況下,需要給這個段代碼添加新的功能時,這時候我們就需要給這段代碼安裝一個裝飾器,裝飾器是指將這段代碼封裝在閉包函數(shù)內(nèi),來達到既能滿足上述條件,又能增加新的功能的條件

概念

  • 在不修改被裝飾對象源代碼和調用方式的情況下給被裝飾的對象添加新的功能

本質

  • 并不是一門新的技術,而是由函數(shù)參數(shù)、名稱空間、函數(shù)名多種用法、閉包函數(shù)組合到一起的效果

口訣

  • 對修改封閉,對擴展開放

1、裝飾器推導流程

1、首先定義一段函數(shù)體代碼,當我們給這段函數(shù)傳入指定的參數(shù)時,他就會暫停一秒,然后運行,使它在運行結束后,能夠統(tǒng)計它的運行時間

import time
def index(a, b):
    time.sleep(1)
    print(index,a, b)

2、通常,我們只需要在這段代碼運行前打印一個時間戳,運行后再次打印一個時間戳,在這段代碼運行結束后通過前后時間的插值就能統(tǒng)計出這段代碼的運行時間,但這種辦法使用起來比較麻煩且只能使用一次

方法一:
    import time
    def index(a, b):
        start = time.time()
        time.sleep(1)
        print(index, a, b)
        end = time.time()
        print(end - start)
    index(1,2)
方式二:
    import time
    def index(a, b):
        time.sleep(1)
        print(index, a, b)
    start = time.time()
    index(1,2)
    end = time.time()
    print(end - start)

3、通過上述方法的方式二,我們可以得出將函數(shù)名包裹在統(tǒng)計時間功能代碼內(nèi),這樣在調用時相對便捷,進一步思考,若將這段代碼使用函數(shù)封包,那樣在調用時就可以更為便捷,在以后統(tǒng)計該代碼時,只需要調用封包這段代碼的函數(shù)名就可以直接統(tǒng)計這段代碼的運行時間

import time
def index(a, b):
    time.sleep(1)
    print(index, a, b)
def time_():
    start = time.time()
    index()
    end = time.time()
    print(end - start)
time_()
------------------------------------------------------------------------
Traceback (most recent call last):
  File "D:/pytcharm項目文件路徑/38/11.py", line 297, in <module>
    time_()
  File "D:/pytcharm項目文件路徑/38/11.py", line 293, in time_
    index()
TypeError: index() missing 2 required positional arguments: 'a' and 'b'

4、雖然這種方式可以行得通,但只能針對沒有參數(shù)的函數(shù)體代碼,若這段代碼需要傳參者無法運行,并直接報錯。再次進一步思考,只需要將封包的這段函數(shù)設置為有參函數(shù)就可解決這個問題

import time
def index(a, b):
    time.sleep(1)
    print(index, a, b)
def core(a,b):
    start = time.time()
    index(a, b)
    end = time.time()
    print(end - start)
core(1, 2)
------------------------------------------------------------------------
<function index at 0x000001F4A0026310> 1 2
1.0047826766967773

5、由上推導可看出,雖然此功能可以更為便捷的統(tǒng)計代碼執(zhí)行時間,但若是源代碼的參數(shù)需要修改則封包它的參數(shù)也需要修改,這時我們可聯(lián)想到將參數(shù)修改為可變長參數(shù),就不會出現(xiàn)這個問題

import time
def index(a, b):
    time.sleep(1)
    print(index, a, b)
def core(*args,**kwargs):
    start = time.time()
    index(*args, **kwargs)
    end = time.time()
    print(end - start)
core(1,2)
------------------------------------------------------------------------
<function index at 0x000002ECDD4E6310> 1 2
1.004744529724121

6、這樣無論源代碼參數(shù)如何修改,我們都可以進行傳參,雖然這個問題解決了,但考慮使用的廣泛性,若有其他函數(shù)體也需要用到這個功能時,還需要重新修改封包內(nèi)代碼,這時,我們可以使用閉包的方式來滿足這個條件

import time
def index(a, b):
    time.sleep(1)
    print(index, a, b)
def func(x, y, z):
    time.sleep(2)
    print(func, x, y, z)
def outer(index):
    def core(*args, **kwargs):
        start = time.time()
        index(*args, **kwargs)
        end = time.time()
        print(end - start)
    return core
res = outer(func)
res(1, 2, 3)
------------------------------------------------------------------------
<function func at 0x0000018C23686670> 1 2 3
2.00856614112854

7、通過將源代碼函數(shù)名放至閉包函數(shù)參數(shù)內(nèi),就可以達到可以調動任何函數(shù)體代碼都可以執(zhí)行此功能的方法,但并未滿足閉包函數(shù)的條件,源代碼的調用方式改變了,這時我們可以通過將原函數(shù)體代碼賦值的方式來達到調用方式和源代碼都未改變的情況下來增加此功能

import time
def index(a, b):
    time.sleep(1)
    print(index, a, b)
def func(x, y, z):
    time.sleep(2)
    print(func, x, y, z)
def outer(index):
    def core(*args, **kwargs):
        start = time.time()
        index(*args, **kwargs)
        end = time.time()
        print(end - start)
    return core
index = outer(index)
index(1,2)
func = outer(func)
func(1, 2, 3)
------------------------------------------------------------------------
<function outer.<locals>.core at 0x0000026C17F58280> 1 2
1.004807710647583
<function outer.<locals>.core at 0x0000026C17F58940> 1 2 3
2.0077626705169678

8、雖然上述推導過程都已滿足裝飾器條件,但是考慮到源代碼有返回值的情況,我們沒有并沒有獲取,這時在進一步推導,可在裝飾器函數(shù)內(nèi)部調用源代碼函數(shù)名的位置設置一個變量名用于接收返回值,傳給裝飾器底層return用于接收即可解決這個問題

import time
def index(a, b):
    time.sleep(1)
    print(index, a, b)
    return 'index'
def func(x, y, z):
    time.sleep(2)
    print(func, x, y, z)
    return 'func'
def outer(index):
    def core(*args, **kwargs):
        start = time.time()
        res = index(*args, **kwargs)
        end = time.time()
        print(end - start)
        return res
    return core
index = outer(index)
res = index(1,2)
print(res)
func = outer(func)
res = func(1, 2, 3)
print(res)
------------------------------------------------------------------------
<function outer.<locals>.core at 0x0000020C50A78280> 1 2
1.0050580501556396
index
<function outer.<locals>.core at 0x0000020C50A78940> 1 2 3
2.0094454288482666
func

2、裝飾器語法糖

什么是裝飾器語法糖

當我們使用裝飾器調用被裝飾的函數(shù)體代碼時,總是需要在調用前通過賦值的方式來調用,這樣的方式相對比較麻煩,這時我們就可以用到裝飾器語法糖來節(jié)省時間和代碼

語法糖的使用方法和條件

用法:在源代碼函數(shù)體上方使用@加裝飾器函數(shù)名

條件:源代碼需在裝飾器下方

具體用法

import time
def outer(index):
    def core(*args, **kwargs):
        start = time.time()
        res = index(*args, **kwargs)
        end = time.time()
        print(end - start)
        return res
    return core
@outer
def index(a, b):
    time.sleep(1)
    print(index, a, b)
    return 'index'
index(1,2)

3、裝飾器模板

def outer(func):
    def inner(*args, **kwargs):
        # 執(zhí)行被裝飾對象之前可以做的額外操作
        res = func(*args, **kwargs)
        # 執(zhí)行被裝飾對象之后可以做的額外操作
        return res
    return inner

以上就是Python基礎globlal nonlocal和閉包函數(shù)裝飾器語法糖的詳細內(nèi)容,更多關于Python基礎globlal nonlocal的資料請關注腳本之家其它相關文章!

相關文章

  • Python?函數(shù)參數(shù)11個案例分享

    Python?函數(shù)參數(shù)11個案例分享

    大家好,今天給大家分享一下明哥整理的一篇?Python?參數(shù)的內(nèi)容,內(nèi)容非常的干,全文通過案例的形式來理解知識點,自認為比網(wǎng)上?80%?的文章講的都要明白,如果你是入門不久的?python?新手,相信本篇文章應該對你會有不小的幫助,需要的朋友可以參考下
    2023-02-02
  • 基于Python實現(xiàn)原生的登錄驗證碼詳情

    基于Python實現(xiàn)原生的登錄驗證碼詳情

    在前面的文章中,我有分享到 vue+drf+第三方滑動驗證碼接入的實現(xiàn),本文將要分享的是基于 python 實現(xiàn)原生的登錄驗證碼,需要的朋友可以參考一下
    2021-10-10
  • Python裝飾器基礎詳解

    Python裝飾器基礎詳解

    裝飾器(decorator)是一種高級Python語法。裝飾器可以對一個函數(shù)、方法或者類進行加工。接下來通過本文給大家介紹python裝飾器基礎,對python裝飾器相關知識感興趣的朋友一起學習吧
    2016-03-03
  • Pygame Time時間控制的具體使用詳解

    Pygame Time時間控制的具體使用詳解

    pygame.time 時間控制模塊,是 Pygame 中使用頻率較高的模塊,其主要功能是管理時間和游戲幀數(shù)率,本文就來詳細的介紹一下,感興趣的可以了解一下
    2021-11-11
  • Python 中類的構造方法 __New__的妙用

    Python 中類的構造方法 __New__的妙用

    這篇文章主要介紹了Python 中類的構造方法 New的妙用,Python 的類中,所有以雙下劃線__包起來的方法,叫魔術方法,魔術方法在類或對象的某些事件發(fā)出后可以自動執(zhí)行,讓類具有神奇的魔力。下面就來學習文章的詳細內(nèi)容把
    2021-10-10
  • python?pygame英雄循環(huán)飛行及作業(yè)示例

    python?pygame英雄循環(huán)飛行及作業(yè)示例

    這篇文章主要為大家介紹了python?pygame英雄循環(huán)飛行及作業(yè)實現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-08-08
  • Python實現(xiàn)學生管理系統(tǒng)的代碼(JSON模塊)

    Python實現(xiàn)學生管理系統(tǒng)的代碼(JSON模塊)

    這篇文章主要介紹了Python實現(xiàn)學生管理系統(tǒng)的代碼(JSON模塊),本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-04-04
  • 點云地面點濾波(Cloth Simulation Filter, CSF)

    點云地面點濾波(Cloth Simulation Filter, CSF)

    這篇文章主要介紹了點云地面點濾波(Cloth Simulation Filter, CSF)“布料”濾波算法介紹,本文從基本思想到實現(xiàn)思路一步步給大家講解的非常詳細,需要的朋友可以參考下
    2021-08-08
  • python去除字符串中空格的6種常用方法

    python去除字符串中空格的6種常用方法

    最近業(yè)務需要對Pyhon中的一些字符串內(nèi)容去除空格,方便后續(xù)處理,下面這篇文章主要給大家介紹了關于python去除字符串中空格的6種常用方法,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2023-05-05
  • python orm 框架中sqlalchemy用法實例詳解

    python orm 框架中sqlalchemy用法實例詳解

    這篇文章主要介紹了python orm 框架中sqlalchemy用法,結合實例形式詳細分析了Python orm 框架基本概念、原理及sqlalchemy相關使用技巧,需要的朋友可以參考下
    2020-02-02

最新評論

临海市| 肇源县| 南召县| 霞浦县| 福清市| 沂南县| 吉水县| 高碑店市| 文成县| 尚志市| 区。| 启东市| 西畴县| 平顶山市| 铅山县| 建水县| 怀远县| 汕尾市| 南乐县| 连平县| 井冈山市| 巫山县| 彝良县| 砀山县| 南宁市| 宜兴市| 商水县| 郑州市| 安陆市| 罗田县| 衡东县| 开原市| 嘉兴市| 裕民县| 高陵县| 南丹县| 海阳市| 墨竹工卡县| 神木县| 揭阳市| 吴堡县|