闭包
在一个外函数中定义了一个内函数,内函数里运用了外函数的临时变量,并且外函数的返回值室内函数的引用.这样就够成了一个闭包.
一般情况下,在我们认知当中,如果一个函数结束,函数的内部所有东西都会释放掉,还给内存,局部变量都会消失,但是闭包是一种特殊情况,如果外函数在结束的时候发现有自己的临时变量将来会在内部函数中用到,就把这个临时变量绑定给了内部函数,然后自己再结束.
闭包和装饰模式 相辅相成
函数后加()为执行的意思 不加()为传递引用的意思
普通闭包
#普通闭包
def sb(sun):
def sp():
print('太阳')
sun()
print('太热')
return sp
def sd():
print('明天下雨')
tianqi=sb(sd)
tianqi()
执行命令得
太阳
明天下雨
太热
装饰器闭包
#装饰器闭包
def out(sun):
def inner():
print('太阳')
sun()
print('太热')
return inner
@out
def index():
print('希望下雨')
index()
执行命得
太阳
希望下雨
太热
练习
火锅点菜系统
def supin(pin):
def caidan():
print('蔬菜拼盘:88')
return pin()+88
return caidan
def yangrou(pin):
def caidan():
print('新西兰牛肉 335')
return 335+pin()
return caidan
def yinliao(pin):
def caidan():
print('长城:800')
return 8+pin()
return caidan
@supin
@yangrou
@yinliao
def guodi():
print('菌汤锅:23元')
return 23
money=guodi()
print('总消费:',money)
执行命令得
蔬菜拼盘:88
新西兰牛肉 335
长城:800
菌汤锅:23元
总消费: 1246
当闭包的外部函数带入方法时
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))
执行命令得
请输入第一个数字:66
请输入第二个数字:66
请输入一个函数:lambda x,y:x*y
4356
<class 'function'>
<class 'int'>