python -【九】函数闭包&装饰器

作用,隐藏部分的功能,让访问者不干涉内部的执行

语法:

def 外部函数([参数]):
    def 内部函数([参数]):
        业务逻辑
    return 闭包函数

# 通过函数得到闭包函数
fn = 外部函数()
fn()  # 调用闭包函数执行内部逻辑

普通闭包的演示

def outer(logo: str):
    def inner(msg: str):
        print(f'<{logo}>{msg}<{logo}>')
    return inner

fn = outer('alibaba')
fn('电商')
fn('Java')

"""
<alibaba>电商<alibaba>
<alibaba>Java<alibaba>
"""

ATM案例的改造

def account_create(init_amount=0):
    def atm(num, deposit=True):
        # 闭包中修改外部函数的值,通过关键字 nonlocal 实现
        nonlocal init_amount
        if deposit:
            init_amount += num
            print(f'存款:+{num},账户余额:{init_amount}')
        else:
            init_amount -= num
            print(f'取款:-{num},账户余额:{init_amount}')

    return atm

ac = account_create()
ac(100)
ac(300)
ac(200, False)

nonlocal 关键字

在闭包中,内部函数如果需要对外部函数的值进行修改,需要通过该关键字指定

atm 中,内部函数中定义了 nonlocal init_amount 表明在 atm 内部函数需要修改 account_create 的入参

def use_nonlocal(init_unm=0):
    def add(x: int, y: int):
        nonlocal init_unm
        # 每次计算后,将值赋给 init_num 缓存
        init_unm += x + y
        print(f'init_num={init_unm}')
    return add


f = use_nonlocal()
f(1, 2)  # 3
f(1, 2)  # 6
f(1, 2)  # 9

装饰器:基础写法

"""
装饰器:
通过装饰器来对函数进行增强

以下案例:
使用 2g 网络打电话
增强:开启 5g 网络打电话
"""

# 增强通话,启动 5g 通话
def enhance(fn):
    def enable_5g():
        print('开启 5g 通话 ...')
        fn()
        print('关闭 5g 通话 ...')

    return enable_5g

# 使用 2g 网络打电话
def call_2g():
    import time
    import random
    print('开始打电话 ....')
    time.sleep(random.randint(0, 5))
    print('结束打电话 ....')

en = enhance(call_2g)
en()

装饰器:高级写法

# 增强通话,启动 5g 通话
def enhance(fn):
    def enable_5g():
        print('开启 5g 通话 ...')
        fn()
        print('关闭 5g 通话 ...')

    return enable_5g


# 通过 @函数名 来装饰该函数
@enhance  
def call_2g():
    import time
    import random
    print('开始打电话 ....')
    time.sleep(random.randint(0, 5))
    print('结束打电话 ....')


call_2g()
  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值