python函数的5种参数详解,python 方法参数
功能的灵活性非常高。除了传统定义的位置参数,它还支持默认参数、关键字参数和变量参数.这样既能应对各种复杂情况,又能简化调用者的代码。
位置参数
调用函数时,通常根据函数定义的参数位置传递参数。这种参数称为位置参数。
考虑以下示例,该函数包含两个参数-name和msg:
defgreet(姓名,消息):
.打印(你好,{},{}!。格式(姓名、消息))
.很容易称之为:
问候(“小马”、“nicetomeetyou”)
你好,小马,你好!这里,值是按顺序分配的。由于“Pony”是第一个值,它将被赋给第一个参数名;类似地,“很高兴见到你”将被赋给第二个参数msg。
当传递两个值时,该函数会平稳运行。但是如果参数的数量不匹配会发生什么呢?
Greet(Pony)#缺少一个参数
.
type : Greet()missing 1 required positional Argument 3360 msg 显然,解释器会发牢骚。但是对于Python来说,解决这个问题简直是小菜一碟。请继续阅读!
默认参数
定义函数时,可以使用赋值运算符(=)来指定参数的默认值:
defgreet(name,msg=nicetomeetyou):
.打印(你好,{},{}!。格式(姓名、消息))
.
注意:如果参数没有默认值,则在调用函数时必须为其指定一个值;如果有默认值,则该值在调用时是可选的,如果为其提供了值,默认值将被覆盖。
因为name没有默认值,所以必须指定一个值,而msg有默认值,所以该值是可选的:
Greet(Pony)#使用默认值
你好,小马,你好!
Greet(Pony , givemeahug)#覆盖默认值
你好,小马,给我一个拥抱!值得注意的是,函数中的所有参数都可以有默认值,但是一旦默认参数存在,它右边的所有参数也必须有默认值。
也就是说,非默认参数不能跟在默认参数后面。例如,将会报告如下所示的错误:
defgreet(msg=nicetomeetyou ,name):
.打印(
#39;Hello,{},{}!'.format(name,msg))
...
File"<stdin>",line1
SyntaxError:non-defaultargumentfollowsdefaultargument关键字参数
为方便起见,Python 还允许使用 key = value 形式的关键字参数调用函数:
>>>defgreet(name,msg):当以这种方式调用函数时,所有传递的关键字参数都必须与函数接受的某个参数匹配,并且它们的顺序不重要:...print('Hello,{},{}!'.format(name,msg))
...>>>
>>>greet(name='Pony',msg='nicetomeetyou')#按循序传递此外,它还可以和位置参数混合使用,但关键字参数必须在位置参数之后:Hello,Pony,nicetomeetyou!
>>>
>>>greet(msg='nicetomeetyou',name='Pony')#顺序颠倒也可以
Hello,Pony,nicetomeetyou!
>>>greet('Pony',msg='nicetomeetyou')#位置参数与关键字参数混合使用所以,如果像下面这样调用,就会报错:Hello,Pony,nicetomeetyou!
>>>greet(name='Pony',message='nicetomeetyou')#message不存在可变参数...
TypeError:greet()gotanunexpectedkeywordargument'message'
>>>
>>>greet(msg='nicetomeetyou','Pony')#关键字参数不能在位置参数之前
...
SyntaxError:positionalargumentfollowskeywordargument
可变参数也被称为不定长参数,顾名思义,就是传入的参数个数是可变的,可以是任意多个(0、1、2 ...)。``
包裹位置传递
在参数名之前可以添加一个星号(*),在函数内部,所有传入的参数都会被变量 names 收集,最终按照位置将它们合并为一个元组:
>>>defgreet(*names):尝试一下,传递不同个数的参数:...print('Hello,',names)
...
>>>
>>>greet()#没有参数,为空元组通常情况下,可变参数(*)会出现在形参列表的最后,因为它们会把传递给函数的所有剩余输入参数都收集起来:Hello,()
>>>
>>>greet('Pony')
Hello,('Pony',)
>>>
>>>greet('JackMa','Pony')
Hello,('JackMa','Pony')
>>>defgreet(msg,*names):话虽如此,但可变参数(*)之后还可以出现其它参数,只不过这些形参都是“强制关键字”参数,这意味着,它们只能被用作关键字参数,而不能是位置参数:...print('Hello,{},{}!'.format(names,msg))
...
>>>
>>>greet('nicetomeetyou','JackMa','Pony')
Hello,('JackMa','Pony'),nicetomeetyou!
>>>defgreet(*names,msg):包裹关键字传递...print('Hello,{},{}!'.format(names,msg))
...
>>>
>>>greet('Pony',msg='nicetomeetyou')#只能被用作关键字参数
Hello,('Pony',),nicetomeetyou!
>>>
>>>greet(msg='nicetomeetyou','Pony')#不能被用作位置参数
...
SyntaxError:positionalargumentfollowskeywordargument
还有一种机制,在参数名之前添加两个星号(**),当这种形式出现时,msgs 将收集所有关键字参数,最终将它们合并为一个字典:
>>>defgreet(**msgs):和上面一样,尝试传递不同个数的参数:...print('Hello,',msgs)
...>>>
>>>greet()#没有参数,为空字典此外,*names 还可以与 **msgs 形式的参数相结合,但*names 必须出现在 **msgs 之前。Hello,{}
>>>
>>>greet(name='Pony')
Hello,{'name':'Pony'}
>>>
>>>greet(name='Pony',msg='nicetomeetyou')
Hello,{'name':'Pony','msg':'nicetomeetyou'}
例如,像下面这样,就会报错:
>>>defgreet(**msgs,*name):解包裹参数...
SyntaxError:invalidsyntax
正如【可变参数】那样,也可在函数调用中使用 * 和 **。只不过在这种情况下,与在函数定义中的语义相反,参数将被解包裹而不是被包裹:
>>>defgreet(name,msg):尝试一下,元组用 * 来传递位置参数:...print('Hello,{},{}!'.format(name,msg))
...
>>>
>>>t=('Pony','nicetomeetyou')同样地,字典也可以用 ** 传递关键字参数:``>>>greet(*t)
Hello,Pony,nicetomeetyou!
>>>d={'name':'Pony','msg':'nicetomeetyou'}位置参数、默认参数、可变参数混合使用>>>greet(**d)
Hello,Pony,nicetomeetyou!
根据上面的介绍,我们不难发现,当这些参数混合使用时,应遵循一个基本的原则:位置参数 -> 默认参数 -> 包裹位置 -> 包裹关键字(定义和调用都应遵循该顺序)。
例如,定义一个函数,能够同时向多个人发送多条消息:
>>>defgreet(sender,address='BeiJing',*receivers,**msgs):为了显示更好的效果,我们在中间穿插了一些华丽的分割线:...print('Hello,Iam{},from{}.'.format(sender,address))
...print('-'*30)#华丽的分割线
...forrecinreceivers:
...forkey,valinmsgs.items():
...print('No{}:{},{}!'.format(key,val,rec))
...print('-'*30)#华丽的分割线
...
>>>
>>>greet('Waleon','Xi\'an','JackMa','Pony',one='nicetomeetyou',two='givemeahug')Hello,IamWaleon,fromXi'an.
------------------------------
Noone:nicetomeetyou,JackMa!
Notwo:givemeahug,JackMa!
------------------------------
Noone:nicetomeetyou,Pony!
Notwo:givemeahug,Pony!
------------------------------
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。