Что такое функция в программировании?

JavaScript
291 просмотр

Представьте кофемашину. Вы нажимаете одну кнопку — и получаете капучино. Вам не нужно каждый раз вручную молоть зёрна, греть молоко и настраивать давление. Машина всё делает сама — достаточно знать, какую кнопку нажать. Функция в программировании работает ровно так же: вы описываете действие один раз, а потом просто «нажимаете кнопку» — вызываете функцию — столько раз, сколько нужно.

Что такое функция в программировании — объясняем простыми словами

Зачем нужны функции — жизнь без них

Допустим, вы пишете программу, которая считает площадь прямоугольника. Без функций это выглядит так:

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: там функции используются буквально на каждом шагу.

Вам может быть интересно:
Swiper.js — слайдер для сайта: настройки и примеры
Swiper.js — как подключить и настроить слайдер на сайте
Promise в JavaScript — промисы JS простыми словами для начинающих
Promise в JavaScript простыми словами — полное руководство
Анимация частиц и GLSL-шейдеры в PixiJS 8 — живой пример в браузере
Изучаем PixiJS. Часть 2 — продвинутая анимация и GLSL-шейдеры
Слайдер для сайта на Owl Carousel 2 — настройка и примеры
Слайдер для сайта Owl Carousel 2 — настройка просто и быстро
Комментарии 0 Разные мнения приветствуются. Здесь можно спорить и обсуждать, но уважительно и без токсичности.
Отмена