Python参数传递及收集机制原理解析
本文深入解析Python中的参数传递机制,详细阐述位置参数与关键字参数的定义、顺序要求及混合使用规则。重点讲解通过单星号'*'收集多余位置参数形成元组,以及双星号'**'收集多余关键字参数形成字典的原理。结合代码示例说明混合调用时的注意事项及常见错误,帮助开发者掌握Python函数参数的灵活用法。
在Python函数调用中,参数传递主要涉及两种形式:位置参数和关键字参数。
1. 位置参数:其核心特征在于参数的顺序至关重要,因为解释器是严格依据参数在调用时的位置顺序来为形参赋值的。
def func1(a, b): print(a,b) # 位置参数,位置顺序很重要 func1(1,2)

2. 关键字参数:这种传递方式首先降低了对位置顺序的依赖,考虑到参数数量较多时记忆位置较为困难;更重要的是,关键字参数允许在定义函数时提供默认初始值。
def func2(c=1, d=2): print(c,d) # 关键字参数,1. 使得位置不那么重要;2. 可提供初始值 func2() #使用初始值 func2(100,200) #关键字参数也可用位置参数的传递形式 func2(c=100,d=200) #变换位置 func2(d=200,c=200)

3. 当位置参数与关键字参数混合使用时,必须遵守一条规则:所有的位置参数必须位于关键字参数之前。
def func3(a, b, c=1): print(a,b,c) # 混合使用时,位置参数必须在前面,否则程序会不知道位置参数对应的值是什么 func3(1,2,100) func3(1,2,c=100)

4. 使用单星号 '*' 可以收集多余的位置参数,将它们打包成一个元组。需要注意的是,在使用该元组时,其中的元素依然保持原有的顺序。
p = (1,2,) def func4(*para): # 存多个参数,位置参数收集形成元组 print(para) func4(*p) #传递的也是元组形式 func4(*(1,2,))

5. 使用双星号 '**' 可以收集多余的关键字参数,将它们打包成一个字典。
arg = {'c':1,'d':2}
def func5(**args): # 存多个参数,关键字参数收集形成字典
print(args)
print(args['c'])
func5(**arg) #传递形式一
func5(**{'c':1,'d':2}) # 二,或者显式传递字典

6. 在位置参数与单星号 '*' 收集参数的混合场景中,单星号 '*' 的作用是收集那些没有对应显式位置参数的其他位置参数。
def func6(a, b, *para): # 混合位置参数,*表示收集没有对应位置参数的其他位置参数,即从前排到后,多余的位置参数
print(a,b)
print('para:',para)
func6(1,2,3,4,5)

7. 在关键字参数与双星号 '**' 收集参数的混合场景中,同理,双星号 '**' 用于收集那些没有对应显式关键字参数的其他关键字参数。
def func7(c=1, d=2, **args): # 混合关键字参数,**表示收集没有对应关键字参数的其他关键字参数,即多余的关键字参数
print(c,d)
print('args:',args)
func7(1,d=2,e=3,f=4)

8. 当位置参数、关键字参数、单星号 '*' 收集参数以及双星号 '**' 收集参数同时混合使用时,规则如下:
def func(a, b, c=1, d=2, *ee, **ff): #混合关键字参数和位置参数:*和** 分别收集多余的位置参数和关键字参数 print(a,b,c,d) print(ee) #元组形式使用 print(ff) #字典形式使用 # func(100,200,300,400,c=500,d=600,e=700,f=800) # TypeError: func() got multiple values for argument 'c',原因是关键字参数也可以按照位置参数传递形式赋值 func(100,200,c=500,d=600,e=700,f=800) func(100,200,300,400,500,600,e=700,f=800) #从前到后多余的参数分别进入元组(单星号)和字典形式(双星号)
若出现 TypeError: func() got multiple values for argument 错误,通常是因为关键字参数也可以像位置参数那样直接传递,导致参数值被重复赋值。

以上即为本文关于Python参数传递及收集机制的全部内容,希望对各位的学习有所帮助,也欢迎大家继续支持本站。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









