在python3.8之后函數參數中允許出現/和*號,/用來指明某些函數形參必須使用位置參數而非關鍵字參數的形式,*出現在函數參數中第一種含義可以表示為可變參數
,一般寫作*args;對於單獨出現在參數中的*參數,則表示,*后面的參數必須為關鍵字參數的形式,接下來詳細說下該用法:
1 /參數的用法
如果你想要函數的調用者在某個參數位置只能使用位置參數而不能使用關鍵字參數傳參,那么你只需要在所需位置后面放置一個/。
def f1(a, b, /): return a + b
對於上面這個函數而言,調用f1時參數a,b只能是特定的值,而不能以關鍵字傳參,即f1(2, 3)執行正確而f1(a=2, 3)和f1(2, b=3)將執行錯誤。
2 *參數的用法
對於*的第一種用法比較常見,這里不再詳述,這里主要詳細解釋*的第二種用法。如果你希望強迫調用者使用某些參數,且必須以關鍵字參數的形式傳參,那么你只需要在所需位置的前一個位置放置一個*。
def f1(a, *, b, c): return a + b + c
對於上面這個函數而言,調用時參數a可以任意值, 但b,c參數一定要以關鍵字參數的形式傳參,如f1(1, b=4, c=5),否則將會報錯。
def f2(a, *, b, c=5): return a + b + c
如果是這種情況下調用函數,參數a可以任意值,但參數b一定要以關鍵字參數的形式傳參,如f2(2, b=3),但是如果想傳入c參數,那么c參數的要求和b參數一樣都為關鍵字參數形式,如f2(2,b=3,c=4)。
3 /和*都出現在函數參數中
比如我們定義一個函數f
def f(a, b, /, c, *, d, e):
print(a, b, c, d, e)
當我們調用函數f時,a,b參數可以為任意型python所支持的值,就是不能以關鍵字形式傳參;c可以為任意型python所支持的值,d,e只能以關鍵字參數傳參。以下調用方式均會拋出異常
f(a=1, 2, c=3, d=4, e=5) # a不能以關鍵字參數傳參
f(1, 2, 3, 4, e=5) # d只能以關鍵字參數傳參
4 總結
如果你希望調用者使用函數時一定不能使用關鍵字參數傳參,那么只需要把這些參數放在/前即可;如果你希望調用者使用函數時一定要使用某些參數,且必須為關鍵字參數傳參,那么只需要把這些參數放在*后面即可。