位置参数
位置形参:指的是定义函数时括号定义的参数,即变量名
在定义函数时,按照从左到右的顺序依次定义的参数,称为位置形参
特性:位置形参必须被传值,多一个不行少一个也不行
位置实参:指的是在调用函数时括号内传入的值,即变量名
在调用函数时,按照从左往右的顺序依次传入的值,称为位置实参
特点:与形参一一对应,顺序乱了,实参赋值也会乱
'''在调用函数时,实参的值会传给形参,这就是一个变量的赋值操作'''
默认形参和关键字实参
-
默认参数(形参):在定义函数时,就可以被赋值的参数,称为默认形参
- 在定义阶段已经被赋值,意味着在调用阶段就可以不用传值
- 默认参数必须跟在位置形参的后面,否则就会报错
- 默认参数的值只在定义阶段被赋值一次就固定死了,定义之后改变没有影响
- 默认参数的值应该设置成不可变类型
(1)、在定义阶段已经被赋值,意味着在调用阶段就可以不用传值
def foo(x,y,z=3):
print(x,y,z)
foo(1,2)
#返回值
1 2 3
(2)、默认形参跟在位置形参的前面,报错
ef foo(y=1,x):
pass
#报错
SyntaxError: non-default argument follows default argument
(3)、默认参数的值只在定义阶段被赋值一次就固定死了,定义之后改变没有影响
m=10
def func(x,y=m):
print(x)
print(y)
m=1111111
func(1)
#返回值
1
10
(4)、默认参数的值应该设置成不可变类型
#这种方式列表的值每次都会发生不可预料的变化,不建议这么做
def func(name,hobby,l=[]):
l.append(hobby)
print(name,l)
func('egon','read')
func('alex','play')
#返回值
egon ['read']
alex ['read', 'play']
#正确姿势
def func(name,hobby,l=None):
if l is None:
l=[]
l.append(hobby)
print(name,l)
func('egon','read')
func('alex','play')
#返回值
egon ['read']
alex ['play']
- 关键字实参:在调用函数时,按照key=value的形式定义的实参,称为关键字实参
特点:可以完全打乱顺序,但仍然能指名道姓的为指定的参数传值
def foo(x,y,z):
print(x,y,z)
foo(x=1,y=2,z=3)
#返回值
1 2 3
可变长参数
可变长参数:指的是在调用函数时,传入的参数个数可以不固定
调用函数时,传值的方式无非两种,一种是位置实参,另一种是关键字实参,因此形参也必须得有两种解决方法,以此来分别接收溢出来的位置实参(*)与关键字实参(**)
形参之*
形参中的会溢出来的位置实参全部接收,然后存储元组的形式,然后把元组赋值给后的参数。需要注意的是:*后的参数名约定俗称成为args。
def sum_self(*args):
res = 0
for num in args:
res += num
return res
res = sum_self(1, 2, 3, 4)
print(res)
10
形参之**
形参中的会将溢出的关键字形参全部接收,然后存储字典的形式,然后把字典赋值给后的参数。需要注意的是:**后的参数名约定俗称为kwargs。
def func(**kwargw):
print(kwargw)
func(a=5)
{'a': 5}
实参之*
实参中的*,会将后产生的值循环取出,打散成位置实参。以后但凡碰到实参中带 *的,它就是位置实参,应该马上打散成位置实参去看。
def func(x, y, z, *args):
print(x, y, z, args)
func(1, *(1, 2), 3, 4)
1 1 2 (3, 4)
1
2
3
4
5
6
实参之**
实参中的**,会将后参数的值循环取出,打散成关键字实参。以后但凡碰到实参中带 * *的,它就是关键字实参,应该马上打散成关键字实参去看。
def func(x, y, z, **kwargs):
print(x, y, z, kwargs)
func(1, 3, 4, **{'a': 1, 'b': 2})
1 3 4 {'a': 1, 'b': 2}
名称空间
名称空间就是用来存储变量名与数据值绑定关系的地方(我们也可以简单的理解为就是存储变量名的地方)
名称空间 | 存放名字 | 存货周期 |
---|---|---|
内置名称空间 | 存放的是python解释器内置的名字 | python解释器启动后产生,关闭后回收 |
全局名称空间 | 不是函数内定义,也不是内置的,剩下的都是全局名称空间的名字 | 执行python文件时产生,python文件运行完成后回收 |
局部名称空间 | 在调用函数时,运行函数体代码的过程中生产的函数内的名字 | 在调用函数时生产,在函数用完毕后回收 |
名字查找顺序
涉及到名字查找,要搞清楚自己在哪个空间
-
当我们在局部名称空间中的时候
局部名称空间 >>> 全局名称空间 >>> 内置名称空间
-
当我们在全局名称空间中的时候
全局名称空间 >>> 内置名称空间