鱼C论坛

 找回密码
 立即注册
查看: 2150|回复: 0

[技术交流] 第20集,内嵌函数和闭包

[复制链接]
发表于 2020-9-20 15:21:50 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
1、global
count=5
def Myfun():
        count=10
        print(10)

       
Myfun()
10
print(count)
5
因为count修改的时候是作为局部变量修改的,被屏蔽了,函数内部修改的无效。
count=10
>>> def Myfun():
        global count
        count=10
        print(10)

       
>>> print(count)使用global就可以修改count

2、内嵌函数
支持函数的嵌套。在内部函数整个作用域都在外部函数之内,只有在外部函数内才可以随意调用内部函数,出了外部函数,就不可以再调用外部函数了。
3、闭包
定义:如果在一个内部函数里对外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就会被认为是闭包。
注意:内部函数可以对外部函数进行访问但是不能修改。
def funX(x):
        def funY(y):
                return x*y
        return funY

>>> i=funX(8)
>>>
>>> type(i)
<class 'function'>
>>> i(5)
40
>>> funX(8) (5)#可以对两个变量都进行赋值
40

def fun1():
        x=5
        def fun2():
                x*=x
                return x
        return fun2()
>>> fun1()#错误,因为不可以对x进行修改,但是如果把x改成列表的话就可以修改。
4、nonlocal函数,将其强制改为一个非全局变量。


题目:
0、应该使用global关键词
1、使用nonlocal关键词
2、不可以之间调用内部函数,内部函数只在外部函数的作用域下可以调用
3、4、5、?
3、outside()函数里有一个var变量,但要注意的是,内嵌函数inside()也有一个同名的变量,python为了保护变量的作用域,故将outside()的var变量屏蔽起来,因此此时是无法访问到外层的var变量的。
5、def funOut():
       def funIn():
                 print('宾果,你成功访问到我啦!')
        return funIn()

这里调用funOut()函数之后,返回funIn()函数,那么继续调用funIn()函数

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

这里调用funOut()函数之后,返回funIn函数名,再加一个括号,即可调用funIn()函数

6、
def funX():
    x=5
    def funY():
        nonlocal x
        x+=1
        return x
    return funY
a=funX()
print(a())
print(a())
print(a())
当a=funx()的时候,只要a变量没有被重新复制,funx()就没有被释放,也就是说局部变量x没有被重新初始化。所以当全局变量不适用的时候,可以考虑使用闭包更稳定和安全。


动动手:
0:有了文件就不会做了

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-30 05:34

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表