目录
位置参数
位置参数要求我们必须传入这个参数对应值,如果没有一定报错
比如这是一个求1-n数之和的函数,使用必需要传入一个参数n,这就是位置参数
def sum(n):
sum=0
i=1
while i<=n:
sum+=i
i+=1
return sum
result=sum(100)
print(result)
如果啥也不传,那就是写了个函数名,没有意义
默认参数
默认参数就是,我在函数中已经将一个参数提前设置好了值,如果你没有传入这个参数的值,就会用我事先设置好的值,如果你传入了就用你的
我这里定义了一个求x的y次方的方法
def power(x,y=2):
return x**y
print(power((2)))
print(power(2,3))
可变参数:
分位可变参数,和关键字参数
可变参数用元组参数:*args 一个*的是接收多个数据放入元组
关键字参数用字典接收参数:**kw 两个*的接受的是k=v类型的数据,并将他们放入一个字典
可变参数,就是传入正常的参数
def sumN(*args):
# args是参数名
# 要操作传入的参数 可以对args(相当于有参数构成的tuple)进行遍历
print(args, type(args))
sum = 0
for i in args:
sum += i
print(sum)
sumN(1,2,3,5)
接收元组参数注意的事项就是,如果有参数在接受元组参数的后面,要用加上参数名传值
下面的就是一个例子
def printmessage(name,age,*args,gender):
print(name,age,args,gender)
print(type(args))
printmessage("赵四",40,12345456,"男")
首先来看一下这个问题,我把一个多值参数写在了一个位置参数的前面这会发生什么事情?
报错信息:找不到”gender“这个字段对应的值
printmessage("赵四",40,12,34,54,56,"男")
*args是一个多值参数,他把后面所有的值都给收纳了,所以我们传入值得时候,需要把对应参数名也写上,这样才能识别这是单独一个参数的值
def printmessage(name,age,*args,gender):
print(name,age,args,gender)
print(type(args))
printmessage("赵四",40,12,34,54,56,gender="男")
指定参数名还有什么用处呢?只要指定了参数名,我们可以不按函数里面设置的参数顺序传入值,但是一旦这样打乱顺序,可变参数就无法识别出哪里是他可以接收值的地方,所以我就传入了其他3个参数
def printmessage(name,age,*args,gender):
print(name,age,args,gender)
print(type(args))
printmessage(age=45, gender='男', name='刘能')
可能有人不相信上面的结论
我尝试把几个数字放在这几个参数的前面后面,随便放哪个位置都是不能识别的
最后一个情况虽然没有报错,但是这个语法是错误的,他会认定你传入的1就是age,但是后面再次出现了age,并且缺少值的问题还是没解决
那我们试试用args接收一个元组试试?
printmessage(age=45, gender='男', name='刘能',args=(1,2,3,4))
很遗憾,根本无法识别这个关键字
所以打乱顺序传值的时候千万别有多值参数
上面说到了可变参数用元组接值,如果我们直接传入的是元组,也不用再去考虑后面参数啥的了
def printmessage(name,age,*args,gender):
print(name,age,args,gender)
print(type(args))
tuple1=(40,12,34,54,56)
printmessage("赵四",gender="男",*tuple1)
关键字参数
关键字参数是允许你在传参时,可以加上0个或任意个含参数名 ,这样就可以一个字典的形式传入函数中,通常是使用kw表示关键字参数
def printmessage(name,age,gender,**kw):
print(name,age,gender,kw)
print(type(kw))
printmessage("赵四",40,"男",address="象牙山",phonenumber="888888")
传入字典的多值参数后面是不能跟参数的,他只能放在函数参数的最后一个位置
还有认为加参数名就可以不管位置的,要是到了**kw的范围,就少了一个参数
def printmessage(name,age,gender,**kw):
print(name,age,kw,gender)
print(type(kw))
printmessage("赵四",address="象牙山",phonenumber="888888",gender="男")
很显然kw直接把gender收进字典去了,位置参数值少一个必然报错了,所以无论是传值还是参数位置,其他参数都要在kw前面
上面提及到是将我们传入的k-v类型数据组装成字典传入,那自然也可以直接传个字典进去,,所以现在我们可以不按顺序传值,加上参数名传值又可以使用了
def printmessage(name,age,gender,**kw):
print(name,age,kw,gender)
print(type(kw))
dict1={'phonenumber':"888888",'address':"象牙山"}
printmessage("赵四",45,**dict1,gender="男")
命名关键字参数
用一个*做与其他字段分割,后面是限制要传入的参数的名字,只能传我指定名字的关键字参数
先来个正确模板:
def printmessage(name,age,*,gender,adderss,phonenumber):
print(name,age,gender,adderss,phonenumber)
printmessage("赵四",45,gender='男',phonenumber=8888888,adderss='象牙山')
错误示范:
关键字参数正常是只要传入k-v类型数据照单全收的,现在我用上面没有指定的参数名试试能不能行
printmessage("赵四",45,gender='男',telephonenumber=8888888,addr='象牙山')
显然不行 ,所以记得参数要对上号