2020 python学习第十三天————函数嵌套,名称空间与作用域和闭包函数

1.1 函数嵌套定义

  在一个函数内又定义了另外一个函数

    def f1():

      def f2():

    f1()

    res = f1()

    print(res)

1.2 函数嵌套调用

  在调用一个函数的过程中又调用了其他函数

    def max2(x, y):

      if x > y:

        return x

    def max4(a, b, c):

      res1 = max2(a, b)

      res2 = max2(res1, c)

      return res3

 

2.1 名称空间

  就是存放名字的地方

  2.1.1 内置名称空间

    存放的是python解释器自带的名字,如len、print、input

      生命周期:解释器启动则创建,解释器关闭就销毁

  2.1.2 全局名称空间

    内置以及函数内的名字之外的名字都存放于全局名称空间中

      生命周期:运行顶级代码/主流水线则创建,顶级代码/主流水线结束则销毁

  2.1.3 局部名称空间

    函数内的名字

      生命周期:函数调用时则创建,函数调用完毕则立即销毁

2.2 名称空间名字的查找顺序

  基于当前所在的位置向上查找

    局部->外层套的局部->外层套的局部->....->全局->内置

  强调:名称空间的"嵌套关系"是函数定义阶段、也就是检测语法的时候就确定的,与调用为无关

2.3 作用域

  2.3.1 全局作用域

    内置名称空间、全局名称空间

      全局存活、全局有效

  2.3.2 局部作用域

    局部名称空间

      临时存活,局部有效

2.4 函数的参数传递都是值拷贝

  2.4.1 对全局定义的不可变类型,在函数内不能直接修改

    x = 10

    def func(a): # a=10的内存地址

      a = 123

    func(x) # x=10的内存地址

  2.4.2 对全局定义的可变类型,可以在函数内直接修改

    x = []

    def func(a): # a=列表的内存地址

  2.4.3 global可以在函数内修改全局的不可变类型

    x = 10

    def func():

      global x

      x = 666

  2.4.4 nonlocal可以修改外层的不可变类型

 

3.1 闭包函数

  闭:指的是定义函数内的函数

  包:指的内函数引用了外函数的变量

    def outter():

      def inner():

      return inner # 千万不要加括号

3.2 为函数体代码传参的方式有两种

  1.直接通过参数的方式传入

  2.通过闭包函数传参

    def outter(x):

      def func():

        print(x)

      return func # 一定不要加括号

    f1 = outter(1)

    f1()

posted @ 2020-06-17 18:09  最冷不过冬夜  阅读(129)  评论(0编辑  收藏  举报