Структурируй код в переиспользуемые функции, освой значения по умолчанию и разберись с областью видимости переменных.
Открыть этот урок в KodokonТы уже умеешь писать циклы и условия - пора структурировать код. Функция изолирует конкретную задачу за понятным именем: пишешь её один раз, тестируешь один раз, вызываешь везде. def объявляет функцию, параметры принимают входные значения, а return отправляет результат вызывающему коду. Запомни одну вещь, о которой часто забывают: функция без return возвращает None.
def net_price(price, tax_rate):
total = price * (1 + tax_rate)
return round(total, 2)
result = net_price(100, 0.2)
print(result) # 120.0Значения по умолчанию делают функцию гибкой, не плодя её вариантов: объявляй их после обязательных параметров. При вызове именованные аргументы (currency="USD") документируют твоё намерение. В профессиональном коде их используют, как только у функции больше двух параметров: вызов читается ясно, без заглядывания в определение.
def format_price(amount, currency="EUR", digits=2):
return f"{amount:.{digits}f} {currency}"
print(format_price(19.9)) # 19.90 EUR
print(format_price(19.9, currency="USD")) # 19.90 USD
print(format_price(19.9, digits=0)) # 20 EURdef add_item(item, items=None):
if items is None:
items = []
items.append(item)
return items
print(add_item("pen")) # ['pen']
print(add_item("book")) # ['book']Область видимости определяет, где существует переменная. Переменная, созданная внутри функции, - локальная: она исчезает, когда вызов завершается. Функция может читать глобальную переменную, но любое присваивание создаёт новую локальную переменную - глобальная остаётся нетронутой. Хорошая привычка: вместо изменения глобальных переменных передавай параметры и возвращай результаты; твой код становится предсказуемым и тестируемым.
rate = 0.2
def apply_tax(price):
return round(price * (1 + rate), 2)
def set_rate(new_rate):
rate = new_rate # local variable, no effect
print(apply_tax(100)) # 120.0
set_rate(0.1)
print(apply_tax(100)) # 120.0, the global is untouched