Python中的函数参数传递-位置参数和关键字参数
Python是一种多范式编程语言,它允许使用不同的编程风格来实现同一个解决方案。Python中的函数参数传递是其非常重要的特性之一,因为在实现大型项目时,函数的参数类型和传递方式会影响到整个程序的性能和可读性。
Python中的函数参数传递主要包括两种类型:位置参数和关键字参数。
1.位置参数
位置参数是指在函数调用中,实参按照定义时的顺序进行传递,即第一个实参对应函数定义中的第一个形参,第二个实参对应函数定义中的第二个形参,以此类推。
例如,我们定义一个求和函数:
def total(a, b, c):
return a + b + c
函数定义中,a、b、c是形参,即变量名。当我们调用该函数时,需传入三个实参:
print(total(1, 2, 3)) # 输出:6
在调用total()函数时,1对应a,2对应b,3对应c。
如果我们传入的实参个数不足三个,会出现TypeError的错误:
print(total(1, 2)) # TypeError: total() missing 1 required positional argument: 'c'
2.关键字参数
关键字参数是指在函数调用时,通过变量名和值的方式进行传递,与位置无关。关键字参数的优点是在传参时可以省去实参与形参的位置顺序一一对应的过程,更容易阅读和理解代码。
例如,我们对total()函数进行改写,使其支持关键字参数:
def total(a, b, c=0):
return a + b + c
在函数定义中,c=0是一个默认参数,当调用函数时没有传值时,c参数默认为0。
我们可以通过关键字参数c传入非默认参数:
print(total(1, 2, c=3)) # 输出:6
也可以省略非默认参数,直接传入默认参数:
print(total(b=2, a=1)) # 输出:3
此时,我们调用了关键字参数,省略了位置调用。
对于位置参数和关键字参数混合使用时,我们必须先传入位置参数,然后再传入关键字参数。这是因为位置参数必须按照函数定义的顺序进行传递,而关键字参数则可以任意顺序传递。
例如,我们定义add()函数:
def add(a, b=0, c=0):
return a + b + c
当我们调用时,须先传入位置参数a,其次传入关键字参数b和c:
print(add(2, c=3)) # 输出:5
我们不能先传入关键字参数,再传入位置参数,否则会出现SyntaxError错误:
print(add(b=2, 3, c=3)) # SyntaxError: positional argument follows keyword argument
3.可变参数
除了位置参数和关键字参数,Python还支持可变参数,即在函数定义中,参数列表中元素个数不确定,可以是任意数量的位置参数或关键字参数。
(1)*args
通过*args定义位置参数,即在参数列表前面加上*符号。*args将实参打包成一个元组(tuple)传递给函数,若在函数定义中,未指定*args,则不能传递不确定长度的实参。
例如,我们定义一个函数,实现n个数的求和,无论n是多少:
def add(*args):
result = 0
for num in args:
result += num
return result
我们可以传递任意数量的位置参数,它们会被打包成一个元组(tuple)
print(add(1, 2, 3)) # 输出:6 print(add(1, 2, 3, 4, 5)) # 输出:15
(2)**kwargs
通过**kwargs定义关键字参数,即在参数列表前面加上**符号。**kwargs将实参打包成一个字典(dict)传递给函数,若在函数定义中,未指定**kwargs,则不能传递不确定数量的关键字实参。
例如,我们定义一个函数,实现将多个键值对传入字典中:
def create_dict(**kwargs):
return kwargs
我们以关键字参数的形式传入多个实参,它们会被打包成一个字典(dict):
print(create_dict(a=1, b=2, c=3)) # 输出:{'a': 1, 'b': 2, 'c': 3}
需要注意的是,无法在函数定义中同时定义*args和**kwargs,且两个都是可变参数,均用于传递不确定数量的参数。为了避免混淆,建议只使用其中一个。
总结
Python中的函数参数传递非常灵活,支持位置参数、关键字参数和可变参数(*args和**kwargs)三种形式。在实际开发中,我们可以根据实际情况选择不同形式的参数传递方式,灵活运用各种参数类型,使代码更加健壮和易于维护。
