Коротко: функция — это именованный блок кода, который можно вызывать сколько угодно раз вместо того, чтобы переписывать те же строки. Она объявляется словом def, может принимать данные через параметры в скобках и возвращать результат словом return. Путаница почти всегда растёт из одного места: дети считают, что print() внутри функции — это и есть результат, хотя реальный результат — то, что функция возвращает наружу.

До функций ребёнок на курсе Python уже писал условия, циклы и работал со списками — каждая задача решалась одним куском кода сверху вниз. Функция меняет этот подход: код разбивается на именованные части, каждая отвечает за одно действие, и одну часть можно вызвать из другой.

Как объявить функцию: синтаксис по шагам

Минимальная функция выглядит так: def privet():, а на следующей строке с отступом — то, что она делает, например print("Привет!"). Слово def говорит Python «далее идёт описание действия», имя после него — название, по которому это действие потом вызывают, скобки — место для входных данных. Вызвать объявленную функцию — значит написать её имя со скобками в другом месте кода: privet().

Функция без параметров и с ними
ЗаписьЧто делает
def privet():всегда выполняет одно и то же
def privet(imya):принимает имя и использует его внутри
privet("Елена")вызывает функцию с конкретным значением

Параметры: как функция получает данные снаружи

Параметр — это имя, которое функция получает в скобках при объявлении, а аргумент — конкретное значение, которое передают при вызове. В def slozhit(a, b): return a + b параметров два, и функцию можно вызывать с любыми числами: slozhit(3, 5) вернёт 8, slozhit(10, 20) — 30. Тот же код работает для разных данных, и это главная причина писать функции — не повторять логику, а параметризовать её.

Почему print() внутри функции — не то же самое, что return?

Потому что print() показывает значение на экране и сразу забывает его, а return передаёт значение наружу, и его можно сохранить в переменную или использовать в вычислении. Функция def kvadrat(x): print(x * x) покажет число, но попытка написать rezultat = kvadrat(4) даст rezultat, равный None — функция ничего не вернула, она только вывела текст. Если заменить print на return, rezultat получит именно число 16, которое можно передать дальше в код.

Значения по умолчанию: когда параметр можно не указывать

Параметру можно сразу задать значение на случай, если его не передали: def privet(imya="друг"):. Вызов privet() без аргументов использует слово «друг», а privet("Максим") перезапишет его на имя. Этот пример на курсе показывают сразу после базового синтаксиса — он объясняет, почему встроенные функции Python, например print(..., sep=" "), можно вызывать и со всеми параметрами, и без части из них.

Локальные переменные: почему функция не видит то, что вне неё

Переменная, созданная внутри функции, существует только во время её выполнения и исчезает, как только функция завершилась — это называется локальная область видимости. Если написать def schitat(): x = 10, а потом попробовать вне функции напечатать print(x), Python выдаст ошибку NameError: переменной x за пределами функции просто не существует. Это не сбой, а защита: благодаря такой изоляции две разные функции могут иметь собственную переменную с одинаковым именем x и не мешать друг другу.

Есть и обратная сторона: функция видит переменные, объявленные вне её, если не создаёт свою с тем же именем. Но на практике на курсе советуют передавать нужные данные через параметры, а не через внешние переменные — так функцию можно переносить в другой проект без изменения остального кода.

Функция, которая вызывает другую функцию

Функции можно комбинировать, и именно здесь становится видно, зачем они на самом деле нужны. Пусть есть функция def chetnoe(chislo): return chislo % 2 == 0, которая проверяет, чётное ли число, и возвращает True или False. Вторую функцию можно написать так, чтобы она использовала первую: def schitat_chetnye(spisok):, а внутри — цикл for по списку, который для каждого элемента спрашивает chetnoe(elem) и считает, сколько раз ответ был True. Так из двух простых функций складывается третья, более сложная задача — и это именно та привычка, которую курс развивает: не писать одну большую функцию на всё, а несколько маленьких, каждая из которых легко проверяется отдельно.

Можно ли передать функции список, а не одно число?

Да, параметром может быть любой тип данных — число, строка, список или даже другая функция. Функция def srednee(spisok_chisel): return sum(spisok_chisel) / len(spisok_chisel) принимает целый список и возвращает одно число — среднее значение. Для ребёнка, который уже проходил списки, это естественный следующий шаг: тот же список, который раньше только выводили на экран или перебирали циклом, теперь можно отдать функции одним аргументом.

Где на курсе появляется эта тема

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

Типичные ошибки с функциями

Забыть return и удивиться, почему результат — None, случается чаще всего. Вторая по популярности ошибка — перепутать отступы: строка, которая должна быть внутри функции, написана на том же уровне, что и def, и Python воспринимает её как отдельный, не связанный с функцией код. Третья — назвать параметр так же, как переменную вне функции, и удивляться, почему изменение внутри функции «не видно» снаружи: параметр живёт только в пределах функции, и это осознанная особенность языка, а не ошибка.

Ещё одна частая путаница: вызов функции без скобок

Строка privet без скобок не вызывает функцию — она лишь ссылается на неё как на объект, и Python ничего не выполнит. Увидеть результат можно только написав скобки: privet(). На письме разница в два символа, а в поведении — разница между «запустить действие» и «просто назвать его», и это одна из тех ошибок, которую легко не заметить, пока программа молча не делает того, что ожидалось.

Обязательно ли функции возвращать значение?

Нет. Функция без return просто выполняет действия — печатает текст, рисует фигуру, меняет список — и возвращает None по умолчанию. Это нормально для функций, цель которых — сделать что-то, а не вычислить число. return нужен тогда, когда результат функции понадобится дальше в коде, а не только на экране.

Зачем это дальше в программе курса

Функции — мост к теме классов и объектов, которую на старшей ступени разбирает статья об ООП в Python: класс, по сути, группирует несколько функций вокруг одних данных. Ребёнок, который уверенно пишет функции с параметрами и return, переходит к классам без лишнего стресса — это тот же принцип, только с другой организацией кода.

Главное правило для практики простое: если один и тот же код копируется в программе больше одного раза — это сигнал выносить его в функцию. Остальные детали синтаксиса становятся понятны за два-три занятия практики, а не за одно теоретическое объяснение.

На занятиях эту тему закрепляют не пересказом правил, а переписыванием уже готового кода: ребёнок берёт проект из предыдущей темы, где одно и то же действие повторено несколько раз подряд, и выносит его в одну функцию с параметрами. Разница видна сразу — вместо десяти одинаковых блоков остаётся один вызов для каждого случая, и правку достаточно внести один раз.