函式物件 函式巢狀和閉包函式

2021-10-04 04:35:02 字數 4528 閱讀 9028

函式物件指的是函式可以被當做』資料』來處理,具體可以分為四個方面的使用,如下

func=記憶體位址

deffunc()

:print

('from func'

)1、可以賦值

f=func #將函式的記憶體位址繫結給f

print

(f,func)f()

#記憶體位址加()呼叫函式

2、可以當做函式當做引數傳給另外乙個函式

deffoo

(x):

# x = func的記憶體位址

# print(x)

x()foo(func)

# foo(func的記憶體位址)

3、可以當做另外乙個函式的返回值

deffoo

(x):

# x=func的記憶體位址

return x # return func的記憶體位址

res=foo(func)

# foo(func的記憶體位址)

print

(res)

# res=func的記憶體位址

res(

)4、可以當做容器型別的乙個元素

l=[func,

]# print(l)l[0

]()#呼叫func

dic=

print

(dic)

dic[

'k1'](

)函式物件應用示範:

deflogin()

:print

('登入功能'

)def

transfer()

:print

('轉賬功能'

)def

check_banlance()

:print

('查詢餘額'

)def

withdraw()

:print

('提現'

)def

register()

:print

('註冊'

)func_dic =

func_dic[

'1']()

while

true

:for k in func_dic:

print

(k, func_dic[k][0

])choice =

input

('請輸入命令編號:'

).strip()if

not choice.isdigit():

print

('必須輸入編號,傻叉'

)continue

if choice ==

'0':

break

# choice='1'

if choice in func_dic:

func_dic[choice][1

]()else

:print

('輸入的指令不存在'

)

1、函式的巢狀定義:在函式內定義其他函式

deff1()

:deff2(

):pass

2、函式的巢狀呼叫:在呼叫乙個函式的過程中又呼叫其他函式

defmax2

(x,y)

:if x > y:

return x

else

:return y

defmax4

(a,b,c,d)

:# 第一步:比較a,b得到res1

res1=max2(a,b)

# 第二步:比較res1,c得到res2

res2=max2(res1,c)

# 第三步:比較res2,d得到res3

res3=max2(res2,d)

return res3

res=max4(1,

2,3,

4)print

(res)

# 圓形

# 求圓形的求周長:2*pi*radius

defcircle

(radius,action=0)

:from math import pi

defperimiter

(radius)

:return

2*pi*radius

# 求圓形的求面積:pi*(radius**2)

defarea

(radius)

:return pi*

(radius**2)

if action ==0:

return

2*pi*radius

elif action ==1:

return area(radius)

circle(

33,action=0)

# 圓形

# 求圓形的求周長:2*pi*radius

defcircle

(radius,action=0)

:from math import pi

defperimiter

(radius)

:return

2*pi*radius

# 求圓形的求面積:pi*(radius**2)

defarea

(radius)

:return pi*

(radius**2)

if action ==0:

return

2*pi*radius

elif action ==1:

return area(radius)

circle(

33,action=

0)

一:大前提:

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

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

二:什麼是閉包函式

"閉"函式指的該函式是內嵌函式

"包"函式指的該函式包含對外層函式作用域名字的引用(不是對全域性作用域)

閉包函式:命名空間與作用域的應用+函式巢狀

deff1()

: x =

33333333333333333333

deff2()

:print

(x) f2()x=

11111

defbar()

: x=

444444

f1()def

foo():

x=2222

bar(

)foo(

)#結果為333333333333

閉包函式:函式物件

deff1()

: x =

33333333333333333333

deff2()

:print

('函式f2:'

,x)return f2

f=f1(

)# print(f)

# x=4444

# f()

deffoo()

: x=

5555

f()foo(

)#結果為3333333333333333333333333

三:為何要有閉包函式=》閉包函式的應用

兩種為函式體傳參的方式

方式一:直接把函式體需要的引數定義成形參

deff2

(x):

print

(x)f2(1)

f2(2

)f2(3)

方式二:使用閉包函式

deff1

(x):

# x=3

x=3deff2(

):print

(x)return f2 #返回f2函式

x=f1(3)

#定義f2函式的記憶體位址給x

print

(x)x(

)#記憶體位址+()呼叫函式

案例:

import requests   

# 傳參的方案一:

defget

(url)

: response=requests.get(url)

print

(len

(response.text)

)get(

'')get(

'')get(

'')# 傳參的方案二:

函式物件 巢狀和閉包函式

精髓 可以把函式當成變數去用 func 記憶體位址 def func print from func f func 函式func賦值給變數f print f,func 列印f和func的記憶體位址,完全相同 f 相當於呼叫了函式func 輸出 func at 0x02f434a8 from func...

物件 巢狀和閉包函式

func 記憶體位址 def func print from func f func print f,func f def foo x x func的記憶體位址 print x x func foo func foo func的記憶體位址 def foo x x func的記憶體位址 return ...

python函式巢狀閉包 閉包與巢狀函式

沒有區別,因為沒有閉合函式,不是真的。有closures,但這一術語指的是在外部和內部範圍中儲存變數的技術。只剩下巢狀函式。在 巢狀函式只是在另乙個函式內部定義的函式 def outer def inner 當outer 定義了乙個inner 然後也使用的名稱,則該變數名稱為閉包單元,儲存在inne...