Python学习--Day10--进阶--闭包

Day10--进阶--闭包

python 一切皆对象: 如 python中一个函数可以作为另外一个函数的参数,传递

🧸闭包:

# 闭包
# 闭包 = 函数 + 环境变量(函数定义时候)
def curve_pre():
    a = 25
    def curve(x):
        #print('This is curve function')
        return a*x*x
    return curve

a = 10
f = curve_pre()     # 此处f是curve()函数
# f()     # This is curve function
print(f(2))  # 100

# 在这里函数curve()和函数curve_pre()形成了闭包, f(2)的值不会受函数curve_pre()外部的变量影响

# 闭包的环境变量  保存位置
print(f.__closure__)    # (<cell at 0x0000015576DA9A98: int object at 0x00007FFFC88A7F40>,)
# 取闭包的参数值
print(f.__closure__[0].cell_contents)   # 25  

🎈闭包的经典误区:

# 一个示例: 此处的f1()不是闭包
def f1():
    a = 10
    def f2():
        # a 此时被python认为是局部变量 ,闭包将不存在
        a = 20
        print('f2()定义', a)  # 20
    print('f1()打印', a)    # 10
    f2()
    print('调用f2()后', a)    # 10

问题:

有一个旅行者,我们要检测其旅行长度
起点x = 0
比如他走3步, result = 3
比如他又走5步, result = 8
比如他走6步, result =14

# 不用闭包解决
origin = 0

def go1(step):
    global origin
    new_pos = origin + step
    origin = new_pos
    return new_pos

print(go1(3))   # 3
print(go1(5))   # 5
print(go1(6))   # 8

# 使用闭包解决
origin = 0

def sum_walk(pos):
    def walk(step):
        nonlocal pos
        new_pos = pos + step
        pos = new_pos
        return new_pos
    return walk

s = sum_walk(origin)
print(s(2))     # 2
print(origin)     # 0
print(s(5))     # 7
print(origin)     # 0
# 由此可见,相比一般函数而言  闭包不会引起全局变量的改变
# 也可以使用 s.__closure__[0].cell_contents验证

闭包知识函数式编程的一种应用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值