玩转Python中闭包的使用原理与注意事项

 谈闭包前,先看两个函数的引用的案例

def fuc(args):
    print("打印一下:",args)
    return args +1
#调用函数方式1
fuc(10)
print("*"*20)
f = fuc(10)  #将函数的调用结果赋给另外一个变量
print(id(f),id(fuc(10)))
f  #这样也相当于调用fuc(10)
print(f,fuc(10)) #11,11

#调用函数方式2
f1 = fuc #这样没有()的方式,将函数体赋给另外一个变量
print(id(f1),id(fuc),f1,fuc)
#9350288 9350288  
fuc(11)  #打印一下: 11
f1(11)  #打印一下: 11

1.什么是闭包

       如下,所谓的闭包,就是在一个函数里面func里面再定义一个内部函数result。这个内部函数result可以引用(实际可以不引用)外部函数func的参数和局部变量。此外将内部函数的函数体当做外部函数的返回值(相关参数和变量都保存在返回的函数中)返回给函数。这种内部函数的形式就被称为“闭包(Closure)”说到底,闭包就是高级函数的使用。

def func(a):
    print("this is :",a)
    def result(x,y):
        sum = a*x +y
        print("sum is :",sum)
        return sum

    return result  #注意这里返回值是函数名,不是result().把result函数作为返回值给func,闭包的核心
-------------------------函数调用---------------------------------------
1.调用外部函数
func(10)  #这里只执行了func里面的第一个print.
print("------------")
f1 = func(10)
f1(10,20)  #上面的效果等同于func(10)(10,20),对内部函数result进行调用。类似于多重列表的调用
print(f1(10,20)) #打印函数的返回值。
'''
this is : 10
------------
this is : 10
sum is : 120
sum is : 120
120
'''

内部函数(闭包)不一定需要引用外部函数的变量,只是他有这个权限。有时候外部函数用来做一些权限检查之类的。

def func1():
    print("准备使用闭包了,我要校验一下,做个权限检查")
    pass
    num = 1000
    def result1(x,y): #这里就没有引用外部函数的变量
        sum = x +y
        print("sum is :",sum)
        return sum

    return result1  #注意这里返回值是函数名,不是result().这个返回值是func的返回值,闭包的核心

f1 = func1()
f1(10,20)

'''
准备使用闭包了,我要校验一下,做个权限检查
sum is : 30
'''

内部函数修改外部函数中的变量

def counter(start=0):
    def incr():
        nonlocal start 
        # nonlocal python3才有 表示将变量声明为外层变量(外层函数的局部变量,而且不能是全局变量,区别global)
        start += 1
        return start
    return incr

c1 = counter(5)
print(c1())
print(c1())

c2 = counter(50)
print(c2())
print(c2())

print(c1())
print(c1())

print(c2())
print(c2())
'''
6
7
51
52
8
9
53
54

'''

2.闭包的用处和好处

    1.闭包的特性:

1.闭包似优化了变量,原来需要类对象完成的工作,可以闭包可以完成,其实提高了代码的封装性
2.闭包提高了代码的复用性,只要体现在装饰器的使用。
3.由于闭包引用了外部函数的局部变量,则外部函数的局部变量没有及时释放,消耗内存

   2.闭包的用处:

    闭包真正发挥用处的是在装饰器中的使用,装饰器强大的功能就是基于闭包实现的。

统一声明:关于原创博客内容,可能会有部分内容参考自互联网,如有原创链接会声明引用;如找不到原创链接,在此声明如有侵权请联系删除哈。关于转载博客,如有原创链接会声明;如找不到原创链接,在此声明如有侵权请联系删除哈。

你可能感兴趣的:(python编程与爬虫开发系列,Python人工智能开发系列)