Python中函数参数传递

前几天写一个方法的时候,内部调用了第三方库的可变参数方法,由于实际的需求,导致参数越写越长,很不方便。这时是不是我们自己也应该写一个可变参数的方法,然后根据需要动态传递参数?

在解决这个问题之前,我们先来了解Python中四种传递参数的形式:

fun1(a, b, c)
fun2(a=1, b=2, c=3)
fun3(*args)
fun4(**kargs)

我们分别简单介绍一下这四种基本的使用方式。

  • 第一种:fun1(a, b, c)它是直接将实参赋予形参,根据位置做匹配,严格要求实参的数量与形参的数量位置相等。
  • 第二种:fun2(a=1, b=2, c=3)根据键值对的形式实现参数的匹配,可以忽略参数的位置关系,直接根据关键字来进行赋值。同时,它可以使用默认参数,例如fun2(a=10), 那么b=2和c=3就是默认参数。
  • 第三种:fun3(*args),这种方式可以传递任意个参数,这些参数都会放到一个tuple元组中赋值给args。我们在函数内直接操作tuple元组就可以取出参数,这样的好处是参数不受到限制,但本身还是有次序的
  • 第四种:fun4(**kargs),它是以键值对字典的形式传递参数,它的参数数量和位置都不受限制。

其中,第一种和第二种调用方式,我很熟悉。而第三种和第四种,还没怎么用过,下面简单示范下:

def print1(*args):
    print('print1: 姓名: {}, 地址: {}'.format(args[0], args[1]))

def print2(**kwargs):
    print('print2: 姓名: {}, 地址: {}'.format(kwargs['name'], kwargs['address']))

print1('jack', '中关村')
print2(name='jack', address='中关村')

输出:

print1: 姓名: jack, 地址: 中关村
print2: 姓名: jack, 地址: 中关村

为了方便,我们还可以将这几种方式混用。例如,下面的show_info(),我们必传参数是name,city是默认参数,而其他一些参数,我们可以使用**kwargs可变参数的形式传递进去。示例如下:

def show_info(name, city='北京', **kwargs):
    print(name, city, kwargs)

show_info('Jack', city='上海', height='1.8')

好了,现在我们回到前面提出的问题,我们如何写一个内部调用可变参数方法的函数,动态的将参数传递给内部方法?

其实,念起来绕口,实现起来很简单,看下面示例:

def print1(*args):
    print('print1: 姓名: {}, 地址: {}'.format(args[0], args[1]))

def print2(**kwargs):
    print('print2: 姓名: {}, 地址: {}'.format(kwargs['name'], kwargs['address']))

def print3(*args):
    print1(*args)

def print4(**kwargs):
    print2(**kwargs)

print3('jack', '中关村')
print4(name='jack', address='中关村')

这样,上面print3()调用了print1()print4()调用了print2(),成功的将可变参数从外部传递进去。

总结

主要记录了下函数传递的四种方式,以及如何使用可变参数。虽然是小的知识点,但可以让代码实现起来更优雅。

参考

python函数的四种参数传递方式

    原文作者:liuchungui
    原文地址: https://www.jianshu.com/p/c998e4c5756e
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞