Przejdź do głównej treści
eLearner.app
Moduł 5 · Lekcja 2 z 418/36 w kursie~12 min
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

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

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

Argumenty kluczowe

Możesz przekazywać argumenty po nazwie, w dowolnej kolejności, co czyni wywołanie bardziej czytelnym:

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

Złota zasada: w wywołaniu argumenty pozycyjne występują PRZED argumentami kluczowymi.

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

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]

Poprawny wzorzec: użyj None jako wartownika i utwórz obiekt wewnątrz:

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

Niebezpieczeń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:

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

Spróbuj sam

Ćwiczenie#python.m5.l2.e1
Próby: 0Ładowanie...

Zdefiniuj `power(base, exponent=2)` która zwraca base ** exponent. Oblicz `square = power(5)` i `cube = power(5, exponent=3)`. Oceń `(square, cube)`.

Ładowanie edytora...
Pokaż wskazówkę

return base ** exponent

Rozwiązanie dostępne po 3 próbach

Ćwiczenie powtórzeniowe

Ćwiczenie#python.m5.l2.e2
Próby: 0Ładowanie...

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

Ładowanie edytora...
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

Ćwiczenie#python.m5.l2.e3
Próby: 0Ładowanie...

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.

Ładowanie edytora...
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