Lompati ke konten utama
Modul 5 · Pelajaran 2 dari 418/36 dalam kursus~12 min
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

Python
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:

Python
def f(a, b=1):     # OK
def f(a=1, b):     # SyntaxError

Argumen kata kunci

Anda dapat menyampaikan argumen berdasarkan nama, dalam urutan apa pun, sehingga membuat panggilan menjadi lebih sering dapat dibaca:

Python
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 keyword

Aturan emas: dalam panggilan, argumen posisi muncul SEBELUM argumen kata kunci.

Python
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.

Python
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:

Python
def aggiungi(elemento, lista=None):
    if lista is None:
        lista = []
    lista.append(elemento)
    return lista

Bahaya 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:

Python
def add(x, my_list=None):
    if my_list is None:
        my_list = []
    my_list.append(x)
    return my_list

Cobalah

Latihan#python.m5.l2.e1
Upaya: 0Memuat…

Tentukan `kekuatan(basis, eksponen=2)` yang mengembalikan eksponen basis **. Hitung `persegi = pangkat(5)` dan `kubus = pangkat(5, eksponen=3)`. Evaluasi `(persegi, kubus)`.

Memuat editor…
Tunjukkan petunjuk

basis pengembalian ** eksponen

Solusi tersedia setelah 3 upaya

Tinjau latihan

Latihan#python.m5.l2.e2
Upaya: 0Memuat…

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'])`.

Memuat editor…
Tunjukkan petunjuk

Gunakan Tidak Ada sebagai default dan buat daftar di dalam fungsi.

Solusi tersedia setelah 3 upaya

Tantangan tambahan

Latihan#python.m5.l2.e3
Upaya: 0Memuat…

Tentukan fungsi \`greet(name, message="Hello")\` yang mengembalikan string yang diformat \`"{message}, {name}!"\`. Uji fungsi dengan memanggil \`greet("Bob")\` sebagai ekspresi terakhir.

Memuat editor…
Tunjukkan petunjuk

Gunakan parameter default message='Halo' dan f-string untuk salam yang dikembalikan.

Solusi tersedia setelah 3 upaya