第55讲:Python函数形参、实参的语法格式汇总以及应用小案例

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形参。

image-20220822164517507

其中*[1, 2, 3, 4, 5]等同于1, 2, 3, 4, 5**{'user': 'wanger', 'passwd': '123456'}等同于user = 'wanger', passwd = '123456'因此调用函数时传参方法虽然看不同,但是返回值是一样的。

image-20220822163537881

如果调用函数时,只传入一个实参,那么这个实参就会传给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个数可变的关键字形参。

image-20220822165716590

如果仅传入一个位置实参,后续全用关键字实参的话,para2形参将会使用默认值,因为第一个位置实参传递给了para1形参,后面全是关键字实参了,第一个关键字实参传递给para3,其余的关键字实参传递给kwargs形参。

fun2('jiangxl', **{
    
    'para3': 'haha', 'user': 'wanger', 'passwd': '123456'})

image-20220822165921591

猜你喜欢

转载自blog.csdn.net/weixin_44953658/article/details/130981428
今日推荐