НОЧУ ДПО "Национальный открытый университет "ИНТУИТ"
Опубликован: 24.01.2021 | Доступ: свободный | Студентов: 2489 / 106 | Длительность: 03:57:00
Лекция 13:

Функции и процедуры

< Лекция 1 || Лекция 13: 12345

Смотреть на youtube

Проект для лекции Lecture4.rar.

Разбиение сложной программы на модули - основной способ борьбы со сложностью программ. Процесс такого разбиения называется декомпозицией программы. Он применяется на всех этапах разработки программ. Большие программные проекты начинаются с этапа проектирования, когда проект представляется в виде взаимосвязанной совокупности модулей. В объектно-ориентированном программировании роль таких модулей играют классы, в функциональном программировании - функции, в модульных языках модули так и называются - модулями. В языке Python для этих целей используются как модули, так и классы.

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

Функции - один из основных инструментов математиков - предмет математического (функционального) анализа. И для программистов функция - базисный элемент построения программ.

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

В чем отличие процедур от функций? Объявление классической функции, близкое к объявлению функции в математике, содержит заголовок и тело функции. В заголовке дается описание входных параметров, называемых также аргументами функции. Тело функции задает алгоритм вычисления значения функции на основе значений входных аргументов. Результат вычислений представляет значение, возвращаемое функцией при ее вызове.

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

У процедуры нет возвращаемого значения, но ее параметры делятся на группы. В теле процедуры по значениям входных параметров вычисляются значения выходных параметров.

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

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

Существование в языке программирования одновременно процедур и функций избыточно, хотя позволяет более точно описать логику вычислений. Понятно, что любую функцию можно задать процедурой, рассматривая результат, возвращаемый функцией, как выходной параметр. Но и процедуру можно представить в виде функции. Один способ такого представления состоит в рассмотрении так называемых функций с побочным эффектом, такие функции имеют не только входные параметры, но и выходные. Один из результатов такая функция возвращает в качестве результата, остальные через выходные параметры. Так устроены функции в языке С, С++. Другой, более универсальный способ использует тот факт, что результат, возвращаемый функцией, может быть сложного типа, так что возвращаемый функцией объект содержит совокупность значений, представляющих выходные параметры.

Функции и процедуры языка Python

Формально, в языке Python все, что задается определением def, является функцией (class function).

В мире Python принято использовать термин "метод", когда речь идет о методах класса, в остальных случаях использовать термин "функция". Термин "процедура", как правило не используется. Я же полагаю, что важно различать процедуры и функции, поэтому, нарушая традиции Python, использую термин "метод" как общее понятие процедур и функций и, если необходимо, уточняю, что метод реализован как функция или как процедура.

Все параметры метода - это входные параметры. Выходных параметров методы Python не имеют. Оператор return в теле метода, как и положено, возвращает результат вычисления функции. Как же быть, когда в методе вычисляется несколько результатов?

В Python эта проблема легко решается, поскольку возвращаемое значение функции может быть списком, элементы которого и представляют результаты функции, возможно разного типа. В Python существует и другой более элегантный способ решения этой проблемы. Он учитывает особенности оператора присваивания в языке Python, который позволяет выполнять присваивание не одной переменной, а списку переменных. Синтаксис оператора return позволяет возвращать не один результат, а список результатов:

return result1 [, result2, … result_n]

Методы Python могут использоваться как классические функции, так и как процедуры.

Классическая функция Python обязательно содержит в теле функции оператор return. Вызов такой функции является первичным выражением и может быть сделан всюду, где допускаются по синтаксису выражения, например, y = sin(x) + cos(2 * x). Здесь sin и cos - это имена функций, определенных в классе math.

Python допускает определение методов как процедур. Оператор ereturn не является обязательной частью тела метода. Такой метод не вычисляет возвращаемое значение, но представляет процедуру, выполняющую полезные действия. Вызов такого метода является оператором, таким же оператором, как оператор присваивания или цикла. В этом главное отличие процедур от функций, - процедуры вызываются как операторы, функции - как выражения.

В предыдущих главах все примеры использовали соответствующие методы test, являющиеся фактически процедурами и вызываемые как процедуры. Эти методы без входных параметров использовали в качестве входных данных локальные переменные, значения которых вычислялись непосредственно в теле функции или задавались пользователем с консоли. Результаты работы выводились на консоль вызовом функции print. В некоторых вариантах тестовых процедур входные данные брались из входного файла, а результаты записывались в выходной файл.

В этой лекции мы подробно рассмотрим классические функции в языке Python. Все примеры будут содержать описание некоторой функции и тестовую процедуру, в которой эта функция будет вызываться.

< Лекция 1 || Лекция 13: 12345
Алексей Авилов
Алексей Авилов

Неужели не нашлось русских специалистов, чтобы записать курс по пайтону ? Да, можно включить переводчик и слушать с переводом, но это что? Это кто-то считает хорошим и понятным курсом для начинающих? 

Елена Лаптева
Елена Лаптева

Думаю. что не смогу его закончить. Хотелось предупредить других - не тратьте зря время, ищите другой курс.