day12 函数嵌套 名称空间 作用域 闭包函数

01函数嵌套

    函数嵌套指的是一个函数包含另一个函数

按照 函数的两个阶段 分为

嵌套调用:

指的是在函数的执行过程中调用了另一个函数

其好处是可以简化0函数的代码,使得结构更清晰

可以将大的复杂的功能拆分为多个简单的小功能

def func1():

    print('func1 run!')

def func2():

    func1()

    print('func2 run')

func2()

嵌套定义(唯一使用场景就是闭包函数,除此之外不要这么写):

    指的是在函数的函数体中定义了另一个函数

def outer():

    print("outer run")

    def inner():

        print("inner run")

    inner()

outer()

需要注意的是 内部定义的函数 只能在内部使用,外界无法直接访问

 

02名称空间:就是存储名字的内存区域

名称空间的分类:

1.内置名称空间:存的是解释器自带的名称,列如print len

特点:是在程序运行的过程中都有效

生命周期:随着解释器的启动而生效 随着解释器运行结束而失效

2.全局名称空间:只要是顶着最左边写的,没有任何缩进的,就在全局名称空间中

特点:是在程序运行的过程中都有效

生命周期:随着py文件的执行而生效,随着py文件执行结束而失效

需要注意的是:在if while for with中 如果if是顶着最左边的没有缩进的 if里面的名字也属于全局 

3.局部名称空间:

存的是函数内部定义的名字

特点:仅在函数调用临时时有效

生命周期:随着函数的调用而生效,随着函数的调用结束而失效

 

名称空间的加载顺序

内置-->全局-->局部

名字的查找顺序

局部-->全局-->内置

 

03作用域:简单的说就是名字的有效范围

存储名称的有三个地方

    1.内置名称空间

    2.全局名称空间

    3.局部名称空间

全局作用域:

由于内置名称空间的名字与全局名称空间的名字,可以在任何位置来访问,所以他们两可以划到同一个范围,称之为全局范围,全局作用域

局部作用域:

局部名称的名字只能在当前的函数中访问,所以他单独划到一个范围,这个范围称之为局部作用域

 

04global(全局)0域nonlocal(不使用本地)关键字

global当需要函数内部修改全局中名字的值时,需要用global

注意,必须在使用这个名字之前声明global

nonlocal(不适用本地)

当需要在内层函数中修改外层函数中的名字时就需要使用nonlocal

会一层一层往外找 直到找到了为止,但是只能找函数中的 不能找到全局的名字

 

05函数对象

目的是为了让你了解函数都可以做什么来使用

函数是第一类对象:

1.能够被调用

2.可以当做容器类型的元素

3.可以当做函数的参数

4.可以当做函数的返回值

函数名除了可以调用之外与一个变量名没有本质区别 变量能怎么用 函数名就能怎么用

 

06闭包函数

闭包:一个函数将另一个函数关闭在内部,反过来说一个函数被另一个函数包裹

 

闭包函数也是一种函数:

其特点是:

1.该函数是定义在另一个函数中的

2.该函数包含了对外层函数中名字的引用,无论在任何位置使用这个函数,其都包含了外部名字引用

满足以上两条称之为闭包函数

需要注意的是名字所在的作用域 在函数定义阶段就已经固定了 与调用阶段无关

现阶段可以将闭包理解为另一个为函数体

传值的方式

之前只能通过参数给函数传值

由于名称空间与作用域的特点,内层定义的函数只能在内层使用

而函数对象可以将一个函数作为返回值,使得内部函数可以被外界使用

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值