Python中不定长参数这样用对吗?def hh(w,**l,pu='d'): 为啥?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python中不定长参数这样用对吗?def hh(w,**l,pu='d'): 为啥?相关的知识,希望对你有一定的参考价值。

题主你好,

一般来说, python函数中有两种形式的参数: 位置参数, 关键字参数.

位置参数: 说白了就是在函数调用时必传的,你不给它赋值函数就运行不了.如:

从拿上图例子来说, 在调用hello时,如果你只写个hello(),肯定会报错, 因为在执行函数里面的print(name)时, 不知道name的值是多少.

所以对于上图来说,hello("Jack"), hello("Mike")这都是正确的调法.

小结: 就上面的hello函数定义来说, name就叫做位置参数. 说白了就是函数定义中,只有变量名的参数就是位置参数(如果这句话不理解,接着向下看完关键字参数,一比较就明白了),而位置参数的特点是: 调用函数时必须要给它们传值,原因上面已经说过   //def hello(a,b,c,d,e,f) 这里面a,b,c,d,e,f全都是位置参数

-----

关键字参数: 首先它同位置参数一样, 也是用在函数定义中. 其外在表现就是一具等式: "变量名=值". 举例来说吧:

对比一下这个hello函数, 和位置参数中的hello函数有啥不一样,可以看到该hello函数中的参数为 name="张三",而位置参数中的hello函数参数为 name, 最大的区别在于函数调用时,

位置参数中你要使用 hello("名字")的形式进行调用, 而关键字参数中直接使用hello()不用加任何参数. 原因也很好理解: 位置参数中name没有默认值, 而关键字参数中,在声明的时候就给name赋了一个默认值,"张三", 所以说在调用关键字参数中的hello函数时,即使我们不给name参数传值,print(name)函数在执行时会使用name的默认值, 整个逻辑是通的.

-----

总结一下位置参数和关键字参数,共两点:

1.从外观看,位置参数就是一个变量名,如a,b,c,d等; 关键字参数表面看就是一个等式,如age=18, name="张三"等.

2.函数调用时,位置参数必须传值;关键字参数可传可不传,传值时用的是传给它的这个值,不传时,用的是在函数声明时的那个默认值. //上面讲关键字参数的时候,函数调用时只说了可以直接使用hello()调用,此时,name使用函数定义时的默认值,"张三". 这里再补一个使用自定义值的,即在讲关键字参数的那个hello函数中, 我们还可以使用hello("王五"), hello("赵六")的形式进行调用,此时print(name)输出的值就不再是默认的"张三"了, 而是我们自定义的"王五","赵六".

-----

通过上面的讲解,应该能认出什么叫位置参数,什么叫关键字参数了,其特征(一个是变量名, 一个是等式)和用法(一个是必须传值,一个是可传可不传)应该也能明白了. 那么这里就再举一个同时含有 位置参数和关键字参数的例子:

按照之前讲的,调用person时,age必须要传值,name可传可不传,所以调用形式可以是:

person(18), 也可以是person(18,"李四")  //同时把参数名加上进行调用也可以,即person(age=18,"李四"), person(age=18, name="李四"), person(18,name="李四")这都是合法的,当然如果看着乱,记住一种就好.

**.还有一点需要注意函数定义中,位置参数一定要位于关键字参数前,也就是说def person(name="张三",age)这么写是错误的(对于这条约定我是这么理解的, 你想啊假如位置参数位于关键字参数前是可行的,则我们在调用person时,即使name就是默认值"张三",我们也要传值, 因为如果你这么写,person(18),则18会传给person的第一个参数name,如果你写person("张三",18)又麻烦了,因为name的默认值就是"张三', 但我觉得使用person(age=18)还可以理解呀,不管怎么样吧,记住规矩就是这样的.).

-----

下面就该引出题主问题中所谓的"不定长参数"了. 我感觉叫"任意数量的参数"更好理解一些,因为重点在于数量,而不在于长度.//至少如果我没有看到你的实际题目,你说"不定长参数"我会理解为一个参数的值的长度不限, 而非可以有任意多个参数.

为了迎合题主, 下面就称"不定长参数"吧.

python中一般不定长参数有两种类型,位置不定长参数关键字不定长参数, 其外在特征是:

位置不定长参数由一个星号+变量名组成: *var    //var是我随意写的,可以是*a,*b,*any等

关键字不定长参数由两个星号+变量名组成: **key  //同理,key也可以是任意名称.

-----

不定长参数的出现其实就是为了增加函数的灵活性, 这个灵活性就体现在"可以表示任意多个参数位置参数和或关键字参数".

-----

最后再说回题主的问题:

def hh(w,**l,pu='d')

这个用法不对, pu='d'要放在**l前面,我说下原因:

先看一下hh这个函数中的参数类型有两种, w是位置参数; **l和pu='d'是关键字参数.

因此w放在最前面没毛病(位置参数要位于关键字参数前面), 而为什么pu='d'要放在**l前面呢,因为**l表示所有的关键字参数都要传给l,所以如果pu='d'写在**l后面,则pu='d'就不起作用了,因此不能这样写.

=====

希望可以帮到题主, 欢迎追问.

参考技术A 题主你好, python中变量(无论是形参变量还是普通变量)是由 字母,数字,下划线组成, 并且还不能以数字开头. 所以,正常情况下没有办法在形参变量中加入除下划线以外的其它符号.追问

**xx好像表示不定长参数

Python的不定长参数研究

技术分享

 通过观察程序和运行结果我们发现,传参时将1传给了a,将2传给了b,将3,4,5传给了*args,将m=6,n=7,p=8传给了**kwargs。为什么是这样传参呢?*args和**kwargs又是什么呢?

*args表示任何多个无名参数,它是一个tuple,所以将3,4,5传给了*args;

**kwargs表示关键字参数,它是一个dict,所以将m=6,n=7,p=8传给了**kwargs。

并且同时使用*args和**kwargs时,必须*args参数列要在**kwargs前。

下面用代码给大家解释:

以一个*开始的参数,代表一个任意长的元组:

 

>>> def mul(*arg):
...     print arg
... 
>>> mul(1,2,3,4,5,6,7,‘hello‘,‘panfei‘)
(1, 2, 3, 4, 5, 6, 7, ‘hello‘, ‘panfei‘) #一个元组
>>>

 

*********************************

 

一个以**开始的参数,代表一个字典:

 

>>> def mul2(**arg):
...     print arg
... 
>>> mul2(a=11,b=444,c=888)
{‘a‘: 11, ‘c‘: 888, ‘b‘: 444} 一个字典
>>>

 

*********************************

 

两种参数前者可以直接写实参,后者写成名=值的形式!

 

********************************

 下面看看 *args, **kwargs  的配合使用


 def foo(*args, **kwargs):
    print ‘args = ‘, args
    print ‘kwargs = ‘, kwargs
    print ‘---------------------------------------‘

if __name__ == ‘__main__‘:
    foo(1,2,3,4)
    foo(a=1,b=2,c=3)
    foo(1,2,3,4, a=1,b=2,c=3)
    foo(‘a‘, 1, None, a=1, b=‘2‘, c=3)
输出结果如下:

args =  (1, 2, 3, 4) 
kwargs =  {} 
--------------------------------------- 
args =  () 
kwargs =  {‘a‘: 1, ‘c‘: 3, ‘b‘: 2} 
--------------------------------------- 
args =  (1, 2, 3, 4) 
kwargs =  {‘a‘: 1, ‘c‘: 3, ‘b‘: 2} 
--------------------------------------- 
args =  (‘a‘, 1, None) 
kwargs =  {‘a‘: 1, ‘c‘: 3, ‘b‘: ‘2‘} 
---------------------------------------

可以看到,这两个是python中的可变参数。*args表示任何多个无名参数,它是一个tuple;**kwargs表示关键字参数,它是一个dict。并且同时使用*args和**kwargs时,必须*args参数列要在**kwargs前,像foo(a=1, b=‘2‘, c=3, a‘, 1, None, )这样调用的话,会提示语法错误“SyntaxError: non-keyword arg after keyword arg”。

 参考:http://longzhiwen-478.blog.163.com/blog/static/29809749201392395923686/























以上是关于Python中不定长参数这样用对吗?def hh(w,**l,pu='d'): 为啥?的主要内容,如果未能解决你的问题,请参考以下文章

python-输入不定长参数函数传值

python中函数的不定长参数

Python 不定长参数 *argc/**kargcs

python-在定义函数时,不定长参数中,默认值参数不能放在必选参数前面

python_30期不定长参数/动态参数 *arges

python_30期不定长参数/动态参数 *arges