鱼C论坛

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

[技术交流] 《零基础入门学习python》第二十讲笔记:函数:内嵌函数和闭包

[复制链接]
发表于 2017-7-31 11:47:15 | 显示全部楼层 |阅读模式

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

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

x
global关键字; 在函数里面定义一个global 变量,使之变成全局变量

内嵌函数:在函数内部创建另一个函数
>>> def fun1():
            print('fun1()正在被调用。。。')
            def fun2():   #函数嵌套
                 print('fun2()正在被调用。。。')
            fun2()


>>> fun1()  # 执行的过程是先走到def fun1(),print('fun1()正在被调用。。 '),然后到fun2(),然后再到def fun2(),print('fun2()正在被调用。。。 ')
fun1()正在被调用。。。
fun2()正在被调用。。。
>>>

>>> fun2()
Traceback (most recent call last):
  File "<pyshell#12>", line 1, in <module>
    fun2()
NameError: name 'fun2' is not defined

上面这个例子。只有fun1()能调用fun2(),出了fun1(),没人能调用得到fun2()

闭包:如果在一个内部函数里引用外部作用域的变量,那么这个内部函数就称为闭包
>>> def funx(x):
             def funy(y):
                  return x * y
             return funy    #python所有东西都是对象,可以返回函数对象

>>> i = funx(8)  # 调用funx(),并给实参8,然后赋值给i
>>> i
<function funy at 0x000000000324AEC8>
>>> type(i)   #  i 是一个函数,因为funx()返回的是一个函数
<class 'function'>
>>> i(5)    # 给y的参数设为5
40
>>> funx(8)(5)   # 或者直接两个括号分别传实参
40
>>> funy(5)  # 在全局调用内部函数会报错
Traceback (most recent call last):
  File "<pyshell#20>", line 1, in <module>
    funy(5)
NameError: name 'funy' is not defined

在闭包中,外部函数的变量相对内部函数的变量,相当于全局变量和局域变量的关系。在内部函数,只能访问外部函数变量而不能修改
>>> def fun1():
             x = 5
             def fun2():
                 x *= x     # 这里fun2函数里修改fun()函数里x变量的值,是不允许的,只能访问
                 return x
          return fun2()

>>> fun1()
Traceback (most recent call last):
  File "<pyshell#28>", line 1, in <module>
    fun1()
  File "<pyshell#27>", line 6, in fun1
    return fun2()
  File "<pyshell#27>", line 4, in fun2
    x *= x
UnboundLocalError: local variable 'x' referenced before assignment
>>>
>>> def fun1():
             x = [5]  # 把x换成列表类型,因为列表不存放在栈里面,数据不会被清空,这只是一个临时的投机取巧方法
             def fun2():
                 x[0] *= x[0]
                 return x[0]
             return fun2()

>>> fun1()
25
>>> def fun1():
    x = 5
    def fun2():
        nonlocal x    #把外部函数变量x 在内部函数里定义成nonlocal,这样就能修改外部函数x的值了
        x *= x
        return x
    return fun2()

>>> fun1()
25
总结:在内部函数定义了nonlocal 变量,然后将此变量重新赋值。 拿到全局去,此值仍然有效。
          funx() 是一个函数,但funx 和 funx() 最大区别是后者会走到def funx()那里去,而前者不会,前者作为return的话,返回的就是一个函数对象。
          如果在函数中修改全局变量的值,需先用global 定义一下这个变量,如果想在内部函数修改外部函数的值,应使用nonlocal定义一下这个变量

评分

参与人数 1鱼币 +5 收起 理由
小甲鱼 + 5 支持楼主!

查看全部评分

本帖被以下淘专辑推荐:

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-24 13:55

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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