Функция в Python — именованный блок кода, объявляемый ключевым словом def. Она принимает аргументы и возвращает результат через return; при отсутствии return возвращает None. Функции Python решают две ключевые задачи: устраняют дублирование по принципу DRY (Don't Repeat Yourself — «не повторяй себя») и делают программу модульной. В статье разберём синтаксис def, пять видов аргументов, правило LEGB для области видимости и семь видов функций — от встроенных до асинхронных — с примерами кода в каждом разделе.
Функция объединяет набор инструкций в единый именованный блок и вызывается столько раз, сколько нужно. Без функций один и тот же код пришлось бы копировать во все нужные места — при ошибке придётся исправлять каждую копию.
Не знаете, с чего ребёнку начать в IT?
Дайте попробовать разные направления: Python, веб-разработку и робототехнику
Четыре причины использовать функции в программировании:
В Python функция — объект первого класса: её хранят в переменной, передают другим функциям и возвращают как результат. Это открывает возможности, которых нет во многих других языках.
В Python нет синтаксического разграничения: оба блока объявляются через def. Единственное различие — наличие return. Функция явно возвращает значение; процедура завершает работу и возвращает None неявно.
| Характеристика |
Функция |
Процедура |
|---|---|---|
| Ключевое слово | def | def |
| Возвращает значение | Да (return) | Нет (возвращает None) |
| Пример | def add(a, b): return a + b | def greet(): print(«Привет») |
Метод — функция, привязанная к классу. Первый аргумент метода — self (ссылка на объект); вызывается через точку: объект.метод(). Обычная функция независима от класса.
| Характеристика |
Функция |
Метод |
|---|---|---|
| Принадлежность | Независима | Привязана к классу |
| Первый аргумент | Любой | self |
| Вызов | имя(аргументы) | объект.метод(аргументы) |
def (сокращение от define — «определить») начинает любое объявление функции. После него — имя, скобки с аргументами и двоеточие. Тело функции пишется с отступом в четыре пробела и завершается оператором return.
def имя_функции(аргументы):
# тело функции
return результат
Правила именования: только латиница, цифры и нижнее подчёркивание; имя начинается с буквы; стиль — snake_case (my_function, calculate_total). Соглашение закреплено в руководстве по стилю PEP 8.

Пошагово: написать def → придумать имя → указать параметры в скобках → поставить двоеточие → написать тело с отступом → вернуть результат через return.
def add(a, b):
result = a + b
return result
Каждая строка важна: a и b — параметры, result — локальная переменная, return передаёт значение вызывающему коду. Частая ошибка начинающих — пропустить отступ. Python реагирует на это IndentationError.
Вызов функции — имя из объявления плюс скобки с аргументами:
print(add(2, 3)) # 5
print(add(10, 7)) # 17
print(add(0, 100)) # 100
Одну функцию вызывают неограниченное число раз с разными входными значениями. В этом и состоит смысл переиспользования кода.
return завершает выполнение функции и передаёт значение вызывающему коду. Без него функция неявно возвращает None.
def square(x):
return x * x # возвращает значение
def say_hi():
print(«Привет») # оператора return нет — вернёт None
Ключевое отличие от yield: return завершает функцию полностью, yield — приостанавливает и сохраняет состояние до следующего вызова.

Параметр — имя переменной в объявлении: в def f(x) — x это параметр. Аргумент — конкретное значение при вызове: в f(5) — 5 это аргумент. На практике термины часто используют взаимозаменяемо.
В Python пять видов аргументов функции: позиционные, именованные, по умолчанию, *args и **kwargs. Каждый решает свою задачу — разбираем по порядку.
Позиционные аргументы передаются строго по порядку: поменяете местами — получите неверный результат. Именованные (ключевые) указываются как имя=значение — порядок не важен, читаемость выше.
def greet(name, age):
print(f»{name}, {age} лет»)
greet(«Максим», 16) # позиционный
greet(age=16, name=»Максим») # именованный — порядок другой, результат тот же
Параметры по умолчанию не требуют передачи аргумента, если подходит стандартное значение:
def power(base, exp=2):
return base ** exp
power(3) # 9 — exp по умолчанию равен 2
power(3, 3) # 27 — аргумент переопределяет дефолт
Параметры с умолчанием всегда располагаются после обязательных — иначе Python вернёт SyntaxError.
*args собирает все позиционные аргументы в кортеж — используется, когда число аргументов заранее неизвестно:
def total(*args):
return sum(args)
total(1, 2, 3, 4) # 10
**kwargs собирает именованные аргументы в словарь:
def show_info(**kwargs):
for key, value in kwargs.items():
print(f»{key}: {value}»)
show_info(name=»Лена», grade=10)

Область видимости (scope) определяет, в каких частях программы доступна переменная. Без неё переменные из разных функций конфликтовали бы между собой.
Python ищет переменную по LEGB-правилу: Local → Enclosing → Global → Built-in. Сначала проверяется локальная область функции, затем — объемлющая (если есть вложенная функция), потом — глобальная, наконец — встроенная (имена самого интерпретатора).
Локальная переменная объявляется внутри функции и недоступна за её пределами:
def calculate():
result = 42 # локальная переменная
print(result) # NameError: name ‘result’ is not defined
Глобальные переменные объявляются вне функций и видны всей программе. Читать их внутри функции можно напрямую; изменять — только с ключевым словом global.
global разрешает изменить глобальную переменную изнутри функции. nonlocal даёт вложенной функции доступ к переменным объемлющей — именно так строятся замыкания:
def make_counter():
count = 0
def increment():
nonlocal count
count += 1
return count
return increment
counter = make_counter()
counter() # 1
counter() # 2
Ребенок хочет изучать программирование? Пусть начнёт с реальных проектов
На курсе школьники создают Telegram-бота, сайт и веб-приложение

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

| Группа |
Функции |
Назначение |
|---|---|---|
| Ввод/Вывод | print(), input() | Взаимодействие с пользователем |
| Числа | abs(), max(), min(), sum(), round() | Арифметические операции |
| Типы | int(), str(), bool(), float() | Преобразование типов |
| Коллекции | len(), sorted(), reversed() | Работа с коллекциями |
| Итерация | range(), enumerate(), zip(), map(), filter() | Обход и фильтрация |
| Объекты | type(), isinstance(), id() | Интроспекция объектов |
Синтаксис: lambda параметры: выражение. Lambda записывается в одну строку и не имеет имени. Ключевое ограничение — только одно выражение (в отличие от def, где тело функции может быть любым).
Применяется для сортировки с key= и передачи в map()/filter():
nums = [3, 1, 4, 1, 5]
nums.sort(key=lambda x: -x) # сортировка по убыванию
squares = list(map(lambda x: x**2, nums)) # возведение в квадрат

| Параметр |
lambda |
def |
|---|---|---|
| Синтаксис | lambda x: x*2 | def f(x): return x*2 |
| Имя | Анонимна | Именована |
| Число выражений | 1 | Без ограничений |
| Переиспользование | Ограничено | Полное |
Рекурсивная функция вызывает сама себя для решения подзадач. Обязательны два компонента: базовый случай (условие выхода из рекурсии) и рекурсивный вызов. Без базового случая функция уходит в бесконечный цикл и выбрасывает RecursionError.
def factorial(n):
if n == 0: # базовый случай — выход
return 1
return n * factorial(n — 1) # рекурсивный вызов
Применение: вычисление факториала, чисел Фибоначчи, обход вложенных структур данных.

Функции высшего порядка принимают другие функции как аргументы или возвращают их в качестве результата.
nums = [1, 2, 3, 4, 5, 6]
evens = list(filter(lambda x: x % 2 == 0, nums)) # [2, 4, 6]

yield приостанавливает функцию, отдаёт очередной элемент и сохраняет состояние до следующего вызова. В отличие от return, функция при этом не завершается.
def count_up(n):
for i in range(n):
yield i
Главное преимущество генераторов — экономия памяти: элементы создаются по одному, не хранятся все сразу. При исчерпании генератора возникает StopIteration.
async def создаёт корутину (coroutine) — функцию, которую можно приостанавливать. await ожидает результат другой корутины, не блокируя цикл событий (event loop).
import asyncio
async def fetch(url):
await asyncio.sleep(1) # имитация сетевого запроса
return f»Данные из {url}»
asyncio.run(fetch(«https://example.com»))
Для параллельного запуска нескольких корутин используют asyncio.gather(task1(), task2()).

В Python аргументы передаются по ссылке на объект. Поведение зависит от типа данных.
Неизменяемые типы (int, str, tuple): изменения внутри функции не затрагивают оригинал — создаётся новый объект.
Изменяемые типы (list, dict): изменения внутри функции отражаются на оригинале.
def double(x):
x = x * 2 # создаётся новый объект — оригинал не меняется
num = 5
double(num)
print(num) # 5
def append_zero(lst):
lst.append(0) # изменяет тот же объект в памяти
data = [1, 2, 3]
append_zero(data)
print(data) # [1, 2, 3, 0]
Понимание этого различия помогает избежать неожиданного поведения функций, работающих со списками и словарями.
Встроенные функции и методы строк и списков — основа ежедневной работы с данными. Технически большинство из них являются методами объектов, но применяются аналогично обычным функциям.
split() разбивает строку по разделителю, join() собирает список строк в одну, replace() заменяет подстроку, upper() и lower() меняют регистр символов.
| Функция |
Что делает |
Пример |
|---|---|---|
| split() | Разбивает строку | «a,b».split(«,») → [«a»,»b»] |
| join() | Объединяет строки | «,».join([«a»,»b»]) → «a,b» |
| replace() | Замена подстроки | «hi».replace(«i»,»ello») → «hello» |
| upper() | Верхний регистр | «text».upper() → «TEXT» |
append() добавляет элемент в конец, pop() удаляет последний, sort() сортирует список на месте, len() возвращает длину.
| Функция |
Что делает |
Пример |
|---|---|---|
| append() | Добавляет элемент в конец | [1,2].append(3) → [1,2,3] |
| pop() | Удаляет последний элемент | [1,2,3].pop() → 3 |
| sort() | Сортирует список | [3,1,2].sort() → [1,2,3] |
| len() | Длина списка | len([1,2,3]) → 3 |
Хотите научиться писать функции, создавать Telegram-ботов и веб-приложения с нуля? На курсе «Программирование: Уверенный старт» школьники за 4 недели осваивают Python, HTML/CSS, Flask и Arduino — и создают четыре реальных проекта для портфолио. Подробнее — на странице курса.
Функция вернёт None — объект типа NoneType. Пример: def greet(): print(«Привет») → result = greet() → result is None вернёт True. Использовать такое возвращаемое значение как число или строку нельзя — это вызовет TypeError.
Да — это вложенная функция. Внутренняя функция имеет доступ к переменным внешней через область Enclosing в правиле LEGB. Для изменения переменной внешней функции используют nonlocal. Типичный паттерн — счётчик вызовов через замыкание: вложенная функция захватывает переменную и помнит её значение между вызовами.
Параметр — имя переменной в объявлении: в def f(x) — x это параметр. Аргумент — конкретное значение при вызове: в f(5) — 5 это аргумент. На практике термины используют взаимозаменяемо, и это не считается грубой ошибкой.
lambda подходит для маленькой функции из одного выражения, которая нужна однократно: как аргумент key= в sort() или внутри map()/filter(). def выбирают, если функция вызывается многократно, содержит несколько строк или требует документирования через строку документации (docstring).
Генератор не хранит все элементы в памяти одновременно — создаёт их по одному при каждом вызове next(). При обработке миллионов записей это критически снижает потребление памяти. Когда элементы заканчиваются, генератор выбрасывает StopIteration.
Да. По умолчанию Python допускает около 1000 уровней рекурсии. При превышении возникает RecursionError: maximum recursion depth exceeded. Лимит можно изменить через sys.setrecursionlimit(), но лучше заменить глубокую рекурсию итеративным решением — оно надёжнее и быстрее.
*args позволяет передать произвольное количество позиционных аргументов. Все они собираются в кортеж и доступны по имени args. Пример: def total(*args): return sum(args) → total(1, 2, 3, 4) вернёт 10. Имя args — соглашение; технически можно написать иначе, например *numbers.
Объявляйте через async def, внутри используйте await перед асинхронными операциями. Запуск: asyncio.run(main()). Для параллельного выполнения нескольких корутин — await asyncio.gather(task1(), task2()). Модуль asyncio импортируется в начале файла стандартной строкой import asyncio.
Пусть ребёнок сделает первый IT-проект уже в этом месяце
Бесплатный онлайн-курс с понятной программой, поддержкой и проектами для портфолио