Функция - именованный блок кода, который можно вызывать много раз.
def создаёт функцию, pass временно оставляет обязательный блок пустым.
При вызове функции позиционные аргументы сопоставляются по порядку, именованные - по названию параметра.
Аргументы по умолчанию пишутся после обязательных параметров.
*args собирает лишние позиционные аргументы в tuple, **kwargs - именованные аргументы в dict.
return завершает функцию и возвращает значение; без return результатом будет None.
LEGB описывает поиск имён: Local, Enclosing, Global, Built-in.
global нужен только для изменения глобальной переменной, но чаще лучше передавать данные параметрами.
Топ-3 ошибки: передавать не то количество аргументов; ожидать значение от функции, где нет return; менять global там, где достаточно параметров и return.