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变量的作用域。


全栈后端 / python教程 :


























Copyright © 2022-2024 笨鸟工具 x1y1z1.com All Rights Reserved.