鱼C论坛

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

[技术交流] 《零基础入门学习Python》第20讲笔记

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

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

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

x
020 内嵌函数和闭包

global关键字:在函数内使相关变量变成全局变量。

内嵌函数(最简单的例子):
def fun1():
        print('fun1()被调用')
        def fun2():
                print('fun2()被调用')
        fun2()

>>> fun1()
fun1()被调用
fun2()被调用

注意:在fun1()内可以调用fun2(),但是在fun1()外面就不能调用了。

闭包——函数式编程的重要结构
基本例子:
def funX(x):
        def funY(y):
                return x * y
        return funY

>>> i = funX(8)  # i就变成了一个函数,默认x值为8,再输入闭包的y即可
>>> type(i)      # <class 'function'>

% 两种调用方式:
>>> i(8)
64
>>> funX(8)(7)
56

注:外部也不能调用内部闭包函数。

列表不会存在于栈里面,为避免闭包函数内引用外部函数参数时出现错误,可以这样做:
def f1():
        x = [5]
        def f2():
                x[0] *= x[0]
                return x[0]
        return f2()

>>> f1()
25
但是这种委曲求全的方法不太好,就有了关键字:nonlocal
>>> def f1():
        x = 5
        def f2():
                nonlocal x  # 表示不是局部变量
                x *= x
                return x
        return f2()

>>> f1()
25
注:这样就不会报错了!

测试题:
0.        在函数中修改全局变量的值:global
1.        在嵌套函数张红修改外部函数的局部变量:nonlocal
2.        Python函数可嵌套,但要注意作用域
问题:函数内部函数不能在外面直接调用
3.        B问题:内嵌函数未給var变量赋值,就引用了
4.        如何访问?
def funOut():
    def funIn():
        print('宾果!你成功访问到我啦!')
    return funIn()
funOut()
5.        如何调用?
def funOut():
    def funIn():
        print('宾果!你成功访问到我啦!')
    return funIn   # 不同点
funOut()()

也可以曲线救国:
go = funOut()
go()
宾果!你成功访问到我啦!

6.        目测打印内容:
def funX():
    x = 5
    def funY():
        nonlocal x
        x += 1
        return x
    return funY

a = funX()
print(a())
print(a())
print(a())

内容:
6
7
8

为什么会有全局变量的效果?
当a = funX()的时候,只要a变量未被重新赋值,funX()就没有被释放,也就是说局部变量(LV)没有被初始化。
所以当全局变量不适合的时候,可以考虑使用闭包更稳定和安全。

评分

参与人数 2荣誉 +5 鱼币 +7 收起 理由
康小泡 + 2
小甲鱼 + 5 + 5 支持楼主!

查看全部评分

本帖被以下淘专辑推荐:

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-22 13:56

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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