欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

Python閉包-創(chuàng)新互聯(lián)

閉包

如果在一個內(nèi)部函數(shù)里,對在外部作用域(但不是在全局作用域)的變量進行引用,那么內(nèi)部函數(shù)就被認為是閉包(closure)

創(chuàng)新互聯(lián)公司主營開陽網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營網(wǎng)站建設(shè)方案,app開發(fā)定制,開陽h5小程序開發(fā)搭建,開陽網(wǎng)站營銷推廣歡迎開陽等地區(qū)企業(yè)咨詢

這里是一個閉包的例子:

def addx(x):
    def adder(y):
        return x + y
    return adder

if __name__ == '__main__':
    func = addx(10)
    print(func(1))
    print(func(2))
    print(func(3))

執(zhí)行結(jié)果:

11
12
13

這里例子里,adder(y) 就是一個內(nèi)部函數(shù)。它里面引用了外部的變量x,x是外部作用域addx(x)里的變量,但是不是全局變量。所以內(nèi)部的adder(y)是一個閉包。
精煉一些:閉包=函數(shù)塊+定義函數(shù)時的環(huán)境。adder就是函數(shù)塊,x就是環(huán)境。

閉包的注意事項

作用域的問題

這個例子里應(yīng)該是一個函數(shù)的作用域的問題,和閉包沒太大關(guān)系:

def foo():
    x = 0
    def f():
        x = 1
        return x
    print(x)  # 0
    print(f())  # 1
    print(x)  # 0

if __name__ == '__main__':
    foo()

內(nèi)部函數(shù)和外部函數(shù)都定義了變量x。這里內(nèi)部沒有引用外部的變量x,還是生成了一個自己的局部變量,也叫x,這個變量還外部的函數(shù)的x變量是沒有關(guān)系的。所以這里的問題只是一個作用域的問題。

操作外部變量

下面的這個函數(shù)是有問題的,語法有錯誤:

def squares():
    x = 0

    def f():
        x = x + 1
        return x * x
    return f

看似符合閉包的要求,但是標量x出現(xiàn)在了賦值符號 '=' 的左邊。python規(guī)則指定所有在賦值語句左面的變量都是局部變量。這里因為x被認為是局部變量,然后再執(zhí)行x+1的時候就只會在局部里找這個x的值,但是找不到,所以就報錯了,錯誤信息如下:

UnboundLocalError: local variable 'x' referenced before assignment

解決方案1
避免直接引用外部,如果引用的是外部的列表、字典等。那么變量名就不會直接出現(xiàn)在賦值符號左邊了:

def squares():
    x = [0]

    def f():
        x[0] = x[0] + 1
        return x[0] * x[0]
    return f

如果直接要引用的是外部的列表、字典這類變量,用就不會遇到這類問題。但是這里例子里,這么做感覺也不好

解決方案2
如果要引用的外部變量就是一個簡單的數(shù)值或者字符串,雖然上面的方法可行,但是還有更好的做法。
使用 nonlocal 聲明,把內(nèi)層的局部變量設(shè)置成外層局部可用,但是還不是全局的。類似聲明全局變量的 global 的用法。這里主要是因為python里不需要像其他語言里,有類型的var之類的關(guān)鍵字來聲明變量。變量直接賦值就完成了聲明,平時用起來很方便,但是在這里,因為在操作的時候變量直接出現(xiàn)在賦值符號左邊了,就會被認為新定義了一個局部變量了。
完整的示例:

def squares():
    x = 0

    def f():
        nonlocal x
        x = x + 1
        return x * x
    return f

if __name__ == '__main__':
    func = squares()
    print(func())
    print(func())
    print(func())

閉包的作用

閉包主要是在函數(shù)式開發(fā)過程中使用。下面介紹的兩種使用場景,用面向?qū)ο笠彩强梢院芎唵蔚膶崿F(xiàn)的。但是在用Python進行函數(shù)式編程時,閉包對數(shù)據(jù)的持久化以及按配置產(chǎn)生不同的功能,是很有幫助的。

讓函數(shù)還可以擁有狀態(tài)

當(dāng)閉包執(zhí)行完后,仍然能夠保持住當(dāng)前的運行環(huán)境。上面也提過了:閉包=函數(shù)塊+定義函數(shù)時的環(huán)境。這個環(huán)境可以在閉包里改變,并且保持下去。
下面是一個類似移動棋子的例子。先在坐標0,0創(chuàng)建棋子。然后可以用內(nèi)部函數(shù)移動棋子。移動后,棋子的狀態(tài)也更新了,下次再移動棋子,就是在之前的位置的基礎(chǔ)上再進行的移動:

def create_piece():
    x = 0
    y = 0

    def move(offset_x=0, offset_y=0):
        nonlocal x, y
        x += offset_x
        y += offset_y
        return x, y
    return move

if __name__ == '__main__':
    player = create_piece()  # 這里是不是和面向?qū)ο罄锏氖褂们?,生成對象的實例很像?    print(player())  # 打印當(dāng)前坐標
    player(1, 1)  # 移動棋子
    print(player())  # 打印當(dāng)前坐標
    print(player(1, 3))  # 再移動棋子并打印坐標

配置函數(shù)的參數(shù)

閉包可以根據(jù)外部作用域的局部變量來得到不同的結(jié)果,這有點像一種類似配置功能的作用,我們可以修改外部的變量,閉包根據(jù)這個變量展現(xiàn)出不同的功能。
下面的例子,統(tǒng)計字符串里,某個特定的字符出現(xiàn)了多少次。要統(tǒng)計哪個字符,就生成一個對應(yīng)的閉包,生成的時候把參數(shù)傳入:

def count_letter(a):
    def count(s):
        x = 0
        for i in s:
            if i == a:
                x += 1
        return x
    return count

if __name__ == '__main__':
    s = 'Hello World !!!'
    count_l = count_letter('l')
    count_space = count_letter(' ')
    print(count_l(s))
    print(count_space(s))

這個用處也是可以用面向?qū)ο蠓奖愕慕鉀Q的。相當(dāng)于生成實例的時候給構(gòu)造函數(shù)傳入不同的值。

總結(jié)

面向?qū)ο罄锇验]包的這點作用都覆蓋了,所以貌似不會也沒什么。主要是為了支持函數(shù)式編程使用的。

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

標題名稱:Python閉包-創(chuàng)新互聯(lián)
分享地址:http://aaarwkj.com/article18/phogp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站設(shè)計服務(wù)器托管、網(wǎng)站制作、網(wǎng)頁設(shè)計公司外貿(mào)建站、自適應(yīng)網(wǎng)站

廣告

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

手機網(wǎng)站建設(shè)
亚洲欧美精品专区极品| 欧美人与性一区二区三区| 色噜噜男人的天堂av| 亚洲精品一区二区三区网站| 国产精品美女丝袜久久久| 亚洲男人的天堂久久精品| 国产经典午夜福利在线| 国产91对白在线观看| 国产毛毛片一区二区三区| 国产精品亚洲欧美日韩综合| 亚洲中文字幕高清无二区| 日韩一二三区免费不卡视频| 亚洲av乱码久久精品蜜桃| 精品熟女少妇av免费久久野外 | 青青草老司机在线视频| 日韩精品一区二区在线天天狠天 | 91无人区一区二区三乱码| 九九热这里面只有精品| 久青青国产综合自拍视频在线观看 | 国产男女免费操作视频| 久久成人激情免费视频| 天堂社区人妻在线亚洲| 日韩国产欧美亚洲一区不卡| 久久精品国产亚洲av超一| 人妻少妇av免费久久蜜臀| 日韩美女后入式在线视频| 五月激情丁香婷婷色网| 亚洲日本中文字幕免费观看| 蜜桃精品一区二区三区在线观看| 欧美国产日韩一区在线观看| 99亚洲综合一区二区三区| 久久精品中文字幕人妻| 日韩精品亚洲一级在线观看| 日本丰满熟女毛茸茸的黑逼| 国内精品自产拍久久久久久久久91| 内地精品露脸自拍视频| 91香蕉伊人综合久久麻豆| 久久久久久狠狠亚洲综合| 亚洲天堂精品日韩电影| 亚洲国产精品97视频| 日韩在线国产亚洲精品|