Modül dersleri (2/4)
Varsayılan ve anahtar kelime parametreleri
İşlev parametreleri varsayılan değerlere sahip olabilir: arayan kişi geçemezse varsayılanlar kullanılır. Ayrıca parametreleri geçen bir işlevi de çağırabilirsiniz. ada göre (anahtar kelime bağımsız değişkenleri).
Varsayılan parametreler
def saluta(nome, saluto="Ciao"):
return f"{saluto}, {nome}!"
saluta("Ada") # 'Ciao, Ada!'
saluta("Ada", "Hello") # 'Hello, Ada!'Varsayılanlara sahip parametreler, aşağıdakilere sahip olmayanlardan sonra gelmelidir:
def f(a, b=1): # OK
def f(a=1, b): # SyntaxErrorAnahtar kelime bağımsız değişkenleri
Argümanları isme göre herhangi bir sırayla iletebilir, böylece aramayı daha fazla yapabilirsiniz okunabilir:
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 keywordAltın kural: Bir çağrıda konumsal argümanlar, anahtar kelime argümanlarından ÖNCE gelir.
crea_utente("Ada", eta=36) # OK
crea_utente(nome="Ada", 36) # SyntaxError⚠️ Değişken varsayılan tuzak
ASLA değiştirilebilir bir nesneyi (liste, dict, set) varsayılan değer olarak kullanmayın: varsayılan, işlev tanımlandığında ve tüm kullanıcılar arasında paylaşıldığında BİR KEZ değerlendirilir tüm çağrılar.
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]Doğru kalıp: None'yi nöbetçi olarak kullanın ve içinde oluşturun:
def aggiungi(elemento, lista=None):
if lista is None:
lista = []
lista.append(elemento)
return listaDeğişken varsayılan argümanların tehlikesi
Değiştirilebilir nesneleri (listeler veya sözlükler gibi) asla parametreler için varsayılan değerler olarak kullanmayın: örneğin def add(x, my_list=[]). Varsayılan değer, işlev tanımlandığında yalnızca bir kez değerlendirilir; bu, sonraki çağrıların tam olarak aynı değiştirilebilir nesneyi paylaşacağı anlamına gelir! En iyi uygulama None kullanmaktır:
def add(x, my_list=None):
if my_list is None:
my_list = []
my_list.append(x)
return my_listDeneyin
Taban ** üssünü döndüren 'kuvvet(taban, üs=2)'yi tanımlayın. 'Kare = kuvvet(5)' ve 'küp = kuvvet(5, üs=3)' hesaplayın. `(kare, küp)`ü değerlendirin.
İpucu göster
dönüş tabanı ** üs
3 denemeden sonra çözüm mevcut
Alıştırmayı gözden geçirin
Değerler Yok olduğunda yeni, boş bir liste kullanan `create_record(isim, değerler=Yok)` tanımını yapın. Değerlere 1 ekleyin ve dict {'name': name, 'values':values} kaydını döndürün. Değerleri aktarmadan iki kez çağırın ve 'a' ve 'b'ye atayın. `(a['değerler'], b['değerler'])`'i değerlendirin.
İpucu göster
Hiçbiri'ni varsayılan olarak kullanın ve listeyi işlevin içinde oluşturun.
3 denemeden sonra çözüm mevcut
Ek zorluk
Biçimlendirilmiş \`"{message}, {name}!"\` dizesini döndüren \`greet(name, message="Merhaba")\` işlevini tanımlayın. Son ifade olarak \`greet("Bob")\` öğesini çağırarak işlevi test edin.
İpucu göster
Döndürülen selamlama için varsayılan bir mesaj = "Merhaba" parametresi ve bir f dizesi kullanın.
3 denemeden sonra çözüm mevcut