形参与实参介绍
"""
函数的参数分为形式参数和实际参数,简称形参和实参:
形参即在定义函数时,括号内声明的参数。形参本质就是一个变量名,用来接收外部传来的值。
实参即在调用函数时,括号内传入的值,值可以是常量、变量、表达式或三者的组合。
"""
"""
# 形参(在定义阶段使用的参数):
例如
def fun(x,y): # x,y都是形参
print(x,y)
# 实参(在调用阶段使用的参数)
例如:
func(1,2) # 1,2都是实参
# 形参与实参的关系:
1,在调用阶段,实参(变量值)会绑定给形参(变量名)
2,这种绑定关系只能在函数体内使用
3,实参与形参的绑定关系在函数调用时生效,函数调用结束后解除绑定关系。
# 函数的类型
1,实参可以是常量:
func(1,2)
2,实参可以是变量:
a = 1
b = 2
func(a,b)
3,实参也可以是常量、变量、表达式的任意组合:
func()
"""
形参与实参的具体使用
"""
1,位置参数:
按照从左到右的顺序依次定义参数,在函数定义阶段,按照从左到右的顺序直接定义“变量名”。
特点:按照顺序与形参一一对应,而且必须被传值,多一个不行,少一个也不信不行。
例如:
def func(name,age,height): # 定义位置形参:name,age,height,三者都必须被传值
print('name:%s age:%s height:%s' %(name,age,height))
func('zyl','18','180')
2,关键字参数:在函数的调用阶段,按照key=value的形式传入的参数,称为关键字参数,凡是按照这种形式定义的实参,可以完全不按照从左到右的顺序定义,但仍能为指定的形参赋值。
特点:可以不按照顺序传,实参不再受形参的顺序限制。
例如:
def func(name,age,height):
print('name:%s age:%s height:%s' %(name,age,height))
func(age="18",name='zyl',height='180')
注意:在调用函数时,实参也可以是按照位置或关键字的混合使用,但必须保证关键字参数在位置参数后面,且不可以对一个形参重复赋值
例如:
def func(name,age,height):
print('name:%s age:%s height:%s' %(name,age,height))
func('zyl',height='180',age='18')
3,默认参数:
在函数的定义阶段,就已经被赋值了的参数,称之为默认参数。
特点:因为在定义阶段就已经被赋值了,所以在调用阶段可以不为其赋值。
例如:
def func(name,age,height='180'):
def func(name,age,height='180'):
print(name,age,height)
func('zyl',18)
func('wyy',16)
func('佩奇',5,'150' )
运行结果:
zyl 18 180
wyy 16 180
佩奇 5 150
注意:默认参数必须在位置参数之后,默认参数的值仅在函数定义阶段被赋值一次,默认参数的值通常设为不可变类型。
"""
可变长度的参数(*与**的用法)
"""
1,基于元组的可变参数(*可变参数)
*可变参数在函数中被组装成一个元组。
用来接收溢出的位置实参,溢出的位置会被*保存为元组的形式,然后赋值给*后面的形参名,*后可以跟任意名字,但是约定成俗使用args。
例如:
def sum(*args):
digital = 0
for number in args:
digital += number
return digital
print(sum(10,20))
print(sum(10,20,30))
运行结果:
30
60
混合使用:
def sum(x,y,*z):
print(x,y,z)
sum(1,2,3,4,5,6)
运行结果:
1 2 (3, 4, 5, 6)
# *的实参使用:
实参中带*的,先*后的值会被打散成位置实参。
例如:
def sum(x,y,z):
print(x,y,z)
sum(*(11,22,33))
l = (11,22,33)
sum(*l)
运行结果:
11 22 33
11 22 33
*在实参和形参中混合使用
例如:
def sum(x,y,*args):
print(x,y,args)
sum(1,2,3,4,5,6)
sum(*"hello")
运行结果:
1 2 (3, 4, 5, 6)
h e ('l', 'l', 'o')
"""
2,基于字典的可变参数(**可变参数)
**的形参名:用来接收溢出的关键字实参,**会将溢出的关键字保存成字典格式,然后赋值给紧跟其后的形参名,**后面的可以是任意名字,但是约定成俗应该是kwargs。
**用在实参中,(**后只能跟字典),实参中带**会被打散成关键字实参的形式。
# 例如:
def sum(x,**kwargs):
print(x,kwargs)
sum(1,name='zyl',age='18')
运行结果:
1 {'name': 'zyl', 'age': '18'}
# 例如:
def sum(x,y,z):
print(x,y,z)
sum(*{'x':1,'y':2,'z':3})
sum(**{'x':1,'y':2,'z':3})
运行结果
x y z
1 2 3
# **的混合使用(实参与形参)
例如:
def sum(x,y,**kwargs):
print(x,y,kwargs)
sum(y=222,x=111,a=333,b=444)
sum(**{'y':222,'x':111,'a':333,'b':4444})
运行结果:
111 222 {'a': 333, 'b': 444}
111 222 {'a': 333, 'b': 4444}
# *与**的混合使用
*args必须在**kwargs之前
例如:def sum(*args,**kwargs):
print(args,kwargs)
sum(1,2,3,4,5,6,x=1,y=2,z=3)
运行结果:
(1, 2, 3, 4, 5, 6) {'x': 1, 'y': 2, 'z': 3}
命名关键字参数
"""
在定义了**kwargs参数后,函数调用者就可以传入任意的关键字参数key=value,如果函数体代码的执行需要依赖某个key,必须在函数内进行判断。
例如:
def register(name,age,**kwargs):
if 'sex' in kwargs:
# 有sex参数
pass
if 'height' in kwargs:
# 有height参数
pass
# 想要限定函数的调用者必须以key=value的形式传值,需要在定义形参时,用作为一个分隔符号,符号之后的形参称为命名关键字参数。对于这类参数,在函数调用时,必须按照key=value的形式为其传值,且必须被传值。
例如:
def func(x,y,*,a,b): # 其中a,b称之为命名关键字参数
print(x,y)
print(a,b)
func(1,2,b=111,a=222)
# 组合使用
1,综上所述,所有参数可任意组合使用,但定义顺序必须是:位置参数、默认参数、*args、命名关键字参数、**kwargs。
2,*args,**kwargs通常一起使用。
"""
© 著作权归作者所有
举报
发表评论
0/200