閉包
在一個外函數中定義了一個內函數,內函數裏運用了外函數的臨時變量,並且外函數的返回值室內函數的引用.這樣就夠成了一個閉包.一般情況下,在我們認知當中,如果一個函數結束,函數的內部所有東西都會釋放掉,還給內存,局部變量都會消失,但是閉包是一種特殊情況,如果外函數在結束的時候發現有自己的臨時變量將來會在內部函數中用到,就把這個臨時變量綁定給了內部函數,然後自己再結束.
閉包和裝飾模式 相輔相成
函數後加()爲執行的意思 不加()爲傳遞引用的意思
#普通閉包
def outter(fun):
def inner():
print('123')
fun()
print('456')
return inner
def index():
print('woshi index')
ind=outter(index)
ind()
執行命令得
123
woshi index
456
裝飾器閉包
#裝飾器閉包
def outter(fun):
def inner():
print('123')
fun()
print('456')
return inner
@outter
def index():
print('woshi index')
index()
執行命令得
123
woshi index
456
練習
火鍋點菜結賬系統
def xuebi(fun):
def caidan():
print('雪碧 5元')
return fun()+5
return caidan
def yangrou(fun):
def caidan():
print('羊肉 80元')
return fun()+80
return caidan
@xuebi
@yangrou
def guodi():
print('三鮮鍋 50元')
return 50
price=guodi()
print('總消費',price)
執行命令得
雪碧 5元
羊肉 80元
三鮮鍋 50元
總消費 135
當閉包的內部函數帶參數時1-4分別加9得出結果分別添加到列表中
list=[]
def outter():
def inner(y):
lam=lambda x,y:x+y
for x in range(1,5):
list.append(lam(x,y))
return inner
out=outter()
out(9)
print(list)
執行命令得
[10, 11, 12, 13]
當閉包的外部函數帶入方法時1-4分別乘9得出結果添加到列表中
list=[]
def outter(fun):
def inner(y):
for x in range(1,5):
list.append(fun(x,y))
return inner
def suan(x,y):
return x*y
out=outter(suan)
out(9)
print(list)
執行命令得
[9, 18, 27, 36]
Python3特性 str轉換爲函數eval()實現帶參函數fun(x,y)
x=int(input('請輸入第一個數字:'))
y=int(input('請輸入第二個數字:'))
fun=eval(input('請輸入一個函數:'))
ret=fun(x,y)
print(ret)
print(type(fun))
print(type(ret))
執行命令得
請輸入第一個數字:6
請輸入第二個數字:4
請輸入一個函數:lambda x,y:x*y
24
<class 'function'>
<class 'int'>