Представьте кофемашину. Вы нажимаете одну кнопку — и получаете капучино. Вам не нужно каждый раз вручную молоть зёрна, греть молоко и настраивать давление. Машина всё делает сама — достаточно знать, какую кнопку нажать. Функция в программировании работает ровно так же: вы описываете действие один раз, а потом просто «нажимаете кнопку» — вызываете функцию — столько раз, сколько нужно.
Зачем нужны функции — жизнь без них
Допустим, вы пишете программу, которая считает площадь прямоугольника. Без функций это выглядит так:
JavaScript:
// Первый прямоугольник
let width1 = 10;
let height1 = 5;
let area1 = width1 * height1;
console.log(area1); // 50
// Второй прямоугольник — копируем весь код
let width2 = 7;
let height2 = 3;
let area2 = width2 * height2;
console.log(area2); // 21
// Третий... и так до бесконечности Если вдруг понадобится изменить логику (например, округлять результат) — придётся менять в каждом месте. Пропустите одно — поймаете баг, который будет тяжело найти. В программировании у этой проблемы есть название: DRY — Don't Repeat Yourself («не повторяй себя»). Функции — главный инструмент соблюдения этого принципа.
Что такое функция в программировании
Функция — это именованный блок кода, который выполняет одну конкретную задачу. Вы описываете его один раз, даёте имя, а потом вызываете по этому имени сколько угодно раз.
Три ключевых элемента любой функции:
- Имя — как мы её будем вызывать.
- Параметры — данные, которые она принимает на вход (необязательно).
- Тело — код, который выполняется при вызове.
Функцию можно сравнить с рецептом: в нём написано что делать (тело), указаны ингредиенты (параметры) и в конце получается блюдо (результат). Рецепт написан один раз, а готовить по нему можно хоть каждый день.
Как объявить функцию — синтаксис в JavaScript и Python
Вернёмся к прямоугольнику. Вот как выглядит функция в двух популярных языках:
JavaScript:
// Объявляем функцию
function calculateArea(width, height) {
return width * height;
}
// Вызываем сколько угодно раз
console.log(calculateArea(10, 5)); // 50
console.log(calculateArea(7, 3)); // 21
console.log(calculateArea(4, 4)); // 16 Python:
# Объявляем функцию
def calculate_area(width, height):
return width * height
# Вызываем сколько угодно раз
print(calculate_area(10, 5)) # 50
print(calculate_area(7, 3)) # 21
print(calculate_area(4, 4)) # 16 Синтаксис разный, но смысл одинаковый. В JavaScript функция начинается с ключевого слова function , в Python — с def . Это одна из первых вещей, которую замечаешь при знакомстве с новым языком: концепции универсальны, меняется только запись.
Параметры и аргументы — что передаём внутрь
Параметры — это переменные, которые функция ожидает получить. Они указываются при объявлении. Аргументы — конкретные значения, которые вы передаёте при вызове. Проще говоря: параметр — это «ингредиент» в рецепте, аргумент — то, что вы реально кладёте на кухню.
JavaScript:
// name и greeting — параметры (описание)
function greet(name, greeting) {
console.log(greeting + ', ' + name + '!');
}
// 'Анна' и 'Привет' — аргументы (конкретные значения)
greet('Анна', 'Привет'); // Привет, Анна!
greet('Иван', 'Добрый день'); // Добрый день, Иван! Python:
def greet(name, greeting):
print(f'{greeting}, {name}!')
greet('Анна', 'Привет') # Привет, Анна!
greet('Иван', 'Добрый день') # Добрый день, Иван! Возвращаемое значение — что функция отдаёт обратно
Функция может не только выполнять действия, но и возвращать результат — значение, которое можно сохранить в переменную или передать дальше. За это отвечает ключевое слово return (в обоих языках).
JavaScript:
function add(a, b) {
return a + b; // возвращаем сумму
}
let result = add(3, 4); // сохраняем результат
console.log(result); // 7
// Можно использовать прямо в выражении
console.log(add(10, 20) * 2); // 60 Python:
def add(a, b):
return a + b
result = add(3, 4)
print(result) # 7
print(add(10, 20) * 2) # 60 Если функция ничего не возвращает явно, JavaScript вернёт undefined, а Python — None. Это не ошибка, просто такая функция выполняет действие (например, выводит что-то на экран), а не вычисляет значение.
Типы функций в программировании
Функции бывают разные — различаются по тому, как объявляются и как используются. Разберём основные виды.
Именованные функции — самый распространённый вид. Объявляются с именем, можно вызвать в любом месте программы. Всё, что мы писали выше — именованные функции.
Анонимные функции — функции без имени. Обычно используются там, где функция нужна один раз: как аргумент для другой функции или значение переменной.
JavaScript:
// Анонимная функция в переменной
const square = function(x) {
return x * x;
};
console.log(square(5)); // 25
// Анонимная функция как аргумент
const numbers = [1, 2, 3, 4];
const doubled = numbers.map(function(n) {
return n * 2;
});
console.log(doubled); // [2, 4, 6, 8] Стрелочные функции (JavaScript) и лямбды (Python) — сокращённая запись анонимной функции для простых случаев. Результат тот же, кода меньше:
JavaScript — стрелочная функция:
// Вместо function(x) { return x * x; }
const square = x => x * x;
const doubled = [1, 2, 3, 4].map(n => n * 2);
console.log(doubled); // [2, 4, 6, 8] Python — лямбда:
# Вместо полноценной def для простых случаев
square = lambda x: x * x
numbers = [1, 2, 3, 4]
doubled = list(map(lambda n: n * 2, numbers))
print(doubled) # [2, 4, 6, 8] Рекурсивные функции — функции, которые вызывают сами себя. Это отдельная большая тема со своими правилами и подводными камнями — разберём её в отдельной статье. Пока достаточно знать, что такое существует: когда встретите слово «рекурсия» в коде или документации, не пугайтесь.
Параметры по умолчанию
Параметрам можно задать значение по умолчанию — если аргумент не передан, функция использует его. Удобно, когда большинство вызовов однотипны:
JavaScript:
function greet(name, greeting = 'Привет') {
console.log(greeting + ', ' + name + '!');
}
greet('Анна'); // Привет, Анна! — используем значение по умолчанию
greet('Иван', 'Хаюшки'); // Хаюшки, Иван! — передаём своё Python:
def greet(name, greeting='Привет'):
print(f'{greeting}, {name}!')
greet('Анна') # Привет, Анна!
greet('Иван', 'Хаюшки') # Хаюшки, Иван! Встроенные функции — то, что уже готово
Каждый язык поставляется с набором встроенных функций — их не нужно писать самому, они просто есть. Вы уже ими пользовались, возможно, не задумываясь:
JavaScript:
console.log('Привет'); // вывод в консоль
Math.max(3, 7, 1); // 7 — максимум из чисел
Math.round(3.7); // 4 — округление
'hello'.toUpperCase(); // 'HELLO' — строка в верхний регистр
[1, 2, 3].length; // 3 — длина массива
parseInt('42'); // 42 — строка в число Python:
print('Привет') # вывод в консоль
max(3, 7, 1) # 7 — максимум
round(3.7) # 4 — округление
'hello'.upper() # 'HELLO' — строка в верхний регистр
len([1, 2, 3]) # 3 — длина списка
int('42') # 42 — строка в число Встроенных функций в каждом языке сотни. Перед тем как писать свою функцию, всегда стоит проверить — возможно, она уже существует. Это экономит время и делает код надёжнее, потому что встроенные функции протестированы миллионами разработчиков до вас.
Одна функция — одна задача
Главное правило хорошей функции: она должна делать одно конкретное дело и делать его хорошо. Если функция называется getUserAndSendEmail — это уже две задачи, и лучше разбить её на две отдельные функции.
Признаки хорошей функции:
- Название говорит что она делает — без чтения тела.
- Помещается на экран — не нужно скроллить вниз полстраницы.
- Работает только с тем, что получила через параметры.
- При одинаковых аргументах всегда возвращает одинаковый результат.
Последние два пункта описывают так называемую чистую функцию (pure function) — идеал, к которому стремятся опытные разработчики. Чистые функции легко тестировать, легко переиспользовать и вообще приятно читать.
Итого: функции в программировании
Функция — одна из фундаментальных концепций в программировании. Она есть в каждом языке, и принцип везде одинаковый: описать действие один раз, дать ему имя и вызывать по мере надобности.
- Функция принимает параметры на вход и может возвращать результат через return .
- Именованные функции объявляются один раз и вызываются по имени.
- Анонимные и стрелочные (JS) / лямбды (Python) — короткая запись для простых случаев.
- Рекурсивные функции вызывают сами себя — обязателен выход из рекурсии.
- Параметры по умолчанию делают вызовы удобнее.
- Встроенные функции — уже написаны за вас, используйте их.
В JavaScript функции идут рука об руку с асинхронностью — когда понадобится работать с запросами к серверу или таймерами, загляните в наши статьи про setTimeout и паузы в JS и Promise в JavaScript: там функции используются буквально на каждом шагу.