函数的参数和名称空间
函数参数的两大分类
- 形式参数
函数定义阶段,在括号内填写的参数简称为“形参”
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、局部名称空间
随着函数体代码的执行和结束而创建和销毁
名字的查找顺序
在查找名字的时候,首先要确定自己当前的位置在哪
- 如果你在局部
局部>>>全局>>>内置 - 如果你在全局
全局>>>内置
局部名称空间的嵌套
函数在定义阶段,名字的查找顺序就已经固定死了(特例)
名称空间的作用域
- 作用域
名称空间所能够作用的范围 - 内置名称空间
程序任何阶段任何位置均可使用(全局有效) - 全局名称空间
程序任何阶段任何位置均可使用(全局有效) - 局部名称空间
一般情况下只在各自的局部名称空间中有效