1. 程式人生 > 實用技巧 >閉包函式

閉包函式

一、什麼是閉包?

#內部函式包含對外部作用域而非全域性作用域的引用

#提示:之前我們都是通過引數將外部的值傳給函式,閉包提供了另外一種思路,包起來嘍,包起呦,包起來哇

        def counter():
            n=0
            def incr():
                nonlocal n
                x=n
                n+=1
                return x
            return incr

        c=counter()
        print(c())
        print(c())
        print(c())
        print(c.__closure__[0].cell_contents) #檢視閉包的元素

二、閉包的意義與應用

#閉包的意義:返回的函式物件,不僅僅是一個函式物件,在該函式外還包裹了一層作用域,這使得,該函式無論在何處呼叫,優先使用自己外層包裹的作用域
#應用領域:延遲計算(原來我們是傳參,現在我們是包起來)
    from urllib.request import urlopen

    def index(url):
        def get():
            return urlopen(url).read()
        return get

    baidu=index('http://www.baidu.com')
    print(baidu().decode('utf-8'))

三、閉包函式講解

1.簡述

閉包函式=函式巢狀定義+名稱空間與作用域+函式物件
閉:指的是該函式是一個定義在函式內部的函式
包:閉函式訪問了一個來自於外層函式中的名字
#示例
def f1():
    x = 111
    def f2():
        print('from f2: ',x)

    return f2  # 千萬不要加括號

res=f1()

def foo():
    x=222
    res()

foo()

  

2、為函式體傳參的解決方案:

2.1直接定義形參

def f2(x):
    print(x)

f2(111)
f2(222)
f2(333)

2.2閉包函式是一種為函式體傳參的解決方案

def f1(x):
    # x=111
    def f2():
        print(x)

    return f2  # return f1.locals.f2的記憶體地址

f2=f1(111)
f2()