函数的使用分为定义阶段与调用阶段,定义函数时中只检测语法,不执行函数体代码,函数名加括号即函数的调用,只有调用函数时才会执行函数体代码
1.函数调用与返回值
return 是一个函数结束的标志,函数内可以有多个return,但只执行一次函数就结束了,并把return后定义
的值作为本次调用的结果返回
形参的顺序:位置形参,默认形参,args,命名关键字形参,**kwargs 实参的顺序与形参对应,顺序也是相同 位置>默认>>关键>**
1.1可变长度的位置参数
如果最后一个形参名前加*号,那么在调用函数时,溢出的位置实参,都会被接收,以元组的形式保存下来赋值组该形参。
def foo(x,y,z=1,*args):
print(x)
print(y)
print(z)
print(args)
foo(1,2,3,4,5,6,7,8)
1
2
3 #默认参数被赋值3
(4,5,6,7,8) #多余的位置实参4,5,6,7,8被*接收,赋值组args,得到args=(4,5,6,7,8)
1.2可变长度的关键字参数
如果在最后一个形参名前加**号,那么在调用函数时,溢出的关键字参数,都会被接收,以字典的形式保存下来赋值组该形参。
def foo(x,**kwargs):
print(x)
print(kwargs)
foo(y=2,x=1,z=3)
1
{'z':3,'y':2}
- 可以用在实参中,实参中带*,先将*后的值打散成位置实参
def func(x,y,z):
print(x,y,z)
func(*[11,22,33]) #打散成 func(11,22,33)
>>>11 22 33
- 可以用在实参中(后跟的只能是字典),实参中带,先将后的内容打散成关键字实参
def func(x,y,z):
print(x,y,z)
func(**{'x':1,'y':2,'z':3}) #这里会先将**后的字典打散成关键字实参,这里打散成的关键字实参必须与形参中的个数相同,多一个不行,少一个也不行
1 2 3
- 和 **都可以放在形参中,也可以放在实参中,在混用的时候,args必须在**kwargs之前
def func(*args,**kwargs): #*args对应的实参中的位置实参,**kwargs对应实参中的关键字参实参
print(args)
print(kwargs)
func(1,2,3,4,5,x=1,y=2,z=3)