Перейти до основного вмісту
Модуль 5 · Урок 2 із 418/36 у курсі~12 min
Модульні уроки (2/4)

Параметри за замовчуванням і ключове слово

Параметри функції можуть мати значення за замовчуванням: якщо виклик не проходить для них використовуються значення за замовчуванням. Ви також можете викликати функцію, передаючи параметри за назвою (аргументи ключового слова).

Параметри за замовчуванням

Python
def saluta(nome, saluto="Ciao"):
    return f"{saluto}, {nome}!"

saluta("Ada")              # 'Ciao, Ada!'
saluta("Ada", "Hello")     # 'Hello, Ada!'

Параметри зі значеннями за замовчуванням мають бути після параметрів без:

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

Аргументи ключових слів

Ви можете передавати аргументи за іменем у будь-якому порядку, роблячи виклик більшим читабельний:

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

Золоте правило: у виклику позиційні аргументи стоять ПЕРЕД аргументами ключового слова.

Python
crea_utente("Ada", eta=36)            # OK
crea_utente(nome="Ada", 36)           # SyntaxError

⚠️ Змінна помилка за замовчуванням

НІКОЛИ не використовуйте змінний об’єкт (список, dict, набір) як значення за замовчуванням: the за замовчуванням оцінюється ОДИН РАЗ, коли функція визначена, і використовується спільно всі дзвінки.

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]

Правильний шаблон: використовуйте None як дозорний і створіть його всередині:

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

Небезпека змінних аргументів за замовчуванням

Ніколи не використовуйте змінні об’єкти (наприклад, списки чи словники) як значення за замовчуванням для параметрів: наприклад def add(x, my_list=[]). Значення за замовчуванням оцінюється лише один раз, коли функція визначена, тобто наступні виклики використовуватимуть той самий змінний об’єкт! Найкраще використовувати None:

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

Спробуйте

вправи#python.m5.l2.e1
Спроби: 0Завантаження…

Визначте `power(base, exponent=2)`, який повертає базовий ** експоненту. Обчисліть `квадрат = ступінь (5)` і `куб = ступінь (5, показник = 3)`. Оцініть `(квадрат, куб)`.

Завантаження редактора…
Показати підказку

повернути основу ** експоненти

Рішення доступне після 3 спроб

Повторна вправа

вправи#python.m5.l2.e2
Спроби: 0Завантаження…

Визначте `create_record(name, values=None)`, який, коли значенням є None, використовує новий порожній список. Додайте 1 до значень і поверніть запис dict {'name': name, 'values': values}. Викличте його двічі без передачі значень і призначте `a` і `b`. Обчислити `(a['values'], b['values'])`.

Завантаження редактора…
Показати підказку

Використовуйте None як значення за замовчуванням і створіть список у функції.

Рішення доступне після 3 спроб

Додатковий виклик

вправи#python.m5.l2.e3
Спроби: 0Завантаження…

Визначте функцію \`greet(name, message="Hello")\`, яка повертає відформатований рядок \`"{message}, {name}!"\`. Перевірте функцію, викликавши \`greet("Bob")\` як останній вираз.

Завантаження редактора…
Показати підказку

Використовуйте параметр за замовчуванням message="Hello" та f-рядок для повернутого привітання.

Рішення доступне після 3 спроб