Pelajaran modul (2/4)
Parameter default dan kata kunci
Parameter fungsi dapat memiliki nilai default: jika pemanggil tidak lulus mereka, defaultnya digunakan. Anda juga dapat memanggil fungsi dengan meneruskan parameter berdasarkan nama (argumen kata kunci).
Parameter bawaan
def saluta(nome, saluto="Ciao"):
return f"{saluto}, {nome}!"
saluta("Ada") # 'Ciao, Ada!'
saluta("Ada", "Hello") # 'Hello, Ada!'Parameter dengan default harus muncul setelah parameter tanpa:
def f(a, b=1): # OK
def f(a=1, b): # SyntaxErrorArgumen kata kunci
Anda dapat menyampaikan argumen berdasarkan nama, dalam urutan apa pun, sehingga membuat panggilan menjadi lebih sering dapat dibaca:
def crea_utente(nome, eta, attivo=True):
return {"nome": nome, "eta": eta, "attivo": attivo}
crea_utente("Ada", 36)
crea_utente(nome="Ada", eta=36, attivo=False)
crea_utente(eta=36, nome="Ada") # any order when all are keywordAturan emas: dalam panggilan, argumen posisi muncul SEBELUM argumen kata kunci.
crea_utente("Ada", eta=36) # OK
crea_utente(nome="Ada", 36) # SyntaxError⚠️ Jebakan default yang bisa berubah
JANGAN PERNAH menggunakan objek yang dapat diubah (daftar, dikt, set) sebagai nilai default: the default dievaluasi SEKALI, ketika fungsi ditentukan, dan dibagikan ke seluruh semua panggilan.
def aggiungi(elemento, lista=[]): # BUG!
lista.append(elemento)
return lista
aggiungi(1) # [1]
aggiungi(2) # [1, 2] !!! not [2] as you'd expect
aggiungi(3) # [1, 2, 3]Pola yang benar: gunakan None sebagai penjaga dan buat di dalam:
def aggiungi(elemento, lista=None):
if lista is None:
lista = []
lista.append(elemento)
return listaBahaya argumen default yang bisa berubah
Jangan pernah menggunakan objek yang dapat diubah (seperti daftar atau kamus) sebagai nilai default untuk parameter: misalnya def add(x, my_list=[]). Nilai default dievaluasi hanya sekali ketika fungsi didefinisikan, yang berarti panggilan berikutnya akan berbagi objek yang bisa diubah sama persis! Praktik terbaiknya adalah menggunakan None:
def add(x, my_list=None):
if my_list is None:
my_list = []
my_list.append(x)
return my_listCobalah
Tentukan `kekuatan(basis, eksponen=2)` yang mengembalikan eksponen basis **. Hitung `persegi = pangkat(5)` dan `kubus = pangkat(5, eksponen=3)`. Evaluasi `(persegi, kubus)`.
Tunjukkan petunjuk
basis pengembalian ** eksponen
Solusi tersedia setelah 3 upaya
Tinjau latihan
Tentukan `create_record(name, value=None)` yang, jika nilainya Tidak Ada, akan menggunakan daftar kosong baru. Tambahkan 1 ke nilai dan kembalikan dict rekaman {'nama': nama, 'nilai': nilai}. Panggil dua kali tanpa meneruskan nilai dan tetapkan ke `a` dan `b`. Evaluasi `(a['nilai'], b['nilai'])`.
Tunjukkan petunjuk
Gunakan Tidak Ada sebagai default dan buat daftar di dalam fungsi.
Solusi tersedia setelah 3 upaya
Tantangan tambahan
Tentukan fungsi \`greet(name, message="Hello")\` yang mengembalikan string yang diformat \`"{message}, {name}!"\`. Uji fungsi dengan memanggil \`greet("Bob")\` sebagai ekspresi terakhir.
Tunjukkan petunjuk
Gunakan parameter default message='Halo' dan f-string untuk salam yang dikembalikan.
Solusi tersedia setelah 3 upaya