閉包函式
基於函式物件的概念,可以將函式返回到任意位置去呼叫 ,但是作用域的關係是在定義完函式時就已經被確定了的,與函式的呼叫位置無關。
一、學習閉包函式的必備知識點:閉包函式=命名空間與作用域+函式巢狀+函式物件
核心點:名字的查詢關係是以函式定義階段為準
二、什麼是閉包函式?
閉:封閉關閉,封閉的函式。指的是該函式是內嵌函式,也就是說被麻袋裝起來了
#封閉的函式例項:
#def f1(): # 這裡的f1就是麻袋
#def f2(): # 這裡的f2就是閉函式
#pass
包:包住,在閉的基礎上,指的是該函式f2包含對外層函式f1作用域名字的引用。(不是對全域性作用域)
#閉包函式例項1:
#def f1(): # 這裡的f1就是麻袋
#x = 1
#def f2(): # 這裡的f2就是閉函式
#print(x) # 這裡的x引用到了外層函式,所以此時的f2就是閉包函式
#f2()
#x = 222
#f1() # 1
#閉包函式例項2:閉包函式之命名空間與作用域+函式巢狀的應用
#def f1(): # 這裡的f1就是麻袋
#x = 333333333333333333333
#def f2(): # 這裡的f2就是閉函式
#print(x) # 這裡的x引用到了外層函式,所以此時的f2就是閉包函式
#f2()
#x = 222
#def foo():
#x = 444
#f1()##
foo() # 333333333333333333333
#閉包函式例項3:
#def f1(): # 這裡的f1就是麻袋
#x = 333333333333333333333
#def f2(): # 這裡的f2就是閉函式
#print(x) # 這裡的x引用到了外層函式,所以此時的f2就是閉包函式
#f2()
#x = 111
#def bar():
#x = 4444
#f1()
#def foo():
#x = 2222
#bar()##
foo() # 333333333333333333333
#閉包函式例項4:閉包函式之函式物件##
我想要在全域性作用域拿到f2的記憶體位址。f2就可以在任意的地方呼叫了。
deff1():
x = 333333333333333333333
deff2():
print("
函式f2的x:
",x)
#print(f2) # 列印f2的記憶體位址
return f2 #
這裡注意不要加(),不加()拿到了記憶體位址
#這裡的f是全域性變數,但是f的值來自區域性,打破了層級上的限制。
f =f1()
#print(f) # 這裡我可以獲得到f2的記憶體位址,.f2 at 0x0000025cc8499670>
#拿到了f2的記憶體位址後加括號執行得到結果
#f() # 執行結果:函式f2的x: 333333333333333333333
deffoo():
x = 555f()
foo()
#函式f2的x: 333333333333333333333
三、閉包函式的應用場景?(為什麼要有閉包函式?)
#四、兩種為函式體傳參的方式
#1、方式一:直接把函式體需要的引數定義成形參,直接傳參
#def f2(x):
#print(x)
#f2(1)
#f2(2)
#f2(3)
#2、方式二:使用閉包函式
#def f1(): # 包的效果
#x = 3
#def f2():
#print(x)
#return f2 # 返回f2的記憶體位址,把f2記憶體位址放到全域性##
f = f1()##
f() # 3
#把上面的函式寫活,修改函式體的引數
def f1(x): #
包的效果
#x = 3 # 這樣就寫死了,如何寫活?
deff2():
(x)
return f2 #
返回f2的記憶體位址,把f2記憶體位址放到全域性
f = f1(3)
print(f) #
f() #
3
#爬取三個**的資訊
#import requests
#response = requests.get("")
#print(response.text)
#requests.get("")
#print(response.text)
#requests.get("")
#print(response.text)##
傳參的方案一:
#import requests
#def get(url):
## response = requests.get("")
## print(response.text)
#response = requests.get(url)
#print(len(response.text))
#get("")
#get("")
#get("")
#使用閉包函式:方案二
import
requests
defoutter(url):
#url='' # 不能寫死
拿到outter的記憶體位址
四、驗證closures()函式
x = 1
defouter():
x = 2
definner():
(x)
return
inner
func =outer()
func() #2
#可以通過函式的closure屬性,檢視到閉包函式所包裹的外部變數
print(func.__closure__)#
(,)
函式閉包python中的閉包
本文純屬個人見解,是對前面學習的總結,如有描述不正確的地方還請高手指正 單簡說,閉包就是根據不同的置配息信到得不同的結果 再來看看專業的解釋 閉包 closure 是詞法閉包 lexical closure 的簡稱,是引用了由自變數的函式。這個被引用的由自變數將和這個函式一起存在,即使已離開了造創它...
python閉包函式
python函式閉包 closure 比較抽象,在函式式程式設計中運用地比較多,通俗點就是子函式 內嵌函式 呼叫上層函式 閉包函式 的變數,且上層函式 閉包函式 接收的變數會儲存在子函式 內嵌函式 的變數中可以供子函式 內嵌函式 呼叫 概念很抽象,但是實現的例子還是比較容易理解的,這裡記住實現函式閉...
python閉包函式
python是一種物件導向的程式語言,在python中一切皆物件,這樣就使得變數所擁有的屬性,函式也同樣擁有。這樣我們就可以理解在函式內建立乙個函式的行為是完全合法的。這種函式被叫做內嵌函式,這種函式只可以在外部函式的作用域內被正常呼叫,在外部函式的作用域之外呼叫會報錯。而如果內部函式裡引用了外部函...