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

Python中函數(shù)的閉包和裝飾器示例詳解

 更新時間:2025年08月28日 11:11:56   作者:Singcing  
Python中的閉包和裝飾器是兩種非常重要的編程概念,它們都是基于函數(shù)的特性,特別是涉及到作用域和函數(shù)的嵌套,這篇文章主要介紹了Python中函數(shù)的閉包和裝飾器的相關(guān)資料,需要的朋友可以參考下

1. python的內(nèi)部函數(shù)示例

# 定義一個外部函數(shù)
def func_out(num1):
    # 定義一個內(nèi)部函數(shù)
    def func_inner(num2):
        # 內(nèi)部函數(shù)使用了外部函數(shù)的變量(num1)
        result = num1 + num2
        print("結(jié)果是:", result)
    # 外部函數(shù)返回了內(nèi)部函數(shù),這里返回的內(nèi)部函數(shù)就是閉包
    return func_inner

# 創(chuàng)建閉包實例,返回內(nèi)部函數(shù)    
# 此時的f是內(nèi)部函數(shù)
f = func_out(100)
# 執(zhí)行閉包
f(2)
f(3)

"""
f接收到func_out的返回值
f = func_inner
f() = func_inner()
"""

示例2:

def config_name(name):
    def say_hello(info):
        print(f"{name}: {info}")
    return say_hello


if __name__ == '__main__':
    # 創(chuàng)建閉包實例
    tom = config_name("tom")
    tom("What did you have for lunch ?")

    jarry = config_name("jarry")
    jarry("I had vegetables and beef.")

"""
tom: What did you have for lunch ?
jarry: I had vegetables and beef.
"""

調(diào)用閉包相當(dāng)于調(diào)用內(nèi)部函數(shù)

閉包的構(gòu)成條件
1. 在函數(shù)嵌套的前提下
2. 內(nèi)部函數(shù)使用了外部函數(shù)的變量(還包括外部函數(shù)的參數(shù))
3. 外部函數(shù)返回了內(nèi)部函數(shù)

結(jié)論:閉包可以對外部函數(shù)的變量進行保存

2. 閉包內(nèi)修改外部變量

def func_out(num1):
    def func_inner(num2):
        # 此時的num1屬于內(nèi)部函數(shù),不是外部函數(shù)的num1
        num1 = num2 + 100

    print("改前:num1 =",num1)
    # 調(diào)用內(nèi)部函數(shù)修改num1的值
    func_inner(200) # 調(diào)用方法改變num1的值
    print("改后:num1 =",num1)
    return func_inner
# 實例化閉包
f = func_out(10)

"""
改前:num1 = 10
改后:num1 = 10
"""
def func_out(num1):
    def func_inner(num2):
        # 此時的num1是外部函數(shù)變量
        nonlocal num1
        num1 = num2 + 100

    print("改前:num1 =",num1)
    # 調(diào)用內(nèi)部函數(shù)修改num1的值
    func_inner(200) # 調(diào)用方法改變num1的值
    print("改后:num1 =",num1)
    return func_inner
# 實例化閉包
f = func_out(10)
# f(10) --> 這是調(diào)用閉包(內(nèi)部函數(shù)),這里沒有調(diào)用閉包,只是創(chuàng)建了閉包
"""
改前:num1 = 10
改后:num1 = 300
"""

修改閉包使用的外部函數(shù)變量使用nonlocal關(guān)鍵字修飾

3. 裝飾器:在不改變原有函數(shù)的源代碼的情況下,給函數(shù)添加功能

1.不修改原有函數(shù)的源代碼
2. 給已有的函數(shù)添加額外的功能

符合開發(fā)中的封閉開放原則

# 1. 定義一個裝飾器(一個閉包, 一個內(nèi)部函數(shù))
def check(fn):
    # fn是comment函數(shù)
    def inner():
        print("請先登錄")
        fn()
    return inner
# 2. 需要被裝飾的函數(shù)
def comment():
    print("發(fā)表評論")

# 3. 使用裝飾器裝飾函數(shù)(增加一個登錄功能)
# 左側(cè)的comment函數(shù)已經(jīng)變成了inner()函數(shù)
comment = check(comment)
comment()
"""
請先登錄
發(fā)表評論
"""

裝飾器就是把一個函數(shù)當(dāng)作參數(shù)傳遞給閉包中的外部函數(shù),同時在內(nèi)部函數(shù)中使用這個函數(shù),并給它添加新的功能

def check(fn):
    def inner():
        print("請先登錄")
        fn()
    return inner

# 解釋器遇到@check,會執(zhí)行comment = check(comment)
@check
def comment():
    print("發(fā)表評論")

comment()
"""
請先登錄
發(fā)表評論
"""

4.修飾帶參數(shù)的函數(shù)

"""裝飾帶參數(shù)的函數(shù)"""
def loggin(fn):
    def inner(a,b):
        print("請先登錄")
        fn(a,b)
    return inner

def sum_num(a,b):
    result = a+b
    print(result)


# sum_num = inner
sum_num = loggin(sum_num)
sum_num(1,2)
"""
請先登錄
3
"""
"""裝飾帶參數(shù)的函數(shù)"""
def loggin(fn):
    def inner(a,b):
        print("請先登錄")
        fn(a,b)
    return inner

# sum_num = inner, sum_sum = loggin(sum_num)
@loggin
def sum_num(a,b):
    result = a + b
    print(result)

sum_num(1,2)
"""
請先登錄
3
"""

5. 裝飾帶有返回值的函數(shù)

"""裝飾帶返回值的函數(shù)"""
def loggin(fn):
    def inner(a,b):
        print("請先登錄")
        return fn(a,b)
    return inner

@loggin
def sum_num(a,b):
    result = a+b
    return result

ans = sum_num(1,2)
print("ans = ",ans)
"""
請先登錄
ans =  3
"""

6. 修飾不定長參數(shù)的函數(shù)

def loggin(fn):
    def inner(*args):
        print("請先登錄")
        return fn(*args)
    return inner

@loggin
def sum_args(*args):
    ans = sum(args)
    return ans

ans = sum_args(1,2,3,4,5)
print("ans = ",ans)
"""
請先登錄
ans =  15
"""

7. 多個裝飾器的使用

def check1(fn):
    def inner1():
        print("登錄驗證1")
        fn()
    return inner1

def check2(fn):
    def inner2():
        print("登錄驗證2")
        fn()
    return inner2

@check2
@check1
def comment():
    print("發(fā)表評論")

comment()
"""
登錄驗證2
登錄驗證1
發(fā)表評論
"""

8. 帶有參數(shù)的裝飾器

"""
帶參數(shù)的裝飾器,正確案例
"""
def loggin(flag):
    def decorator(fn):
        def inner(num1, num2):
            # 判斷流程
            if flag == "+":
                print("--正在努力加法計算--")
            elif flag == "-":
                print("--正在努力減法計算--")
            ant = fn (num1,num2)
            return ant
        return inner
    return decorator

# 被帶有參數(shù)的裝飾器飾的函數(shù)
@loggin("+")  # 1. loggin("+")  2. @decorator起到裝飾器的功能了
def sum_num(a, b):
    res = a + b
    return res

result = sum_num(1,3)
print("result = ",result)

帶參數(shù)的裝飾器
1. 裝飾器的外部函數(shù)只接受一個參數(shù) -- 被裝飾的函數(shù)
2. 需要給裝飾器參數(shù)需要在裝飾器外部再增加一個函數(shù)

9. call方法

class Check(object):
    def __call__(self,*args,**kwargs):
        print("請先登錄")

c1 = Check()
c1()
"""請先登錄"""

10. 類裝飾器

class Check(object):
    def __init__(self,fn):
        self._fn = fn
    def __call__(self,*args,**kwargs):
        print("請先登錄")
        self._fn()

@Check   # comment = Check(comment)
def comment():
    print("發(fā)表評論")

comment()
"""
請先登錄
發(fā)表評論
"""

11. property 裝飾器方式

class Person(object):
    def __init__(self) -> None:
        self.__age = 0
    
    @property
    def age(self):
        return self.__age
    
    @age.setter
    def age(self, new_age):
        self.__age = new_age


p = Person()
print(p.age)

p.age = 100
print(p.age)

12. property類屬性方式

class Person(object) : 
    def __init__(self) -> None:
        self.__age = 0
    
    def get_age(self):
        return self.__age
    
    def set_age(self, new_age):
        if new_age >= 150:
            print("年齡錯誤")
        else:
            self.__age = new_age
    
    age = property(get_age, set_age)


p = Person()
print(p.age)

p.age = 60
print( p.age )

總結(jié) 

到此這篇關(guān)于Python中函數(shù)的閉包和裝飾器的文章就介紹到這了,更多相關(guān)Python函數(shù)的閉包和裝飾器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • python去除文件中重復(fù)的行實例

    python去除文件中重復(fù)的行實例

    今天小編就為大家分享一篇python去除文件中重復(fù)的行實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-06-06
  • Flask SocketIO實現(xiàn)動態(tài)繪圖的示例詳解

    Flask SocketIO實現(xiàn)動態(tài)繪圖的示例詳解

    Flask-SocketIO 是基于 Flask 的一個擴展,用于簡化在 Flask 應(yīng)用中集成 WebSocket 功能,本文主要介紹了Flask SocketIO如何實現(xiàn)動態(tài)繪圖,需要的可以參考下
    2023-11-11
  • Java基礎(chǔ)技術(shù)之反射詳解

    Java基礎(chǔ)技術(shù)之反射詳解

    這篇文章主要介紹了Java基礎(chǔ)技術(shù)之反射詳解,反射就是把Java類中的各個部分,映射成一個個的Java對象,拿到這些對象后可以做一些事情,需要的朋友可以參考下
    2023-07-07
  • python算法練習(xí)之抓交通肇事犯

    python算法練習(xí)之抓交通肇事犯

    這篇文章主要該大家分享python算法抓交通肇事犯得練習(xí),文章主要通過描述抓交通肇事犯得問題然后確定程序框架將結(jié)果運算出來,下面來看詳細內(nèi)容吧,需要的朋友可以參考一下喲
    2021-10-10
  • 使用python 進行區(qū)間取值的方法

    使用python 進行區(qū)間取值的方法

    這篇文章主要介紹了使用python 進行區(qū)間取值的相關(guān)知識,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-07-07
  • 利用python如何實現(xiàn)貓捉老鼠小游戲

    利用python如何實現(xiàn)貓捉老鼠小游戲

    這篇文章主要給大家介紹了關(guān)于利用python如何實現(xiàn)貓捉老鼠小游戲的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • 使用Python提高PDF分辨率的完整指南

    使用Python提高PDF分辨率的完整指南

    在處理PDF文件時,分辨率可能會影響到需要顯示的內(nèi)容質(zhì)量,本文將帶你一步步了解如何使用Python提高PDF分辨率,希望對大家有所幫助
    2025-08-08
  • python生成器generator用法實例分析

    python生成器generator用法實例分析

    這篇文章主要介紹了python生成器generator用法,實例分析了python生成器的相關(guān)使用技巧,需要的朋友可以參考下
    2015-06-06
  • socket + select 完成偽并發(fā)操作的實例

    socket + select 完成偽并發(fā)操作的實例

    下面小編就為大家?guī)硪黄猻ocket + select 完成偽并發(fā)操作的實例。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-08-08
  • 解決python manage.py makemigrations和python manage.py migrate問題及過程

    解決python manage.py makemigrations和python mana

    文章介紹了解決執(zhí)行`python manage.py makemigrations`和`python manage.py migrate`報錯的步驟,首先刪除migrations文件夾中的所有文件,僅保留`__init__.py`文件;然后刪除數(shù)據(jù)庫中的所有表;最后重新進行數(shù)據(jù)遷移,作者分享個人經(jīng)驗,并希望大家參考和支持
    2026-02-02

最新評論

安丘市| 灵川县| 固始县| 错那县| 喀什市| 钟山县| 北京市| 康平县| 霞浦县| 根河市| 多伦县| 高邑县| 兴城市| 鄂温| 同江市| 法库县| 昔阳县| 永寿县| 清河县| 乌鲁木齐市| 顺义区| 岳池县| 黄山市| 尚义县| 阿瓦提县| 云南省| 冀州市| 邻水| 永春县| 阳朔县| 多伦县| 旺苍县| 临猗县| 资兴市| 霍林郭勒市| 五大连池市| 溧水县| 荣昌县| 榆中县| 灌南县| 电白县|