前情提要
函数
- 使用函数时,记得要写函数后面的冒号
- 传参数时注意要与形参格式相同个数也想同,当形参赋为固定值时可以传进个数不同的参数
- 但你不确定你要输入多少个时可以用“ *形参名 ”或者“ **形参名 ”(这个是传进去键值对)
- 当有多个输出值时,有相应个元素接收就可以
实参
分为两种:
1、位置参数,必须一一对应,缺一不行多一也不行
2、关键词参数,无需一一对应,缺一不行多一也不行
def test(x,y,z):
print(x)
print(y)
print(z)
print("位置参数")
test(1,2,3)
print("关键词参数")
test(y=1,x=3,z=4)
结果:
位置参数
1
2
3
关键词参数
3
1
4
函数中的*args **kwargs有什么区别?
1、*args是列表 **kwargs是字典
2、def test(x,*args **kwargs)的位置是固定的
举例:
注:
args以元组的方式去存储,
1、当你写一个功能的时候,为后期留下可扩展性。
2、在你调用的时候你不确定到底传几个值
1、
def test(x,*args):
print(x)
print(args)
print(args[0])
test(1,2,3,4,5)
结果:
1
(2, 3, 4, 5)
2
2、传的值只要是按位置参数的方式给形参传值,多余的都会按照一个整体的列表形式存储
test(1,{'name':'alex','age':18})
test(1,['x','y','z'])
结果:
1
({'name': 'alex', 'age': 18},)
{'name': 'alex', 'age': 18}
1
(['x', 'y', 'z'],)
['x', 'y', 'z']
3、想以2,3,4,5的形式把x,y,z传进去
test(1,*['x','y','z'])
结果:
1
('x', 'y', 'z')
x
4、以关键字的方式传,会出现错误
原因:*args 处理的只是位置参数,把未知参数处理成列表的形式
test(1,y=2,z=3)
结果:
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-5-1ad824fe3d24> in <module>()
1 #以关键字的方式传
----> 2 test(1,y=2,z=3)
TypeError: test() got an unexpected keyword argument 'y'
5、若想要传关键词参数时,要用到**kwargs
def test1(x,**kwargs):
print(x)
print(kwargs)
test1(1,y=2,z=3)
结果:
1
{'y': 2, 'z': 3}
6、位置参数必须在关键词参数的左边
test1(1,y=2,z=3,1,2)
结果:
File "<ipython-input-10-fa987fd6f2fc>", line 2
test1(1,y=2,z=3,1,2)
^
SyntaxError: positional argument follows keyword argument
7、注意个数
test1(1,2,1,2,y=2)
结果:
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-16-a164592a7fac> in <module>()
----> 1 test1(1,2,1,2,y=2)
TypeError: test1() takes 1 positional argument but 4 were given
8、一个参数不能传两遍
test1(1,y=2,z=3,z=2)
结果:
File "<ipython-input-17-060e23d5720f>", line 2
test1(1,y=2,z=3,z=2)
^
SyntaxError: invalid character in identifier
9、def test(x,args **kwargs)的位置是固定的
原因:
<1>这种形式本身就不允许,因为args接收的是位置参数,
<2>而位置参数不可以出现在关键词参数的右侧
def test3(x,**kwargs,*args):
print(x)
print(kwargs)