函式引數
函式名儲存了函式所在的空間位址
函式名+ () 到函式所在的空間執行裡面的**
閉包:發生函式巢狀
外層函式有引數(內層函式使用到)
節省系統資源 提高**復用率的一種特殊語法
語法格式
def 外層函式(引數):
def 內層函式():
pass
return 內層函式
閉包流程
執行第五行 呼叫func_out
執行2,3 行 func_in函式 只定以不執行 開闢乙個空間 暫且定為 0x11(),所以func_in=0x11
執行第四行 返回func_in 也就是0x11
然後到第五行 usa_rate= func_in= 0x11
執行第六行 0x11(100) = fun_in()
執行2,3 行**
1 1.deffunc_out(rate):
2 2. def
func_in(money):
3 3. print(rate *money)
45 4. return
func_in
67 5.usa_rate = func_out(0.7)
8 6.usa_rate(100)
裝飾器
在不改變原有**的前提下 還可以給函式增加新的功能
使用方法
@新加功能的函式名
裝飾器下面正好是函式
自動執行 login = func_out(login)
執行流程
執行第六行,首先裝飾器會自動執行一句話 login = func_out(login)
把7,8行**開闢乙個空間位址暫且叫做0x22, 當作引數傳給第一行func
執行第一行 0x22傳遞給func
2,3,4函式只定以不執行開闢乙個空間位址 暫且是 0x11
執行第五行 返回func_in = =0x11 給函式呼叫者, 也就是 login = func_in== 0x11
然後執行login() == 0x11()==func_in(),到2,3,4**
第四行 func() == login ==0x22=7,8行**
*** 執行流程結論***
func ==> 原始login 也就是0x22
新的login()0x11 ==>func_in()
1.deffunc_out(func):
2. def
func_in():
3. print("驗證"
)4. func()
5. return
func_in
6.@func_out
7.def
login():
8. print("登入"
)9.login()
通用版裝飾器
deffunc_out(func):
def func_in(*args,**kwargs):
return func(*args,**kwargs)
return
func_in
@func_out
def login(*args,**kwargs):
(args)
print(kwargs)
login(10,30,age = "123",name = "qwe")
多重裝飾器
執行流程
1.deffunc_out01(func01):
2. print("
func_out01 is show")
3. def
func_in01():
4. print("
func01 is show")
5. func01()
6. return
func_in01
7.def
func_out02(func02):
8. print("
func_out02 is show")
9. def
func_in02():
10. print("
func02 is show")
11. func02()
12. return
func_in02
13.@func_out02
14.@func_out01
15.def
login():
16. print('
login is show')
17.login()
答案:func_out01
isshow
func_out02
isshow
func02
isshow
func01
isshow
login
isshow
首先執行13行 裝飾器func_out02下面不是函式,所以執行14行,
把15.16行開闢乙個空間暫且定義為0x11 ,把0x11當作引數傳遞給func01暫且存起來
執行func_out01,自動執行login = func_out(login) login = 0x11 = func01
執行第二行 得出第乙個結果 --- func_out01 is show
3,4,5只定以不執行 開闢乙個空間 暫且定義以為 0x22
返回 0x22 新login = 0x22 = func_in01
14行變為乙個函式
執行裝飾器13行 自動執行 0x22=func_in01 == func_out02(0x22)
執行10行 func_in01 = func02 = 0x22 得出第二個結果 ----- func_out02 is show
把9,10,11 封裝起來 開闢乙個空間 稱為 0x33
執行12行 返回給函式呼叫者 login = func_in02()
這時候執行login()
執行9,10,11 行**得出 第三個結果--- func02 is show
執行11行 fun02() = func_in01()-----得出func01 is show
執行fun01() 得出 == login is show fun01() = login
裝飾器與閉包
閉包 內層函式呼叫外層函式的引數,並且返回內層函式,叫做閉包。裝飾器 是裝飾器的符號 裝飾器是對閉包的一種利用,內層函式呼叫外層函式的引數,並且返回內層函式,叫做閉包,把呼叫的引數,換成函式,就是裝飾器,因為python中,函式也是當做物件,從而有裝飾器這一種特殊的用法。有引數的裝飾器就是在外面一層...
閉包與裝飾器
閉包 a 1 def inner return a return inner print ret 保證資料安全性 裝飾器 假裝分隔符 裝飾器def warpper f 這裡接受func記憶體位址,f是要被裝飾的函式的函式名,f就是相當於閉包裡面的自由變數 def inner args,kwargs ...
閉包與裝飾器
閉包函式 命名空間與作用域 函式巢狀 函式物件 核心點 名字的查詢關係是以函式定義階段為準 閉 函式指的該函式是內嵌函式 包 函式指的該函式包含對外層函式作用域名字的引用 不是對全域性作用域 方式一 直接把函式體需要的引數定義成形參 def f2 x print x f2 1 f2 2 f2 3 方...