"Информатика (изд. "БИНОМ. Лаборатория знаний")", Угринович Н.Д.
Функция — именованная часть программы, которая принимает данные, выполняет действия и возвращает результат. Она помогает не повторять один и тот же код и использовать вычисления в разных местах. В процедурном программировании функции обычно вызывают по имени, а в объектно-ориентированном их связывают с объектами и называют методами. Чтобы правильно вызвать подпрограмму, нужно передать подходящие аргументы и понимать, что именно она возвращает.
Текст подготовлен нейронной сетью по теме параграфа и не заменяет учебник — важные факты и формулировки сверяйте с ним.
Функция — именованный фрагмент программы, который получает входные данные, выполняет действия и возвращает результат. Например, функция может вычислить площадь фигуры или найти большее из двух чисел. Имя позволяет вызвать этот фрагмент в нужном месте, а возвращаемый результат — продолжить вычисления с полученным значением.
Параметр задаёт данные, которые функция ожидает получить, а аргумент — конкретное значение, переданное при её вызове. Если в описании функции указано два параметра для чисел, при вызове вместо них подставляют два аргумента. Это различие помогает понять, где задаётся устройство функции, а где она применяется к конкретным данным.
Процедура — подпрограмма, которая выполняет действия, но не возвращает значение как результат выражения. Например, она может вывести сообщение или изменить данные. Процедуры нужны, когда важен сам выполненный шаг, а не значение, которое можно подставить в дальнейший расчёт.
Метод — функция или процедура, связанная с объектом или классом и работающая с их данными. Например, у объекта «счёт» может быть метод пополнения, изменяющий сумму на этом счёте. Понятие метода помогает объединять действия с теми данными, к которым эти действия относятся.
Повторяющееся действие выгодно вынести в отдельную функцию, чтобы не переписывать один и тот же алгоритм в нескольких местах. Когда правило расчёта меняется, достаточно исправить его в одном месте, а не искать копии по всей программе. Такое устройство также упрощает проверку: функцию можно испытать отдельно на разных входных данных. В результате программа становится понятнее и её легче поддерживать.
При вызове функция получает управление от той части программы, где её вызвали. Сначала ей передают аргументы, затем выполняются команды её тела, и после завершения управление возвращается к месту вызова. Если функция рассчитала результат, этот результат подставляется вместо вызова или сохраняется в переменной. Такой переход позволяет скрыть подробности вычисления за коротким и понятным именем.
Параметры описывают ожидаемые данные и их роли, а аргументы задают значения для конкретного запуска функции. Количество должно совпадать, потому что иначе часть параметров останется без данных или появятся лишние аргументы. Порядок имеет значение, если первый параметр обозначает, например, длину, а второй — ширину. Типы тоже должны подходить: нельзя без дополнительного преобразования передать текст туда, где функция ожидает число.
Функция возвращает результат специальной командой возврата, предусмотренной языком программирования. Полученное значение можно сохранить, вывести или использовать в вычислении, например сложить с другим числом. Вызов процедуры обычно выполняют отдельной командой, потому что у неё нет результата для подстановки в выражение. Если попытаться использовать процедуру как число, программа не сможет выполнить такой расчёт.
В объектно-ориентированном программировании данные объединяют в объект, а связанные с ними действия оформляют как методы. Поэтому метод может обращаться к свойствам того объекта, для которого его вызвали, и изменять их. Например, один и тот же метод пополнения будет менять сумму у выбранного счёта, а не у всех счетов сразу. Эта связь помогает организовать программу так, чтобы действия были рядом с данными, которыми они управляют.
| Свойство | Функция в процедурном программировании | Процедура | Метод в объектно-ориентированном программировании |
|---|---|---|---|
| Назначение | Выполняет вычисление или другое действие с получением результата | Выполняет команду или последовательность действий | Выполняет действие, связанное с объектом или классом |
| Наличие возвращаемого значения | Возвращает значение | Не возвращает значение для выражения | Может возвращать значение или не возвращать его |
| Способ вызова | По имени функции с аргументами, если они нужны | По имени процедуры как отдельная команда | В контексте объекта или класса |
| Параметры и аргументы | Параметры задают ожидаемые данные, аргументы передают при вызове | Могут быть нужны для выполнения действия | Могут передаваться дополнительно к данным объекта |
| Связь с данными программы | Обычно получает данные через параметры | Работает с переданными или доступными данными | Может обращаться к свойствам объекта |
| Пример результата работы | Вычисленное большее число | Выведенное сообщение | Изменённое свойство объекта или возвращённое значение |
Сравнивайте сначала наличие возвращаемого значения, а затем способ вызова и связь с данными. Это помогает отличить функцию от процедуры и понять, почему метод относится к конкретному объекту. В реальных языках детали могут различаться, поэтому при работе с конкретным языком учитывайте его правила.
Условие: запросить у пользователя число, вычислить его модуль встроенной функцией и вывести результат. Модуль показывает расстояние числа от нуля, поэтому результат для отрицательного числа будет положительным. Нам нужно увидеть, где находится имя функции, что является аргументом и где используется возвращаемое значение.
Ответ: программа выводит модуль введённого числа; например, для −7 результат будет 7. При вводе положительного числа модуль совпадает с ним, а для нуля остаётся равным нулю. Вызов abs(x) можно было бы использовать непосредственно в команде вывода, поскольку функция возвращает значение.
Условие: описать собственную функцию, которая принимает два числа и возвращает большее, затем вызвать её несколько раз. В заголовке функции обозначим ожидаемые данные параметрами a и b. Чтобы выбрать ответ, сравним числа условием: если a больше b, вернём a, иначе вернём b.
Ответ: функция возвращает 9 для пары 4 и 9, а для пары 12 и 5 — 12. Одно описание можно применять снова и снова, меняя аргументы. Перед вызовом проверяем, что переданы два значения подходящего типа и в нужном порядке.
Условие: создать объекты-счета с суммой денег и метод пополнения, который увеличивает сумму на заданное число. Каждый объект хранит собственное значение суммы, поэтому важно изменить именно тот счёт, для которого вызван метод. Метод пополнения получает размер пополнения, а текущую сумму может взять из данных своего объекта.
Ответ: метод изменяет сумму только того объекта, у которого его вызвали. При вызове для двух счетов выполняется одно описание метода, но результат зависит от данных каждого объекта. Это пример связи метода с состоянием объекта, а не просто отдельного вычисления.
Путать параметр с аргументом — значит считать, что имя в описании функции и значение при вызове обозначают одно и то же. Обычно так происходит, потому что оба связаны с передаваемыми данными. Проверка простая: найдите заголовок функции и конкретный вызов; имя в заголовке — параметр, значение после имени функции — аргумент.
Забытый возврат результата приводит к тому, что функция не даёт ожидаемого значения. Иногда также пытаются поставить вызов процедуры в арифметическое выражение, хотя процедура только выполняет действие. Проверьте, предусмотрен ли в функции возврат и действительно ли вызываемая подпрограмма должна дать значение, а не, например, вывести сообщение.
Неверное количество, порядок или тип аргументов часто появляются из-за невнимательного чтения заголовка функции. Например, два числа можно передать в обратном порядке, если параметры имеют разные роли, или случайно передать текст вместо числа. Перед запуском сопоставьте каждый аргумент с соответствующим параметром и убедитесь, что число и тип данных подходят.
Обычную функцию иногда называют методом, хотя метод дополнительно связан с объектом или классом. Путаница возникает потому, что оба вида подпрограмм могут принимать аргументы и возвращать результат. Чтобы проверить себя, выясните, вызывается ли действие в контексте объекта и обращается ли оно к его данным; если такой связи нет, это не метод объекта.
Для работы с функциями нужны переменные, типы данных и выражения: они помогают передавать значения и использовать результаты. Условия и циклы часто становятся частью тела функции, если алгоритм требует выбора или повторения действий. Понимание алгоритмов позволяет выделять повторяющиеся шаги в самостоятельные подпрограммы, делая общий план программы яснее.
Функции и методы особенно полезны в больших программах, где их можно многократно вызывать и проверять отдельно. Встроенные функции и библиотечные методы помогают использовать готовые средства языка, а собственные классы позволяют создавать объекты с нужными свойствами и действиями. Это подготавливает к разработке программ, в которых отдельные части взаимодействуют друг с другом.
Чем функция отличается от процедуры?
Функция возвращает значение, которое можно сохранить или использовать в выражении. Процедура выполняет действия, например выводит сообщение, но не даёт результата для подстановки в выражение.
Почему параметр и аргумент — не одно и то же?
Параметр — имя для ожидаемых данных в описании функции. Аргумент — конкретное значение, которое передают при её вызове.
Можно ли вызвать функцию без аргументов?
Да, если функция описана без параметров. Она может, например, вернуть заранее заданное значение или получить данные другим способом.
Зачем нужны собственные функции, если в языке уже есть встроенные?
Встроенные функции решают распространённые задачи, но не всегда подходят для особой логики программы. Собственная функция помогает оформить нужное действие один раз и затем вызывать его в разных местах.
Чем метод объекта отличается от обычной функции?
Метод связан с объектом или классом и может работать с данными этого объекта. Обычную функцию вызывают отдельно, не обращаясь к конкретному объекту.
1.5. Функции в языках объектно-ориентированного и процедурного программирования