函数的参数和名称空间


函数参数的两大分类

  • 形式参数
    函数定义阶段,在括号内填写的参数简称为“形参”
    eg:def qwer(a,b):
    中的a和b就是函数qwer的形参
  • 实际参数
    函数调用阶段,括号内传入的参数简称“实参”
    qwer(1,2)
    1和2就是函数qwer的实参
  • 形参与实参的关系
    1、我们可以将形参看成是变量名,实参看成是变量值,两者在函数调用阶段临时绑定,函数运行结束断开。
    2、形参的表现形式只有一种---变量名
    3、实参的表现形式有很多种(但是把握核心:就是数据值)

位置参数

  • 定义
    按照从左往右的顺序依次填入的参数
  • 位置形参
    在函数定义阶段的括号内,按照从左往右的顺序依次填入的变量名
  • 位置实参
    在函数调用阶段的括号内,按照从左往右的顺序依次填入的数据值
    定义一个可以比较大小的函数(传入两个值 返回较大的)
  • 关键字实参(可以打破位置顺序)
    在函数调用阶段通过(形参名=数据值)的形式指名道姓的传值
  • 重点
    1、位置形参与位置实参在函数调用阶段,按照位置一一对应绑定
    2、位置参数在绑定的时候多一个不行少一个也不行
    3、格式越简单的越靠前 格式越复杂的越靠后

默认参数

  • 默认形参
    函数在定义阶段就可以给形参赋值了
    1、该形参在函数调用阶段如果不给值,则使用默认的
    2、该形参在函数调用阶段也可以继续给值,则使用你给的值
  • 重点
    位置形参与默认值形参在定义的时候,位置形参必须在默认值形参前面

可变长参数

1、函数无论传入多少位置参数都可以正常运行

  • 可变长形参
    def qwer(x,y,*a)
    print(x,y,a)
    qwer() # ()
    qwer(1) # (1,)
    qwer(1, 2, 3, 4, 5, 6, 7) # (1, 2, 3, 4, 5, 6, 7)
  • 重点
    在形参中的使用:用于接收多余的位置参数,并组织成元祖的形式赋值给号后面的变量名

2、函数无论传入多少关键字参数都可以正常运行
def qwer(x,y,**a)
print(x,y,b)
qwer() # {}
qwer(a=1,b=2,c=3,d=4) # {'a':1,'b':2,'c':3,'d':4}
qwer(x=1,y=2) # 1 2 {}

  • 重点
    **在形参中的使用:
    用于接收多余的关键字参数,并组织成字典的形式赋值给双*号后面的变量名

3、定义一个函数无论传入多少个位置参数和关键字都可以正常运行
def qwer(*a,**b):
print(a,b)
qwer() # (){}
qwer(1,2,3,4) # (1, 2, 3, 4) {}
qwer(a=1,b=2,c=3) # () {'a': 1, 'b': 2, 'c': 3}
qwer(1,2,3,4,a=1,b=2,c=3) # (1, 2, 3, 4) {'a': 1, 'b': 2, 'c': 3}

  • 重点
    可变长形参 与**后面的变量名其实是可以随便定义的,但在python中推荐使用(args,kwargs)
    def index(a, b, c):
    print(a,b,c)
    new_list = [11,22,33]
    index(new_list) # 肯定不行 列表是一个整体 相当于一个实参
    index(new_list[0],new_list[1],new_list[2]) # 可以
    如果index形参是*args 列表里面有很多元素 如何实现按照位置一一传入
    def index1(args):
    print(args)
    new_list1 = [11,22,33,44,55,66,77,88,99]
    index1(
    new_list1) # index1(11,22,33,44,55,66,77,88,99)
    号在实参中的使用,会将列表、元组内的元素打散成位置参数的形式一一传值
    def index2(
    kwargs):
    print(kwargs)
    new_dict = {'username':'jason','pwd':123}
    index2(
    *new_dict) # index2(username='jason',pwd=123)# {'username': 'jason', 'pwd': 123}
    **号在实参中的使用,会将字典内的键值对打散成关键字参数传入

名称空间

  • 什么是名称空间(namespaces)
    用于存放变量名与变量值绑定关系的地方(类似于民政局)
  • 名称空间的分类(重要)
    1、内置名称空间
    是python解释器提前定义好的,可直接使用
    2、全局名称空间
    在py文件中顶格编写的代码运行之后都会存入全局名称空间,循环包括内含的子代码。
    3、局部名称空间
    函数体代码运行之后产生的都在局部名称空间

存活周期

1、内置名称空间
随着python解释器启动与关闭而创建和销毁
2、全局名称空间
随着py文件的运行和结束而创建和销毁
3、局部名称空间
随着函数体代码的执行和结束而创建和销毁

名字的查找顺序

在查找名字的时候,首先要确定自己当前的位置在哪

  • 如果你在局部
    局部>>>全局>>>内置
  • 如果你在全局
    全局>>>内置

局部名称空间的嵌套
函数在定义阶段,名字的查找顺序就已经固定死了(特例)

名称空间的作用域

  • 作用域
    名称空间所能够作用的范围
  • 内置名称空间
    程序任何阶段任何位置均可使用(全局有效)
  • 全局名称空间
    程序任何阶段任何位置均可使用(全局有效)
  • 局部名称空间
    一般情况下只在各自的局部名称空间中有效
py