今天python人工智障大水课老师给我们讲了一堆跟人工智能不沾边的玩意,但是确实是python的基础操作,有点触及我的知识盲区了。呜呜,python的参数的确是够特性的。

python的参数类型

  • 位置参数(positional arguments,官方定义,就是其他语言所说的参数)

  • 默认参数(被默认赋值的参数)

  • 可变参数

  • 命名关键字参数

  • 关键字参数

位置参数的特性

位置(参数positional arguments)就是其他语言的参数,其他语言没有分参数的种类是因为只有这一种参数,所有参数都遵循按位置一一对应的原则。

默认参数

没什么特性,但有几点注意

默认参数必须处于最右端,否者会产生二义性

还有一点需注意

python的解释器将默认参数当作一个公共对象,如果函数内部修改了它,那么再次调用时默认参数将改变

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
def defaultzero(list = []):  #我们的本意是提供的list参数为0时 返回只有一个0的list
list.append(0)
return list
>>> defaultzero()
[0]
>>> defaultzero()
[0, 0]
#显然重复调用的时候结果不是我们所期望的

#解决方案 使用None
def defaultzero(list = None):
if list = None: list = []
list.append(0)
return list

#这说明list是一个对象
#事实上Python所有的数据类型其实都是对象(先记住这点,后面的博文将给出详细解释)
摘自于https://cloud.tencent.com/developer/article/1037232

可变参数

使用于未知个数的参数

可变参数由tuple形式传播

格式【 *参数

使用该参数的函数可以将整个元组或者列表传进来,但是必须顺序得提前规划好

1
2
3
4
5
6
7
def xxx(*param):
##########
############

list=[]
调用时
xxx(list)

关键字参数

关键字的参数是由字典形式传递的

即可变参数传递的是参数值,关键字参数传递的是参数名:参数值键值对

形式:**kw 这是惯用写法,建议使用,容易被理解

1
2
3
4
5
def personinfo(name, age, **kw):
print('name:', name, 'age:', age, 'ps:', kw)
>>> personinfo('Steve', 22)
>>> personinfo('Lily', 23, city = 'Shanghai')
>>> personinfo('Leo', 23, gender = 'male',city = 'Shanghai')

可变参数和关键字参数都可以接受0个或者多个参数

命名关键字参数

Python的命名关键字参数对传入的关键字参数做了进一步的限制。

格式:在关键字参数前增加一个”*”。

1
def personinfo(name, age, *, gender, city): #只能传gender和city参数

关键字参数和命名关键字参数的区别在于,

前者可以传递任何名字的参数,而后者只能传递*后面名字的参数。

如果函数定义中已经有了一个可变参数,后面跟着的命名关键字参数就不再需要一个特殊分隔符*了

各种参数的组合

顺序:基本参数、默认参数、可变参数、命名关键字参数和关键字参数。

总而言之

python的参数类型可粗分为三类

基本参数,命名关键字参数和关键字参数。