欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

python中的閉包和裝飾器的使用示例

 更新時(shí)間:2022年11月18日 16:35:41   作者:一只不起眼的豬  
閉包就是能夠讀取其他函數(shù)內(nèi)部變量的函數(shù),例如在javascript中,只有函數(shù)內(nèi)部的子函數(shù)才能讀取局部變量,所以閉包可以理解成“定義在一個(gè)函數(shù)內(nèi)部的函數(shù),這篇文章主要介紹了python中的閉包和裝飾器的使用,需要的朋友可以參考下

函數(shù)參數(shù)

在python中,函數(shù)可以當(dāng)作參數(shù)使用

def func01():
    print("func01 is show ......")


# func01()
# 函數(shù)名存放的是函數(shù)所在空間的地址
# print(func01)
# 函數(shù)名也可以像普通變量一樣賦值
# func02 = func01
# func02()

def foo(func):
    func()


foo(func01)

閉包的構(gòu)成條件

1.在函數(shù)嵌套(函數(shù)里面再定義函數(shù))的前提下
2.內(nèi)部函數(shù)使用了外部函數(shù)的變量(還包括外部函數(shù)的參數(shù))
3.外部函數(shù)返回了內(nèi)部函數(shù)

# 閉包的構(gòu)成條件:
# 1在函數(shù)嵌套(函數(shù)里面再定義函數(shù))的前提下

def func_out(num1):
    def func_inner(num2):
        # 2內(nèi)部函數(shù)使用了外部函數(shù)的變量(還包括外部函數(shù)的參數(shù))
        num = num1 + num2
        print("num的值為", num2)

    # 3外部函數(shù)返回了內(nèi)部函數(shù)
    return func_inner


# 創(chuàng)建閉包實(shí)例
f = func_out(10)
# 執(zhí)行閉包
f(1)
f(2)

基礎(chǔ)的閉包的使用

# 外部函數(shù)
def config_name(name):
    # 內(nèi)部函數(shù)
    def say_info(info):
        print(name + ":" + info)

    return say_info
tom = config_name("tom")
tom("你好")
tom("你在嗎")

jerry = config_name("jerry")
jerry("你好")
jerry("我在呢")

# 外部函數(shù)
def config_name(name):
    # 內(nèi)部函數(shù)
    def say_info(info):
        print(name + ":" + info)

    return say_info


tom = config_name("tom")
tom("你好")
tom("你在嗎")

jerry = config_name("jerry")
jerry("你好")
jerry("我在呢")

nonloal關(guān)鍵字的使用

1.非局部聲明變量指代的已有標(biāo)識(shí)符是最近外面函數(shù)的已聲明變量,但是不包括全局變量。這個(gè)是很重要的,因?yàn)榻壎ǖ哪J(rèn)行為是首先搜索本地命名空間。nonlocal聲明的變量只對(duì)局部起作用,離開封裝函數(shù),那么該變量就無效。
2.非局部聲明不像全局聲明,我們必須在封裝函數(shù)前面事先聲明該變量
3.非局部聲明不能與局部范圍的聲明沖突

# 外部函數(shù)
def func_out(num1):
    # 內(nèi)部函數(shù)
    # aaa = 10

    def func_inner(num2):
        nonlocal num1
        num1 = num2 + 10
    print(num1)
    func_inner(10)
    print(num1)

    return func_inner
# num1 = 10
# f = func_out(10)
# 調(diào)用閉包 = 內(nèi)部函數(shù) num2 = 10
# f(10)

func_out(10)

基礎(chǔ)代碼實(shí)現(xiàn)(裝飾器)

# 1.定義一個(gè)裝飾器(裝飾器的本質(zhì)是閉包)
def check(fn):
    def inner():
        print("登錄驗(yàn)證")
        fn()

    return inner

# 需要被裝飾的函數(shù)
def comment():
    print("發(fā)表評(píng)論")

# 2使用裝飾器裝飾函數(shù)(增加一個(gè)登錄功能)
comment = check(comment)
comment()

裝飾器的基本使用

# 1定義一個(gè)裝飾器(裝飾器的本質(zhì)是閉包)
def check(fn):
    def inner():
        print("請(qǐng)先登陸")
        fn()

    return inner
# 2使用裝飾器裝飾函數(shù)(增加一個(gè)登陸功能)
# 解釋器遇到@check 會(huì)立即執(zhí)行 comment = check(comment)

@check
def comment():
    print("發(fā)表評(píng)論")
comment()

裝飾器的使用

import time
# 1 定義裝飾器
def get_time(fn):
    def inner():
        start = time.time()
        fn()
        end = time.time()

        print("時(shí)間:", end - start)

    return inner

# 2 裝飾函數(shù)
# 要被裝飾的函數(shù)
@get_time
def func():
    for i in range(100000):
        print(i)
func()

有參數(shù)的裝飾器的使用

# 定義裝飾器
def logging(fn):  # fn = sum_num
    def inner(a, b):
        fn(a, b)

    return inner  # sum_num = inner

# 使用裝飾器裝飾函數(shù)
@logging
def sum_num(a, b):
    result = a + b
    print(result)
sum_num(1, 2)

帶有返回值的裝飾器

# 定義裝飾器
def logging(fn):  # fn = sum_num
    def inner(a, b):
        result = fn(a, b)
        return result

    return inner  # sum_num = inner

# 使用裝飾器裝飾函數(shù)
@logging
def sum_num(a, b):
    result = a + b
    return result
result = sum_num(1, 2)
print(result)

帶有不定長參數(shù)的裝飾器

# 定義裝飾器
def logging(fn):  # fn = sum_num
    def inner(*args, **kwargs):
        fn(*args, **kwargs)

    return inner  # sum_num = inner

# 使用裝飾器裝飾函數(shù)
@logging
def sum_num(*args, **kwargs):
    print(args, kwargs)
sum_num(1, 2, 3, age="18")

帶有參數(shù)的裝飾器的使用

# 裝飾器
def logging(flag):  # flag = "+"

    # 外部函數(shù)
    def decorator(fn):
        # 內(nèi)部函數(shù)
        def inner(num1, num2):
            # 判斷流程
            if flag == "+":
                print("--正在努力加法計(jì)算--")
            elif flag == "-":
                print("--正在努力減法計(jì)算--")
            result = fn(num1, num2)
            return result

        return inner

    # 返回裝飾器
    return decorator
# 被帶有參數(shù)的裝飾器裝飾的函數(shù)
@logging('+')  # 1 logging("+") 2 @decorator起到裝飾器的功能了
def add(a, b):
    result = a + b
    return result
# 執(zhí)行函數(shù)
result = add(1, 3)
print(result)

類裝飾器的使用

# 定義類裝飾器
class Check(object):
    def __init__(self, fn):
        self.__fn = fn

    def __call__(self, *args, **kwargs):
        print("登錄")
        self.__fn()
@Check
def comment():
    print("發(fā)表評(píng)論")
comment()

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

相關(guān)文章

  • python requests爬取高德地圖數(shù)據(jù)的實(shí)例

    python requests爬取高德地圖數(shù)據(jù)的實(shí)例

    今天小編就為大家分享一篇python requests爬取高德地圖數(shù)據(jù)的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-11-11
  • 瘋狂上漲的Python 開發(fā)者應(yīng)從2.x還是3.x著手?

    瘋狂上漲的Python 開發(fā)者應(yīng)從2.x還是3.x著手?

    熱度瘋漲的 Python,開發(fā)者應(yīng)從 2.x 還是 3.x 著手?這篇文章就為大家分析一下了Python開發(fā)者應(yīng)從2.x還是3.x學(xué)起,感興趣的小伙伴們可以參考一下
    2017-11-11
  • Python參數(shù)類型以及常見的坑詳解

    Python參數(shù)類型以及常見的坑詳解

    這篇文章主要介紹了Python參數(shù)類型以及常見的坑詳解,由于之前遇到過幾次有關(guān)于參數(shù)類型的坑,以及經(jīng)常容易把一些參數(shù)類型搞混淆,現(xiàn)在做一下有關(guān)參數(shù)類型的總結(jié)記錄以及對(duì)之前踩坑經(jīng)歷的分析,需要的朋友可以參考下
    2019-07-07
  • Python線程池的正確使用方法

    Python線程池的正確使用方法

    這篇文章主要介紹了Python線程池的正確使用方法,Python的線程池與Java線程池基本原理和概念是共通的。最大的區(qū)別大概就是語言的區(qū)別吧,感興趣的朋友可以參考下面內(nèi)容
    2021-09-09
  • 在java中如何定義一個(gè)抽象屬性示例詳解

    在java中如何定義一個(gè)抽象屬性示例詳解

    這篇文章主要給大家介紹了關(guān)于在java中如何定義一個(gè)抽象屬性示例詳解的相關(guān)資料,需要的朋友可以參考下
    2017-08-08
  • Go1.16引入目錄遍歷優(yōu)化解析

    Go1.16引入目錄遍歷優(yōu)化解析

    Go1.16版本中,對(duì)目錄遍歷進(jìn)行了顯著的優(yōu)化,新增的接口os.ReadDir、(*os.File).ReadDir和filepath.WalkDir使用fs.DirEntry代替os.FileInfo,減少了系統(tǒng)調(diào)用次數(shù),提高了遍歷效率,測試顯示,優(yōu)化后的遍歷速度比原先快了480%
    2024-10-10
  • Python編程實(shí)現(xiàn)生成特定范圍內(nèi)不重復(fù)多個(gè)隨機(jī)數(shù)的2種方法

    Python編程實(shí)現(xiàn)生成特定范圍內(nèi)不重復(fù)多個(gè)隨機(jī)數(shù)的2種方法

    這篇文章主要介紹了Python編程實(shí)現(xiàn)生成特定范圍內(nèi)不重復(fù)多個(gè)隨機(jī)數(shù)的2種方法,涉及Python基于random生成隨機(jī)數(shù)的常見操作技巧,需要的朋友可以參考下
    2017-04-04
  • Django實(shí)現(xiàn)在線無水印抖音視頻下載(附源碼及地址)

    Django實(shí)現(xiàn)在線無水印抖音視頻下載(附源碼及地址)

    該項(xiàng)目功能簡單,完全復(fù)制SaveTweetVedio的項(xiàng)目。用戶觀看抖音視頻時(shí)選擇復(fù)制視頻鏈接,輸入到下載輸入欄,即可下載無水印視頻,還可掃描二維碼手機(jī)上預(yù)覽。親測成功。
    2021-05-05
  • PyPy?如何讓Python代碼運(yùn)行得和C一樣快

    PyPy?如何讓Python代碼運(yùn)行得和C一樣快

    這篇文章主要介紹了如何讓Python代碼運(yùn)行得和C一樣快,由于?PyPy?只是?Python?的一種替代實(shí)現(xiàn),大多數(shù)時(shí)候它都是開箱即用,無需對(duì)?Python?項(xiàng)目進(jìn)行任何更改。它與?Web?框架?Django、科學(xué)計(jì)算包?Numpy?和許多其他包完全兼容,推薦大家多多使用
    2022-01-01
  • Python常用函數(shù)及常用庫整理筆記

    Python常用函數(shù)及常用庫整理筆記

    這篇文章主要介紹了Python常用函數(shù)及常用庫整理,主要介紹了文件操作和數(shù)據(jù)格式的相關(guān)知識(shí),結(jié)合實(shí)例代碼給大家講解的非常詳細(xì),需要的朋友可以參考下
    2023-02-02

最新評(píng)論