Python 優雅的使用參數 - 可變參數(*args & **kwargs)

轉載自:https://n3xtchen.github.io/n3xtchen/python/2014/08/08/python-args-and-kwargs

寫在前面的話

傳遞參數的行爲對於現在編程語言來說,再尋常不過的概念

參數(英語:parameter)是使用通用變量來建立函數和變量之間關係(當這種關係很難用方程來闡述時)的一個數量。 - 來自 wikipedia

先來看一個例子:

# 來源於 https://docs.python.org/2/library/itertools.html
def chain(*iterables):
    for it in iterables:
        for element in it:
            yield element

大家可能注意到 *iterables 了,對了,就是他, 不定參數

>>> from itertool import chain
>>> chan([1,2], [2, 3])                # 你可以這麼用
[1, 2, 2, 3]
>>> chan([1,2], [2, 3], [4, 5])        # 你還可以這麼用
[1, 2, 2, 3, 4, 5]
>>> chan([1,2], [2, 3], [4, 5])        # 你也可以這麼用
[1, 2, 2, 3, 4, 5]
... // 隨心所欲的加參數

很神奇把,(^_^)v,來講講枯燥的概念把!

可能很多人用了幾年的 Python 都沒真正使用過可變參數,就比如我,爲了學寫通用模塊,就會對它有需求;或許你經常看 Python 模塊庫代碼,會發現很多函數的參數定義,都會跟上 *args**kwargs(不定參數的另一種形式,後面會講到)。

在計算機程序設計,一個可變參數函數是指一個函數擁有不定引數,即是它接受一個可變量目的參數。 - 來自 wikipedia

通俗的說就是,函數可以處理不同數量的參數。

在我看來,幾乎80%的使用可變參數列表的場景,都可以使用數組和字典來解決。但是使用可變參數列表的函數可以提供一種數組和字典無法提供的東西:優雅

*args

def argsFunc(a, *args):
    print a
    print args

>>> argsFunc(1, 2, 3, 4)
1
(2, 3, 4)

argsFunc 中匹配完定義好的參數,剩餘的參數以元組的形式存儲在 args(args 名稱你可以自行定義),因此在上述程序中只要你傳入不小於 1 個參數,該函數都會接受,當然你也可以直接定義只接受可變參數,你就可以自由傳遞你的參數:

def argsFunc(*my_args):
    print my_args

>>> argsFunc(1, 2, 3, 4)
(1, 2, 3, 4)
>>> argsFunc()
()

很簡單把,現在來將另一個種不定參數形式

**kwargs

形參名前加兩個*表示,參數在函數內部將被存放在以形式名爲標識符的 dictionary 中,這時調用函數的方法則需要採用 arg1=value1,arg2=value2 這樣的形式。

爲了區分,我把 *args 稱作爲數組參數,**kwargs 稱作爲字典參數

>>> def a(**x):print x
>>> a(x=1,y=2,z=3)
{'y': 2, 'x': 1, 'z': 3} #存放在字典中

不過,有個需要注意,採用 **kwargs 傳遞參數的時候,你不能傳遞數組參數

>>> a(1,2,3) #這種調用則報錯
Traceback (most recent call last):
        File "<stdin>", line 1, in <module>
TypeError: a() takes exactly 0 arguments (3 given)

同樣很簡單,但是我們什麼時候可以用到他呢?

import mysql.connector  

db_conf = {
    user='xx',
    password='yy', 
    host='xxx.xxx.xxx.xxx',
    database='zz'
}

cnx = mysql.connector.connect(
    user=db_conf['user'],
    password=db_conf['password'], 
    host=db_conf['host'],
    database=db_conf['database']
    )
...

相比,使用 Mysql Python 庫時候,經常看到這個樣子的代碼,db_conf 一般都從配置文件讀取,這是優雅的不定字典參數就派上用途了!

import mysql.connector  

db_conf = {
    user='xx',
    password='yy', 
    host='xxx.xxx.xxx.xxx',
    database='zz'
}

cnx = mysql.connector.connect(**db_conf)
...

怎樣,是不是順眼多了,代碼也省了不少!^_^

今天就到這裏了,很早就開始寫這一篇了,不想像網路上的大部分博客,只是寫一個使用文檔類型的教程,看完就忘了。

適當的考慮應用場景,希望能印象深刻。學會,就儘可能的使用它;再優雅的概念,不用也是百搭。

The End

參考 * Python中函數的參數定義和可變參數 * Python函數中定義參數的四種方式 * wiki - 參數 * 【C/C++ 語法備忘】4、可變參數列表

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章