在 Python 中擴展和傳遞列表、元組和字典作為函數參數

商業

在 Python 中,列表(數組)、元組和字典可以展開(解包),並且它們各自的元素可以作為函數參數一起傳遞。

調用函數時,使用 * 為列表和元組指定參數,使用 ** 為字典指定參數。注意星號 * 的數量。

此處描述了以下詳細信息。

  • 使用 *(一個星號)展開(解包)列表或元組
    • 對於具有默認參數的函數
    • 對於具有可變長度參數的函數
  • 使用 **(兩個星號)展開(解包)字典
    • 對於具有默認參數的函數
    • 對於具有可變長度參數的函數

在定義函數時,請參閱以下文章了解 Python 函數、默認參數和帶 *,** 的可變長度參數的基本用法。

使用 *(一個星號)展開(解包)列表或元組

當列表或元組被指定為帶有 * 的參數時,它會被擴展並且每個元素都作為單獨的參數傳遞。

def func(arg1, arg2, arg3):
    print('arg1 =', arg1)
    print('arg2 =', arg2)
    print('arg3 =', arg3)

l = ['one', 'two', 'three']

func(*l)
# arg1 = one
# arg2 = two
# arg3 = three

func(*['one', 'two', 'three'])
# arg1 = one
# arg2 = two
# arg3 = three

t = ('one', 'two', 'three')

func(*t)
# arg1 = one
# arg2 = two
# arg3 = three

func(*('one', 'two', 'three'))
# arg1 = one
# arg2 = two
# arg3 = three

以下解釋適用於列表,但同樣適用於元組。

如果元素的數量與參數的數量不匹配,則會發生 TypeError 錯誤。

# func(*['one', 'two'])
# TypeError: func() missing 1 required positional argument: 'arg3'

# func(*['one', 'two', 'three', 'four'])
# TypeError: func() takes 3 positional arguments but 4 were given

對於具有默認參數的函數

如果設置了默認參數,則在元素數量不足時使用默認參數。如果元素數量過多,則會出現 TypeError 錯誤。

def func_default(arg1=1, arg2=2, arg3=3):
    print('arg1 =', arg1)
    print('arg2 =', arg2)
    print('arg3 =', arg3)

func_default(*['one', 'two'])
# arg1 = one
# arg2 = two
# arg3 = 3

func_default(*['one'])
# arg1 = one
# arg2 = 2
# arg3 = 3

# func_default(*['one', 'two', 'three', 'four'])
# TypeError: func_default() takes from 0 to 3 positional arguments but 4 were given

對於具有可變長度參數的函數

如果設置了可變長度參數,則位置參數的元素之後的所有元素都將傳遞給可變長度參數。

def func_args(arg1, *args):
    print('arg1 =', arg1)
    print('args =', args)

func_args(*['one', 'two'])
# arg1 = one
# args = ('two',)

func_args(*['one', 'two', 'three'])
# arg1 = one
# args = ('two', 'three')

func_args(*['one', 'two', 'three', 'four'])
# arg1 = one
# args = ('two', 'three', 'four')

使用 **(兩個星號)展開(解包)字典

當字典 dict 被指定為帶有 ** 的參數時,元素鍵被擴展為參數名稱和值作為參數值,並且每個都作為單獨的參數傳遞。

def func(arg1, arg2, arg3):
    print('arg1 =', arg1)
    print('arg2 =', arg2)
    print('arg3 =', arg3)

d = {'arg1': 'one', 'arg2': 'two', 'arg3': 'three'}

func(**d)
# arg1 = one
# arg2 = two
# arg3 = three

func(**{'arg1': 'one', 'arg2': 'two', 'arg3': 'three'})
# arg1 = one
# arg2 = two
# arg3 = three

如果沒有與參數名稱匹配的鍵或存在不匹配的鍵,則會導致 TypeError 錯誤。

# func(**{'arg1': 'one', 'arg2': 'two'})
# TypeError: func() missing 1 required positional argument: 'arg3'

# func(**{'arg1': 'one', 'arg2': 'two', 'arg3': 'three', 'arg4': 'four'})
# TypeError: func() got an unexpected keyword argument 'arg4'

對於具有默認參數的函數

僅更新與字典中的鍵匹配的參數名稱的值的圖像。

與參數名稱不匹配的鍵將導致 TypeError 錯誤。

def func_default(arg1=1, arg2=2, arg3=3):
    print('arg1 =', arg1)
    print('arg2 =', arg2)
    print('arg3 =', arg3)

func_default(**{'arg1': 'one'})
# arg1 = one
# arg2 = 2
# arg3 = 3

func_default(**{'arg2': 'two', 'arg3': 'three'})
# arg1 = 1
# arg2 = two
# arg3 = three

# func_default(**{'arg1': 'one', 'arg4': 'four'})
# TypeError: func_default() got an unexpected keyword argument 'arg4'

對於具有可變長度參數的函數

如果設置了可變長度參數,則任何具有指定為參數的參數名稱以外的鍵的元素都將傳遞給可變長度參數。

def func_kwargs(arg1, **kwargs):
    print('arg1 =', arg1)
    print('kwargs =', kwargs)

func_kwargs(**{'arg1': 'one', 'arg2': 'two', 'arg3': 'three'})
# arg1 = one
# kwargs = {'arg2': 'two', 'arg3': 'three'}

func_kwargs(**{'arg1': 'one', 'arg2': 'two', 'arg3': 'three', 'arg4': 'four'})
# arg1 = one
# kwargs = {'arg2': 'two', 'arg3': 'three', 'arg4': 'four'}

func_kwargs(**{'arg1': 'one', 'arg3': 'three'})
# arg1 = one
# kwargs = {'arg3': 'three'}