Python函数参数

在本节中,我们将来学习Python函数参数,及其不同类型的参数,例如默认参数,关键字参数和任意参数。

Python函数参数:

函数的参数是在函数内需要调用该函数时输入的值。当定义的函数具有指定数量参数,调用此特定函数时必须传递指定数量的参数。

如果传递的参数多于或少于函数定义中指定的参数,则会得到一个错误-TypeError

我们举下面的例子,

def language(p, n):
    """Function to print a message"""
    print("Programming language",n,"is:", p)
language('Python', 1)
language('Java', 2)
Programming language 1 is: Python
Programming language 2 is: Java

函数language有两个参数。如果调用函数时传递不同数量的参数,则会出现如下错误:

>>> language('Python')

Traceback (most recent call last):
  File "<pyshell#7>", line 1, in <module>
    language('Python')
TypeError: language() takes exactly 2 arguments (1 given)

>>> language(2, 'Python', 'Java')

Traceback (most recent call last):
  File "<pyshell#8>", line 1, in <module>
    language(2, 'Python', 'Java')
TypeError: language() takes exactly 2 arguments (3 given)

Python函数参数类型:

上面介绍的函数具有固定数量的参数。函数也可以有可变的参数,将可变参数传递给函数有三种不同的方法,现在我们来逐一介绍。

Python函数默认参数:

在函数中,参数可以有在函数定义中指定的默认值。如果参数有默认值,那么它是输入参数中可选的值。

我们先来看下面的例子,

def language(p = 'C++', n = 3):
    """Function to print a message"""
    print("Programming language",n,"is:", p)
language()
Programming language 3 is: C++

你可以在看到这里没有传递任何输入参数,但程序仍然能运行,这是因为函数定义的时候提供了参数的默认值。如果你传入了这些默认参数的不同的值,则将覆盖默认值。

Python函数关键字参数:

通常情况下,你需要按照函数定义中定义的参数顺序来传递多个参数。但是如果使用关键字参数,则可以更改参数的位置。

下面的例子是顺序输入参数的情形,

def language(p, n):
    """Function to print a message"""
    print("Programming language",n,"is:", p)
language(p = 'C++', n = 3)
Programming language 3 is: C++

如果使用关键字参数将值明确的赋给特定参数,那就可以更改参数的位置。 比如,

def language(p, n):
    """Function to print a message"""
    print("Programming language",n,"is:", p)
language(n = 3, p = 'C++')
Programming language 3 is: C++

Python函数任意参数:

假如事先不知道应该传递多少个参数,那可以来使用任意参数。任意参数在参数名称前用星号*来表示。它将不是关键字参数的其他参数作为元组传递给函数。

def language(*args):
    """Demo function of arbitray arguments"""
    for i in args:
        print("Programming language:", i)

language("Java", "C++", "R", "Kotlin")
Programming language: Java
Programming language: C++
Programming language: R
Programming language: Kotlin

这个函数在调用的时候,传递了多个参数,这些参数在函数被真正调用前被转换成了一个元组。

双星号 **kwargs 是用来传递任意的关键字参数,比如,

def language(**kwargs):
    """Demo funciton of arbitrary keyword arguments"""
    for a in kwargs:
        print(a, kwargs[a])
        
language(country="NL", code="+31")
country NL
code +31

任意关键字参数中的参数是作为字典传递的,该字典的键是关键字,字典值是对应的参数的值。比如上面的示例中,传递的参数将转换为字典{'country':"NL", 'code':"+31"}