Python的閉包函式

2022-06-26 13:03:10 字數 3541 閱讀 8854

閉包函式

基於函式物件的概念,可以將函式返回到任意位置去呼叫 ,但是作用域的關係是在定義完函式時就已經被確定了的,與函式的呼叫位置無關。

一、學習閉包函式的必備知識點:

閉包函式=命名空間與作用域+函式巢狀+函式物件

核心點:名字的查詢關係是以函式定義階段為準

二、什麼是閉包函式?

閉:封閉關閉,封閉的函式。指的是該函式是內嵌函式,也就是說被麻袋裝起來了

#

封閉的函式例項:

#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():

print

(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():

print

(x)

return

inner

func =outer()

func() #2

#可以通過函式的closure屬性,檢視到閉包函式所包裹的外部變數

print(func.__closure__)#

(,)

函式閉包python中的閉包

本文純屬個人見解,是對前面學習的總結,如有描述不正確的地方還請高手指正 單簡說,閉包就是根據不同的置配息信到得不同的結果 再來看看專業的解釋 閉包 closure 是詞法閉包 lexical closure 的簡稱,是引用了由自變數的函式。這個被引用的由自變數將和這個函式一起存在,即使已離開了造創它...

python閉包函式

python函式閉包 closure 比較抽象,在函式式程式設計中運用地比較多,通俗點就是子函式 內嵌函式 呼叫上層函式 閉包函式 的變數,且上層函式 閉包函式 接收的變數會儲存在子函式 內嵌函式 的變數中可以供子函式 內嵌函式 呼叫 概念很抽象,但是實現的例子還是比較容易理解的,這裡記住實現函式閉...

python閉包函式

python是一種物件導向的程式語言,在python中一切皆物件,這樣就使得變數所擁有的屬性,函式也同樣擁有。這樣我們就可以理解在函式內建立乙個函式的行為是完全合法的。這種函式被叫做內嵌函式,這種函式只可以在外部函式的作用域內被正常呼叫,在外部函式的作用域之外呼叫會報錯。而如果內部函式裡引用了外部函...