欢迎访问宙启技术站
智能推送

Python函数传参:位置参数、默认参数、可变参数和关键字参数

发布时间:2023-06-20 13:59:57

Python函数允许通过不同的方式传递参数,包括位置参数、默认参数、可变参数和关键字参数。下面我们分别来介绍这四种参数传递方式。

1.位置参数

位置参数是指在调用函数时,按照函数定义时的参数顺序依次传入的参数。例如:

def add(x, y):
    return x + y

print(add(1, 2)) #输出3

在上面的例子中,add函数接收两个位置参数x和y。在调用函数时,我们按照函数定义的参数顺序传入了2个参数,即1和2。

值得注意的是,调用函数时必须按照函数参数顺序传递参数,否则会报错,例如:

print(add(2)) #TypeError: add() missing 1 required positional argument: 'y'

因为在函数定义时,有两个参数需要传递,但是我们只传递了一个参数2,所以会报错。

2.默认参数

默认参数是指在函数定义时,为参数指定了默认值,这样在函数调用时,如果没有传入该参数,它会自动使用默认值。例如:

def add(x, y=1):
    return x + y

print(add(2)) #输出3

在上面的例子中,我们给参数y指定了默认值1。在调用函数时,我们只传递了一个参数2,这时函数会自动使用默认值1作为参数y的值。

需要注意的是,默认参数必须放在所有位置参数的后面,否则会报错。例如下面这个例子就会报错:

def add(x=1, y):
    return x + y

print(add(2)) #SyntaxError: non-default argument follows default argument

因为在定义函数时,默认值参数x放在了位置参数y的前面。

3.可变参数

可变参数是指在函数定义时,允许传递可变数量的参数。在函数体内,可变参数作为一个元组类型进行处理。例如:

def add(*args):
    result = 0
    for arg in args:
        result += arg
    return result

print(add(1, 2, 3)) #输出6

在上面的例子中,我们定义了一个可变参数args,它可以接收任意数量的参数,并把它们存储在一个元组中。在函数体内,我们遍历args元组中的所有参数,并逐个进行加法运算。

需要注意的是,可变参数必须放在所有位置参数和默认参数之后,否则会报错。例如下面这个例子就会报错:

def add(x, *args, y=1):
    result = x + y
    for arg in args:
        result += arg
    return result

print(add(1, 2, 3)) #SyntaxError: non-default argument follows default argument

因为在定义函数时,默认值参数y放在了可变参数args的前面。

4.关键字参数

关键字参数是指在函数调用时,通过指定参数名来传递参数的方式。在函数体内,关键字参数作为一个字典类型进行处理。例如:

def add(x, y, **kwargs):
    result = x + y
    for key, value in kwargs.items():
        print(key, value)
        result += value
    return result

print(add(1, 2, a=3, b=4)) #输出10 a=3, b=4被传递给kwargs参数

在上面的例子中,我们定义了一个关键字参数kwargs,它可以接收任意数量的关键字参数,并把它们存储在一个字典中。在函数体内,我们遍历kwargs字典中的所有项,并逐个进行加法运算。

需要注意的是,关键字参数必须放在所有位置参数、默认参数和可变参数的后面,否则会报错。例如下面这个例子就会报错:

def add(x, **kwargs, y=1):
    result = x + y
    for key, value in kwargs.items():
        result += value
    return result

print(add(1, a=3, b=4)) #SyntaxError: invalid syntax

因为在定义函数时,默认值参数y放在了关键字参数kwargs的前面。

总结:

位置参数、默认参数、可变参数和关键字参数都是Python函数中常用的参数传递方式,它们的区别在于传递参数的方式不同,使用方式也不同。在函数的具体实现中,我们可以根据具体的需求选择合适的参数传递方式。