python闭包

这篇博客探讨了Python中的闭包和作用域概念,重点在于自由变量和nonlocal关键字的使用。通过示例解释了如何在函数内部访问和修改外部函数的变量。同时,介绍了`make_average`函数的闭包实现,展示了如何保存并更新状态。文章还讲解了`nonlocal`关键字的作用,用于在内部函数中修改外部但非全局的变量。
摘要由CSDN通过智能技术生成

python闭包

'''
作用域
闭包中肯定会涉及到作用域的问题
Ctrl+alt+l 格式化
'''

b = 4
def f(a):
    # global b = 9 语法错误
    global b
    print(a)
    print(b)
    # b = 9  这样会报错   python在编译函数的定义体时,判断b为局部变量
    #使用global就能完美解决问题
    b = 9
f(1)
print(b)

'''
闭包
自由变量
假如在全局中定义了变量a,在函数中使用了这个a,这个a就是自由变量,可以这样理解,凡是跨了自己的作用域的变量都叫自由变量。

def sum(*args, **kwargs): # real signature unknown
    """
    Return the sum of a 'start' value (default: 0) plus an iterable of numbers
    
    When the iterable is empty, return the start value.
    This function is intended specifically for use with numeric values and may
    reject non-numeric types.
    """
    pass
'''

def make_average():
    series = []      #初始化一个空列表     series是自由变量
    def averager(val):
        series.append(val)
        total = sum(series)       #sum() 累加
        return total / len(series)
    return averager    #返回一个函数名

avg = make_average()     #相当于avg = averager
print(avg(10))   #10.0
print(avg(11))   #10.5
print(avg(12))   #11.0

print(avg.__code__.co_varnames)   #局部变量  ('val', 'total')
print(avg.__code__.co_freevars)   #自由变量  ('series',)

print(avg.__closure__)   #cell对象    (<cell at 0x000001554614FCD0: list object at 0x00000155460F30C0>,)
print(avg.__closure__[0].cell_contents)   #自由变量的值,即series的值   [10, 11, 12]
'''
nonlocal
nonlocal声明的变量不是局部变量,也不是全局变量,而是外部嵌套函数内的变量。
'''
def make_averager():
    count = 0
    total = 0

    def averager(val):
        nonlocal count, total    #如果没有这行代码会报错
        count += 1   #相当于count = count + 1,相当于在创建了一个局部变量
        total += val
        return  total / count
    return  averager

avg = make_averager()     #相当于avg = averager
print(avg(10))   #10.0
print(avg(11))   #10.5
print(avg(12))   #11.0
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值