前方高能-函数的进阶

一. 函数参数--动态传参

  如果我们需要给一个函数传参, 但是参数又是不确定的, 或者我给一个函数传很多参数, 那么形参就要写很多, 很麻烦, 这时就可以用到动态参数.

  形参的第三种: 动态参数

  动态参数分为两种:

  1. 动态接收位置参数

  在参数位置编写 * 表示接收任意内容

  

  动态接收参数的时候要注意, 动态参数必须在位置参数的后面.

  

  这时程序运行就会报错, 因为前面传递进去的所有位置参数都被*food接收了, a和b永远接收不到参数.

  2. 动态接收关键字参数

  在python中*args只能接胡搜位置参数无法接收关键字参数, 所以要使用**kwargs 来接收动态关键字参数.

  

  顺序的问题, 在函数调用的时候, 如果先给出关键字参数, 则整个参数列表会报错.

  那么我们的传参顺序是:

    位置参数, *args, 默认值参数, **kwargs

  如果想接收所有的参数:

  

  这个俗称无敌模式.

  动态参数的另一种传参方式:

  

  在实参位置上给一个序列, 列表, 可迭代对象前面加个*表示吧这个序列打散.

  如果是一个字典, 也可以打散, 但是需要用两个**

  

二. 命名空间

  1. 命名空间分类:

    1. 内置命名空间:  存放python解释器为我们提供的名字, list, tuple, str, int这些都是内置命名空间

    2. 全局命名空间: 我们直接在py文件中, 函数外声明的变量都属于全局命名空间

    3. 局部命名空间: 在函数中声明的变量会放在局部命名空间

  加载顺序:

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

  取值顺序:

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

  2. 作用域: 作用域就是作用范围, 按照生效范围来看分为 全局作用域和局部作用域

    全局作用域: 内置 + 全局

    局部作用域: 局部

  3. 我们可以通过globals()函数来查看全局作用域中的内容, 也可以通过locals()来查看局部作用域中的变量和函数信息

    globals() 查看全局作用域中的内容

     locals()  查看当前作用域中的内容

三. 函数的嵌套

  

四. 关键字global和nonlocal

  global表示. 不再使用局部作用域中的内容了. 而改用全局作用域中的变量

  

  nonlocal 表示在局部作用域中, 引入离他最近的那一层的变量.

  

  

  再看, 如果嵌套了很多层, 会是一种什么效果:

  

  这样的程序如果能分析明白, 那么作用域, global和nonlocal就没有问题了.

 

posted on 2018-09-14 15:44  噬心人  阅读(100)  评论(0编辑  收藏  举报