上一篇我们介绍了python函数的一些定义和基本的构成。 接下来我们介绍下函数的参数。
什么是函数的参数呢?
当我们定义函数的时候,经常会希望函数能够处理我们传入的数据。
这样可以更具有灵活性和通用性。
传给函数数据时,我们就会使用到参数。
参数有两种:形参(形式参数),实参(实际参数)。
5.3.1 参数
参数用来把数据传给函数,让函数利用这个数据来执行
- 参数的特点:
- 参数可以是多个
- 严格按照顺序传参数:位置方式传参
- 定义了几个参数就得传几个
- 实际参数可以传任意类型
1. 形参和实参
形参-形式参数:在函数定义时定义的参数就是形参。
实参-实际参数:当调用函数是,交给函数的参数就是实际参数。
下面简单的代码来举例:
def get_list_first_data(aaa): # aaa叫做形参(形式参数)
v = [11,22,33,44]
print(v[aaa])
get_list_first_data(1) # 1叫做实参(实际参数)
执行结果:
22
定义的形参(定义的是默认参数,万能参数的情况除外)和传入的实参需要数量相符。
2. 默认参数(default parameter)
默认参数:设置了默认值得参数。
- 默认参数规则:
- 默认参数必须定义在非默认参数之后(原因:不放在后面传入实参的时候会混乱)
参数的默认值,如果是可变类型,---有坑
def func(a1, a2=9): # a2默认值是9。a2(default parameter)必须定义在在a1(non-default parameter)的后面
pass
# 调用
func(1) # a1=1,a2=9
func(2,3) # a1=2,a2=3
3. 位置传参(positional arg),关键字传参(key arg)
位置参数:按定义的顺序传入参数(不使用关键字)。
关键字参数(又称关键参数,指定参数):指定关键字(形参名)来传入参数。关键参数不用按顺序传入。
- 传入实参的原则:
- 【实参:位置传参在前,关键字传参在后】
def func1(a1,a2,a3=1,a4=2):
print(a1,a2,a3,a4)
func1(11,22) # 位置传参a1=11,a2=22。默认参数a3=1,a4=2
func1(11,22,33) # 位置传参
func1(11,22,33,44) # 位置传参
func1(11,a2=22,a3=33) # a2=22,a3=33是关键字传参
# func1(11,a2=22,33) # 报错,关键字后面的参数也必须有关键字
4. 万能参数(非固定参数) \'*\' (元组)
参数一般命名为\'*args\',这个参数可以接受任意个位置参数,并转换为元组(即使只有一个元素也会转换)传入函数。
参数名可以自定义,但是推荐用args
不确定这个函数接受多少参数的时候使用
- 一般命名为 *args
- *args 可以接受任意参数,并将参数转换成元组。
- 有 * :将实参的元素循环放入元组(可以使列表,元组)
- 无 * :将实参本身放入元组
- *args 只支持位置传参
def func1(*args): # 一般情况下万能参数推荐命名为 *args
print(args) # 调用的时候不要 *
func1(1,2) # 输出元组(1,2)
# 无*和有*
func1((11,22,33,44,55)) # 输出元组套元组((11, 22, 33, 44, 55),)
func1(*(11,22,33,44,55)) # \'*\'将元素循环放入*参数的元组中(打散放入),输出(11, 22, 33, 44, 55)
func1(1,2,*[11,22,33],*(111,222,333),*{1111,2222}) # 列表,元组,集合都能拆开放进去。注意集合无序
输出结果:
(1, 2)
((11, 22, 33, 44, 55),)
(11, 22, 33, 44, 55)
(1, 2, 11, 22, 33, 111, 222, 333, 2222, 1111)
一般参数和万能参数一起用:
- 同样适用于【实参:位置参数在前,关键字参数在后的原则】
def func2(a1, *args):
print(a1, args)
func2(1,2,3,4,5,a2=6) # 当参数在万能参数后面,只能用关键字传参。 很少用
# a1=1,args=(2,3,4,5),a2=6
5. 万能参数(非固定参数) \'**\' (字典)
参数一般命名为\'**kwargs\',这个参数可以接受任意个关键字参数,并转换为字典传入函数。
- 一般命名为**kwargs
- 只能用关键字传参
- **kwargs 可以接受任意个关键字参数,并将参数转换成字典。
- 有 ** : 可以直接传入一个字典
- 没 ** : 只能以关键字参数追加到字典中
def func1(**kwargs):
print(kwargs)
func1(k1=\'a\',k2=123) # {\'k1\':\'a\', \'k2\':123}
# 有**和无**
func1(**{\'k1\':\'a\', \'k2\':123}) # {\'k1\':\'a\', \'k2\':123}
func1(k1={\'k1\':\'a\', \'k2\':123},k2=123) # {\'k1\':{\'k1\':\'a\', \'k2\':123}, \'k2\':123}
func1(k1=1,**{\'k2\':2,\'k3\':3}) # 这个违背了关键字参数在后的原则,不过很少见
执行结果:
{\'k1\': \'a\', \'k2\': 123}
{\'k1\': \'a\', \'k2\': 123}
{\'k1\': {\'k1\': \'a\', \'k2\': 123}, \'k2\': 123}
{\'k1\': 1, \'k2\': 2, \'k3\': 3}
一般*args和**kwargs 一般会一起出现
def func1(*args,**kwargs):
print(args,kwargs)
func1(*[1,2,3],k1=2,k2=3,k3=4)
func1(*[1,2,3],**{\'k1\':2,\'k2\':3})
func1(111,222,*[1,2,3],k1=\'aaa\',**{\'k2\':\'bbb\',\'k3\':\'ccc\'})
执行结果:
(1, 2, 3) {\'k1\': 2, \'k2\': 3, \'k3\': 4}
(1, 2, 3) {\'k1\': 2, \'k2\': 3}
(111, 222, 1, 2, 3) {\'k1\': \'aaa\', \'k2\': \'bbb\', \'k3\': \'ccc\'}
6. 常用函数方式
- 定义函数
def func1(a1,a2):
pass
def func2(a1,a2=None):
pass
def func3(*args,**kwargs):
pass
- 调用函数 原则:【实参:位置传参在前,关键字传参在后】
以上就是python中关于参数的一些介绍。
下一篇我们介绍一下函数的返回值。