6.3 函数参数的应用与可变长参数
6.3 函数参数的应用与可变长参数
6.3.1 函数参数的应用
- 函数分为两个阶段
- 定义阶段:定义阶段的x,y称为形参,形参应具有描述意义,不为具体数据类型。
- 调用阶段:调用阶段的x,y称为实参,实参必须有值,是具体的数据类型。
- 形参与实参关系:形参接收实参
def self_max(x,y): #形参
#参数无提示,应具有描述意义 例如num1,num2
if x > y:
return x
return y
self_max(10,20)
def guess_age(age): #缺点:每次都要传参,因此可以设置默认形参
inp_age=input()
if age==inp_age:
print('y')
else:
print('n')
guess_age(18)
- 形参(函数定义阶段)
-
默认形参:用于形参经常是同一个值的函数。值不需要改变,在定义阶段,提前赋值给形参;实参传值的时候,实参传的值会覆盖默认值,经常使用。
-
位置形参:按从左到右位置接收实参的形参。
-
位置先后顺序:默认形参必须在位置形参后面。
def guess_age(age=18): #设置默认形参
inp_age=int(input())
if age==inp_age:
print('y')
else:
print('n')
guess_age(20) #实参20被传入会覆盖默认形参age原来的值,age=20
# 默认形参必须在位置形参后面
def self_max(x,y,z=5): #x,y位置形参,z:默认形参
# or (x,y=5,z=10)√、(x=5,y,z=20)×
return x,y,z
print(self_max(10,1,3))
#输出:(10, 1, 3)
- 实参(函数调用阶段)
- 关键字实参
- 适用场景:适用于函数参数较多的情况,可以打乱位置,但关键字实参必须在位置实参后面。
- 运用方法:在函数调用阶段找到与形参的对应关系,并赋值给对应的形参
- 关键字实参名:形参名为什么,则关键字实参名也必须是什么
- 位置实参:传给形参,默认按照从左到右顺序。
- 位置先后顺序:关键字实参必须在位置实参后面。
def self_max(x,y):
if x>y:
return x
else:
return y
x=self_max(10,20) #位置实参,传参默认按照顺序
result=self_max(y=10,x=20) #关键字传参
print(result)
def self_max(x,y,z):
print(x,y,z)
self_max(10,10,z=3)# 关键字实参必须在位置实参后面
6.3.2 可变长参数
参数多时,使用关键字参数,但还是较麻烦。
- 可变长形参(函数定义阶段)
-
*args:在函数定义阶段,接收所有位置实参,不接收关键字实参。
-
**kwargs:在函数定义阶段,接收所有关键字实参,以字典形式保存下来。
-
命名规范:
- *a、**b 也是可以的
- 但 *args、**kwargs 是约定俗称的一种规范。
def self_max(*args): #*args接收所有位置参数
print(args,type(args))
self_max(1,2,3,5,6,8,8)
def self_max(*args,**kwargs): #**kwargs 接收所有关键字实参,以字典形式保存下来{'x':8,'y':20}
print(args,type(args))
print(kwargs,type(kwargs))
self_max(1,2,3,5,6,8,8,x=8,b=20)
- 可变长实参(函数调用阶段)
- *args:
- *把这个元组内的元素取出来,然后按位置对应传给位置形参。(这个过程也是解压缩的过程)
- 对默认参数也有效,取出的值可以覆盖默认参数。
- **kwargs:
- 会把字典打散成键值对的形式作为实参传给关键字形参。
def self_max(a,b,c,d,e,f):
print(a,b,c,d,e,f)
a=(1,2,3,4,5,6)
self_max(*a)
# self_max(*a)=self_max(1,2,3,4,5,6)
def self_max(a,b,c,d,e,f,g=1,h=3):
print(a,b,c,d,e,f,g,h)
a=(1,2,3,4,5,6)
b={'g':8,'h':9}
self_max(*a,**b)
# self_max(**b)相当于self_max(g=8,h=9)
# self_max(*a,**b):相当于self_max(1,2,3,4,5,6,g=8,h=9)
def self_max(a,b,c,d,e,f,g=1,h=3):
print(a,b,c,d,e,f,g,h)
a=(1,2,3,4,5,6,7)
self_max(*a) #对默认参数也有效,取出的值可以覆盖默认参数。
def self_max(*args,**kwargs): #能接收全部实参
print(args)
print(kwargs)
a=(1,2,3,4,5,6)
b={'g':8,'h':9}
self_max(*a,**b)