閉包函式
阿新 • • 發佈:2020-08-08
一、什麼是閉包?
#內部函式包含對外部作用域而非全域性作用域的引用 #提示:之前我們都是通過引數將外部的值傳給函式,閉包提供了另外一種思路,包起來嘍,包起呦,包起來哇 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()