python函数的参数类型,位置参数、默认参数、可变参数、关键词参数
在介绍python函数的位置参数、默认参数和动态参数三种类型之前,我们有必要来先来见简单认识一下函数的形参和实参。
形参
形参,也就是形式参数,又称为虚拟变量,就是不是实际存在的变量,python程序中的变量作为形参作为参数给python函数之后,变量的值并没有发生改变,可以参考如下示例。
形参示例
大家可以打开jupyter notebook,或者打开spyder,spyder这款IDE也是非常方便的python IDE,安装了anaconda之后,会自动安装spyder,只要在终端里头或命令行里头输入spyder关键词即可(要稍微等待一会儿,就像开启jupyter notebook一样)。
In[1]: a,b=1,2
def countSum(x,y):
x += 1 #在函数中,我们更改了参数的值(重新赋值)
y += 1
cs = x+y
return cs
cs = countSum(a,b)
print(cs,a,b) #从下面的输出结果可知,当变量作为形参传递给函数之后,值并不会发生改变
5 1 2
注意:在python的程序设计当中,通常情况下,传递给函数的值都是以形参的方式。
实参
在c/c++当中,我们可以用指针或引用来给函数传递实参,可python没有指针,而且python中的实参的定义有些令人费解,比如上面的例子中,如果这样调用函数——countSum(1,2),那么1,2便可成为实参!
依据个人的编程经验,在python当中,理解并懂得形参就差不多可以了。
好了,接下来我们将正式介绍python函数参数的三种类型。
python的位置参数
位置参数是python函数参数中最常见的参数,实战开发当中也是最经常遇见的,在这一节课之前,我们所举的所有示例当中有函数参数的用到的都是位置参数,这类的参数有两大特性:
- 1、必须传递的参数;
- 2、顺序性,必须按照前后顺序循序传递;
我们来举个与上面不一样的简单的例子来充分展示python位置参数的这两大特性:
位置参数示例
In[2]: a,b = 'x1y1z1.com,至简计算',1 #为了展示位置参数的顺序性,这里特定将一个变量声明为字符串
def pr(x,y):
print(x[:],'是%s个不错的学习python的网站!' %y)
pr(a,b)
x1y1z1.com,至简计算 是1个不错的学习python的网站!
————————————————————————————————
pr(b,a) #如果顺序调换,将发生TypeError的错误。
TypeError Traceback (most recent call last)
<ipython-input-xxxxx> in <module>
2 def pr(x,y):
3 print(x[:],'是%s个不错的学习python的网站!' %y)
----> 4 pr(b,a)
<ipython-input-xxxxx> in pr(x, y)
1 a,b='x1y1z1.com,至简计算',1
2 def pr(x,y):
----> 3 print(x[:],'是%s个不错的学习python的网站!' %y)
4 pr(b,a)
TypeError: 'int' object is not subscriptable
除此之外,大家也可以试一下只传递一个参数的情况下会发生什么样的错误,是不是出现了missing...arguments的错误。
默认参数
python的默认参数,简而言之就是当我们不给函数传递这个参数上的值的时候,函数就会使用该参数的默认值。默认参数在python的许多框架或库里头经常出现,比如web框架Django,机器学习框架sklearn,深度学习框架,游戏框架pygame,数据绘图框架matplotlib等。
python的默认参数长什么样子,我们用一个简单的示例来展示:
默认参数示例
In[3]:
def powerNum(m,n=2): #我们设计一个用python求幂次方的函数,默认次方为2
p=1
if m==0 and n==0:
print('0的0次方没有意义')
return
elif n==0 and m!=0:
p = 1
else:
for i in range(n):
p *= m
return p
powerNum(5) #在这个函数当中,当我们只输入一个参数时,程序不会报错,而且会将n默认为2
25
powerNum(5,3)
125
注意:默认参数必须设计在位置参数之后,而且默认参数之前的位置参数必须按照位置参数的特性,比如必须传递位置参数,也必须按照位置参数的顺序。
多个默认参数需要注意的传参形式
当有多个默认参数的时候,当默认参数一旦出现参数名,后面的默认参数也必须使用参数名,比如:
In[1]:
def worker(name,phone,gender,age='18~35',address='北上广'):
pass #python的关键词之一,有点类似占位符,这样声明好的函数的代码块不用写也不会发生错误
worker('小明','12345678910','男',age='20',address='abc') #运行之后,不会输出,也不会发生错误
worker('小明','12345678910','男','20','abc') #运行之后,不会发生错误
worker('小明','12345678910','男','20',address='abc') #注意后面两个默认参数,不会发生错误,可是下面的形式就会发生错误
worker('小明','12345678910','男',age='20','abc') #注意后面两个默认参数,当默认参数出现参数名,后面的也必须使用
File "<ipython-input-xxx>", line 3
worker('小明','12345678910','男',age='20','abc')
^
SyntaxError: positional argument follows keyword argument
python的默认参数没有顺序要求
python函数中的默认参数没有位置参数那样的特性,可以随意调换,但必须跟上参数名:
In[1] ......上面例子中的代码
worker('小明','12345678910','男',address='abc',age='20') #这样写,程序也不会发生错误
python的可变参数
这里的可变指的是参数的个数是可变的,一般用*args表示,注意星号是必须的,后面的字母倒是可以自己命名。在python的函数调用时,可变的参数会被python打包成为一个元组,也就是说相当于传递了一个元组参数,但实际情况又不是这样的,千万不要自己传入一个元组,然后把它当成可变的参数,不是这样的。
可变参数示例
In[1]:
def sumNumber(*a):
sumN = 0
for i in a:
sumN += i
return sumN
sumNumber(1,2,3,4,5) #我们设计一个可以传递任意数字类型的参数并求参数和的函数
15
sumNumber()
0
关键词参数
python的关键词参数可以有任意个,用**kwargs表示,同样前面的两个**是必须的,后面的可以自己命名。python的关键词参数为被python打包成字典dict的形式,但同样要注意的是,不能用字典代替关键词参数。
关键词参数示例
In[1]:
def address(**kwargs):
addr = ''
for key, values in kwargs.items():
addr += (key+':'+values+';')
return addr
address(省='aa',市='bb',县='cc')
'省:aa;市:bb;县:cc;'
可变参数和关键词参数联合使用
在python的很多框架的源代码里头,或者函数里头,我们会遇见一些可变参数*args和关键词参数**kwargs联合使用的情况。我们在自己设计函数的时候,要是联合使用了这两个参数,那么一定要注意如下要求:
可变参数*args一定要设计在关键词参数**kwargs前面,否则会发生SyntaxError: invalid syntax的错误。
python函数的参数类型就暂时介绍到这里,下一章节我们将介绍python变量的作用域。