python函数的参数传递
传递方式:
位置传参
序列传参
关键字传参
位置传参:
实际调用参数(实参)的对应关系与形式参数(形参)的对应关系是按照位置来依次对应的
示例 :
def fx(a,b,c):
pass
fx(1,2,3)
序列传参:
序列传参是指在函数调用的过程中,用*将序列拆解后按顺序位置进行传递的传参方式
实参和形式通过序列传递和匹配
示例:
def fx(a,b,c):
print("a=",a)
print("b=",b)
print("c=",c)
s1=[11,22,33]
fx(*s1) # 一个星号后跟一个序列 将s1序列拆解后按位置传入fx
fx(*"abc")
fx(*(1,2,3))
关键字传参:
是指传参时,按着形参的名称给形参赋值
是参合形参按名称机型匹配
示例:
def fx(a,b,c):
pass
fx(b=22,c=33,a=11) # 11 ->a 22 ->b 33 ->c
注意:
实参和形参按形参名进行匹配,可以不按位置进行匹配
字典关键字传参:
实参为字典,用**拆解字典后在进行关键字传参
示例:
def fx(a,b,c):
pass
d={"c":33,"b":22,"a":11}
fx(**d) # 拆解字内再依次按关键字传参
解释说明:
字典的键名和形参必须一致
字典的键名必须为字符串
字典的键名要在形参中存在
综合传参:
函数的传参方式在能确定形参能唯一匹配到相应实参的情况下可以任意组合
注意:
通常位置传参和序列传参先传递,其次是关键字传参和字典关键字传参
示例:
def fx(a,b,c,d,e,f):
pass
fx(10,*[20,30],e=50,**{"d":40,"f":60})
# 以下是错误做法
fx(e=50,**{"d":40,"f":60},10,*[20,30])
##################以下是函数的形参##############
函数的缺省参数:
语法:
def 函数名(形参名1=默认实参1,形参2=默认实参2,...):
语句
示例:
def info(name,age=1,address="不详"):
print("我叫:",name,",我今年:",age,"岁,家庭地址:",address)
info("张飞",30,"蜀国") #我叫: 张飞,我今年: 30 岁,家庭住址:蜀国
info("张无忌",100) 我叫: 张无忌,我今年: 100岁,家庭住址:不详
info("黄忠") 我叫: 黄忠,我今年: 1 岁,家庭住址:不详
说明:
缺省参数必须自右至左依次存在
缺省参数可以有零个,一个,多个,甚至全部都有缺省参数
缺省参数的绑定对象存在于函数内,同函数的生命周期一致
示例:
def fn(a,lst=[]):
lst.append(a)
print(lst)
l=[1,2,3,4]
fn(5,l) #[1,2,3,4,5]
fn(6,l) #[1,2,3,4,5,6]
fn(1.1) #[1.1]
fn(2.2) #[1.1,2.2]
函数的形参定义方式:
1.位置形参
2.星号元组形参
3.命名关键字形参
4.双星号形参
位置形参:
def 函数名(形参1,形参2,...):
语句块
星号元组传参:
语法:
def 函数名(*元组形参名)
语句块
作用:
收集多余位置形参
示例:
此示例示意星号元组形参
def func(*args):
print("实参个数是:",len(args))
print("args的值是:",args)
func(1,2,3)
func("abc",4,5,True,None)
####输出为以下:###########
实参个数是: 3
args的值是: (1, 2, 3)
实参个数是: 5
args的值是: ('abc', 4, 5, True, None)
命名关键字形参:
语法:
def 函数名(*,命名关键字形参):
语句块
或
def 函数名(*args,命名关键字形参):
语句块
作用:
所有的命名关键字形参都强制调用者采用关键字传参或字典关键字传参的方式传递
示例:
def myfun(a,*,k): #有两个形参
print("a=",a)
print("k=",k)
myfun(100,200) #错
myfun(100,k=200) # k 强制是用关键字传参
myfun(10,**{"k":20})
def myfun2(b,*args,c,d):
print("b=",b)
print("args=",args)
print("c=",c)
print("d=",d)
myfun2(100,200,300,400) # 错
myfun2(100,200,300,400,d=600,c=500)
双星号字典形参:
语法:
def 函数名(**字典形参名):
语句块
作用:
收集多余的关键字
注:
字典形参通常叫kwargs
示例:
此示例示意双星号字典形参的用法:
def func(**kwargs):
print("关键字传参的个数是:",len(kwargs))
print("kwargs=",kwargs)
func(name="tarena",age=15)
func(a=1,b="BBBB",c=[2,3,4],d=True)
#####输出为:###########
关键字传参的个数是: 2
kwargs= {'name': 'tarena', 'age': 15}
关键字传参的个数是: 4
kwargs= {'d': True, 'a': 1, 'b': 'BBBB', 'c': [2, 3, 4]}
函数参数说明:
位置形参,缺省参数,双星号元组形参,命名关键字形参,双星号字典形参可以混合使用
函数参数自左至右的顺序为:
1.位置形参
2.星号元组形参
3.命名关键字形参
4.双星号字典形参
示例:
def fn(a,b,*args,c,**kwargs):
print(a,b,args,c,kwargs)
fn(100,200,400,*"AB",**{'d':"D"},c=1000)
fn(100,200,400,*"AB",**{'d':"D",'c':"C"},e=1000)
可以接受任意位置传参和关键字传参的函数:
def fn(*args,**kwargs):
pass
习题及答案:
1.写一个函数,mysum,可以传入任意个实参的数字,返回所有实参的和
def mysum():
...
print(mysum(1,2,3,4))
print(mysum(5,6,7,8,9))
def mysum(*age):
return sum(mysum)
print(mysum(1,2,3,4)) # 10
print(mysum(5,6,7,8,9)) # 35
2.已知内建函数 max的帮助文档为:
max(...)
max(iterable)->value
max(arg1,arg2,*arg3)->value
仿造max ,写一个mymax函数实现功能与max完全相同
测试用例:
print(mymax([6,8,3,5]))
print(mymax(100,200))
print(mymax(1,3,9,7,5))
def mymax(*args):
if len(args)==1:
l=list(*args)
l.sort(reverse=True)
return l[0]
elif len(args)>1:
l=list(args)
l.sort(reverse=True)
return l[0]
print(mymax([6,8,3,5]))
print(mymax(100,200))
print(mymax(1,3,9,7,5))
方法二:
def mymax(a,*args):
def _max(*args):# 此函数用于求args的最大值
m=args[0]
i=1
while i <len(args): # 遍历之后的每一个元素
if args[i] > m: # 如果此元素比m大,则让m绑定大的
m=args[i]
i+=1
return m
if len(args)==0:
return _max(*a)
return _max(a,*args)
print(mymax([6,8,3,5]))#8
print(mymax(100,200))
print(mymax(1,3,9,7,5))
3.写一个函数minmax,可以给出任意个数字实参,返回这些实参的最大数和最小数,要求两个数字形成元组后返回(最小数在前,最大数在后)调用此函数,能得到实参的最小值和最大值
def minmax(...):
xiao,da=minmax(5,7,9,3,1)
print("最小数是:",xiao)
print("最大数是",da)
def minmax(*args):
return (min(args),max(args))
xiao,da=minmax(5,7,9,3,1)
print("最小数是:",xiao)
print("最大数是",da)