对函数的进一步了解

  1. 函数的参数

    • 形参角度:

      1. 动态参数

        当给函数传入的参数数目不定时,之前的传参方式解决不了问题.

        def chi(*args):   # 定义一个函数的时候,* 将实参角度所有的位置参数聚合到一个元组中.
            print('我请你吃:', args)
        chi('蒸羊羔', '蒸熊掌', '蒸鹿尾')
        
        def func(**kwargs): # 函数定义时,**将实参的所有的关键字参数聚合成了一个字典给了kwagrs
            print(kwargs)
        func(name='小明', age='18', hobby='唱跳rap篮球')
        
        def func(*args, **kwargs): # 万能参数
            print(args, kwargs)
        
      2. 形参的顺序:

        • 位置参数 => *args => 默认值参数 => **kwargs

        • 仅限关键字参数:

          在 *args 和 **kwargs 中间

  2. *的魔法用法

    def func(*args, **kwargs):
        print(args)
        print(kwargs)
    l1 = [1, 2, 3]
    l2 = ['小明', '小红', '小丽']
    dic = {'k1': 'v1', 'k2': 'v2'}
    func(*l1, *l2)  # 函数的执行时: * 代表打散
    func(**dic)     # 函数的执行时: ** 代表打散 (key不能是int型)
    
    函数外:
    a, b, *c = [1, 2, 3, 4, 5, 6] # 处理剩余元素,列表形式
    print(a, b, c)
    
  3. 命名空间与作用域

    1. 命名空间:

      • 全局命名空间:我们直接在py文件中,函数外声明的变量
      • 内置命名空间:python最开始会开辟一个自己的命名空间 -- 内置命名空间
      • 局部命名空间:函数内部声明的变量
      • 加载顺序: 内置命名空间 => 全局命名空间 => 局部命名空间
      • 取值顺序: 局部命名空间 => 全局命名空间 => 内置命名空间
    2. 作用域:

      • 作用域: 变量或函数的声明周期

      • 全局作用域: 内置命名空间 全局命名空间

      • 局部作用域: 局部命名空间

        globals() # 查看全局作用域中的内容
        locals()  # 查看的是当前作用域中的内容
        
  4. 函数的嵌套

    # 函数可以互相嵌套:
    def outer():
        def inner():
            print('我是内部')
        print('我是外部')
        inner()
    outer()
    
  5. 拓展

    • global
      • 在局部作用域中可以更改全局作用域的变量(限于字符串,数字)
      • 利用global在局部作用域也可以声明一个全局变量
    • nonlocal
      • 不能更改全局变量
      • 在局部作用域中,对父级作用域(或者更外层作用域非全局作用域)的变量进行引用和修改,并且引用的哪层,从那层及以下此变量全部发生改变。
原文地址:https://www.cnblogs.com/zyyhxbs/p/11045732.html