《詭野西部》異者的盒子用途介紹 異者的盒子裡有什麼
在Python中設定一個函式時,常見的引數型別分為:位置引數、預設引數、關鍵字引數、不定長引數。當我們不明確所定義的函式到底要傳遞多少個引數時,就可以使用不定長引數,比如我們在程式碼中常看到的 *args
和 **kwargs
就屬於不定長引數,它們可以接收任意數量的引數。
*args
當我們使用 *args
來傳遞引數時,將會以元組的形式進行引數傳遞。在使用過程中,*args
可以和位置引數、預設引數混合使用,三者在函式中的順序將會影響到函式的執行結果。
位置引數,必須放在函式的最前面,然後才是 預設引數 或 *args。
- 位置引數、預設引數、*args
def demo1(name, sex=1, *args): print("name的值:{}".format(name)) print("sex的值:{}".format(sex)) print("args的值:{}".format(args)) demo1("wintest1", 0, 18, "深圳市", "10086001") print("----------------") demo1("wintest2", 22, "廣州市", "10086002") print("----------------") demo1("wintest3")
執行結果如下:
name的值:wintest1
sex的值:0
args的值:(18, '深圳市', '10086001')
----------------
name的值:wintest2
sex的值:22
args的值:('廣州市', '10086002')
----------------
name的值:wintest3
sex的值:1
args的值:()
從結果中可以看到,如果傳入多個值情況下,那麼第2個值就會被傳入到引數 sex 中,而從第3個值之後的資料,都會傳入到 args 中並以元組形式存在。
- 位置引數、*args、預設引數
def demo2(name, *args, sex=1): print("name的值:{}".format(name)) print("sex的值:{}".format(sex)) print("args的值:{}".format(args)) demo2("wintest1", 0, 18, "深圳市", "10086001") print("----------------") demo2("wintest2", 22, "廣州市", "10086002") print("----------------") demo2("wintest3", sex=0) # 傳入 sex 的值為 0
執行結果如下:
name的值:wintest1
sex的值:1
args的值:(0, 18, '深圳市', '10086001')
----------------
name的值:wintest2
sex的值:1
args的值:(22, '廣州市', '10086002')
----------------
name的值:wintest3
sex的值:0
args的值:()
從結果中可以看到,當預設引數在函式最後面時,如果傳入多個值情況下,從第2個值之後的資料,都會傳入到 args 中並以元組形式存在,而引數 sex 的值則會自動取預設值,如果想改變 sex 的值,那麼就必須在傳值時以 引數名 = 值
的方式指定其值。
**kwargs
當我們使用 **kwargs
來傳遞引數時,將會以字典的形式進行引數傳遞。在使用過程中, **kwargs
可以和位置引數、預設引數、*args
混合使用,它們在函式中的不同順序將會影響到函式的執行結果。
位置引數,必須放在函式最前面,而 **kwargs ,則必須放在函式最後面,預設引數 或 *args 需放在函式中間部分。
- 位置引數、預設引數、*args、**kwargs
def demo3(name, sex=1, *args, **kwargs):
print("name的值:{}".format(name))
print("sex的值:{}".format(sex))
print("args的值:{}".format(args))
print("kwargs的值:{}".format(kwargs))
demo3("wintest1", 0, 18, address="深圳市", telephone="10086001")
print("----------------")
demo3("wintest2", 22, address="廣州市", telephone="10086002")
print("----------------")
demo3("wintest3", sex=3)
執行結果如下:
name的值:wintest1
sex的值:0
args的值:(18,)
kwargs的值:{'address': '深圳市', 'telephone': '10086001'}
----------------
name的值:wintest2
sex的值:22
args的值:()
kwargs的值:{'address': '廣州市', 'telephone': '10086002'}
----------------
name的值:wintest3
sex的值:3
args的值:()
kwargs的值:{}
從結果中可以看到,如果傳入多個值情況下,那麼第2個值會傳入到引數 sex 中,從第3個值之後的非關鍵字引數部分,都會傳入到 args 中並以元組形式存在,而最後的關鍵字引數部分,都會傳入到 kwargs 中並以字典形式存在。
- 位置引數、*args、預設引數、**kwargs
def demo4(name, *args, sex=1, **kwargs):
print("name的值:{}".format(name))
print("sex的值:{}".format(sex))
print("args的值:{}".format(args))
print("kwargs的值:{}".format(kwargs))
demo4("wintest1", 0, 18, address="深圳市", telephone="10086001")
print("----------------")
demo4("wintest2", 22, address="廣州市", sex=3, telephone="10086002")
print("----------------")
demo4("wintest3", sex=0)
執行結果如下:
name的值:wintest1
sex的值:1
args的值:(0, 18)
kwargs的值:{'address': '深圳市', 'telephone': '10086001'}
----------------
name的值:wintest2
sex的值:3
args的值:(22,)
kwargs的值:{'address': '廣州市', 'telephone': '10086002'}
----------------
name的值:wintest3
sex的值:0
args的值:()
kwargs的值:{}
從結果中可以看到,當預設引數在 *args 後面時,唯一的不同在於對引數 sex 的傳值,如果要自定義 sex 的值,那麼就必須在 關鍵字引數部分 中任一位置下以 引數名 = 值
的方式指定其值。
當然,如果上面的 *args
和 **kwargs
中星號後面的名字是可以隨便改的,比如命名為 *aa
和 **bb
得到結果都是一樣的,但一般情況下都會約定使用 *args
和 **kwargs
。