Python-20-内嵌函数和闭包

本文详细介绍了Python中闭包的概念及应用,包括内嵌函数、闭包中变量的作用域规则、global与nonlocal关键字的使用场景,并通过实例演示闭包如何避免变量重复初始化。

1.内嵌函数和闭包

global关键字:把变量变为全局变量

count=5

>>> def MyFun():

global count
count=10
print(count)

>>> print(count)

10

2.内嵌函数(在函数内部定义一个函数)内部函数的作用域都在外部函数之内,出了fun1就不能调用fun2了


>>> def fun1():
print('fun(1)正在被调用。。。')
def fun2():
print('fun2正在被调用。。。')
fun2()

>>> fun1()
fun(1)正在被调用。。。

fun2正在被调用。。。

3.闭包

在一个内部函数里,Funy(y)在它外部的作用域引用到了外部的变量x就称Funy()是Funx()的闭包

在内部函数中只能对外部函数的变量进行访问,不能修该

>>> def Fun1():
x=5
def Fun2():
X*=X
return x
return Fun2()


>>> Fun1()
Traceback (most recent call last):
  File "<pyshell#55>", line 1, in <module>
    Fun1()
  File "<pyshell#54>", line 6, in Fun1
    return Fun2()
  File "<pyshell#54>", line 4, in Fun2
    X*=X

UnboundLocalError: local variable 'X' referenced before assignment

.利用容器

>>> def Fun1():

x=[5]
def Fun2():
x[0]*=x[0]
return x[0]
return Fun2()


>>> Fun1()

25

4.nonlocal可以用它把内部变量重新定义一下不是局部变量

>>> def Fun1():
x=[5]
def Fun2():
nonlocal x
x[0]*=x[0]
return x[0]
return Fun2()


>>> Fun1()
25

课后练习:

如果希望在函数中修改全局变量的值,应该使用什么关键字?

答:global

在嵌套的函数中,如果希望在内部函数修改外部函数的局部变量,应该使用什么关键字?

答: nonlocal

Python的函数可以嵌套,但要注意访问的作用域问题哦,请问以下代码存在什么问题呢?

    def outside():  
        print('I am outside!')  
        def inside():  
            print('I am inside!')  
    inside()  

答:inside()是内部函数,不能在外部调用 
使用嵌套函数要注意一点就是作用域问题,inside()函数是内嵌在outside()函数中的,所以inside()是人妻,除了身为老公的outside()可以碰(调用),在外边或者别的函数体里是无法对其进行调用的。

请问为什么代码A没有报错,但代码B却报错了?应该如何修改?

    def outside():  
        var = 5  
        def inside():  
            var = 3  
            print(var)  

        inside()  
    outside()  

    def outside():  
        var = 5  
        def inside():  
            print(var)  
            var = 3  

        inside()  
    outside()  

答:这里outside()函数里有一个var变量,但要注意的是,内嵌函数inside()也有一个同名的变量,Python为了保护变量的作用域,故将outside()的var变量屏蔽起来,因此此时是无法访问到外层的var变量的。 
应该修改为:

def outside():  
    var = 5  
    def inside():  
        nonlocal var  
        print(var)  
        var = 8  

    inside()  
outside() 

请问如何访问funIn()呢?

    def funOut():  
        def funIn():  
            print('宾果!你成功访问到我啦!')  
        return funIn()  

以下是“闭包”的一个例子,请你目测下会打印什么内容?

    def funX():  
        x = 5  
        def funY():  
            nonlocal x  
            x += 1  
            return x  
        return funY  
    a = funX()  
    print(a())  
    print(a())  
    print(a())  

答:6 


论坛的解释: 
有些鱼油可能会比较疑惑,这……怎么跟全局变量一样了?局部变量x不是应该在每次调用的时候都重新初始化了吗?!

其实大家仔细看看就明白了,当a = funX()的时候,只要a变量没有被重新赋值,funX()就没有被释放,也就是说局部变量x就没有被重新初始化。

所以当全局变量不适用的时候,可以考虑使用闭包更稳定和安全,你还可以参考 -> 游戏中的角色移动:闭包在实际开发中的作用


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值