当使用混合特定的参数匹配模型时,Python将会遵循以下有关顺序的法则:
1、在函数调用中,参数必须以这样的顺序出现:任何位置参数(Value)、任何关键字参数(name = Value)和*sequence形式的组合,最后是**dict形式
2、在函数头部,参数必须以如下的顺序出现:任何一般参数、任何默认参数、如果有的话,是*name(在Python3.0中是*)的形式,然后是任何name或name=value keyword-only参数,最后是**name形式
Python内部是使用以下的步骤来在赋值前进行参数匹配的:
1、通过位置分配非关键字参数
2、通过匹配变量名分配关键字参数
3、其他额外的非关键字参数分配到*name元组中
4、其他额外的关键字参数分配到**name字典中
5、用默认值分配给在头部未得到分配的参数
例子:
1、不含有特殊匹配法的函数,会按照位置从左至右的匹配变量名
def f(a, b, c):
print(a, b, c)
f(1,2,3)
#输出结果
1 2 3
2、关键字参数的匹配
def f(a, b, c):
print(a, b, c)
f(c = 3, b = 2, a = 1)
#输出结果
1 2 3
3、默认参数
def f(a, b = 2, c = 3):
print(a, b, c)
f(1)
#输出结果
1 2 3
def f(a, b = 2, c = 3):
print(a, b, c)
f(1,4)
输出结果:
1 4 3
f(1,c = 6)
输出结果:
1 2 6
4、关键字参数和默认参数的混合
def func(spam, eggs, toast = 0, ham = 0):
print((spam,eggs,toast,ham))
func(1,2)
#输出结果
(1, 2, 0, 0)
func(1, ham = 1, eggs = 0)
#输出结果
(1, 0, 0, 1)
func(spam = 1, eggs = 0)
#输出结果
(1, 0, 0, 0)
func(1,2,3,4)
#输出结果
(1, 2, 3, 4)
5、任意参数的实例
def func(*args):
print("#输出结果")
print(args)
func()
#输出结果
()
func(1)
#输出结果
(1,)
func(1,2,3,4)
#输出结果
(1, 2, 3, 4)
def f(**args):
print("#输出结果")
print(args)
f()
#输出结果
{}
f(a = 1, b = 2)
#输出结果
{'a': 1, 'b': 2}
6、混合参数实例
def f(a, *pargs, **kargs):
print("#输出结果:")
print(a, pargs, kargs)
f(1, 2, 3, x = 1, y = 2)
#输出结果:
1 (2, 3) {'y': 2, 'x': 1}
Python 函数中,参数是传值,还是传引用?
在 C/C++ 中,传值和传引用是函数参数传递的两种方式,在Python中参数是如何传递的?回答这个问题前,不如先来看两段代码. 代码段1: def foo(arg): arg = 2 print(a ...
python函数中的参数类型
python函数中的参数 动态获取函数的参数 python的函数类型详解