用闭包解决行走距离问题

假设起点从x=0开始。
走了3步,打印的结果result = 3
再走了5步,打印的结果是result = 8
又走了6步,打印的结果是result = 14

先用非闭包函数实现:

x = 0
def go(step):
    global x
    new_pos = x + step
    x = new_pos
    return x
print(go(3)) 
print(go(5)) 
print(go(6)) 
---------------------------------------------
输出:
3
8
14

这里为什么要用global关键字来定义变量x为全局变量呢?这是因为`在go函数内部出现了x = new_pos,而Python会认为等号左边的变量是一个局部变量。如果没有使用global关键字来定义x为全局变量的话,new_pos = x + step这行是会报错的。就会未定义x变量。

在函数内部定义一个全局变量这个做法是不好的,因为全局变量是很容易被其他函数改变的。现在用闭包来实现

origin = 0

def factory(pos):
    def go(step):
        nonlocal pos
        new_pos = pos +step
        pos = new_pos
        return new_pos
    return go
f = factory(origin)
print(f(3))
print(f(5))
print(f(6))
----------------------------------
输出:
3
8
14

注意,用了nonlocal关键字来声明pos变量不是本地的一个局部变量。
闭包的环境变量有保存现场的一个功能,它可以记忆上一次调用的状态。
定义的变量origin的变量并没有被改变。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值
>