Lekcje modułu (2/4)
Parametry domyślne i nazwane
Parametry funkcji mogą mieć wartości domyślne: jeśli wywołujący ich nie przekaże, używane są wartości domyślne. Możesz także wywołać funkcję, przekazując parametry po nazwie (argumenty kluczowe lub keyword arguments).
Parametry domyślne
def saluta(nome, saluto="Ciao"):
return f"{saluto}, {nome}!"
saluta("Ada") # 'Ciao, Ada!'
saluta("Ada", "Hello") # 'Hello, Ada!'Parametry z wartościami domyślnymi muszą znajdować się po tych bez wartości domyślnych:
def f(a, b=1): # OK
def f(a=1, b): # SyntaxErrorArgumenty kluczowe
Możesz przekazywać argumenty po nazwie, w dowolnej kolejności, co czyni wywołanie bardziej czytelnym:
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 keywordZłota zasada: w wywołaniu argumenty pozycyjne występują PRZED argumentami kluczowymi.
crea_utente("Ada", eta=36) # OK
crea_utente(nome="Ada", 36) # SyntaxError⚠️ Pułapka modyfikowalnej wartości domyślnej
NIGDY nie używaj obiektu modyfikowalnego (listy, słownika, zbioru) jako wartości domyślnej: wartość domyślna jest oceniana TYLKO RAZ, podczas definiowania funkcji, i jest dzielona między wszystkie wywołania.
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]Poprawny wzorzec: użyj None jako wartownika i utwórz obiekt wewnątrz:
def aggiungi(elemento, lista=None):
if lista is None:
lista = []
lista.append(elemento)
return listaNiebezpieczeństwo modyfikowalnych argumentów domyślnych
Nigdy nie używaj obiektów modyfikowalnych (takich jak listy lub słowniki) jako wartości domyślnych dla parametrów: na przykład def add(x, my_list=[]). Wartość domyślna jest oceniana tylko raz podczas definiowania funkcji, co oznacza, że kolejne wywołania będą współdzielić dokładnie ten sam modyfikowalny obiekt! Najlepszą praktyką jest użycie None:
def add(x, my_list=None):
if my_list is None:
my_list = []
my_list.append(x)
return my_listSpróbuj sam
Zdefiniuj `power(base, exponent=2)` która zwraca base ** exponent. Oblicz `square = power(5)` i `cube = power(5, exponent=3)`. Oceń `(square, cube)`.
Pokaż wskazówkę
return base ** exponent
Rozwiązanie dostępne po 3 próbach
Ćwiczenie powtórzeniowe
Zdefiniuj `create_record(name, values=None)` która, gdy values to None, używa nowej pustej listy. Dodaj 1 do values i zwróć słownik rekordu {'name': name, 'values': values}. Wywołaj funkcję dwukrotnie bez przekazywania values i przypisz do `a` i `b`. Oceń `(a['values'], b['values'])`.
Pokaż wskazówkę
Użyj None jako wartości domyślnej i utwórz listę wewnątrz funkcji.
Rozwiązanie dostępne po 3 próbach
Dodatkowe wyzwanie
Zdefiniuj funkcję `greet(name, message="Hello")` która zwraca sformatowany ciąg znaków `"{message}, {name}!"`. Przetestuj funkcję wywołaniem `greet("Bob")` jako ostatnim wyrażeniem.
Pokaż wskazówkę
Użyj parametru domyślnego message="Hello" i f-stringa do wygenerowania zwracanego powitania.
Rozwiązanie dostępne po 3 próbach