python的位置参数、关键字参数、默认参数、可变参数*args,**kwargs


1.位置参数和关键字参数

位置参数和关键字参数时在调用函数时将实参传递给形参时的概念

'''
位置参数和关键字参数 positional argument and keyword argument
位置参数和关键字参数时在调用函数时将实参传递给形参时的概念
>位置参数必须在关键字参数前面
'''
def func(king,artist):
    print("king is {} and artist is {}".format(king,artist))

#位置参数
#将实参传给形参时按位置依次传递
func("billy","van")                      #此时函数中king="billy",artist="van"
func("van","billy")                     #这样就反了,此时函数中artist="billy",king="van"

#关键字参数
#以"形参=实参",换言之"键-值"的形式一一对应
func(king="billy",artist="van")          #此时函数中king="billy",artist="van"
func(artist="van",king="billy")          #反过来也没关系

#位置参数必须在关键字参数前面
func(king="billy","van")                 #b报错,SyntaxError: positional argument follows keyword argument
func("king",artist="van",)                #正确


'''显然对于参数较多的函数,使用关键字参数的方式来调用会使代码更具可读性,也不容易出错'''

2.默认参数

默认参数是在定义函数时的概念,可为形参提供默认值

#在定义函数时,可以为形参提供默认值
def func(king="billy"):                  #king的默认值为"billy"
	print(king)

#调用函数时如果为该参数传值,则使用传入的值,否则使用默认值。
func()                                   #此时函数中king使用默认值"billy"
func("van")                              #此时函数中king使用值"van"

3.可变参数

一个例子
'''
可变参数*args,**kwargs
单个*: *p是用来接受任意多个<位置参数>并将其放在一个元组p中,一般用*args。
两个*: **p是用来接受任意多个<关键字参数>并将其放在一个字典p中,一般用**kwargs。
>*args要放在**kwargs前面,否则会报错
'''

def printKW(*args,**kwargs):
    print('args is',args)
    print('kwargs is',kwargs)

printKW()
printKW(777,'ah')  
printKW(king='bili',artist='van')
printKW(king='bili',artist='van',dancer='mr banana')
printKW(777,None,artist='van')

输出结果

args is ()
kwargs is {}
args is (777, 'ah')
kwargs is {}
args is ()
kwargs is {'king': 'bili', 'artist': 'van'}
args is ()
kwargs is {'king': 'bili', 'artist': 'van', 'dancer': 'mr banana'}
args is (777, None)
kwargs is {'artist': 'van'}
位置参数、关键字参数、*args和**kwargs的前后位置关系

因为可变参数分别会将***之前所有的位置参数和关键字参数分别装入元组和字典中***,
*args必须放在所有位置参数的后面,
*args必须放在 **kwargs的前面,
**kwargs必须放在所有关键字参数的后面,一般如下:

# 位置参数,关键字参数,*args,**kwargs
def multiArgs(p1,p2,...,*args,**kwargs):
    pass
  1. *args必须放在所有位置参数后面
def multiArgs(*args,p1,p2=888):
    print('p1 is',p1,'p2 is',p2)
    print('args is',args)
    
#multiArgs(666)                           #出错,p1没有参数也没有默认参数
multiArgs(666,'van',p1='heaven')

结果如下

p1 is heaven p2 is 888
args is (666, 'van')
  1. *args必须放在 **kwargs的前面
##*args要放在**kwargs前面,否则会报错
def multiArgs(**kwargs,*args):
    print('args is',args)
    print('kwargs is',kwargs)
multiArgs()

报错如下

  File "<ipython-input-26-391df307cb6b>", line 1
    def multiArgs(**kwargs,*args):
                           ^
SyntaxError: invalid syntax
  1. **kwargs必须放在所有关键字参数的后面(与*args同理)
可变参数由符号*和**指定,一般用args和kwargs
##一般用args和kwargs,其它也可以
def fun(*shit,**fuck):
    if shit==():
        pass
    else:
        for i in range(shit[0]):
            if 'king' in fuck:
                print(fuck['king'],'send you a invitation for wrestling')

fun(2,king='billy')

结果如下

billy send you a invitation for wrestling
billy send you a invitation for wrestling
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值