文章目录
- 1.Python函数中各种参数的汇总
- 1.1.常规参数
- 1.2.参数设置默认值
- 1.3.强制传参时使用关键字传参
- 1.4.个数可变的形参
- 1.5.将序列中的每个元素都转换为位置实参
- 1.6.将字典中的每个元素都转换为关键字实参
- 2.小案例练习Python中的各种函数参数
- 2.1.案例一
- 2.2.案例二
1.Python函数中各种参数的汇总
1.1.常规参数
常规参数也是必须指定的参数,如果不指定位置形参或者关键字形参,那么函数的功能就太单一了,只能做一件事。
1)位置形参
在定义函数时设置几个形参,然后调用时传入位置实参。
def pos_trans(pos1, pos2, pos3):
posformat = 'pos1 = {}, pos2 = {}, pos3= {}'
print(posformat.format(pos1, pos2, pos3))
pos_trans('jiangxl', 'K8S', 'Python')
2)关键字形参
在定义函数时还是设置几个形参,只是调用函数时传参的方式不同。
def para_trans(para1, para2, para3):
paraformat = 'para1 = {}, para2 = {}, para3= {}'
print(paraformat.format(para1.capitalize(), para2.capitalize(), para3.capitalize()))
para_trans(para1 = 'jiangxl', para2 = 'k8s', para3 = 'python' )
1.2.参数设置默认值
可以在定义函数时,为某个形参设置默认值,即使不给这个形参传入实参,也不会抛出异常,而是使用默认值,一般情况下,变动小的形参会为其设置一个默认值。
def fun1(para1, para2 = 'k8s'):
funformat = 'para1为:{}, para2为:{}'
print(funformat.format(para1, para2))
fun1('haha')
1.3.强制传参时使用关键字传参
在定义函数时使用*
可以定义一个关键字形参,调用函数时就必须使用关键字传参的方式传递实参。
def fun1(para1, para2, *, para3, para4):
funformat = 'para1为:{}, para2为:{}, para4为:{}, para5为:{}'
print(funformat.format(para1, para2, para3, para4))
fun1('k8s', 'istio', para3 = 'helm', para4 = 'rancher')
1.4.个数可变的形参
在函数定义时,形参前面添加一个*
表示定义一个个数可变的位置形参,添加两个*
表示定义一个个数可变的关键字形参。
1)个数可变的位置形参
def fun1(*args):
print(args)
fun1(1)
fun1(1, 2)
fun1('jiangxl', 1, 2)
2)个数可变的关键字形参
def fun1(**kwargs):
funformat = 'kwargs:{}'
print(funformat.format(kwargs))
fun1()
fun1(user = 'jiangxl')
fun1(user = 'jiangxl', age = 26, passwd = '1234567')
1.5.将序列中的每个元素都转换为位置实参
在调用函数时,如果传入的参数是序列,并且希望将序列中的每个元素都转换为独立的位置实参,那么就在序列前添加一个*号。
def fun1(para1, para2, para3):
funformat = 'para1为:{}, para2为:{}, para3为:{}'
print(funformat.format(para1, para2, para3))
mylist = ['jiangxl', 'wangwu', 'zhangsan']
fun1(*mylist)
1.6.将字典中的每个元素都转换为关键字实参
在调用函数时,如果传入的参数是字典,并且希望将字典中的每个元素都转换为独立的关键字实参,那么就在序列前添加两个*号。
def fun2(**kwargs):
funformat = 'kwargs:{}'
print(funformat.format(kwargs))
mydict = {'user': 'jiangxl', 'age': '26', 'passwd': '123456'}
fun2(**mydict)
2.小案例练习Python中的各种函数参数
2.1.案例一
在下面这个函数中,运用到了位置实参、默认值、个数可变的位置形参、个数可变的关键字形参。
def fun1(para1, para2='default', *args, **kwargs):
funformat = 'para1为:{}, para2为:{}, args为:{}, kwargs为:{}'
print(funformat.format(para1, para2, args, kwargs))
fun1('jiangxl', 'Python', 1, 2, 3, 4, 5, user='wanger', passwd='123456')
fun1('jiangxl', 'Python', *[1, 2, 3, 4, 5], **{'user': 'wanger', 'passwd': '123456'})
我们来分析传参的结果:
首先jiangxl会传给para1形参。
para2形参定义了默认值,但是我们没有用,Python会传给para2形参
*args是个数可变的位置形参,可以接收0到多个位置实参,1, 2, 3, 4, 5这几个实参会传给args形参。
**kwargs是个数可变的关键字形参,可以接收0到多个关键字实参,user = ‘wanger’, passwd = '123456’会穿个kwargs形参。
其中*[1, 2, 3, 4, 5]
等同于1, 2, 3, 4, 5
,**{'user': 'wanger', 'passwd': '123456'}
等同于user = 'wanger', passwd = '123456'
因此调用函数时传参方法虽然看不同,但是返回值是一样的。
如果调用函数时,只传入一个实参,那么这个实参就会传给para1实参,para2形参则会用指定的默认值作为实参,agrs则会返回一个空元组,kwargs则会返回一个空字典。
fun1(1)
#输出结果:para1为:1, para2为:default, args为:(), kwargs为:{}
2.2.案例二
在下面这个函数中,运用到了位置实参、默认值、强制使用关键字传参、个数可变的关键字形参。
def fun2(para1, para2='default', *, para3, **kwargs):
funformat = 'para1为:{}, para2为:{}, para3为:{}, kwargs为:{}'
print(funformat.format(para1, para2, para3, kwargs))
fun2(*('jiangxl', 'Python'), **{'para3': 'haha', 'user': 'wanger', 'passwd': '123456'})
我们来分析传参的结果:
- 第一个参数
*('jiangxl', 'Python')
,这里利用*将序列中的元素转换成了位置实参,然后分别传给了para1形参和para2形参,para2形参设置了默认值,会覆盖掉其默认值。- 第二个参数
**{'para3': 'haha', 'user': 'wanger', 'passwd': '123456'}
,这里利用两个*将字典中的键值对元素转换成了独立的关键字实参,分别传入函数中对于的形参中,第一组键值对'para3': 'haha'
就会转换成para3 = haha
,从而传递给para3实参,其余剩下的键值对会传给**kwargs
个数可变的关键字形参。
如果仅传入一个位置实参,后续全用关键字实参的话,para2形参将会使用默认值,因为第一个位置实参传递给了para1形参,后面全是关键字实参了,第一个关键字实参传递给para3,其余的关键字实参传递给kwargs形参。
fun2('jiangxl', **{'para3': 'haha', 'user': 'wanger', 'passwd': '123456'})