Перейти к основному содержимому
Модуль 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, set) в качестве значения по умолчанию: по умолчанию оценивается ОДИН РАЗ, когда функция определена, и используется всеми все звонки.

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, expent=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 попыток