鱼C论坛

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

[技术交流] 19 - 函数:内嵌函数和闭包 - 景命

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

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

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

x
本帖最后由 景命 于 2017-7-11 23:35 编辑

知识点:
这一节的内容比较多大家要多看代码,最好能自己敲一遍。



global关键字:
        在函数内部用global关键字,可以修改全局变量的值。
>>> a = 10
>>> def b():
        global a
        a = 5
        print(a)

>>> b()                #调用函数b()
5                        #返回值为已经改变的a的值5
>>> a                #输出全局变量a
5                        #此时全局变量a的值已经发生改变




内嵌函数(内部函数):
def a():                        #定义函数a()
        print("函数a()正在被调用")
        def b():                #在函数a()中定义函数b()
                print("函数b()正在被调用")
        b();                        #在函数a()中调用函数b().

a()                                #调用函数a()
函数a()正在被调用        #输出函数a()里的语句,再输出函数b()里的语句。
函数b()正在被调用
注意:函数b()在函数a()内部定义,所以函数b()的作用域只在函数a()中,如果在函数a()外部调用函数b()将会报错。







闭包(claeune):
不同的编程语言实现闭包的方式不同,Python中闭包从表现形式定义为,如果在一个内部函数里,对外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就会被认为是闭包。
例:
def a(x):                                #定义函数a()
        def b(y):                        #在函数a()中定义函数b()
                return x * y        #在函数b()中引用其外部作用域变量x
        return b                        #函数a()的返回值为函数b()。在Python中函数属于对象,可以用return返回。

i = a(4)                                #调用函数a(),并将参数4传入,用变量i接受函数a()的返回值
type(i)                                #查看变量i的类型
<class 'function'>                #显示类型为函数
i(8)                                        #此时i为函数a()的返回值,也就是函数b()。
32                                        #输出函数b()的返回值。

a(3)(4)                                #也可以用这种方式来调用函数a(),和函数a()内的函数b(),这种方式是访问函数中的函数。                        
12                                          







在闭包中外部函数的局部变量对内部函数的局部变量,就类似与全局变量与局部变量的关系。在内部函数中只能对外部函数的局部变量进行访问,但是不可以对外部函数的局部变量修改。
例:
def a():                                
        x = 3                                #定义外部函数的局部变量。
        def b():
                x *= x                #在这里试图改变外部函数的局部变量
                return x
        return b()                        #返回函数b()的返回值。(这样就会运行函数b内部的代码)

a()                #调用函数a()
UnboundLocalError: local variable 'x' referenced before assignment        #会报错





但是用容器类型的变量(元组,列表)可以避免以上错误:
def a():
        x = [3]                        #将3存放在列表型变量x中
        def b():
                x[0] *= x[0]        #将列表中的元素相乘
                return x[0]        #返回的也是列表中的元素
        return b()
a()                                        #调用函数a()
9                                        #返回值为9





nonlocal关键字(与global关键字类似):
def a():
        x = 3
        def b():
                nonlocal x        #用nonlocal关键字来修饰变量x,x就可以被内部函数修改。
                x *= x
                return x
        return b()
a()
9

评分

参与人数 1荣誉 +4 鱼币 +4 收起 理由
小甲鱼 + 4 + 4 热爱鱼C^_^

查看全部评分

本帖被以下淘专辑推荐:

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-24 20:07

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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