Kodokon kodokon.com

Функции: def, параметры, return и область видимости

Структурируй код в переиспользуемые функции, освой значения по умолчанию и разберись с областью видимости переменных.

10 мин · 3 вопросов

Открыть этот урок в Kodokon

Ты уже умеешь писать циклы и условия - пора структурировать код. Функция изолирует конкретную задачу за понятным именем: пишешь её один раз, тестируешь один раз, вызываешь везде. def объявляет функцию, параметры принимают входные значения, а return отправляет результат вызывающему коду. Запомни одну вещь, о которой часто забывают: функция без return возвращает None.

PYTHON
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
Функция принимает два параметра и возвращает значение через return.

Значения по умолчанию делают функцию гибкой, не плодя её вариантов: объявляй их после обязательных параметров. При вызове именованные аргументы (currency="USD") документируют твоё намерение. В профессиональном коде их используют, как только у функции больше двух параметров: вызов читается ясно, без заглядывания в определение.

PYTHON
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 EUR
Именованные аргументы позволяют указать только то, что меняется.
PYTHON
def 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']
С паттерном None каждый вызов начинается с нового списка.

Область видимости определяет, где существует переменная. Переменная, созданная внутри функции, - локальная: она исчезает, когда вызов завершается. Функция может читать глобальную переменную, но любое присваивание создаёт новую локальную переменную - глобальная остаётся нетронутой. Хорошая привычка: вместо изменения глобальных переменных передавай параметры и возвращай результаты; твой код становится предсказуемым и тестируемым.

PYTHON
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
Читать глобальную переменную можно; присваивание создаёт локальную.

Проверка знаний

Убедись, что запомнил ключевые моменты этого урока.

  1. Что возвращает функция Python, в которой нет инструкции return?
    • 0
    • None
    • Пустую строку
    • Возбуждается ошибка
  2. Почему стоит избегать def add_item(item, items=[])?
    • Список по умолчанию создаётся один раз и общий для всех вызовов
    • Список нельзя использовать как значение по умолчанию
    • Это вызывает SyntaxError при определении
  3. Что происходит, когда ты присваиваешь переменную внутри функции, а глобальная с тем же именем уже существует?
    • Python изменяет глобальную переменную
    • Python создаёт локальную переменную, глобальная остаётся нетронутой
    • Python сообщает об ошибке конфликта имён