七天学会Python基础-第五天1/2-函数的传参

  1. 形参角度:

    1. 万能参数:*args,**kwargs

      • 在前期写函数的时候可能用到的参数较少,到后期需要扩展,此时就需要一种形参,可以接受所有的实参,万能参数

        def eat(*args):
            print(f"我请你吃{args}")
        eat('蒸羊羔','蒸熊掌','蒸鹿邑','烧花鸭','烧雏鸡','烧子鹅')
        
    2. *的魔性用法

      1. 在函数定义的时候,*代表(聚合)

        • *args,约定俗成:args,接受的是位置参数。
        • 函数定义时,*代表聚合。他将所有的位置参数聚合成一个元组中,赋值给args
        • **kwargs,约定俗成,接受的是关键字参数。
        • 函数定义时,**将所有关键字参数聚合到一个字典中,将这个字典赋值给了kwargs
      2. 在函数执行的时候,*代表打散

        • 在函数的调用时,*代表打散元组列表(像拆包)然后传给✳args,在可迭代对象前面加上✳即可

        • def eat(*args):
              print(f"我请你吃{args}")
          eat(*['蒸羊羔','蒸熊掌','蒸鹿邑'],*['烧花鸭','烧雏鸡','烧子鹅'])
          # 效果等同于
          eat('蒸羊羔','蒸熊掌','蒸鹿邑','烧花鸭','烧雏鸡','烧子鹅')
          
        • 在函数的调用时,**代表打散字典(像拆包)然后传给✳✳kwargs,在可迭代对象前面加上✳即可

    3. 仅限关键字参数(只能接受关键字参数3.4后出现)(了解)

      • 形参角度的第四个参数,位于默认值参数和**kwargs之间
    4. 形参的最终顺序

      • 位置参数--*args--关键字参数--仅限关键字参数(可以和关键字参数互换)--**kwargs
  2. 名称空间(命名空间)角度

    1. 概念
      • 在Python解释器开始执行之后,就会在内存中开辟一个空间,每当遇到一个变量的时候就把变量名和值之间的关系记录下来,但是当遇到函数定义的时候,解释器只是把函数名读入内存,表示这个函数存在了,值与函数内部的变量和逻辑,解释器是不关心的,也就是说一开始的时候函数只是加载进来,仅此而已,只有当函数被调用和访问的时候解释器才会根据函数内部声明的变量来进行开辟变量的内部空间。随着函数执行完毕,这些函数内部变量占用的空间也会随着函数执行完毕而清空。
      • 等执行到函数调用的时候,Python解释器会再开辟一块内存来储存这个函数里面的内容,这个时候才关注函数里面有内些变量,而函数中的变量会存储在新开辟的内存中,函数中的变量只能在函数内部使用,并且会随着函数执行完毕,这块内存中的所有内容也会被清空
      • 我们给这个‘存放名字与值的关系’的空间起了一个名字----命名空间
      • 代码在运行初始,创建的存储‘变量名与值的关系’的空间叫做全局命名空间;
      • 在函数的运行中开辟的临时的空间叫做局部命名空间,也叫做临时名称空间
    2. 命名空间分类
      1. 全局名称空间(当前py文件):
        • 记录的是一个py文件中变量名与值,函数名与函数体的对应关系
      2. 局部名称空间(函数,函数执行时才开始):
        • 调用函数时,函数体里面定义变量,会随着函数的结束而消失。
      3. 内置名称空间(builtins.py)
        • python源码会给我们提供一些内置的函数,如print,input
    3. 加载顺序,取值顺序
      • 加载顺序:内置名称空间----全局名称空间----局部名称空间
      • 取值顺序(LEGB原则):就近原则(单向不可逆),(从局部执行时)--局部名称空间----全局名称空间----内置名称空间
    4. 作用域
      1. 全局作用域:内置名称空间 全局名称空间
        1. 全局作用域不可以引用局部变量
      2. 局部作用域:局部名称空间,
        1. 局部作用域可以引用全部变量,但不能改变,(同样在嵌套函数中(高阶函数),局部作用域可以引用上一层名称空间,同样不能改变)
          • 当Python解释器读取到局部作用域时,发现了你对一个变量进行修改的操作。解释器会认为你在局部已经定义过这个局部变量了,他就从局部找这个局部变量,然后就找不到-报错
  3. 函数的嵌套(高阶函数)

    1. 记住函数需要调用才会执行
    2. 明白执行顺序即可
  4. 内置函数:globals() locals()

    • print(globals()),返回的是字典:字典里面的键值对:全局作用域的所有内容
    • print(locals()),返回的是字典:字典里面的键值对:当前作用域的所有内容
posted @ 2021-05-19 21:01  double大博  阅读(100)  评论(0)    收藏  举报