Mengembangkan dan menghantar senarai, tupel dan kamus sebagai argumen fungsi dalam Python

Perniagaan

Dalam Python, senarai (tatasusunan), tupel dan kamus boleh dikembangkan (dibongkar) dan elemen masing-masing boleh dihantar bersama sebagai hujah fungsi.

Apabila memanggil fungsi, nyatakan hujah dengan * untuk senarai dan tupel dan ** untuk kamus. Perhatikan bilangan asterisk *.

Butiran berikut diterangkan di sini.

  • Kembangkan (buka bungkusan) senarai atau tupel dengan * (satu asterisk)
    • Untuk fungsi dengan argumen lalai
    • Untuk fungsi dengan argumen panjang berubah-ubah
  • Kembangkan (buka bungkusan) kamus dengan ** (dua asterisk)
    • Untuk fungsi dengan argumen lalai
    • Untuk fungsi dengan argumen panjang berubah-ubah

Lihat artikel berikut untuk penggunaan asas fungsi Python, argumen lalai dan argumen panjang berubah-ubah dengan *,** apabila mentakrifkan fungsi.

Kembangkan (buka bungkusan) senarai atau tupel dengan * (satu asterisk)

Apabila senarai atau tupel dinyatakan sebagai argumen dengan *, ia dikembangkan dan setiap elemen diluluskan sebagai argumen berasingan.

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

Penjelasan berikut adalah untuk senarai, tetapi perkara yang sama berlaku untuk tupel.

Jika bilangan elemen tidak sepadan dengan bilangan argumen, ralat TypeError berlaku.

# 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

Untuk fungsi dengan argumen lalai

Jika argumen lalai ditetapkan, argumen lalai digunakan jika bilangan elemen tidak mencukupi. Jika bilangan elemen terlalu besar, ralat TypeError berlaku.

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

Untuk fungsi dengan argumen panjang berubah-ubah

Jika argumen panjang pembolehubah ditetapkan, semua elemen selepas elemen untuk argumen kedudukan dihantar ke argumen panjang pembolehubah.

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')

Kembangkan (buka bungkusan) kamus dengan ** (dua asterisk)

Apabila dict kamus ditentukan sebagai argumen dengan **, kunci elemen dikembangkan sebagai nama argumen dan nilai sebagai nilai argumen, dan setiap satu diluluskan sebagai argumen berasingan.

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

Jika tiada kunci yang sepadan dengan nama argumen atau terdapat kunci yang tidak sepadan, ralat TypeError akan terhasil.

# 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'

Untuk fungsi dengan argumen lalai

Imej dengan hanya nilai nama argumen yang sepadan dengan kunci dalam kamus dikemas kini.

Kunci yang tidak sepadan dengan nama argumen akan mengakibatkan ralat 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'

Untuk fungsi dengan argumen panjang berubah-ubah

Jika argumen panjang pembolehubah ditetapkan, sebarang elemen dengan kunci selain daripada nama argumen yang ditentukan sebagai argumen dihantar ke argumen panjang pembolehubah.

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'}