1. 程式人生 > >Python中函式引數傳遞

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學習交流群:548377875