1. 程式人生 > 其它 >Filter多過濾器執行順序

Filter多過濾器執行順序

在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