python中内嵌函数和闭包不理解?看这个就对了~

python中内嵌函数和闭包不理解?看这个就对了~,第1张

1.内嵌函数

顾名思义,内嵌函数(或者嵌套函数)是指在一个函数里嵌套另一个函数。

def mytest1():
    print("mytest1正在被调用……")
    def mytest2():
        print("mytest2在被调用……")
    mytest2()
mytest1()

"""输出结果:
mytest1正在被调用……
mytest2在被调用……

"""

注意:内部函数的调用只能在外部函数这个作用域中,出了外部函数,则无法调用内部函数。因为python会在全局中寻找 mytest2函数 ,但是此时全局并没有创建,所以会报错。如下图所示:

2.闭包 2.1 闭包概念

如果在一个内部函数里对外部作用域(但不是在全局作用域)的变量进行引用,内部函数就被认为是闭包。
举个例子:

def testA(a):
    def testB(b):
        return a + b
    return testB
i = testA(10)
print(i)   

如上图,testA函数相当于外部函数,testB函数相当于内部函数,在testB里引用了testA的变量a ,那么testB就被认为是闭包。

执行上面的代码,如下图所示。python所有的东西都可以视为一个对象,所以可以直接返回函数本身。

如果还不是很确定,那我们可以看一下返回结果的类型。

如果要返回testB函数的结果,需要再对testB进行传参,如下图所示:

上面分了2步才执行出testB的返回结果,其实也可以有简便写法,一次性输出testB的结果,如下图所示:

2.2 调用内部函数

这里需要注意的是,不能在外部函数的外边对内部函数进行调用。和上面内嵌函数说的是一个道理,内部函数的调用只能在外部函数这个作用域中。

2.3 访问和修改外部函数的变量

外部函数的局部变量对于内部函数来说相当于内部函数的"全局变量"(并非全局中的全局变量)。可以直接访问,但不能直接修改,否则会报错。

def test1():
    x = 5
    def test2():
        return x	# 可以直接访问到外部函数的变量x
    return test2()
print(test1())

#输出结果: 5

若是必须要修改外部函数中的局部变量,则需要在内部函数开头加上:nonlocal 变量名。

总结:

  • 如果在一个内部函数里对外部作用域(但不是在全局作用域)的变量进行引用,内部函数就被认为是闭包;
  • python所有的东西都是对象,所以可以直接返回函数本身;
  • 不能在外部函数的外边对内部函数进行调用;
  • 外部函数的局部变量对于内部函数来说相当于内部函数的全局变量,可以直接访问,但不能直接修改。如果一定要修改,需要在内部函数开头加上:nonlocal 变量名

以上就是对于内嵌函数和闭包的理解,如有补充和建议请评论区留言,共同进步,感谢!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/875667.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-13
下一篇 2022-05-13

发表评论

登录后才能评论

评论列表(0条)

保存