当我们编写函数时,我们定义了一些占位符,这些占位符是参数,是函数定义中用来接收外部传递值的占位符,这将有助于我们在调用函数时接收外部传递的值。 在Python中,有各种类型的参数,包括位置参数、默认参数、关键字参数、变量位置参数、变量关键字参数和强制关键字参数。
位置参数是最常见的参数类型,也是默认参数类型。 它们按照它们在函数定义中的显示顺序传递,并且在调用函数时必须按顺序提供。
def greet(name, message):
print(message, name)
greet("alittle", "hello"输出:hello alittle
默认参数是那些在定义函数时具有默认值的参数,并且在调用函数时,如果没有为参数提供特定值,则默认值将用作参数的值。 通过设置参数的默认值,可以使函数在某些情况下更加灵活和易于使用。 如果调用函数时未提供该参数的值,则该函数将使用默认值,否则将使用传递给该参数的值。
def greet(name, message="hello"):
print(message, name)
使用默认参数调用函数。
greet("alittle"输出:hello alittle
传递特定参数值将调用该函数。
greet("kobe", "hi"输出: Hi Kobe
需要注意的是,在Python中,默认参数是从左到右依次设置的,如果要为第一个参数设置默认值,则必须确保它位于以下参数之前。 也就是说,要设置倒数第二个参数的默认值,必须首先为倒数第二个参数设置默认值。
def greet(name="iverson", message):
print(message, name)
由于第一个参数具有默认值,因此只能传递第二个参数。
greet("kobe")
运行上述示例时,报错信息:
file "d:\program files\jetbrains\pycharmprojects\hello.py", line 33
def greet(name="iverson", message):
syntaxerror: non-default argument follows default argument
尝试为第一个参数设置默认值时发生语法错误。 这是因为在定义函数时,默认参数只能放在非默认参数之后。 所以如果我们想为第一个参数设置一个默认值,我们可以考虑使用关键字参数来传递参数值,或者两个参数可以颠倒过来。
关键字参数是一种在调用函数时使用参数名称指定参数值的方法。 使用关键字参数可以使函数调用更清晰、更易读,尤其是当函数具有多个参数并且它们具有相同的数据类型或默认值时。
例如,上面的默认参数示例:
def greet(name, message):
print(message, name)
使用关键字参数调用函数。
greet(name="iverson", message="hello"输出:hello iverson
greet(message="hi", name="kobe"输出: Hi Kobe
在上面的示例中,我们在调用函数时通过参数名称指定了参数值。 这不仅可以准确传递参数,还可以使函数调用的意图更清晰、更易于理解。 即使将函数定义中的第一个参数设置为默认值,也不会进行纠错。
因此,您可以使用关键字参数显式指定参数名称,这样可以避免因参数顺序错误而导致的错误。 并且只将值传递给您关心的参数,而忽略其他参数。 在调用函数时提供更好的可读性和可维护性。
可变长度位置参数是一种属性,它允许函数接受任意数量的位置参数。 定义函数时,使用星号 (*) 作为前缀来表示变量位置参数。 它将所有传入的位置参数打包到一个元组中。 定义函数后,我们可以在参数列表中使用 *args 来接收这些参数。
def calculate_sum(*numbers):
total = 0
for num in numbers:
total += num
return total
print(计算总和(1, 2, 3)) 输出: 6
print(calculate sum(4, 5, 6, 7, 8)) 输出: 30
同样重要的是要注意,可变位置参数放在其他参数之后。 也就是说,函数定义中首先定义的参数将按位置顺序读取参数的值,而变量位置参数将读取所有剩余的参数。 例如,如果你想这样写,你会得到一个错误:
def calculate_sum(*numbers, message):
total = 0
for num in numbers:
total += num
return message, total
result = calculate_sum(1, 2, 3, "sum=")
print(result)
如果运行它,将报告以下错误。
traceback (most recent call last):
file "d:\program files\jetbrains\pycharmprojects\hello.py", line 40, in
result = calculate_sum( 1, 2, 3, "sum=")
typeerror: calculate_sum() missing 1 required keyword-only argument: 'message'
变量关键字参数是通过使用 ** 前缀来定义的,以接收任意数量的关键字参数。 有点类似于键值格式,它会将所有传入的关键字参数打包到一个字典(dict)中,可以使用键值对在函数内部访问该字典。
def calculate_sum(*args, *kwargs):
total = sum(args)
for key, value in kwargs.items():
total += value
return total
result = calculate_sum(1, 2, 3, num1=4, num2=5)
print(result) 输出: 15
在此示例中,calculate_sum
函数接受可变位置参数args
和可变关键字参数kwargs
。可变位置参数args
用于接收任意数量的位置参数,同时变量关键字参数可用kwargs
用于接收任意数量的关键字参数。 在函数内部,我们首先使用calculate_sum
功能对可变位置参数args
做一个总结。 然后,我们遍历变量关键字参数kwargs
将关键字参数的值相加到总和。
变量关键字参数提供了一种灵活的方法来处理不确定数量的关键字参数,并为函数提供更大的可伸缩性和适应性。
必需的仅关键字参数位于 3在版本 1 之后引入,意味着在定义函数时,使用 * 后缀来限制调用函数时关键字参数的使用,不允许使用位置参数。
def greet(*,name, message):使用分隔符“*”指示必须使用关键字传递以下参数。
print(message, name)
greet(name="alittle", message="hi") 关键字参数传递。
greet("kobe", "hi")
第一次通话greet
没问题,但第二名叫greet
它将引发异常并报告错误。
traceback (most recent call last):
file "d:\program files\jetbrains\pycharmprojects\hello.py", line 39, in
message = greet("kobe", "hi")
typeerror: greet() takes 0 positional arguments but 2 were given
通过使用必填关键字参数,我们可以清楚地传达参数的含义,避免混淆参数的位置,并提高参数的可读性和鲁棒性。