Python--(闭包)

闭包

在一个外函数中定义了一个内函数,内函数里运用了外函数的临时变量,并且外函数的返回值室内函数的引用.这样就够成了一个闭包.
一般情况下,在我们认知当中,如果一个函数结束,函数的内部所有东西都会释放掉,还给内存,局部变量都会消失,但是闭包是一种特殊情况,如果外函数在结束的时候发现有自己的临时变量将来会在内部函数中用到,就把这个临时变量绑定给了内部函数,然后自己再结束.
闭包和装饰模式 相辅相成
函数后加()为执行的意思 不加()为传递引用的意思
 
#普通闭包
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'>


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值