目录
1. 参数格式
定义中参数的格式
| 参数格式 | 说明 |
| name | 由名字或位置匹配【输入关键字参数、位置参数】 |
| name=value | 没有传递name时的默认值【默认参数】 |
| *name | 收集额外的位置参数作为新的元组名【收集参数-元组】 |
| **name | 收集额外的关键字参数作为新的字典名【收集参数-字典】 |
| *other,name[=value] | *后是Python3.X的进位关键字参数 |
| *,name[=value] | 与前行相同【参数中的 '*'】 |
调用中参数的格式
| 参数格式 | 说明 |
| value | 位置参数 |
| name=value | 关键字(由name匹配)参数 |
| *iterable | 分解位置参数的序列或其他迭代 |
| **dictionary | 分解关键字参数的字典 |
2. 位置参数
直接按照函数定义形参前后位置,在调用函数时录入实参,这种实参录入即位置参数;
录入超过声明定义形参数量的实参,报错;
录入少于声明但未赋值默认参数的形参数量的实参,报错;
def functionx(var1,var2,var3):
print(f'Hi,{var3}.\nWaohoh,{var1}!\nEn,{var2}')
#按顺序录入的实参'Ana'、'Bob'、'Carl',按照functionx的形参位置,赋予了var1、var2、var3
functionx('Ana','Bob','Carl')
Hi,Carl.
Waohoh,Ana!
En,Bob
#录入超过声明定义形参数量的实参,报错。
functionx('Ana','Bob','Carl','Dave')
Traceback (most recent call last):
File "<input>", line 1, in <module>
TypeError: functionx() takes 3 positional arguments but 4 were given
#录入少于声明但未赋值默认参数的形参数量的实参,报错
functionx('Ana','Bob')
Traceback (most recent call last):
File "<input>", line 1, in <module>
TypeError: functionx() missing 1 required positional argument: 'var3'
3. 关键字参数
当函数参数较多,位置、顺序容易混淆时,在知道形参参数名的前提下,可直接通过"形参 = 实参"的方式录入,这种实参录入即关键字参数;
关键字参数只要知道形参参数名,可以不按形参位置录入;
反复录入同一形参的实参,报错;
关键字参数录入实参少于声明的未赋值默认参数的形参的数量,报错;
录入未声明的形参为关键字,报错;
可以混合使用位置参数和关键字参数,此时关键字参数录入需要在所有位置参数之后,否则报错;
位置参数和关键字参数重复赋值实参给同一形参,报错。
def functionx(var1,var2,var3):
print(f'Hi,{var3}.\nWaohoh,{var1}!\nEn,{var2}')
#按形参名给予关键字参数,可以不按形参位置录入
functionx(var3='Ana',var2='Bob',var1='Carl')
Hi,Ana.
Waohoh,Carl!
En,Bob
#反复录入同一形参的实参,报错
functionx(var1='Ana',var1='Bob',var3='Carl')
File "<input>", line 1
SyntaxError: keyword argument repeated: var1
#关键字参数录入实参少于声明的形参数,报错
functionx(var1='Ana',var3='Carl')
Traceback (most recent call last):
File "<input>", line 1, in <module>
TypeError: functionx() missing 1 required positional argument: 'var2'
#录入未声明的形参为关键字,报错
functionx(var4='Dave')
Traceback (most recent call last):
File "<input>", line 1, in <module>
TypeError: functionx() got an unexpected keyword argument 'var4'
#混合使用位置参数和关键字参数
functionx('Ana',var3='Bob',var2='Carl')
Hi,Bob.
Waohoh,Ana!
En,Carl
#关键字参数在位置参数之前,报错
functionx(var1='Ana','Bob',var3='Carl')
File "<input>", line 1
functionx(var1='Ana','Bob',var3='Carl')
^
SyntaxError: positional argument follows keyword argument
#位置参数和关键字参数重复赋值实参给同一形参,报错
functionx('Ana',var3='Bob',var2='Carl',var1='Dave')
Traceback (most recent call last):
File "<input>", line 1, in <module>
TypeError: functionx() got multiple values for argument 'var1'
4. 默认参数
函数定义形参时,即通过"形参 = 默认参数",来给形参赋值默认参数;
函数调用时,如果已经赋值默认参数的形参没有录入实参,则函数该形参赋值为默认参数;
有赋值为默认参数的形参,调用函数时,可以不赋值实参;
未赋值默认参数的其他形参,若未被赋值实参,报错;
函数定义形参时,如有形参赋值默认参数,则该形参的声明,需要在所有未赋值默认参数的形参声明之后,否则报错;
默认值在函数定义中求值,如默认值为变量,函数定义后改变变量值,默认值不变;
重要警告:
- 通常默认值只计算一次。但当默认值为列表、字典或类实例等可变对象时,会产生与该规则不同的结果:
- 函数内调用时,如改变被默认值赋值为列表、字典等可变对象的形参时,默认值改变;
- 函数内调用时,如被默认值赋值为不可变对象的形参,则不会改变默认值;
- 函数外改变被赋值为默认值的可变对象,也不改变默认值。
def functionx(var1='Smith1',var2='Smith2',var3='Smith3'):
print(f'Hi,{var3}.\nWaohoh,{var1}!\nEn,{var2}')
#函数调用时,如果已经赋值默认参数的形参没有录入实参,则函数该形参赋值为默认参数
#有赋值为默认参数的形参,调用函数时,可以不赋值实参
functionx()
Hi,Smith3.
Waohoh,Smith1!
En,Smith2
functionx('Ana',var3='Bob')
Hi,Bob.
Waohoh,Ana!
En,Smith2
#未赋值默认参数的其他形参,若未被赋值实参,报错
functionx('Ana',var3='Bob')
Traceback (most recent call last):
File "<input>", line 1, in <module>
TypeError: functionx() missing 1 required positional argument: 'var2'
#函数定义形参时,如有形参赋值默认参数,则该形参的声明,需要在所有未赋值默认参数的形参声明之后,否则报错
def functionx(var1='Smith1', var2, var3='Smith3'):
print(f'Hi,{var3}.\nWaohoh,{var1}!\nEn,{var2}')
File "<input>", line 1
def functionx(var1='Smith1', var2, var3='Smith3'):
^
SyntaxError: non-default argument follows default argument
默认值在函数定义中求值,如默认值为变量,函数定义后改变变量值,默认值不变
x = 'Smith1'
def functionx(var1, var2, var3=x):
print(f'Hi,{var3}.\nWaohoh,{var1}!\nEn,{var2}')
functionx('Ana','Bob')
Hi,Smith1.
Waohoh,Ana!
En,Bob
x = 'James1'
functionx('Ana','Bob')
Hi,Smith1.
Waohoh,Ana!
En,Bob
#函数内调用时,如改变被默认值赋值为列表、字典等可变对象的形参时,默认值改变
def functionx(var1, var2, var3=[]):
var3.append(var1)
print(f'Hi,{var3}.\nWaohoh,{var1}!\nEn,{var2}')
functionx('Ana','Bob')
Hi,['Ana'].
Waohoh,Ana!
En,Bob
functionx('Ana','Bob')
Hi,['Ana', 'Ana'].
Waohoh,Ana!
En,Bob
functionx('Ana','Bob')
Hi,['Ana', 'Ana', 'Ana'].
Waohoh,Ana!
En,Bob
#函数内调用时,如被默认值赋值为不可变对象的形参,则不会改变默认值
def functionx(var1, var2, var3=1):
var3 += 1
print(f'Hi,{var3}.\nWaohoh,{var1}!\nEn,{var2}')
functionx('Ana','Bob')
Hi,2.
Waohoh,Ana!
En,Bob
functionx('Ana','Bob')
Hi,2.
Waohoh,Ana!
En,Bob
#函数外改变被赋值为默认值的可变对象,也不改变默认值
x = []
def functionx(var1, var2, var3=x):
print(f'Hi,{var3}.\nWaohoh,{var1}!\nEn,{var2}')
functionx('Ana','Bob')
Hi,[].
Waohoh,Ana!
En,Bob
x = [1,2,3]
functionx('Ana','Bob')
Hi,[].
5. 参数中的 '/'
通过help()函数查看内置函数说明时,发现如abs()、sum()等函数的参数中有 '/' 字符;
'/' 字符实际作用是:定义函数时,斜杠“/”限制位置参数,即斜杠左侧的参数必须传递位置参数,而不能传递关键字参数(斜杠右侧的参数随意)。
#abs()函数说明,可见带有'/'
help(abs)
Help on built-in function abs in module builtins:
abs(x, /)
Return the absolute value of the argument.
def functionx(var1,/,var2,var3):
print(var1,var2,var3)
#斜杠左侧的参数必须传递位置参数,而不能传递关键字参数
#斜杠右侧的参数既可以是位置参数,也可以是关键字参数
functionx(1,2,3)
1 2 3
functionx(1,var3=2,var2=3)
1 3 2
#斜杠左侧传递关键字参数,报错
functionx(var1=1,var3=2,var2=3)
Traceback (most recent call last):
File "<input>", line 1, in <module>
TypeError: functionx() got some positional-only arguments passed as keyword arguments: 'var1'
6. 参数中的 '*'
'*' 字符实际作用是:限制关键字参数,即星号右侧的参数必须传递关键字参数,而不能传递位置参数(星号左侧的参数随意);
'*' 实际上就是一个匿名的收集参数,参见章节6;
'/' 、'*' 可以混合使用。
def functionx(var1,var2,*,var3):
print(var1,var2,var3)
#星号左侧的参数既可以是位置参数,也可以是关键字参数
#星号右侧的参数必须传递关键字参数,而不能传递位置参数
functionx(var1=1,var3=2,var2=3)
1 3 2
functionx(1,var3=2,var2=3)
1 3 2
functionx(1,2,var3=3)
1 2 3
#星号右侧参数传递位置参数,报错
functionx(1,2,3)
Traceback (most recent call last):
File "<input>", line 1, in <module>
TypeError: functionx() takes 2 positional arguments but 3 were given
#'/' 、'*' 可以混合使用
#如下示例中,var1只能为位置参数,var3只能为关键字参数,var2则都可以
def functionx(var1,/,var2,*,var3):
print(var1,var2,var3)
functionx(1,var2=2,var3=3)
1 2 3
functionx(1,2,var3=3)
1 2 3
functionx(var1=1,var2=2,var3=3)
Traceback (most recent call last):
File "<input>", line 1, in <module>
TypeError: functionx() got some positional-only arguments passed as keyword arguments: 'var1'
functionx(1,2,3)
Traceback (most recent call last):
File "<input>", line 1, in <module>
TypeError: functionx() takes 2 positional arguments but 3 were given
7. 收集参数-元组
若实参个数不定,定义函数时,形参可以使用收集参数-元组实现,在形参前加上星号(*)即可;
Python实现时,把标志为收集参数-元组的所有实参打包成一个元组,可以在函数内部代码块应用元组方法对收集参数进行操作;
def functionx(*vart):
for i in range(len(vart)):
print(f'实参{vart[i]},在收集参数元组中索引值是{vart.index(vart[i])}')
print(type(vart))
functionx('a','b','c')
实参a,在收集参数元组中索引值是0
实参b,在收集参数元组中索引值是1
实参c,在收集参数元组中索引值是2
<class 'tuple'>
收集参数-元组收集额外的位置参数,只能以位置参数实参录入,不能使用关键字参数实参录入;
收集参数之前定义的形参,如果收集参数有实参录入,则只能以位置参数实参录入,否则收集参数无法以位置参数实参录入;
收集参数之前定义的形参,如果收集参数没有实参录入,则可以同时使用位置参数或关键值参数实参录入;
def functionx(var1,*vart,var2,var3):
print(f'Waoh{var1}\nWaoh{var2}\nWaoh{var3}\nWaoh{vart}\n')
#收集参数-元组收集额外的位置参数,只能以位置参数实参录入,不能使用关键字参数实参录入
functionx(0,vart=(1,2,3,4),var2='a',var3='b')
Traceback (most recent call last):
File "<input>", line 1, in <module>
TypeError: functionx() got an unexpected keyword argument 'vart'
#收集参数之前定义的形参,如果收集参数有实参录入,只能以位置参数实参录入
functionx(0,1,2,3,4,5,6,var2='a',var3='b')
Waoh0
Waoha
Waohb
Waoh(1, 2, 3, 4, 5, 6)
#收集参数之前定义的形参,以关键值参数实参录入,则收集参数无法以位置参数实参录入
functionx(var1='x',1,2,3,4,var2='a',var3='b')
File "<input>", line 1
functionx(var1='x',1,2,3,4,var2='a',var3='b')
^
SyntaxError: positional argument follows keyword argument
#收集参数之前定义的形参,如果收集参数没有实参录入,则可以关键值参数实参录入
functionx(var1='x',var2='a',var3='b')
Waohx
Waoha
Waohb
Waoh()
收集参数之后定义的形参,在调用函数时使用关键参数指定,否则Python会把所有实参纳入到收集参数中;
收集参数之后定义的形参,如果没有设置默认值,且在调用时没有输入关键字实参,则报错;
def functionx(var1,*vart,var2,var3):
print(f'Waoh{var1}\nWaoh{var2}\nWaoh{var3}\nWaoh{vart}\n')
#收集参数之后的形参,不使用关键字调用,则未录入实参报错
functionx(0,1,2,3,4,5)
Traceback (most recent call last):
File "<input>", line 1, in <module>
TypeError: functionx() missing 2 required keyword-only arguments: 'var2' and 'var3'
#通过关键字调用收集参数之后的形参
functionx(0,1,2,3,var3=4,var2=5)
Waoh0
Waoh5
Waoh4
Waoh(1, 2, 3)
#收集参数之后的形参,设置默认值
def functionx(var1,*vart,var2='A',var3='B'):
print(f'Waoh{var1}\nWaoh{var2}\nWaoh{var3}\nWaoh{vart}\n')
functionx(0,1,2,3,4,5,6,7,8,9)
Waoh0
WaohA
WaohB
Waoh(1, 2, 3, 4, 5, 6, 7, 8, 9)
8. 收集参数-字典
若多个实参需要以字典形式输入函数,则在定义函数时,形参使用收集参数-字典实现,在形参前加上两个星号(**)即可;
收集参数-字典前可以定义位置参数、收集参数-元组,但之后则不可以定义任何形参;
收集参数-字典前声明的位置参数,可以通过关键字参数录入实参;
调用时,收集参数-字典的实参,通过key1=value1,key2=value2,key3=value3 的格式录入,注意此时key为字符串,不能带单引号和双引号;
实参录入时,直接录入字典、dict()函数、带二元元组元素的序列,都报错;
需要直接录入完整字典时,参见解包参数。
#位置参数 + 收集参数-元组 + 收集参数-字典,可以同时使用
def functionx(var1,*vart,**vard):
print(f'参数1:{var1},参数2:{vart}')
for i in range(len(vard)):
print(vard.popitem())
functionx(0,1,2,3,4,5,a=6,b=7,c=8)
参数1:0,参数2:(1, 2, 3, 4, 5)
('c', 8)
('b', 7)
('a', 6)
#收集参数-字典前声明的位置参数,可以通过关键字参数录入实参
def functionx(var1, *vart, **vard):
print(f'参数1:{var1},参数2:{vart},参数3:{vard}')
functionx(vart=(2,3,4),vard=3,var1=4)
参数1:4,参数2:(),参数3:{'vart': (2, 3, 4), 'vard': 3}
#收集参数-字典之后则不可以定义任何形参
def functionx(var1,**vard,var2):
print(f'参数1:{var1},参数2:{var2}')
for i in len(vard)
vard.popitem()
File "<input>", line 1
def functionx(var1,**vard,var2):
^
SyntaxError: invalid syntax
def functionx(var1,**vard1,**vard2):
print(f'参数1:{var1},参数2:{var2}')
for i in len(vard)
vard.popitem()
File "<input>", line 1
def functionx(var1,**vard1,**vard2):
^
SyntaxError: invalid syntax
#实参录入时,直接录入字典、dict()函数、带二元元组元素的序列,都报错
functionx({'a':1,'b':2})
Traceback (most recent call last):
File "<input>", line 1, in <module>
TypeError: functionx() takes 0 positional arguments but 1 was given
functionx(dict({'a':1,'b':2}))
Traceback (most recent call last):
File "<input>", line 1, in <module>
TypeError: functionx() takes 0 positional arguments but 1 was given
functionx([('a',1),('b',2)])
Traceback (most recent call last):
File "<input>", line 1, in <module>
TypeError: functionx() takes 0 positional arguments but 1 was given
9. 解包参数
当函数定义多个形参,需要将序列或字典作为实参直接录入函数时,可以通过解包参数,即在序列实参前加上星号(*),或在字典实参前加上两个星号(**)进行解包;
不仅可以对收集参数录入解包的序列、字典,对于多个位置参数也可以通过解包序列录入,但需要注意解包元素数量如果与形参数量不一致,则报错;
字典解包录入位置参数或收集参数-元组时,录入的是键。
#当函数定义多个形参,需要将序列或字典作为实参直接录入函数时,可以通过解包参数录入
def functionx(*vart,**vard):
for i in range(len(vart)):
print(f'参数:{vart[i]},索引为:{vart.index(vart[i])}')
for i in range(len(vard)):
print(vard.popitem())
str1 = 'ac 1.&'
dic1 = {'a':1,2:[1,2,'34']}
functionx(*str1,**dic1)
参数:a,索引为:0
参数:c,索引为:1
参数: ,索引为:2
参数:1,索引为:3
参数:.,索引为:4
参数:&,索引为:5
('b', [1, 2, '34'])
('a', 1)
#多个位置参数可以通过解包序列录入
def functiony(var1,var2,var3):
print(f'参数1:{var1},参数2:{var2},参数3:{var3}')
s = [1,2,3]
functiony(*s)
参数1:1,参数2:2,参数3:3
#解包元素数量如果与形参数量不一致,则报错
s = [1,2,3,4]
functiony(*s)
Traceback (most recent call last):
File "<input>", line 1, in <module>
TypeError: functiony() takes 3 positional arguments but 4 were given
s = [1,2]
functiony(*s)
Traceback (most recent call last):
File "<input>", line 1, in <module>
TypeError: functiony() missing 1 required positional argument: 'var3'
#字典解包录入位置参数或收集参数-元组时,录入的是键
def functiony(var1,var2,var3):
print(f'参数1:{var1},参数2:{var2},参数3:{var3}')
d = {'a':1,'b':2,'c':3}
functiony(*d)
参数1:a,参数2:b,参数3:c

这篇博客详细介绍了Python函数的参数类型,包括位置参数、关键字参数、默认参数、'/ '字符的作用、'*'参数、收集参数(元组和字典)以及解包参数的使用规则和注意事项。
1240

被折叠的 条评论
为什么被折叠?



