您好,登錄后才能下訂單哦!
本篇內容主要講解“怎么使用python不定長參數*args和**kwargs”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“怎么使用python不定長參數*args和**kwargs”吧!
在python語言寫成的模塊中的函數里,常常可以看到函數的參數表列里面有這兩個參數,形如:
def some_function(*args, **kwargs): to do list return 0
首先,解釋星號的作用,一個星號*
的作用是將tuple或者list中的元素進行unpack,分開傳入,作為多個參數;兩個星號**
的作用是把dict類型的數據作為參數傳入。
kwargs是keyword argument的縮寫,args就是argument。我們知道,在Python中有兩種參數,一種叫位置參數(positional argument),一種叫關鍵詞參數(keyword argument),關鍵詞參數只需要用 keyword = somekey 的方法即可傳參,而位置參數只能由參數位置決定。這也就決定了位置參數一定要在前面,否則關鍵詞參數數量的變化(比如有些kwargs有默認值因此沒有傳參或者在后面傳參的),都會使得位置無法判斷。因此常見的也是*args
在 **kwargs
前面。
1、怎么理解不定長參數?
2、*args
和 **kwargs
是什么意思?為什么要使用它們?
1、函數參數可為分如下幾種:必選參數、默認參數、可變參數、命名關鍵字參數和關鍵字參數
2、當我們在定義和調用一個函數時,如果包含所有的參數類型,則必須按照:必選參數、默認參數、可變參數、命名關鍵字參數和關鍵字參數的順序。但是在實際開發中,不建議包含過多的參數類型,會影響代碼的可讀性
3、必選參數很簡單,就是函數中必須要接受的參數
4、默認參數,即給參數賦一個默認值,我們在傳遞時,可省略對該參數的傳值操作。如:
def print_test(title, msg="world"): print(title, msg) print_test("hello") # hello world print_test("hello", "demon") # hello demon print_test("hello", msg="demon") # hello demon # 錯誤調用示例 # print_test( msg="demon","hello") # 這樣是不對的
5、可變參數,在定義函數是用 *args 來接受,其中 * 是規定的,args可用其他名稱替換,但一般習慣用 args 來表示。可變參數在傳入函數后,被封裝成一個 tuple 來進行使用。所以我們在函數內部,可以通過操作 tuple 的方法來操作參數,示例如下:
def print_numbers(*args): print(type(args)) # tuple for n in args: print(type(n)) # int print_numbers(1, 2, 3, 4)
6、如果在函數外已經得到一個 list 或者 tuple,想調用一個可變參數,也可以用 *+變量名 的形式進行調用,(這種用法有點類似 C語言 中的指針),示例如下:
def print_numbers(*args): print(type(args)) # tuple for n in args: print(type(n)) # int l = [1, 2, 3, 4] print_numbers(*l) # *l,等價于 print_numbers(1, 2, 3, 4) print_numbers(l) # 將 l 作為一個整體傳入,這樣函數接受到的其實只有一個參數,且參數類型為 list
7、關鍵字參數使用 kwargs 來標識,是規定,而kwargs可替換,它將不定長參數轉換為 dict 傳入函數。它用于擴展函數的功能。比如我們要實現用戶注冊,有必輸項和非必輸項,這些非必輸項就可以用關鍵字參數來接受。示例如下:
def register(name, email, **kwargs): print('name:%s, age:%s, others:%s', (name, email, kwargs)) register("demon", "1@1.com") # name:%s, age:%s, others:%s ('demon', '1@1.com', {}) register("demon", "1@1.com", addr="shanghai") # name:%s, age:%s, others:%s ('demon', '1@1.com', {'addr': 'shanghai'})
8、如果函數外已經獲得一個 dict ,想進行函數調用,只需用 **+變量名 傳入即可。并且 dict示例如下:
def register(name, email, **kwargs): print('name:%s, age:%s, others:%s', (name, email, kwargs)) d = {"addr":"shanghai"} register("demon", "1@1.com", **d) d = {"name":"yrr", "email":"1@1.com", "addr":"shanghai"} register(**d) d = {"email":"yrr", "name":"1@1.com", "addr":"shanghai"} register(**d)
9、命名關鍵字參數用于限制調用函數可傳入的屬性。這里的限制是假限制,因為仍然可以傳入,只是函數體中對限制外的參數不作任何處理。命名關鍵字參數用一個 * 號分隔,* 后面的參數都被視為命名關鍵字參數。如:
def person(name, age, *, city, job): print(name, age, city, job)
10、如果函數中已經有了一個可變參數的定義,后面的命名關鍵字參數則不需要再添加 * ,如:
def person(name, age, *args, city, job): print(name, age, args, city, job)
11、關鍵字參數和命名關鍵字參數在調用時必須用 key=value 的形式來調用,這類參數我們稱之類名稱參數,而不需要指定參數名稱的參數,也稱為位置參數。必輸參數和可變參數都可以通過位置參數來匹配。如:
def register(name, email, **kwargs): print('name:%s, age:%s, others:%s', (name, email, kwargs)) # 錯誤調用: register("123","123","123") # 它會把第三個參數 "123">
12、最后一個比較特殊,也是一個結論:對于任意函數,都可以通過func_name(*args, **kw)的形式來進行調用其中 args 是一個已經獲得的列表或者元組,而 kw 是一個已經獲得的字典。列表傳入會按順序對必輸參數賦值,多余的參數會當成可變參數傳入,而字典傳入會根據 key 來匹配所有參數。如:
def test1(a, b, c=0, *args, **kwargs): print('a =', a, 'b =', b, 'c =', c, 'args =', args, 'kw =', kwargs) def test2(a, b, c=0, *args, d, **kwargs): print('a =', a, 'b =', b, 'c =', c, 'd =', d, 'args=', args, 'kw =', kwargs) # 定義一個元組和字典用作參數傳入 args = (1, 2, 3, 4) kw = {'d': 99, 'x': '#'} test1(*args, **kw) # a = 1 b = 2 c = 3 args = (4,) kw = {'d': 99, 'x': '#'} test2(*args, **kw) a = 1 b = 2 c = 3 d = 99 args= (4,) kw = {'x': '#'}
到此,相信大家對“怎么使用python不定長參數*args和**kwargs”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。