【Python】闭包

引入:

通过全局变量account_amount来记录余额

并定义函数进行取款存款操作,代码如下:

account_amount = 0
def atm(num, deposit = True):
    global account_amount
    if deposit:
        account_amount += num
        print(f"存款:+{num},账户余额:{account_amount}")
    else:
        account_amount -= num
        print(f"取款:-{num},账户余额:{account_amount}")

atm(300)
atm(300)
atm(100, False)

运行结果:

存款:+300,账户余额:300
存款:+300,账户余额:600
取款:-100,账户余额:500

尽管功能实现是OK的,但是仍有问题:

  • 代码在命名空间上(变量定义)不够干净、整洁
  • 全局变量有被修改的风险

如何解决?

  • 将变量定义在函数内部是行不通的
  • 我们需要使用闭包

我们先来看一个闭包的简单示例:

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

fn1 = outer("编程语言")
fn1("Python")
fn1("Java")
fn1("C++")

fn2 = outer("前端")
fn2("HTML")
fn2("CSS")
fn2("JavaScript")

运行结果:

<编程语言>Python<编程语言>
<编程语言>Java<编程语言>
<编程语言>C++<编程语言>
<前端>HTML<前端>
<前端>CSS<前端>
<前端>JavaScript<前端>

定义双层嵌套函数,内层函数可以访问外层函数的变量

将内层函数作为外层函数的返回,此内层函数就是闭包函数

如果我们想修改外部函数的值呢?

使用nonlocal关键字

示例:

def outer(num1):
    def inner(num2):
        nonlocal num1
        num1 += num2
        print(num1)
    return inner

fn = outer(10)
fn(5)
fn(3)
fn(1)

要对num1进行修改,需要用nonlocal对其进行修饰

运行结果:

15
18
19

我们回过头来对一开始的代码进行优化:

def account_create(initial_amount = 0):
    def atm(num, deposit =True):
        nonlocal initial_amount
        if deposit:
            initial_amount += num
            print(f"存款:+{num},账户余额:{initial_amount}")
        else:
            initial_amount -= num
            print(f"取款:-{num},账户余额:{initial_amount}")
    return atm

fn = account_create()
fn(300)
fn(300)
fn(100,False)

优点:

  • 无需定义全局变量即可实现:通过函数持续地访问、修改某个值
  • 闭包使用的变量的作用域在函数内,难以被错误的调用修改

缺点:

  • 由于内部函数持续引用外部函数的值,会导致这一部分内存空间不被释放,一直占用内存
  • 8
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值