Уроки модуля (2/4)
Параметры по умолчанию и ключевые слова
Параметры функции могут иметь значения по умолчанию: если вызывающая сторона не передает для них используются значения по умолчанию. Вы также можете вызвать функцию, передающую параметры по имени (аргументы ключевого слова).
Параметры по умолчанию
def saluta(nome, saluto="Ciao"):
return f"{saluto}, {nome}!"
saluta("Ada") # 'Ciao, Ada!'
saluta("Ada", "Hello") # 'Hello, Ada!'Параметры со значениями по умолчанию должны идти после параметров без:
def f(a, b=1): # OK
def f(a=1, b): # SyntaxErrorАргументы ключевых слов
Вы можете передавать аргументы по имени в любом порядке, что делает вызов более удобным. читаемый:
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Золотое правило: в вызове позиционные аргументы идут ДО аргументов ключевых слов.
crea_utente("Ada", eta=36) # OK
crea_utente(nome="Ada", 36) # SyntaxError⚠️ Ошибка изменяемых значений по умолчанию
НИКОГДА не используйте изменяемый объект (список, dict, set) в качестве значения по умолчанию: по умолчанию оценивается ОДИН РАЗ, когда функция определена, и используется всеми все звонки.
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 в качестве стража и создайте его внутри:
def aggiungi(elemento, lista=None):
if lista is None:
lista = []
lista.append(elemento)
return listaОпасность изменяемых аргументов по умолчанию
Никогда не используйте изменяемые объекты (например, списки или словари) в качестве значений параметров по умолчанию: например, def add(x, my_list=[]). Значение по умолчанию оценивается только один раз при определении функции, а это означает, что последующие вызовы будут использовать один и тот же изменяемый объект! Лучше всего использовать None:
def add(x, my_list=None):
if my_list is None:
my_list = []
my_list.append(x)
return my_listПопробуйте это
Определите `power(base, expent=2)`, который возвращает базовый показатель **. Вычислите «квадрат = степень (5)» и «куб = мощность (5, показатель = 3)». Оцените `(квадрат, куб)`.
Показать подсказку
вернуть основание ** показатель
Решение доступно после 3 попыток
Обзор упражнения
Определите `create_record(name,values=None)`, который, когда значения равны None, использует новый пустой список. Добавьте 1 к значениям и верните запись dict {'name': name, 'values':values}. Вызовите его дважды, не передавая значений, и присвойте значения `a` и `b`. Оцените `(a['values'], b['values'])`.
Показать подсказку
Используйте None по умолчанию и создайте список внутри функции.
Решение доступно после 3 попыток
Дополнительная задача
Определите функцию \`greet(name, message="Hello")\`, которая возвращает форматированную строку \`"{message}, {name}!"\`. Проверьте функцию, вызвав \`greet("Bob")\` в качестве последнего выражения.
Показать подсказку
Используйте параметр по умолчанию message="Hello" и f-строку для возвращаемого приветствия.
Решение доступно после 3 попыток