Python中函式引數傳遞
阿新 • • 發佈:2019-02-04
前幾天寫一個方法的時候,內部呼叫了第三方庫的可變引數方法,由於實際的需求,導致引數越寫越長,很不方便。這時是不是我們自己也應該寫一個可變引數的方法,然後根據需要動態傳遞引數?
在解決這個問題之前,我們先來了解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