[python]函数默认参数顺序问题

python 函数参数定义有四类:

1、必选参数:调用函数时候必须赋值的参数。

a,须以正确的顺序传入函数
b,调用时的数量必须和声明时的一样

def exa(x):
    return x
 
#b作为参数进入函数体内
b=1
print exa(b) #1
print exa()
#错误 TypeError: exa() takes exactly 1 argument (0 given)

2,默认参数:初始已经有值,在调用时未更改使用默认值

def exa(x=1)
    return x
 
print exa() # 1
print exa(2) # 2

3,可变参数:不确定参数个数,会分配给带“*”参数

def exa(*x)
    return x
 
print exa(1,2,3,4,5,6,6)
# (1,2,3,4,5,6,6)

4,关键字参数:使用关键字参数来确定传入的参数值。调用函数时带关键字后,顺序不影响。

def exa(x,y,z):
    return x,y,z
 
print exa(y=2,x=3,z=2) #(3, 2, 2)

Tips:可变元组参数和可变字典参数

*x
#可变元组参数,参数格式化存储在一个元组中,长度没有限制。
#python2必须位于普通参数和默认参数之后。
#python3可以位于默认参数之前

def exa(*x):
    return x
print exa('ai', 'ni', 'ya')
#('ai', 'ni', 'ya')
 
 
**x
#可变字典参数
#必须位于参数列表的最后面。
def exa(**x):
    return x
print exa(ai="",ni="")
#{'ai': '爱', 'ni': '你'}

函数参数顺序

args与必选参数和默认参数混用

1、python2、python3 三者顺序是:位置参数、默认参数、*args  

def foo(x,y=1,*args):
     pass
foo (1,2,3,4,5) // 其中的x为1,y=1的值被2替换,3,4,5都给args,即args=(3,4,5)

2、python3 三者顺序是:位置参数、*args、默认参数

def foo(x,*args,y=1):
     pass
foo (1,2,3,4,5) // 其中的x为1,2,3,4,5都给args,即args=(2,3,4,5),y始终为1

3、python2、python3  **kwargs与位置参数、*args、默认参数混用

**kwargs:可变字典长度(表示的就是形参中按照关键字传值把多余的传值以字典的方式呈现)

位置参数、*args、**kwargs三者的顺序必须是位置参数、*args、**kwargs

def foo(x,*args,**kwargs):
     pass
foo (1,2,3,4,y=5,a=6,b=7) // 其中的x为1,2,3,4都给args,即args=(2,3,4),y=5,a=6,b=7以字典形式传给kwargs,即kwargs={'y':5,'a':6,'b':7}

 

python2参数顺序:必选参数、默认参数、可变参数,关键字参数。

python2中,默认参数必须在可变参数之前

 

Python3参数顺序:必选参数,默认参数,*args,**kwargs

python3中,*args也可以在默认参数前,谁在前谁优先拿到值

 

python2和python3相同的是:

1、必选参数必选在默认参数之前

2、关键字参数在最后

 

参考:

牛客网问题评论:https://www.nowcoder.com/questionTerminal/d899caec3dc54e60a9a238546e5b363a?toCommentId=2993542

 

posted @ 2019-05-07 11:45  faithfu  阅读(5934)  评论(0编辑  收藏  举报