函式物件指的是函式可以被當做』資料』來處理,具體可以分為四個方面的使用,如下
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...