函数参数中独立的*符号,什么意思?

2019年6月27日 / 48次阅读 / Last Modified 2019年9月3日
函数参数

Python的函数接口定义是很灵活的,有多种定义方式,参数可以固定位置,参数可以设置默认值,还可以定义不定参数数量的接口。而有一种函数接口的定义方式,在调用函数时,只能使用key=value的形式传递参数,这种方式,就是通过在函数参数定义中,使用一个独立的*符号来实现的。

常见的keyword函数参数形式

我们先来看看常见的keyword函数参数形式是什么样的,请看如下示例代码:

>>> def test_keyword(a,b=2,c=3):
...     print(a,b,c)
... 
>>> test_keyword(1)
1 2 3
>>> test_keyword(a=1)
1 2 3
>>> test_keyword(2,3,4)
2 3 4
>>> test_keyword(c=6,b=5,a=7)
7 5 6

测试代码定义了test_keyword函数,此函数有a,b,c三个参数,调用时,可以只输入a参数的值,b和c两个参数都有默认值;也可以按固定顺序给三个参数赋值;也可以通过key=value的形式传递参数。使用key=value这样的形式时,我们可以打乱参数的固定顺序。

函数参数定义中使用独立的*符号

下面的示例代码,在函数定义时,使用了一个独立的*符号,这表示,在*符号后面的参数,调用函数时,必须使用key=value的形式进行参数传递。在Python的标准库中,有不少模块的接口函数的定义都在使用这种方式,所以我们必须要理解这种形式:

>>> def test_keyvalue(a,b,*,x,y=2,z=3):
...     print(a,b,x,y,z)
... 
>>> test_keyvalue(1,2,3,4,5)
Traceback (most recent call last):
  File "", line 1, in 
TypeError: test_keyvalue() takes 2 positional arguments but 5 were given
>>> test_keyvalue(1,2,x=3,y=4,z=5)
1 2 3 4 5
>>> test_keyvalue(1,2,x=3)
1 2 3 2 3
>>> test_keyvalue(1,2,x=3,z=8,y=9)
1 2 3 9 8
>>> test_keyvalue(x=3,z=8,y=9,a=3,b=5)
3 5 3 9 8

注意test_keyvalue函数的定义,参数列表中有一个*符号,这个符号我们不能将其理解为一个参数,而是一个分隔符。*分隔符后面的参数,在函数调用时,必须使用key=value形式。

继续看上面的示例代码,不管a和b两个参数的传递采用固定位置的方式,还是采用key=value的方式,x,y和z这三个参数,都只能使用key=value的形式传递。如果所有参数都采用key=value的方式传递,顺序就无所谓了。

我理解强制使用key=value这样的形式传递参数,也是为了增加Python代码的可读性和可理解性。容易被人类阅读理解的代码,才是好的代码。

写到此处时,本站有介绍的os.chmod函数,和os.stat()函数,都使用了Python的这个特性。

需要注意,本文说介绍的技术特性,对*符号的使用的独立的,即只有一个独立的*符号在函数的参数列表中,*符号前后都有逗号分割。如果*符号后面还有字符,或者是连续的**符号,所表示的是不同的特性,这些在别的文章中介绍。

-- EOF --

本文链接:https://www.pynote.net/archives/368

留言区

《函数参数中独立的*符号,什么意思?》有1条留言

电子邮件地址不会被公开。 必填项已用*标注

  • 麦新杰

    两种函数参数:positional argument 和 keyword argument,即位置参数和关键词参数。*后面的全部是keyword参数,/前面的全是positional参数。 [回复]


前一篇:
后一篇:

More

麦新杰的Python笔记

Ctrl+D 收藏本页


©Copyright 麦新杰 Since 2019 Python笔记

go to top