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

Python函数中的参数传递与默认值设定。

发布时间:2023-05-21 05:55:33

Python中函数的参数传递方式有多种,包括位置参数、关键字参数、默认参数和可变参数等。本文将详细介绍Python中函数参数传递的相关概念和使用方式,并总结一下默认参数设定的注意事项。

1. 位置参数

Python中最简单的传递参数方式是位置参数。函数中的每个参数按照定义的顺序依次对应传入的值。例如:

def add(x, y):
    return x + y
print(add(3, 5))   # 输出8

上例中,函数add有两个参数xy,位置分别为1和2,分别对应传入的3和5。函数返回3和5之和,即8。

在传递位置参数时,需要保证传入的参数数量与函数定义的参数数量一致,否则会报错。例如:

def add(x, y):
    return x + y
print(add(3))   # 报错:缺少必要的参数'y'

因为函数add定义了两个参数,但是只传入了一个参数,缺少了必要的参数。

2. 关键字参数

关键字参数是指通过指定参数名来传递参数。在传递关键字参数时,可以按任意顺序指定参数名和参数值,因此可以更灵活地传递参数。例如:

def add(x, y):
    return x + y
print(add(y=5, x=3))   # 输出8

上例中,通过指定参数名xy,可以按任意顺序传递参数,结果与位置参数传递相同。

在传递关键字参数时,需要保证参数名与函数定义的参数名一致,否则会报错。例如:

def add(x, y):
    return x + y
print(add(a=3, b=5))   # 报错:unexpected keyword argument 'a'

因为函数add只定义了xy两个参数,没有ab这两个参数名。

3. 默认参数

Python中的默认参数是指在函数定义时给参数设置初始值。在调用函数时,如果没有传递该参数的值,则默认使用设置的初始值。例如:

def add(x, y=0):
    return x + y
print(add(3))   # 输出3

上例中,函数add定义了两个参数xy,并为参数y设置了默认值0。在调用函数时只传递了一个参数3,因此参数y使用了默认值0。

如果使用位置参数和关键字参数同时传递参数,则关键字参数的值会覆盖默认值。例如:

def add(x, y=0):
    return x + y
print(add(3, y=5))   # 输出8

以上例中传递了位置参数3和关键字参数y=5,因此参数y的值为5,而不是默认的0。

需要注意的是,如果默认参数是可变类型(例如列表、字典),则会遇到一些奇怪的问题。例如:

def add(x, ls=[]):
    ls.append(x)
    return ls
print(add(3))   # 输出[3]
print(add(5))   # 输出[3, 5]

上例中,函数add定义了两个参数xlsls是一个空列表。在 次调用函数时,参数x的值为3,会将3添加到ls列表中。在第二次调用函数时,参数x的值为5,同样会将5添加到ls列表中,因此结果为[3, 5],而不是期望的[5]。这是因为默认参数只会在函数定义时执行一次,后续每次调用函数时都会使用上一次的结果,因此ls列表会被不断地修改。

为避免这样的问题,可以将默认参数设置为None,并在函数内部判断参数是否为None,如果是则创建一个新的列表。例如:

def add(x, ls=None):
    if ls is None:
        ls = []
    ls.append(x)
    return ls
print(add(3))   # 输出[3]
print(add(5))   # 输出[5]

上例中,函数add中的ls=None表示默认参数为None,并在函数内部判断参数是否为None,如果是则创建一个新的空列表。这样就可以避免默认参数不断修改的问题。

4. 可变参数

Python中还有一种特殊的参数传递方式,即可变参数。可变参数是指可以传递任意数量的参数,包括位置参数和关键字参数,对应的参数在函数内部被当作一个元组或字典处理。

使用单个星号(*)表示位置参数可变参数,使用双星号(**)表示关键字参数可变参数。例如:

def add(*args):
    result = 0
    for arg in args:
        result += arg
    return result
print(add(1, 2, 3, 4, 5))   # 输出15

上例中,函数add使用单个星号*args表示位置参数可变参数,将传递的参数打包成一个元组,然后遍历元组并相加,返回相加的结果。

使用双星号**kwargs表示关键字参数可变参数,将传递的参数打包成一个字典,其中键是参数名,值是对应的参数值。例如:

def add(**kwargs):
    result = 0
    for key, value in kwargs.items():
        result += value
    return result
print(add(a=1, b=2, c=3, d=4, e=5))   # 输出15

上例中,函数add使用双星号**kwargs表示关键字参数可变参数,将传递的关键字参数打包成一个字典,然后遍历字典并相加,返回相加的结果。

需要注意的是,可变参数必须放在位置参数和默认参数之后,否则会报错。例如:

def add(*args, x):   # 报错:必须指定x参数的值
    result = 0
    for arg in args:
        result += arg
    result += x
    return result
print(add(1, 2, 3, 4, 5))   # 报错:必须指定x参数的值

因为可变参数会将所有传递的参数都打包成一个元组或字典,因此如果放在位置参数和默认参数之前,则会导致无法确定哪些参数是位置参数或默认参数和哪些参数是可变参数。

结论:

Python中函数参数传递的方式有多种,包括位置参数、关键字参数、默认参数和可变参数等。在传递参数时需要注意参数的顺序、参数名和参数类型。默认参数的初始值不能是可变类型,否则可能会出现意外的问题。可变参数必须放在位置参数和默认参数之后,否则会报错。在使用可变参数时需要注意对元组和字典的遍历和处理。