Python函数的参数与名称空间
Python函数的参数与名称空间
- 函数参数的两大分类
- 位置参数与关键字参数
- 默认参数
- 可变长参数(重点)
- 其他函数参数补充(了解)
- 名称空间的概念
一、函数参数的两大分类
1. 形式参数
在函数定义阶段括号内所填写的参数,简称“形参”
def func(a, b): # a和b就是函数func的形参 pass
2. 实际参数
在函数调用阶段括号内传入的参数,简称“实参”
func(1, 2) # 数据1和2就是函数func的实参
3. 形参与实参的关系
我们可以将形参看成是变量名,实参看成是变量值。
两者在函数调用阶段临时绑定,函数运行结束时断开。
4. 形参与实参的表现形式
形参的表现形式只有一种,就是变量名
实参的表现形式有很多种(但是把握核心,就是数据值)
二、位置参数
位置参数是按照从左往右的顺序依次填入的参数
1. 位置形参
在函数定义阶段括号内按照从左往右的顺序依次填入的变量名
def func(a, b, c): pass
2. 位置实参
在函数调用阶段括号内按照从左往右的顺序依次填入的数据值
func(a=111, b=222, c=333)
3.位置参数的注意点
位置形参与位置实参在函数调用阶段按照位置一一对应绑定
位置参数在绑定的时候多一个少一个都不行
def func(a, b, c): print(a, b, c) func(a=111, b=222, c=333)
三、关键字参数
1. 关键字参数的使用
在函数调用阶段通过形参名 = 数据值的形式指名道姓的传值
def func(name, age): print(name, age) func(age=20, name='aaa')
关键字参数可以打破位置顺序
2. 关键字参数与位置参数的连用
在调用函数阶段,位置实参和关键字实参可以混合使用,但必须保证关键字参数在位置参数的后面
def func(name, age): print(name, age) func('aaa', age=20)
格式越简单的越靠前,格式越复杂的越靠后
四、默认参数
1. 默认形参
函数在定义阶段就可以给形参赋值了
1) 该形参在函数调用阶段如果不给值,则使用默认参数
2) 该形参在函数调用阶段如果给了值,则使用新给的参数
def register(name, age, gender='male'): print('%s:%s:%s' % (name, age, gender)) register('jason', 18) register('tony', 28) register('kevin', 38) register('lili', 18, 'female') register('lili', 18, gender='female')
位置形参与默认值形参在定义的时候,位置形参必须在默认值形参前面
遵循“格式越简单越靠前,格式越复杂越靠后”
五、可变长参数
1. 可变长位置参数
函数无论传入多少位置参数都可以正常运行
def func(a, b, *c): print(a, b, c) func(1, 2, 3, 4, 5, 6, 7)
*在形参中,用于接收多余位置的参数,并组织成元组的形式赋值给*后面的变量名
2. 可变长关键字参数
函数无论传入多少关键字参数都可以正常运行
def index(x, y, **b): print(x, y, b) index(y=2, x=1, u=222, k=111, l=444) # 1 2 {'u': 222, 'k': 111, 'l': 444}
**在形参中,用于接收多余的关键字参数,并组织成字典的形式赋值给**后面的变量名
3. 组合使用
定义一个函数无论传入多少位置参数和关键字参数都可以正常运行
def index(*a,**b): print(a,b) index() # () {} index(1,2,3,4) # (1, 2, 3, 4) {} index(a=1,b=2,c=3) # () {'a': 1, 'b': 2, 'c': 3} index(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(*args, **kwargs): pass
4. *在实参中使用
会将列表、元组内的元素打散成位置参数的形式一一传入
def index(*args): print(args) list1 = [11, 22, 33, 44, 55, 66, 77, 88, 99] index(*list1)
5. **在实参中使用
会将字典内的键值对打散成关键字参数传入
def index(**kwargs): print(kwargs) dict1 = {'name': 'aaa', 'pwd': 123} index(**dict1)
六、函数参数补充(了解)
1. 命名关键字参数
def register(name, age, *, sex, height): pass register('aaa', 20, 'male', 180) # 错误示范 register('bbb', 22, sex='male', height=180) # 正确使用 # sex和height在传入实参的时候必须以关键字参数的形式传入
该类型的参数几乎不用,也几乎很少能碰到
七、名称空间
1. 什么是名称空间(namespaces)
用于存放变量名与变量值绑定关系的地方
2. 名称空间的分类(重要)
1) 内置名称空间
python解释器提前给你定义好的,如:
print() len() ...
python解释器运行产生,关闭销毁。
2) 全局名称空间
在py文件中顶格编写的代码运行之后都会存入全局名称空间
name = 'aaa' # name全局 def func(): # func全局 pass if 1: a = 111 # a全局 for i in range(10): # i全局 print(i)
py文件运行产生,结束销毁
3) 局部名称空间
函数体代码运行之后产生的都是局部名称空间
def func() b = 'bbb' # b存入局部名称空间
八、变量名的查找顺序
1. 在查找变量名的时候,要先确定自己当前在哪
1) 在局部
局部 >>> 全局 >>> 内置
2) 在全局
全局 >>> 内置
2. 局部名称空间的嵌套
函数在定义阶段名字的查找顺序就已经固定死了(特殊)
x = 111 def f1(): x = 222 def f2(): x = 333 def f3(): x = 444 def f4(): x = 555 print(x) # x = 555 特殊 f4() f3() f2() # 通过调用f1 执行所有的函数 f1()
当x = 555在print(x)后面时会报错