当前位置: 首页 > 图灵资讯 > 行业资讯> 5分钟搞定Python中函数的参数

5分钟搞定Python中函数的参数

发布时间:2025-09-26 11:09:16

函数的灵活性很高。除了常规定义的位置参数外,它还支持默认参数、关键字参数和可变参数 ... 这样,不仅可以处理各种复杂的情况,还可以简化调用者的代码。

位置参数

在调用函数时,参数通常根据函数定义的参数位置传输,称为位置参数。

考虑到下面的例子,函数包含两个参数 - name 和 msg:

>>>defgreet(name,msg):
...print('Hello,{},{};.format(name,msg))
...>>>

很容易调用它:

>>>greet('Pony','nicetomeetyou')
Hello,Pony,nicetomeetyou!

在这里,值将按顺序分配。因为“Pony“它是第一个值,所以它将被分配给第一个参数 name;同样地,“nice to meet you“它将被分配给第二个参数 msg。

传递两个值时,函数运行顺利。但是如果参数的数量不匹配,会发生什么呢?

>>>greet('Pony')#少一个参数
...
TypeError:greet()missing1requiredpositionalargument:'msg'

显然,解释器会抱怨。但对 Python 解决这个问题简直就是反掌,继续往下看!

默认参数

赋值运算符(=)可用于定义函数时指定参数的默认值:

>>>defgreet(name,msg='nicetomeetyou'):
...print('Hello,{},{};.format(name,msg))
...
>>>

注意: 如果参数没有默认值,则必须在调用函数时指定一个值;如果有默认值,则可以选择调用值。如果提供了一个值,则将覆盖默认值。

由于 name 没有默认值,因此必须指定值 msg 有默认值,因此值是可选的:

>>>greet('Pony')#使用默认值
Hello,Pony,nicetomeetyou!
>>>
>>>greet('Pony','givemeahug')#覆盖默认值
Hello,Pony,givemeahug!

值得注意的是,函数中的所有参数都可以有默认值,但一旦有默认参数,其右侧的所有参数也必须有默认值。

也就是说,非默认参数不能在默认参数之后进行。例如,如下所示,您将报告错误:

>>>defgreet(msg='nicetomeetyou',name):
...print('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()#没有参数,是空字典
Hello,{}
>>>
>>>greet(name='Pony')
Hello,{'name':'Pony'}
>>>
>>>greet(name='Pony',msg='nicetomeetyou')
Hello,{'name':'Pony','msg':'nicetomeetyou'}

此外,*names 还可以与 **msgs 形式参数相结合,但*names 必须出现在 **msgs 之前。

例如,像下面这样,你会报错:

>>>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!
------------------------------

相关文章

Python中reduce函数和lambda表达式的学习

Python中reduce函数和lambda表达式的学习

2025-09-26
Python小白必学的面向对象

Python小白必学的面向对象

2025-09-26
一个例子解释python装饰器

一个例子解释python装饰器

2025-09-26
深入理解Python的set和dict

深入理解Python的set和dict

2025-09-26
Python中正则表达式的巧妙使用

Python中正则表达式的巧妙使用

2025-09-26
5分钟搞定Python中函数的参数

5分钟搞定Python中函数的参数

2025-09-26