Jak používat a zaznamenávat výchozí argumenty ve funkcích Pythonu

Podnikání

Nastavení výchozího argumentu v definici funkce jazyka Python způsobí, že pokud je argument během volání funkce vynechán, použije se výchozí hodnota.

Níže jsou popsány následující podrobnosti.

  • Nastavení výchozích argumentů
  • Omezení pozice výchozích argumentů
  • Všimněte si, že pokud je jako výchozí hodnota použit seznam nebo slovník.

Nastavení výchozích argumentů

Pokud je v definici funkce název argumentu = výchozí hodnota, bude při vynechání příslušného argumentu použita výchozí hodnota.

def func_default(arg1, arg2='default_x', arg3='default_y'):
    print(arg1)
    print(arg2)
    print(arg3)

func_default('a')
# a
# default_x
# default_y

func_default('a', 'b')
# a
# b
# default_y

func_default('a', arg3='c')
# a
# default_x
# c

Omezení pozice výchozích argumentů

Umístění výchozího argumentu před normální argument (argument, pro který není zadána žádná výchozí hodnota) při definování funkce vede k chybě.
SyntaxError

# def func_default_error(arg2='default_a', arg3='default_b', arg1):
#     print(arg1)
#     print(arg2)

# SyntaxError: non-default argument follows default argument

Všimněte si, že pokud je jako výchozí hodnota použit seznam nebo slovník.

Pokud je jako výchozí hodnota zadán aktualizovatelný (měnitelný) objekt, například seznam nebo slovník, bude tento objekt vytvořen při definování funkce. Když je pak funkce volána bez příslušného argumentu, použije se stejný objekt.

Výchozí hodnoty argumentů se při provádění definice funkce vyhodnocují zleva doprava. To znamená, že výraz výchozího argumentu je při definici funkce vyhodnocen pouze jednou a při každém volání je použita stejná „vypočtená“ hodnota.
8.7. Function definitions — Python 3.10.2 Documentation

Pokud je tedy například definována funkce, která jako výchozí argument přijímá seznam nebo slovník a přidává do něj prvky, a je opakovaně volána bez tohoto argumentu, budou prvky do stejného objektu přidávány opakovaně.

Příklad výpisu.

def func_default_list(l=[0, 1, 2], v=3):
    l.append(v)
    print(l)

func_default_list([0, 0, 0], 100)
# [0, 0, 0, 100]

func_default_list()
# [0, 1, 2, 3]

func_default_list()
# [0, 1, 2, 3, 3]

func_default_list()
# [0, 1, 2, 3, 3, 3]

Příklad slovníku.

def func_default_dict(d={'default': 0}, k='new', v=100):
    d[k] = v
    print(d)

func_default_dict()
# {'default': 0, 'new': 100}

func_default_dict(k='new2', v=200)
# {'default': 0, 'new': 100, 'new2': 200}

Při každém volání funkce se vytvoří nový objekt.

def func_default_list_none(l=None, v=3):
    if l is None:
        l = [0, 1, 2]
    l.append(v)
    print(l)

func_default_list_none()
# [0, 1, 2, 3]

func_default_list_none()
# [0, 1, 2, 3]