Лекция функции в программировании

Элементы функционального программирования

Аннотация: Эта лекция может показаться необычной для того, кто использует императивные языки программирования (вроде Pascal, C++ или Java). Тем не менее, функциональный подход дает программисту мощные средства, позволяя создавать не только более компактный, но и более устойчивый к ошибкам программный код. Совсем не обязательно писать с помощью Python чисто функциональные программы, но необходимо научиться видеть, где элементы функционального программирования принесут максимальный эффект.

Функции являются абстракциями, в которых детали реализации некоторого действия скрываются за отдельным именем. Хорошо написанный набор функций позволяет использовать их много раз. Стандартная библиотека Python содержит множество готовых и отлаженных функций, многие из которых достаточно универсальны, чтобы работать с широким спектром входных данных. Даже если некоторый участок кода не используется несколько раз, но по входным и выходным данным он достаточно автономен, его смело можно выделить в отдельную функцию.

Эта лекция более ориентирована на практические соображения, а не на теорию функционального программирования. Однако там, где нужно, будут употребляться и поясняться соответствующие термины.

Далее будут подробно рассмотрены описание и использование функций в Python , рекурсия , передача и возврат функций в качестве параметров, обработка последовательностей и итераторы , а также такое понятие как генератор . Будет продемонстрировано, что в Python функции являются объектами (и, значит, могут быть переданы в качестве параметров и возвращены в результате выполнения функций). Кроме того, речь пойдет о том, как можно реализовать некоторые механизмы функционального программирования, не имеющие в Python прямой синтаксической поддержки, но широко распространенные в языках функционального программирования.

Читайте также:  Программирование tia portal обучение

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

Функциональное программирование — это стиль программирования, использующий только композиции функций . Другими словами, это программирование в выражениях, а не в императивных командах.

Как отмечает Дэвид Мертц (David Mertz) в своей статье о функциональном программировании на Python , «функциональное программирование — программирование на функциональных языках ( LISP , ML, OCAML, Haskell, . )», основными атрибутами которых являются:

  • «Наличие функций первого класса» (функции наравне с другими объектами можно передавать внутрь функций).
  • Рекурсия является основной управляющей структурой в программе.
  • Обработка списков (последовательностей).
  • Запрещение побочных эффектов у функций, что в первую очередь означает отсутствие присваивания (в «чистых» функциональных языках)
  • Запрещение операторов, основной упор делается на выражения. Вместо операторов вся программа в идеале — одно выражение с сопутствующими определениями.
  • Ключевой вопрос: что нужно вычислить, а не как.
  • Использование функций более высоких порядков (функции над функциями над функциями).

Функциональная программа

В математике функция отображает объекты из одного множества ( множества определения функции ) в другое ( множество значений функции ). Математические функции (их называют чистыми ) «механически», однозначно вычисляют результат по заданным аргументам. Чистые функции не должны хранить в себе какие-либо данные между двумя вызовами. Их можно представлять себе черными ящиками, о которых известно только то, что они делают, но совсем не важно, как.

Программы в функциональном стиле конструируются как композиция функций. При этом функции понимаются почти так же, как и в математике: они отображают одни объекты в другие. В программировании «чистые» функции — идеал, не всегда достижимый на практике. Практически полезные функции обычно имеют побочный эффект: сохраняют состояние между вызовами или меняют состояние других объектов. Например, без побочных эффектов невозможно представить себе функции ввода-вывода. Собственно, такие функции ради этих «эффектов» и используются. Кроме того, математические функции легко работают с объектами, требующими бесконечного объема информации (например, вещественные числа). В общем случае компьютерная программа может выполнить лишь приближенные вычисления.

Читайте также:  Программирование файлов в pascal

Кстати, бинарные операции » + «, » — «, » * «, » / «, которые записываются в выражениях, являются «математическими» функциями над двумя аргументами — операндами. Их используют настолько часто, что синтаксис языка программирования имеет для них более короткую запись . Модуль operator позволяет представлять эти операции в функциональном стиле:

>>> from operator import add, mul >>> print add(2, mul(3, 4)) 14

Источник

Урок 4. Основы программирования. Функции

Чем больше в вашей программе строк, тем сложнее она для понимания. Поскольку программу придётся актуализировать, дополнять и изменять бесконечно, то объёмный код в этой задаче не помощник. Для его упрощения есть функции. Благодаря им вы сократите время на разработку и уберёте дублирующиеся части. Понимать и тестировать программу станет проще. Как всё работает, сейчас покажем.

Сначала теория

Программы состоят из алгоритмов. А они в свою очередь из команд, переменных и функций.

Функция – это часть кода, совокупность команд, которая решает конкретную задачу. Чтобы легко обратиться к функции из разных частей программы, ей присваивают имя.

Зачем обращаться к функции? Чтобы не прописывать тот же самый алгоритм повторно в другом месте. Вместо этого достаточно написать только имя функции. Код становится лаконичным и понятным, его легко отлаживать и сопровождать.

Объясняем

Например, вы хотите написать программу, которая проигрывает песню. И в ней 5 раз звучит игра на барабанах. Вы бы прописали следующий алгоритм для барабанщика:

3. Совершить удар по барабану.

5. Помотать головой в такт.

Без функции вам пришлось бы прописывать 5 раз одно и то же в тех частях композиции, где нужны ударные. Но гораздо удобнее оформить этот алгоритм в функцию playDrums и вызывать её каждый раз, когда необходимо. Это экономит время.

По сути, это алгоритм в алгоритме, который вызывается по имени с помощью команды. Например, лай собаки – это функция, которая выполняется по определённому алгоритму и вызывается командой «Голос».

Аргументы

Функциям можно передавать параметры, которые называются аргументами функции.

Когда мы пишем функцию, то указываем в ней не конкретные значения, а параметры, которые необходимо ввести при вызове функции, чтобы она заработала.

Например, если взять функцию человека ходить, то в качестве аргументов в неё передаётся «обувь».

Обувь – это параметр.

В разное время потребуется разная обувь, поэтому при каждом вызове функции аргументы меняются. Например, чтобы ходить по спортивной площадке нужна обувь «кроссовки», а чтобы перейти лужу – «сапоги».

Кроссовки и сапоги – это аргументы.

Алгоритм при этом не поменяется: каждый раз человек ходит одинаково, но в разной обуви.

При вызове функции в строке происходит следующее:

1. Язык программирования находит её в той части программы, где она прописана.

2. Выполняет команды, содержащиеся в ней, с учетом указанных при вызове аргументов.

3. Возвращается обратно к строке, которая её вызвала.

4. Переходит к следующей строке.

Некоторые функции уже встроены в язык программирования, например, console.log() в JavaScript, с которой мы уже познакомились 🙂

Пользовательские функции

Помимо стандартных встроенных в язык функций, мы можем создавать свои – пользовательские. Для этого необходимо записать алгоритм в определённой форме и придумать ему имя.

В JavaScript специальное слово для определения функций – function. После него указывается:

— список аргументов в круглых скобках;

— тело функции в фигурных скобках.

Создадим простейшую функцию без параметров с именем greeting, которая будет выводить строку ‘Hello!’:

Справка! Перед вложенными в функцию строками принято ставить отступ с помощью клавиши , чтобы они начинались немного дальше от края строки. Это визуально упрощает чтение кода.

Если позже нам понадобится вызвать функцию в другой части программы, то мы вызовем её только по имени – «greeting();» – и нажмём :

Увидим в консоли результат:

Тренировка

1. Напишем на JS функцию height() с двумя аргументами: высота в полных метрах (m) и остаток в сантиметрах (cm). Объявление функции выглядит так:

(m, cm) — это параметры, которые необходимо передавать в функцию, чтобы она заработала.

При объявлении функции нам не нужно указывать значения этих параметров. Мы только обозначаем их через запятую. Когда позже мы вызовем функцию, то укажем в скобках после имени конкретные значения, которые компьютер подставит под эти параметры.

2. По нашей задумке функция height() должна вычислять общую высоту в сантиметрах и выводить её в консоль. Для этого мы составим формулу вычисления, по которой функция произведет расчёт:

Мы указали, что для расчета общей высоты в сантиметрах необходимо взять значение аргумента m, умножить его на 100, а затем прибавить значение аргумента cm.

3. Запишем эту формулу в переменную total. Наша функция теперь выглядит так:

4. Попросим функцию сразу выводить значение переменной total, которое получилось после произведённого рассчета:

5. Вызовем функцию с аргументами 1 и 70:

Что произойдёт? Компьютер понимает, что функции height(m, cm) переданы аргументы 1 и 70 и подставляет их соответственно: m = 1, cm = 70. Затем производится расчёт по формуле:

Результат вычисления 170 записывается в переменную total. Далее – значение переменной total выводится в консоль:

6. Теперь попросим функцию выводить не просто результат расчёта, а добавлять к нему обозначение результата ‘cm tall’ и снова вызовем функцию с теми же аргументами:

function height(m, cm) < let total = 100 * m + cm; console.log(total + 'cm tall'); >height(1,70);

Алгоритм работы функции не поменяется. Но при выводе результата вычисления – в нашем случае 170 – выполняется конкатенация (склейка) двух строк таким образом:

— значение переменной total автоматически преобразуется в строку благодаря неявному преобразованию в JavaScript: число 170 превращается в строку ‘170’;

— строка ‘cm tall’ склеивается со строкой ‘170’.

Теперь результат в консоли выглядит так:

Возвращение значений

Функции могут возвращать значения – результаты вычислений. Эти значения удобно присвоить переменной и использовать при необходимости для выполнения дальнейших вычислений.

Чтобы «научить» функцию возвращать значения потребуется ввести ключевое слово return. А после него указать значение какой переменной необходимо вернуть.

Напишем функцию с именем calc(), которая бы принимала два числовых параметра и суммировала их. Запишем алгоритмическое выражение в переменную total:

Справка! Переменной присваивается не само выражение a + b, а результат, который в итоге получится.

Теперь попросим функцию возвращать значение переменной total:

При вычислении функция получит результат, присвоит его переменной total и вернёт это значение как результат функции.

Например, вызовем функцию calc() с параметрами 4 и 5:

Такие хитрости упрощают жизнь разработчика. Без функций на прописывание повторов в коде уходило бы время, за которое программист напишет еще 30-40% программы.

Домашнее задание

Напишите функцию на языке JavaScript, которая бы считала количество минут в днях.

Источник

Оцените статью