Python函数中的可变参数和默认参数
Python是一种崭新的、互动式的编程语言,它支持面向对象和面向过程的编程范式。Python 3.0版本发布后,参数传递的方式有了很大的改进。其中最值得注意的两个改进就是可变参数和默认参数。
一、可变参数
在Python中,函数定义时,我们可以为其设置任意多个参数,这些参数的位置可以放在其他已经指定的参数之前或之后。有时候,我们需要定义一个接收可变数目的参数的函数。为此,Python将会提供三种不同的方式来实现这样的工作。
1.参数前添加*号
当参数前添加一个*号时,表示这个参数可以接收任意多的参数,并将这些参数放在一个元组中传递。
例如:
def foo(*args):
print(args)
foo(1, 2, 3)
输出结果为:(1, 2, 3)
2.参数前添加**号
当参数前添加一个**号时,表示这个参数可以接收任意多个关键字参数,并将这些关键字参数放在一个字典中传递。
例如:
def foo(**kwargs):
print(kwargs)
foo(a=1, b=2, c=3)
输出结果为:{'a': 1, 'b': 2, 'c': 3}
3.同时使用两种方式
当同时使用这两种方式时,表示这个函数可以同时接受任意多个位置参数和关键字参数。
例如:
def foo(*args, **kwargs):
print(args)
print(kwargs)
foo(1, 2, 3, a=4, b=5, c=6)
输出结果为:(1, 2, 3) {'a': 4, 'b': 5, 'c': 6}
二、默认参数
在Python中,可以为函数的参数设置默认值,这样在调用函数时不必为这些参数传递值。如果调用函数时传递了这些参数的值,函数会使用传递的值,否则使用默认值。Python函数定义时,定义默认参数很容易:用赋值语句给参数变量设置初始值即可。
例如:
def foo(a, b=2):
print(a, b)
foo(1)
foo(1, 3)
输出结果为:1 2 1 3
需要注意的是,函数默认参数只会在函数定义时求值一次,因此当默认参数是可变对象时,如果这个可变对象的状态发生了变化,则这些变化会被所有函数调用所共享。此时,函数调用时要特别谨慎,否则会造成预料之外的结果。
例如:
def foo(a, b=[]):
b.append(a)
print(b)
foo(1)
foo(2)
foo(3)
输出结果为:[1] [1, 2] [1, 2, 3]
小结:
Python中的可变参数和默认参数可以大大方便函数的定义和调用。在使用可变参数时,需要注意元组和字典的概念,同时可以使用两种方式来同时接受任意多个位置参数和关键字参数。在使用默认参数时,需要特别注意可变对象的状态变化,以免对下一次调用造成影响。
