Kursus Python / Menggunakan argumen posisi, keyword, dan nilai bawaan
Argumen fungsi dapat diberikan berdasarkan posisi atau nama, dan nilai bawaan membuat parameter tertentu boleh tidak diisi. Jika setiap pemanggilan harus memulai keadaan baru, hindari memakai objek mutable seperti list sebagai nilai bawaan yang dibagi antarpemanggilan.
Perlihatkan makna argumen pada pemanggilan
Argumen posisi dihubungkan ke parameter sesuai urutannya. Argumen kata kunci atau keyword dihubungkan berdasarkan nama, seperti amount=9000. Memberikan nilai kepada parameter yang sama dua kali merupakan kesalahan. Menempatkan argumen posisi biasa setelah argumen keyword juga tidak sah; gunakan urutan dan nama yang sesuai definisi.
Parameter setelah tanda * tersendiri bersifat keyword-only. Dalam contoh berikut, currency harus disebut dengan nama jika ingin diberikan secara eksplisit. Aturan ini membuat arti satuan terlihat di lokasi pemanggilan. name dan amount pada fungsi tersebut tetap dapat diberikan berdasarkan posisi atau keyword.
Dokumentasi parameter keyword-only Python menjelaskan pembatasan ini. Gunakan istilah parameter untuk nama pada definisi dan argumen untuk nilai pada pemanggilan, sebagaimana dalam latihan fungsi dan nilai balik.
Jalankan argumen keyword-only dan default list baru
Simpan kode lengkap berikut sebagai arguments.py dengan encoding UTF-8. Gunakan Python 3.12 atau lebih baru dan jalankan python arguments.py di terminal lingkungan proyek. Tidak diperlukan paket atau berkas tambahan.
def format_expense(name, amount, *, currency="KRW"):
return f"{name}: {amount:,} {currency}"
def append_name(name, names=None):
if names is None:
names = []
names.append(name)
return names
print(format_expense("lunch", 8000))
print(format_expense(amount=9000, name="dinner", currency="KRW"))
print(append_name("A"))
print(append_name("B"))
Keluaran yang diharapkan:
lunch: 8,000 KRW
dinner: 9,000 KRW
['A']
['B']
Pemanggilan pertama memakai mata uang bawaan KRW. Pemanggilan kedua memberi semua argumen dengan nama; urutan keyword berbeda dari urutan parameter tetapi pengikatannya tetap jelas. Fungsi hanya memformat label mata uang, bukan mengonversi jumlah ke mata uang lain.
Dua pemanggilan append_name tidak berbagi list bawaan. Ketika names bernilai None, fungsi membuat list baru, menambahkan nama, lalu mengembalikan list tersebut. Karena itu, keluaran kedua tidak memuat nama dari pemanggilan pertama.
Pahami kapan nilai bawaan dibuat
Ekspresi nilai bawaan dievaluasi ketika definisi fungsi dieksekusi, bukan setiap kali fungsi dipanggil. Definisi seperti def shared(name, names=[]) membuat satu list yang kemudian dipakai ulang untuk pemanggilan tanpa argumen names. Jika fungsi mengubah list tersebut, perubahan terlihat pada pemanggilan berikutnya.
Simpan contoh lengkap berikut sebagai defaults.py dan jalankan python defaults.py di folder latihan yang sama. Kedua fungsi dipanggil berturut-turut dalam satu proses agar perilaku berbagi dapat diamati.
def shared(name, names=[]):
names.append(name)
return names
def fresh(name, names=None):
if names is None:
names = []
names.append(name)
return names
print(shared("A"))
print(shared("B"))
print(fresh("A"))
print(fresh("B"))
Keluaran yang diharapkan:
['A']
['A', 'B']
['A']
['B']
shared("B") menambahkan B ke list yang sudah memuat A. Sebaliknya, dua pemanggilan fresh membuat list baru masing-masing. Jika skrip dijalankan lagi sebagai proses baru, definisi fungsi dieksekusi lagi; berbagi default ini bukan penyimpanan permanen lintas proses.
Gunakan if names is None ketika list kosong yang diberikan pemanggil harus tetap dipakai. Mengubahnya menjadi if not names memperlakukan list kosong sebagai alasan untuk membuat list pengganti, sehingga pemanggil tidak melihat perubahan yang mungkin diharapkannya. Nilai kosong yang sah berbeda dari tidak diberikannya nilai.
Dokumentasi nilai argumen bawaan menjelaskan waktu evaluasi dan pola None. Ekspresi waktu atau tanggal sebagai default juga dievaluasi saat definisi; jika setiap pemanggilan memerlukan nilai baru, hitung di dalam isi fungsi. Gunakan penanda berbeda jika None sendiri memiliki arti sah yang harus dibedakan dari argumen yang tidak diberikan.
Uji antarmuka dan kontrak perubahan objek
- Coba
format_expense("lunch", 8000, "KRW"). Argumen ketiga tidak diizinkan sebagai argumen posisi dan menghasilkanTypeError. Gunakancurrency="KRW"untuk pemanggilan yang benar. - Coba memberikan
amountsekaligus berdasarkan posisi dan keyword. Python menolak nilai ganda untuk parameter yang sama; perbaiki pemanggilan sebelum menilai hasil perhitungan. - Di luar fungsi, buat
names = [], lalu panggilappend_name("A", names). Fungsi mengubah list yang diberikan itu dan mengembalikan objek yang sama. Ini perubahan yang disengaja terhadap argumen eksplisit, berbeda dari masalah default bersama. - Jalankan kembali
arguments.pydandefaults.pytanpa perubahan percobaan serta cocokkan masing-masing keluarannya.
Jika fungsi seharusnya tidak mengubah list milik pemanggil, kontraknya harus berbeda, misalnya membuat salinan sebelum menambahkan unsur. Pola default None hanya menentukan cara menyediakan list ketika argumen tidak ada; ia tidak otomatis melindungi objek yang secara eksplisit diberikan.
Nama parameter, kewajiban pemberian argumen, dan perubahan terhadap objek merupakan bagian antarmuka fungsi. Tentukan ketiganya dengan jelas agar pemanggil tidak menebak apakah data baru dibuat, dibagi, atau dimodifikasi.




