Python函数进阶
一.函数两大分类
1.1 形式参数
在函数定义阶段括号内所填写的参数,简称“形参”
def test(a,b):
pass
# a和b两个参数就是test的形参
1.2 实际参数
在参数调用阶段括号内传入的参数,简称“实参”
1 def test2(x,y): 2 pass 3 # x,y就是test1的实参
1.3 形参与实参的关系
我们可以将形参看成是变量名,实参看成是变量值,两者在函数调用阶段临时绑定,函数运行结束断开。实参的表现形式只有一种就是变量名,实参的表现形式有很多种,实参核心其实就是数据值。
二.位置参数
2.1 定义
位置参数按照从左往右的顺序依次填入的参数
2.2 分类
位置形参:在函数定义阶段括号内按照从左往右的顺序依次填入的变量名
位置实参:在函数调用阶段括号内按照从左往右的顺序依次传入的数据值
操作注意事项
1.位置形参与位置实参在函数调用阶段,按照位置一一对应绑定
2.位置实参在绑定的时候多一个少一个都不可以
3.格式越简单的越靠前,格式越复杂的越靠后
三.默认参数
3.1 定义
默认形参:函数在定义阶段就可以给形参赋值了
1.该形参在函数调用阶段如果不给值,则使用默认的
2.该形参在函数调用阶段也可以继续给值,则使用你给的
1 # 定义学员注册功能 2 def register(name, age, gender='male'): 3 print('%s:%s:%s' % (name, age, gender)) 4 5 6 register('jason', 18, 'male') # jason:18:male
位置形参与默认形参在定义的时候,位置形参必须在默认形参的前面
越简单的越靠前,格式越复杂的越靠后
四.可变长参数
4.1 函数无论传入多少位置参数都可以正常运行
可变长参数
1 def test2(x, y, *a): 2 print(x, y, a) 3 test2(13, 25, 45, 67, 43, 21) # 13 25 (45, 67, 43, 21) 4 test2(13, 14) # 13 14 ()
*号用来接收多于位置的参数,并组织成元组的形式赋值给*后面的变量名
4.2 函数无论传入多少关键字参数都可以正常运行
**号在形参中的使用
用于接收多余的关键字参数,并组织成字典的形式赋值**好后面的变量名
1 def test3(x,y,**b): 2 print(x,y,b) 3 test3(x=23,y=2,) 4 test3(x=24,y=26,a=1234)
4.3 定义一个函数无论传入多少位置参数和关键字参数都可以正常运行
可变长形参,*与**后面的变量名其实是可以随便定义的
1 def test4(*a, **b): 2 print(a, b) 3 4 5 test4(3, 5) 6 test4(0) 7 test4(1, 2, 3) 8 test4(1, 2, 3, 4) 9 test4(1, 2, 3, 4, a=1, b=2, c=3, d=4)
如果test4形参是*args,列表里面有很多元素,如何实现按照位置一一传值
会将列表,元组内的元素打散成参数的形式一一传值
1 def test4(a, b, c): 2 print(a, b, c) 3 4 5 new_list = [1, 2, 3] 6 old_tuple = (1, 2, 3) 7 test4(new_list[0], new_list[1], new_list[2]) 8 test4(*new_list) 9 test4(*old_tuple)
五.名称空间
5.1 什么是名称空间
用于存放变量名与变量值绑定关系的地方
5.2 名称空间的分类
1.内置名称空间
Python解释器提前给你定义好的,例如print(),len()
2.全局名称空间
在py文件中顶格编写的代码运行性之后都会存入全局名称空间
name = 'jason' # name全局 def func(): # func全局 pass if 1: a = 123 # a全局 for i in range(10): print(i) # i全局 while True: a = 123 # a全局
3.局部名称空间
函数体代码运行之后产生的都是局部名称空间
六.名字的查找顺序
6.1 在查找名字的时候 要先确定自己当前在哪
1.如果你在局部
局部>>>全局>>>内置
2.如果你在全局
全局>>>内置
6.2 函数的定义阶段名字的查找顺序
函数在定义阶段名字的查找顺序就已经固定死了(特例)