Apa itu * args dan ** kwargs dengan Python?

Fungsinya adalah kehidupan. Benar? Jika Anda baru mulai mempelajari Python, tidak masalah apakah itu adalah bahasa pemrograman pertama Anda, atau jika Anda datang ke Python dari bahasa lain, maka Anda sudah tahu bahwa jumlah parameter dalam deklarasi fungsi sesuai dengan jumlah argumen yang dilewati fungsi ketika dipanggil.



Ini adalah dasar-dasarnya. Inilah yang membantu orang memahami dunia di sekitar mereka. Tetapi pernyataan "jumlah parameter sama dengan jumlah argumen" menempatkan bom waktu di kepala pemula, yang menyala setelah ia melihat *args misterius atau **kwargs membangun dalam deklarasi fungsi.

Jangan biarkan lencana apa pun membuat Anda pingsan. Tidak ada yang kuno di sini. Secara umum, jika desain ini tidak Anda kenal, saya sarankan Anda menanganinya.

Argumen Posisional dan Bernama


Untuk menangani *args dan **kwargs , kita perlu menguasai konsep argumen posisional dan bernama.

Pertama, mari kita bicara tentang perbedaannya. Dalam fungsi yang paling sederhana, kita cukup memetakan posisi argumen dan parameter. Argumen No. 1 sesuai dengan parameter No. 1, argumen No. 2 ke parameter No. 2, dan seterusnya.

 def printThese(a,b,c):   print(a, "is stored in a")   print(b, "is stored in b")   print(c, "is stored in c") printThese(1,2,3) """ 1 is stored in a 2 is stored in b 3 is stored in c """ 

Untuk memanggil suatu fungsi, ketiga argumen diperlukan. Jika Anda melewatkan setidaknya satu dari mereka, pesan kesalahan akan ditampilkan.

 def printThese(a,b,c):   print(a, "is stored in a")   print(b, "is stored in b")   print(c, "is stored in c") printThese(1,2) """ TypeError: printThese() missing 1 required positional argument: 'c' """ 

Jika Anda menetapkan nilai default ke parameter saat mendeklarasikan fungsi, tidak perlu lagi menunjukkan argumen yang sesuai saat memanggil fungsi. Parameter menjadi opsional.

 def printThese(a,b,c=None):   print(a, "is stored in a")   print(b, "is stored in b")   print(c, "is stored in c") printThese(1,2) """ 1 is stored in a 2 is stored in b None is stored in c """ 

Parameter opsional juga dapat diatur saat memanggil suatu fungsi menggunakan namanya.

Dalam contoh berikut, kami menetapkan tiga parameter ke nilai default None dan melihat bagaimana mereka dapat ditetapkan menggunakan nama mereka dan tidak memperhatikan urutan argumen yang digunakan saat memanggil fungsi.

 def printThese(a=None,b=None,c=None):   print(a, "is stored in a")   print(b, "is stored in b")   print(c, "is stored in c") printThese(c=3, a=1) """ 1 is stored in a None is stored in b 3 is stored in c """ 

Operator tanda bintang


Operator * paling sering dikaitkan dengan operasi perkalian pada orang, tetapi dalam Python itu memiliki arti lain.

Operator ini memungkinkan Anda untuk "membongkar" objek di mana elemen-elemen tertentu disimpan. Berikut ini sebuah contoh:

 a = [1,2,3] b = [*a,4,5,6] print(b) # [1,2,3,4,5,6] 

Di sini, isi daftar a diambil, dibongkar, dan ditempatkan di daftar b .

Cara menggunakan * args dan ** kwargs


Jadi, kita tahu bahwa operator "tanda bintang" dengan Python mampu "mengeluarkan" elemen penyusunnya dari objek. Kita juga tahu bahwa ada dua jenis fungsi parameter. Mungkin saja Anda sudah memikirkan hal ini sendiri, tetapi untuk berjaga-jaga, saya akan mengatakan ini. Yaitu, *args adalah singkatan untuk "argumen" (argumen), dan ** kwargs adalah singkatan untuk "argumen kata kunci" (argumen bernama).

Setiap konstruk ini digunakan untuk membongkar argumen dari tipe yang sesuai, memungkinkan Anda untuk memanggil fungsi dengan daftar argumen dengan panjang variabel. Misalnya - buat fungsi yang dapat menampilkan hasil yang diketik oleh siswa dalam ujian:

 def printScores(student, *scores):   print(f"Student Name: {student}")   for score in scores:      print(score) printScores("Jonathan",100, 95, 88, 92, 99) """ Student Name: Jonathan 100 95 88 92 99 """ 

Saya tidak menggunakan konstruksi *args ketika mendeklarasikan suatu fungsi. Sebaliknya, saya memiliki *scores . Apakah ada kesalahan di sini? Tidak ada kesalahan di sini. Faktanya adalah bahwa "args" hanyalah serangkaian karakter yang digunakan untuk menunjukkan argumen. Yang paling penting di sini adalah operator * . Dan apa yang sebenarnya terjadi setelah itu tidak memainkan peran khusus. Menggunakan * kami membuat daftar argumen posisi berdasarkan apa yang diteruskan ke fungsi ketika dipanggil.

Setelah kami menemukan *args , seharusnya tidak ada lagi masalah dengan memahami **kwargs . Lagi-lagi namanya tidak masalah. Yang utama adalah dua karakter ** . Berkat mereka, kamus dibuat yang berisi argumen bernama diteruskan ke fungsi ketika dipanggil.

 def printPetNames(owner, **pets):   print(f"Owner Name: {owner}")   for pet,name in pets.items():      print(f"{pet}: {name}") printPetNames("Jonathan", dog="Brock", fish=["Larry", "Curly", "Moe"], turtle="Shelldon") """ Owner Name: Jonathan dog: Brock fish: ['Larry', 'Curly', 'Moe'] turtle: Shelldon """ 

Ringkasan


Berikut adalah beberapa tips untuk membantu Anda menghindari masalah umum yang muncul saat bekerja dengan fungsi dan memperluas pengetahuan Anda:

  • Gunakan *args dan **kwargs untuk menangkap argumen posisional dan bernama.
  • **kwarg s tidak dapat ditempatkan sebelum *args . Jika Anda melakukan ini, pesan kesalahan akan ditampilkan.
  • Waspadalah terhadap konflik antara parameter bernama dan **kwargs , dalam kasus-kasus ketika direncanakan untuk meneruskan nilai sebagai argumen **kwarg , tetapi nama kunci dari nilai ini cocok dengan nama parameter yang disebutkan.
  • * Operator dapat digunakan tidak hanya dalam deklarasi fungsi, tetapi juga ketika mereka dipanggil.

Pembaca yang budiman! Parameter apa yang paling sering Anda gunakan saat mendeklarasikan fungsi Python?

Source: https://habr.com/ru/post/id482464/


All Articles