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

關(guān)于Python中的閉包詳解

 更新時(shí)間:2022年01月27日 17:09:58   作者:繁華似錦Fighting  
大家好,本篇文章主要講的是關(guān)于Python中的閉包詳解,感興趣的同學(xué)感快來看一看吧,對(duì)你有幫助的話記得收藏一下

1、閉包的概念

請(qǐng)大家跟我理解一下,如果在一個(gè)函數(shù)的內(nèi)部定義了另一個(gè)函數(shù),外部的我們叫他外函數(shù),內(nèi)部的我們叫他內(nèi)函數(shù)。閉包: 在一個(gè)外函數(shù)中定義了一個(gè)內(nèi)函數(shù),內(nèi)函數(shù)里運(yùn)用了外函數(shù)的臨時(shí)變量,并且外函數(shù)的返回值是內(nèi)函數(shù)的引用。這樣就構(gòu)成了一個(gè)閉包。一般情況下,在我們認(rèn)知當(dāng)中,如果一個(gè)函數(shù)結(jié)束,函數(shù)的內(nèi)部所有東西都會(huì)釋放掉,還給內(nèi)存,局部變量都會(huì)消失。但是閉包是一種特殊情況,如果外函數(shù)在結(jié)束的時(shí)候發(fā)現(xiàn)有自己的臨時(shí)變量將來會(huì)在內(nèi)部函數(shù)中用到,就把這個(gè)臨時(shí)變量綁定給了內(nèi)部函數(shù),然后自己再結(jié)束。

2、實(shí)現(xiàn)一個(gè)閉包

# 將函數(shù)作為返回值返回,也是一種高階函數(shù)
# 這種高階函數(shù)我們也稱為叫做閉包,通過閉包可以創(chuàng)建一些只有當(dāng)前函數(shù)能訪問的變量
#   可以將一些私有的數(shù)據(jù)藏到的閉包中

def outer():
    a = 10

    # 函數(shù)內(nèi)部再定義一個(gè)函數(shù)
    def inner():
        print('我是outer', a)

    # 將內(nèi)部函數(shù) inner作為返回值返回
    return inner


# r是一個(gè)函數(shù)對(duì)象,是調(diào)用fn()后返回的函數(shù)對(duì)象
# 這個(gè)函數(shù)實(shí)在fn()內(nèi)部定義,并不是全局函數(shù)
# 所以這個(gè)函數(shù)總是能訪問到fn()函數(shù)內(nèi)的變量
# 外函數(shù)返回了內(nèi)函數(shù)的引用
fn = outer()

# r()相當(dāng)于調(diào)用了inner()函數(shù)
print("outer引用地址:", outer)
print("inner引用地址:", fn)
fn()
"""
輸出結(jié)果:
outer引用地址: <function outer at 0x0000000002BB5948>
inner引用地址: <function outer.<locals>.inner at 0x0000000002BB58B8>
我是outer 10
"""

說明上述代碼:

對(duì)于閉包,在外函數(shù)outer中 最后return inner,我們?cè)谡{(diào)用外函數(shù) fn = outer() 的時(shí)候,outer函數(shù)返回了inner函數(shù)對(duì)象,inner函數(shù)對(duì)象是一個(gè)函數(shù)的引用,這個(gè)引用被存入了fn對(duì)象中。所以接下來我們?cè)龠M(jìn)行fn() 的時(shí)候,相當(dāng)于運(yùn)行了inner函數(shù)。

提示:

一個(gè)函數(shù),如果函數(shù)名后緊跟一對(duì)括號(hào),相當(dāng)于調(diào)用這個(gè)函數(shù)。如果不跟括號(hào),相當(dāng)于只是一個(gè)函數(shù)的名字,里面存了函數(shù)所在位置的引用。

3、在閉包中外函數(shù)把臨時(shí)變量綁定給內(nèi)函數(shù)

按照我們正常的認(rèn)知,一個(gè)函數(shù)結(jié)束的時(shí)候,會(huì)把自己的臨時(shí)變量都釋放還給內(nèi)存,之后變量都不存在了。一般情況下,確實(shí)是這樣的。但是閉包是一個(gè)特別的情況。外部函數(shù)發(fā)現(xiàn),自己的臨時(shí)變量會(huì)在將來的內(nèi)部函數(shù)中用到,自己在結(jié)束的時(shí)候,返回內(nèi)函數(shù)的同時(shí),會(huì)把外函數(shù)的臨時(shí)變量送給內(nèi)函數(shù)綁定在一起。所以外函數(shù)已經(jīng)結(jié)束了,調(diào)用內(nèi)函數(shù)的時(shí)候仍然能夠使用外函數(shù)的臨時(shí)變量。

在我編寫的實(shí)例中,我兩次調(diào)用外部函數(shù)outer,分別傳入的值是10和20。內(nèi)部函數(shù)只定義了一次,我們發(fā)現(xiàn)調(diào)用的時(shí)候,內(nèi)部函數(shù)是能識(shí)別外函數(shù)的臨時(shí)變量是不一樣的。

Python中一切都是對(duì)象,雖然函數(shù)我們只定義了一次,但是外函數(shù)在運(yùn)行的時(shí)候,實(shí)際上是按照里面代碼執(zhí)行的,外函數(shù)里創(chuàng)建了一個(gè)函數(shù),我們每次調(diào)用外函數(shù),它都創(chuàng)建一個(gè)內(nèi)函數(shù),雖然代碼一樣,但是卻創(chuàng)建了不同的對(duì)象,并且把每次傳入的臨時(shí)變量數(shù)值綁定給內(nèi)函數(shù),再把內(nèi)函數(shù)引用返回。

所以我們每次調(diào)用外函數(shù),都返回不同的實(shí)例對(duì)象的引用,他們的功能是一樣的,但是它們實(shí)際上不是同一個(gè)函數(shù)對(duì)象。

下面示例進(jìn)行演示:

def outer(num):
    a = num

    # 函數(shù)內(nèi)部再定義一個(gè)函數(shù)
    def inner():
        print('我是outer', a)

    # 將內(nèi)部函數(shù) inner作為返回值返回
    return inner


fn1 = outer(10)
fn2 = outer(20)


print("inner引用地址:", fn1)
fn1()
print("inner引用地址:", fn2)
fn2()
"""
輸出結(jié)果:
inner引用地址: <function outer.<locals>.inner at 0x00000000026B58B8>
我是outer 10
inner引用地址: <function outer.<locals>.inner at 0x00000000026B5828>
我是outer 20
"""
# 注意兩個(gè)inner的地址不一樣,一個(gè)是8B8,一個(gè)是828。

4、閉包中內(nèi)函數(shù)修改外函數(shù)局部變量

在基本的Python語法當(dāng)中,一個(gè)函數(shù)可以隨意讀取全局?jǐn)?shù)據(jù),但是要修改全局?jǐn)?shù)據(jù)的時(shí)候有兩種方法

global聲明全局變量。全局變量是可變類型數(shù)據(jù)的時(shí)候可以修改。

在閉包內(nèi)函數(shù)也是類似的情況。在內(nèi)函數(shù)中想修改閉包變量(外函數(shù)綁定給內(nèi)函數(shù)的局部變量)的時(shí)候,在Python3中,可以用nonlocal關(guān)鍵字聲明一個(gè)變量, 表示這個(gè)變量不是局部變量空間的變量,需要向上一層變量空間找這個(gè)變量。

示例:

def outer(num):
    a = num
    b = 10  # a和b都是閉包變量
    print("原始a值為", a)

    # inner內(nèi)函數(shù)
    def inner():
        # 內(nèi)函數(shù)中想修改閉包變量
        # nonlocal關(guān)鍵字聲明變量
        nonlocal a
        a += b
        print('我是outer的a', a)

    # 將內(nèi)部函數(shù) inner作為返回值返回
    return inner


fn1 = outer(10)

fn1()
"""
輸出結(jié)果:
原始a值為 10
我是outer的a 20
"""

在內(nèi)函數(shù)中,對(duì)閉包變量進(jìn)行了修改,打印出來的結(jié)果也確實(shí)是修改之后的結(jié)果。

5、注意:

還有一點(diǎn)需要注意,閉包變量實(shí)際上只有一份,每次調(diào)用一份閉包變量。(這個(gè)在Python實(shí)現(xiàn)的單利模式下來解釋更多)

def outer(num):
    a = num
    b = 10  # a和b都是閉包變量
    print("原始a值為", a)

    # inner內(nèi)函數(shù)
    def inner():
        # 內(nèi)函數(shù)中想修改閉包變量
        # nonlocal關(guān)鍵字聲明變量
        nonlocal a
        a += b
        print('我是outer的a', a)

    # 將內(nèi)部函數(shù) inner作為返回值返回
    return inner


fn1 = outer(10)

fn1()
fn1()
fn1()
"""
輸出結(jié)果:
原始a值為 10
我是outer的a 20
我是outer的a 30
我是outer的a 40
"""

可以看到第二次第二次調(diào)用fn1()方法,a的值有增加了10。

6、練習(xí):

# 求多個(gè)數(shù)的平均值
# nums = [50,30,20,10,77]

# sum()是一個(gè)求和函數(shù)
# sum()用來求一個(gè)列表中所有元素的和
# print(sum(nums)/len(nums))
# 結(jié)果:37.4


# 形成閉包的要件
#   ① 函數(shù)嵌套
#   ② 將內(nèi)部函數(shù)作為返回值返回
#   ③ 內(nèi)部函數(shù)必須要使用到外部函數(shù)的變量


def make_averager():
    # 創(chuàng)建一個(gè)列表,用來保存數(shù)值
    nums = []

    # 創(chuàng)建一個(gè)函數(shù),用來計(jì)算平均值
    def averager(n) :
        # 將n添加到列表中
        nums.append(n)
        # 求平均值
        return sum(nums)/len(nums)

    return averager

# 創(chuàng)建對(duì)象,現(xiàn)在就是獲得了內(nèi)函數(shù)對(duì)象的引用
averager = make_averager()

# 調(diào)用內(nèi)涵書對(duì)象
# 這里注意,雖然是調(diào)用外函數(shù)創(chuàng)建的對(duì)象,
# 但是獲得的是內(nèi)函數(shù)對(duì)象的引用,內(nèi)函數(shù)是有形參的,
# 所以averager對(duì)象相當(dāng)于是內(nèi)函數(shù)對(duì)象。
# 所以調(diào)用內(nèi)函數(shù)就要傳遞形參。
print(averager(10))
print(averager(20))
print(averager(30))
print(averager(40))

總結(jié)

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

相關(guān)文章

  • python基礎(chǔ)之包的導(dǎo)入和__init__.py的介紹

    python基礎(chǔ)之包的導(dǎo)入和__init__.py的介紹

    這篇文章主要介紹了python基礎(chǔ)之包的導(dǎo)入和__init__.py的相關(guān)資料,需要的朋友可以參考下
    2018-01-01
  • 基于Pandas讀取csv文件Error的總結(jié)

    基于Pandas讀取csv文件Error的總結(jié)

    今天小編就為大家分享一篇基于Pandas讀取csv文件Error的總結(jié),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-06-06
  • 基于Python輕松實(shí)現(xiàn)PDF轉(zhuǎn)圖片

    基于Python輕松實(shí)現(xiàn)PDF轉(zhuǎn)圖片

    PDF文件是我們?cè)谌粘9ぷ骱蛯W(xué)習(xí)中常用的文檔格式之一,但你知道嗎,你可以將PDF文件轉(zhuǎn)換為圖像,讓文檔變得更加生動(dòng)有趣,下面我們就來看看具體的實(shí)現(xiàn)方法吧
    2023-08-08
  • Python中ini配置文件的寫入與讀取的操作示例

    Python中ini配置文件的寫入與讀取的操作示例

    本文詳細(xì)介紹了如何在Python中使用configparser模塊進(jìn)行INI文件的讀寫操作,包括基本用法、高級(jí)用法以及創(chuàng)建、讀取和管理配置文件的實(shí)例演示,需要的朋友可以參考下
    2025-03-03
  • 解決TensorFlow GPU版出現(xiàn)OOM錯(cuò)誤的問題

    解決TensorFlow GPU版出現(xiàn)OOM錯(cuò)誤的問題

    今天小編就為大家分享一篇解決TensorFlow GPU版出現(xiàn)OOM錯(cuò)誤的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-02-02
  • Python多線程編程(一):threading模塊綜述

    Python多線程編程(一):threading模塊綜述

    這篇文章主要介紹了Python多線程編程(一):threading模塊綜述,本文講解了threading模塊、Thread類、Queue提供的類等內(nèi)容,需要的朋友可以參考下
    2015-04-04
  • python實(shí)現(xiàn)調(diào)用其他python腳本的方法

    python實(shí)現(xiàn)調(diào)用其他python腳本的方法

    python實(shí)現(xiàn)調(diào)用其他python腳本的方法,是一個(gè)比較實(shí)用的技巧,需要的朋友可以參考下
    2014-10-10
  • python中最小二乘法詳細(xì)講解

    python中最小二乘法詳細(xì)講解

    在本篇文章里小編給大家整理的是一篇關(guān)于python中最小二乘法詳細(xì)講解內(nèi)容,需要的朋友們可以參考下。
    2021-02-02
  • Python操作Elasticsearch詳細(xì)指南

    Python操作Elasticsearch詳細(xì)指南

    Elasticsearch?是一種強(qiáng)大且靈活的分布式搜索引擎,而?Python?則以其易用性和強(qiáng)大的數(shù)據(jù)處理能力,成為開發(fā)者在數(shù)據(jù)操作中的理想選擇,下面我們就來看看如何使用Python操作Elasticsearch吧
    2025-02-02
  • opencv實(shí)踐項(xiàng)目之圖像拼接詳細(xì)步驟

    opencv實(shí)踐項(xiàng)目之圖像拼接詳細(xì)步驟

    OpenCV的應(yīng)用領(lǐng)域非常廣泛,包括圖像拼接、圖像降噪、產(chǎn)品質(zhì)檢、人機(jī)交互、人臉識(shí)別、動(dòng)作識(shí)別、動(dòng)作跟蹤、無人駕駛等,下面這篇文章主要給大家介紹了關(guān)于opencv實(shí)踐項(xiàng)目之圖像拼接的相關(guān)資料,需要的朋友可以參考下
    2023-05-05

最新評(píng)論

阳西县| 通榆县| 赣州市| 老河口市| 新泰市| 滨州市| 南昌县| 南部县| 四平市| 紫金县| 十堰市| 平山县| 东兰县| 井研县| 积石山| 滕州市| 台山市| 益阳市| 遂平县| 岳西县| 长岭县| 宣化县| 收藏| 阳山县| 阳新县| 繁昌县| 安多县| 抚州市| 平谷区| 邵阳市| 伊宁县| 夏邑县| 安新县| 会理县| 庆城县| 闵行区| 白河县| 历史| 苗栗县| 上虞市| 青阳县|