函数参数:
1、形参变量
只有在被调用时才分配内存单元,在调用结束时,即刻释放所分配的内存单元。因此,形参只在函数内部有效。
函数调用结束返回主调用函数后则不能再使用该形参变量;
2、实参变量
可以是常量、变量、表达式、函数等,无论实参是何种类型的量,在进行函数调用时,它们都必须有确定的值,
以便把这些值传送给形参。因此应预先用赋值、输入等办法使参数获得确定值。
例如:
#函数调用时,使用形参
def calc(x,y):
res=x**y
return res
#实参,下面的a,b都是实参
a=3
b=4
c=calc(a,b)
print(c)
位置参数:
在调用函数,传递参数的时候,每个实参与形参需要一一对应的关系;
在这期间实参就是位置参数;
此时并没有具体指定哪个实参要传递给哪个形参;
此时实参与形参之间是一一对应的关系;
例如:
def test(x,y,z) #x=1,y=2,z=3
...
c=test(1,2,3)
关键字参数:
当调用函数时,具体指定了哪个形参接收具体的参数时,此时叫做关键字参数
关键字参数时位置不是一一对应;
例如:
def test(x,y,z) #x=4,y=9,z=2
...
c=test(z=2,x=4,y=9)
#位置参数与关键字参数的混搭使用:
注意:
要混搭使用时,位置参数必须要在关键字参数的左边。
例如:
def test(x,y,z):
print(x)
print(y)
print(z)
c=test(1,3,z=2)
默认参数:
形参可以设置默认参数,不必等待实参传递进来值;
如果已有默认参数时,实参仍旧传递参数给形参,则已有的默认值被覆盖
例如:
def handle(x,y='mysql'):
print(x)
print(y)
handle(x=9)
返回结果:
9
mysql
def handle(x,y='mysql'):
print(x)
print(y)
handle(x=9,y='sqlite')
返回结果:
9
sqlite
非固定长度参数:
形参接收变量时,可以一次接收许多参数;
这些参数可以使用非固定长度参数来接收;
使用:*args
不一定非得使用*args,可以定义别的;
但是,规定最好使用*args
例如:
注意:之前提到过,**字典、*列表
args会被当作一个列表处理,*args就是去遍历这个列表
def test(x,*args):
print(x)
print(args)
print(args[0])
test(1,2,3,4,5,6)
返回结果:
1
(2, 3, 4, 5, 6)
2
例如:传递了字典
def test(x,*args):
print(x)
print(args)
test(1,{'name':'alex','age':19})
返回结果:
1
({'age': 19, 'name': 'alex'},)
例如:传递了元组
def test(x,*args):
print(x)
print(args)
test(1,(1,2,3,))
返回结果:
1
((1, 2, 3),)
例如:传递列表
def test(x,*args):
print(x)
print(args)
test(1,[1,2,3,4])
返回结果:
1
([1, 2, 3, 4],)
例如:传递列表,可以用args从列表中取值
def test(x,*args):
print(x)
print(args)
print(args[0][0])
test(1,[1,2,3,4])
返回结果:
1
([1, 2, 3, 4],)
1
例如:想从args中单独把每个列表的元素取出来
那就需要在列表前面加*
def test(x,*args):
print(x)
print(args)
print(args[0])
test(1,*['x','y','z'])
返回结果:
1
('x', 'y', 'z')
x
结论:如果不加*则表示把参数当作整体传给args
args会把参数作为一个整体当作元组的第一部分
**kwargs
用于接收传递进来的类似字典形式的参数
字典形式的参数并非如:key:value样式
例如:
def test(x,**kwargs):
print(x)
print(kwargs)
test(1,y=2,z=3)
返回结果:
1
{'z': 3, 'y': 2}
综合使用:*args **kwargs
def test(x,*args,**kwargs):
print(x)
print(args)
print(kwargs)
test(1,2,3,4,5,6,7,y=3,z=9)
返回结果:
1
(2, 3, 4, 5, 6, 7)
{'y': 3, 'z': 9}
例如:可以做任何处理
def test(x,*args,**kwargs):
print(x)
print(args)
print(args[-1])
print(kwargs)
print(kwargs['y'])
test(1,2,3,4,5,6,7,y=3,z=9)
返回结果:
1
(2, 3, 4, 5, 6, 7)
7
{'y': 3, 'z': 9}
3
例如:传递列表及字典
def test(x,*args,**kwargs):
print(x)
print(args)
print(args[-1])
print(kwargs)
print(kwargs["k1"])
test(1,*[1,2,3],**{"k1":"v1"})
返回结果:
1
(1, 2, 3)
3
{'k1': 'v1'}
v1