Функции Python 3
Функция - главный инструмент, который превращает набор строк в программу. Здесь вы научитесь объявлять функции через def, возвращать результат через return, понимать, где живут локальные переменные, и избегать ловушек с аргументами по умолчанию.
Примеры проверены на Python 3.12 и 3.13. В конце страницы добавлен раздел о том, как писать функции в современном стиле: с аннотациями типов, именованными аргументами и без скрытого общего состояния. Это то, что ожидают увидеть в коде на работе и на код-ревью в 2026 году.

Начинаем цикл статей, про функции в Python 3. В этом цикле, мы с вами разберемся для чего нужны функции, синтаксис, и типы функции. Кроме всего этого, мы научимся создавать различные типы функции на Python 3.
Что такое функция?
В первую очередь, функция - это многоразовый код, мы напишем ее один раз, а затем можно вызывать эту функцию сколько угодно. Функции так же позволяют разделить нашу программу на небольшие модульные блоки. В то время как наша программа будет становиться больше, благодаря функциям, она станет организованнее, и с более понятным кодом. Самое главное преимущество функции, это возможность не повторять один и тот же код несколько раз.
Я понимаю, что для тех, кто в первый раз сталкивается с функциями, сложно сразу понять о чем идет речь, поэтому, как и в предыдущих уроках, мы шаг за шагом узнаем, что, где, и как применяется.
Синтаксис функции
def name_functions(parameters):
"""
Описание функции, желательно всегда писать.
Что бы спустя время, вы могли понять, что делает эта функция
"""
pass
Выше я привел пример определения функции, оно состоит из следующих элементов.
- Ключевое слово def - определяет начало функции
- Затем следует указать название функции (обратите внимание, нельзя называть функции зарезервированными именами Python)
- Далее после название идут круглые скобки, в них мы передаем (аргументы функции). Они необязательны
- Знак двоеточия, как и в циклах и в условиях, означает конец заголовка
- Внутри функции желательно указать комментарии, что бы мы всегда знали, что делает эта функция
- Далее отступ в 4 пробела, и создаем тело функции
- return - необязательный оператор, который возвращает значения из функции
Пример функции
def hello(name):
"""
Эта функция приветствия.
Аргумент name передается в качестве параметра
"""
print("Привет, "+ name + " Доброе утро")
Отлично, простейшая функция у нас готова, она приветствует всех, чье имя будет указано при вызове функции.
Как вызвать функцию?
Мы определили функцию, дали ей название hello. Вызывать эту функцию можно по разному, например из другой функции, или даже из другой программы. Сейчас вызовем эту функцию, просто введя имя этой функции, и ее параметр.
hello("Тимур")
Результат:
Привет, Тимур Доброе утро
Уловили суть? Мы в самом начале создали функции, в парметр функции передаем переменную name, и в print выводим переданный параметр. Затем, мы в любом месте нашей программы, можем написать имя нашей функции, передать ей параметр, и она выведет наше приветствие. Откройте свой Pycharm, и введите приведенный ниже листинг кода, и вы увидите результат.
def hello(name):
""" Эта функция приветствия.
Аргумент name передается в качестве параметра """
print("Привет, "+ name + " Доброе утро")
hello("Тимур")
Результат:
Привет, Тимур Доброе утро
return - оператор возврата
Оператор return возвращает значение, если отсутствует значение, или отсутствует сам оператор return - мы получаем None объект. None объект - это пустой объект, то есть нечего ему возвращать. Рассмотрим пример:
def value(number):
"""
Возвращаем значение введенного числа
"""
if number >= 0:
return number
else:
return -number
print(value(2))
print(value(-4))
Результат:
2
4
Время жизни переменных, и область работы переменных
Параметры и переменные определенные внутри функции, работают только внутри функции, при выходе из функции, определенные ранее переменные не будут видны. Из этого следует, что область действия переменных имеют локальную область действия.
Время жизни переменных внутри функции равняется времени выполнения функции. Как только функция заканчивает свою работу, значение переменной хранящейся в памяти, уничтожается. Это говорит нам о том, что функция не запоминает значение переменной из предыдущих вызовов. Ниже рассмотрим пример, который показывает как устроен жизненный цикл переменной.
def testfunc():
x = 10
print("Значение внутри функции: ", x)
x = 20
testfunc()
print("Значение переменной за пределами функции: ", x)
Результат:
Значение внутри функции: 10
Значение переменной за пределами функции: 20
На примере выше, внешней переменной x присвоено значение 20, а внутри функции создается локальная переменная x со значением 10. В результате, как мы видим одна и та же переменная выводит разное значение. Это объясняется тем, что переменная внутри функции, это локальная переменная для функции, соответственно внешняя переменная, даже если имеет такое же название, будет другой, так как области действия этих переменных разное.
Более подробно про определение функции можно почитать в официальной документации Python, если хорошо владеете английским языком, если нет, то читайте весь мой цикл, я стараюсь максимально подробно, и с примерами объяснять материал, а в конце цикла, мы с вами разберем практический пример, что бы закрепить материал.
Программирование иногда сильно утомляет, тяжело всегда думать головой, поэтому не забывайте время от времени немного расслабляться, посмотрите лучшие моменты из ЧБД.
Следующий урок: Аргументы функции
Как писать функции в современном Python
Базовый синтаксис def не менялся много лет, но требования к хорошей функции выросли. Ниже то, что отличает учебный код от рабочего.
Аннотации типов и docstring
def average(values: list[float], *, ndigits: int = 2) -> float:
"""Возвращает среднее значение, округленное до ndigits знаков."""
if not values:
raise ValueError("Список пуст")
return round(sum(values) / len(values), ndigits)
print(average([4, 5, 5, 3])) # -> 4.25
print(average([1, 2, 2], ndigits=1)) # -> 1.7
Аннотации Python не проверяет при запуске, но их читают редактор и анализаторы вроде mypy. Звездочка в списке параметров делает ndigits только именованным: вызов average(data, 1) выдаст ошибку, и никто не перепутает смысл числа.
Ловушка изменяемого значения по умолчанию
Значение по умолчанию вычисляется один раз, при создании функции. Если это список или словарь, он будет общим для всех вызовов:
def add_item(item, basket=[]): # ошибка
basket.append(item)
return basket
print(add_item("хлеб")) # -> ['хлеб']
print(add_item("сыр")) # -> ['хлеб', 'сыр']
def add_item(item, basket=None): # правильно
if basket is None:
basket = []
basket.append(item)
return basket
Переменное число аргументов
def log(level, *messages, **extra):
print(level, *messages, extra)
log("INFO", "Старт", "сервера", port=8080)
# -> INFO Старт сервера {'port': 8080}
| Запись | Что получает функция | Когда нужна |
|---|---|---|
def f(a, b) | обязательные аргументы | основные входные данные |
def f(a, b=1) | аргумент со значением по умолчанию | необязательные настройки |
def f(*args) | кортеж позиционных аргументов | произвольное число значений |
def f(**kwargs) | словарь именованных аргументов | передача опций дальше |
def f(a, *, b) | b только по имени | флаги и параметры, которые легко перепутать |
def f(a, /, b) | a только по позиции | API, где имя параметра может измениться |
Одна функция, одна задача
Функция, которая и считает, и печатает, плохо переиспользуется. Возвращайте результат через return, а вывод делайте снаружи. Такую функцию легко проверить тестом и вызвать из другого модуля.
Еще несколько правил, которые экономят время на отладке. Проверяйте входные данные в начале функции и сразу выходите через return или raise, тогда основной код не уходит вглубь вложенных условий. Не меняйте переданный список или словарь без явной необходимости: вызывающий код не ожидает, что его данные изменятся. Если функция не помещается на один экран, ее почти всегда можно разделить на две-три более простые. Подробнее о видах параметров читайте в статье Аргументы функции Python.
Частые вопросы
Несколько вопросов, которые часто задают начинающие, и ответы на них.
Чем print внутри функции отличается от return?
print только выводит текст на экран, а функция при этом возвращает None. return передает значение вызывающему коду, его можно сохранить в переменную, сравнить или передать в другую функцию.
Можно ли вернуть из функции несколько значений?
Да, перечислите их через запятую: return total, count. Python вернет кортеж, который удобно распаковать: total, count = stats(data).
Как изменить глобальную переменную внутри функции?
Технически через global name, но так делать не стоит: функция начинает зависеть от внешнего состояния. Лучше передать значение аргументом и вернуть новое через return.
Что будет, если вызвать функцию до ее определения?
Получите NameError, потому что def выполняется как обычная инструкция сверху вниз. Внутри другой функции ссылаться на функцию, объявленную ниже, можно: имя ищется в момент вызова, а не при определении.
Нужно ли писать аннотации типов новичку?
Не обязательно, но полезно начать рано. Аннотации служат документацией, помогают редактору подсказывать методы и находить ошибки до запуска. Для учебных задач достаточно аннотировать параметры и возвращаемое значение.