Модульні уроки (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, набір) як значення за замовчуванням: the за замовчуванням оцінюється ОДИН РАЗ, коли функція визначена, і використовується спільно всі дзвінки.
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, exponent=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 спроб