函数进阶

定义

函数的嵌套:嵌套调用
嵌套定义:定义在内部的函数无法直接在全局被调用
函数名的本质:就是一个变量,保存了函数所在的内存地址
闭包:内部函数包含对外部作用域而非全剧作用域名字的引用,该内部函数称为闭包函数

Python代码运行遇到函数时的运行流程:

从python解释器开始执行之后,就在内存中开辟了一个空间
每当遇到一个变量的时候,就把变量名和值之间的对应关系记录下来。
但是当遇到函数定义的时候解释器只是象征性的将函数名读入内存,表示知道这个函数的存在了,至于函数内部的变量和逻辑解释器根本不关心。
等执行到函数调用的时候,python解释器会再开辟一块内存来存储这个函数里的内容,这个时候,才关注函数里面有哪些变量,而函数中的变量会存储在新开辟出来的内存中。函数中的变量只能在函数的内部使用,并且会随着函数执行完毕,这块内存中的所有内容也会被清空。
我们给这个“存放名字与值的关系”的空间起了一个名字——叫做命名空间
代码在运行伊始,创建的存储“变量名与值的关系”的空间叫做全局命名空间,在函数的运行中开辟的临时的空间叫做局部命名空间

理解嵌套函数

举例:

def f1():
    def f2():
        def f3():
            print("in f3")
        print("in f2")
        f3()
    print("in f1")
    f2()
    
f1()
打印结果:
in f1
in f2
in f3

理解作用域

举例1:

def f1():
    a = 1
    def f2():
        a = 2
    f2()
    print('a in f1 : ',a)

f1()
打印结果:
a in f1 :  1

举例2:

def f1():
    a = 1
    def f2():
        nonlocal a
        a = 2
    f2()
    print('a in f1 : ',a)

f1()
打印结果:
a in f1 :  2

对比例子1和2理解nonlocal
1.外部必须有这个变量
2.在内部函数声明nonlocal变量之前不能再出现同名变量
3.内部修改这个变量如果想在外部有这个变量的第一层函数中生效

闭包

内部函数包含对外部作用域而非全剧作用域名字的引用,该内部函数称为闭包函数

def func():
    name = 'Jose'
    def inner():
        print(name)
闭包+嵌套

举例:

def wrapper():
    money = 999
    def func():
        name = 'Jose'
        def inner():
            print(name,money)
        return inner
    return func
f = wrapper()
i = f()
i()
打印结果:
Jose 999
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值