Меню
Видеоучебник

Функции

Урок 13. Основы алгоритмизации и программирования на языке Python

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

Конспект урока "Функции"

Вопросы:

·     Определение функции.

·     Описание функции.

·     Тестирование функции.

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

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

Часто бывает полезным описать собственную функцию. Рассмотрим пример. Допустим, в нескольких местах программы нам нужно вывести на экран одно и то же текстовое сообщение. Можно во всех случаях выводить на экран сообщения с одним и тем же текстом с помощью инструкций print. Однако если нам понадобится изменить текст выводимого сообщения, то придётся искать в коде программы все инструкции print для вывода данного сообщения и изменять их одну за другой. Это может занять некоторое время, к тому же есть возможность пропустить одну или несколько инструкций, тогда программа будет работать неправильно. Этого можно избежать, если описать функцию вывода на экран поясняющего сообщения.

Функцией называется подпрограмма, которая позволяет производить одни и те же действия над различными данными в различных местах программы. Рассмотрим, каким образом функция описывается в языке Python. Описание функции начинается со служебного слова def, что в переводе на русский язык означает «определение», после которого через пробел следует имя функции. Далее следует пробел, и в скобках, через запятую, указываются входные параметры функции. Следом идёт двоеточие, а после него, со следующей строки с отступом, следуют инструкции, составляющие тело функции. Функция описывается в программе до её первого использования.

Таким образом, для того, чтобы написать на языке Python функцию, которую мы привели в примере, нужно написать слово def, после чего — имя функции. Назовём её PrintText. У этой функции не будет параметров, поэтому через пробел после имени будут следовать пустые скобки, далее – двоеточие. Тело функции будет содержать единственную инструкцию print, которая выведет на экран заданное текстовое сообщение.

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

Таким образом, при каждом вызове функции будут выполняться инструкции, описанные в её теле, то есть инструкция print, выводящая на экран текстовое сообщение. Так мы, по сути, описали новую команду, которую можно использовать при написании программы. Для того, чтобы изменить текст выводимого сообщения, достаточно изменить его единственный раз в описанной функции PrintText..

Однако из определения функции, данного ранее, следует, что она должна работать для различных данных. Для этого она должна каким-то образом принять эти данные из программы. Это происходит через входные параметры функции. При вызове функции в программе, через запятую, указываются их значения. Количество и порядок следования значений входных параметров должны соответствовать принятым при описании функции. То есть если при описании функции мы указали три параметра: a, b и c, то при вызове функции в скобках должны следовать три их значения, причём именно в таком порядке, иначе функция и вся программа в целом будут работать неправильно. При исполнении функции значения параметров, указанных при её вызове, передаются в тело функции, где над ними выполняются описанные действия.

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

Создадим для функции модуль и назовём его Bin. В нём начнём описание функции. Назовём её DecToBin. У этой функции будет единственный параметр – число в десятичной системе счисления – dec. Опишем тело функции. Оно будет начинаться с того, что мы объявим пустую строку и назовём её bin. Дальше напишем цикл для перевода числа dec в двоичную систему счисления. Это будет цикл while. Он будет работать до тех пор, пока dec > 0. Тело цикла будет содержать инструкцию присваивания переменным dec и bin соответственно значения dec // 2, а также str (dec % 2) + bin. Таким образом, на каждом шаге цикла dc будет делиться на два, при этом остаток от деления будет дописываться в строку bin, слева от её текущего значения. Так, после выполнения цикла в строке bin будет содержаться число в двоичной системе счисления. С помощью инструкции print выведем на экран её значение.

def DecToBin (dec):

    bin = ''

    while dec > 0:

        dec, bin = dec // 2, str (dec % 2) + bin

    print (Bin)

Сохраним написанный модуль и запустим его на выполнение. При запуске модуля на выполнение все функции, описанные в нём, загружаются автоматически. После того, как мы загрузили функцию, она будет работать для любого целого положительного числа. Вызовем её для числа 21. Действительно, число двадцать один в двоичной системе счисления записывается так: 10101. Теперь вызовем эту же функцию для числа 1024. В двоичной системе счисления это число действительно записывается 10000000000. Функция работает правильно.

В теле функции могут использоваться дополнительные параметры. К ним нельзя обращаться вне функции. Эти параметры, как и входные параметры функции, называются локальными. Из функции же, напротив, можно обращаться к переменным, описанным вне её. Такие переменные называются глобальными параметрами. Для того, чтобы обратиться к таким переменным из функции, нужно записать служебное слово global, после которого, через запятую, перечислить глобальные параметры, необходимые для работы функции. Далее к ним можно обращаться также, как и к локальным параметрам.

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

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

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

Начнём изменять модуль Bin. В конце функции DecToBin уберём инструкцию вывода двоичного числа на экран и вместо неё запишем инструкцию возврата return, которая будет возвращать значение строки Bin, но так как это число, преобразуем возвращаемую строку в целочисленный тип int. Таким образом, функция DecToBin будет возвращать значение двоичного числа во внешнюю программу.

def DecToBin (dec):

    bin = ''

    while dec > 0:

        dec, bin = dec // 2, str (dec % 2) + bin

    return int (Bin)

Теперь опишем противоположную функцию. Назовём её BinToDec. У этой функции, как и у предыдущей, будет один входной параметр – двоичное число. Назовём его bin. Опишем тело функции. Заведём переменную i, содержащую номер разряда числа bin, из которого мы берём цифру. Мы начнём с правой цифры числа, то есть с первого разряда. Поэтому присвоим переменной i значение 1. Также создадим переменную dec для хранения десятичного числа. Так как мы ещё не учли ни одной цифры, присвоим ей значение 0. В дальнейшем мы будем брать правую цифру числа bin, умножать эту цифру на соответствующую степень двойки и учитывать её в числе dec, после чего удалять из числа bin. Напишем для этого цикл while. Он будет работать до тех пор, пока bin > 0. В цикле мы будем увеличивать значение переменной dec на остаток от деления числа bin на 10, умноженный на 2 в степени I - 1. После того, как мы учли правую цифру числа bin в переменной dec, мы уберём её из переменной bin, разделив её же значение без остатка на десять, а также увеличим номер разряда – i на единицу.

По окончании работы цикла в переменной dec будет содержаться искомое число в десятичной системе счисления. Вернём её в основную программу с помощью инструкции возврата return.

def BinToDec (bin):

    i = 1

    dec = 0

    while bin > 0:

        dec = dec + bin % 10 * 2 ** (i – 1)

        bin = bin // 10

        i = i + 1

    return dec

Сохраним модуль, запустим его на выполнение и протестируем описанные функции. Протестируем функцию BinToDec. Вызовем её для числа 1000. В десятичной системе счисления это действительно число 8. Снова вызовем эту функцию для числа 111. В десятичной системе счисления это действительно число 7. Однако протестировать эти функции можно куда проще. Вызовем функцию BinToDec, а в качестве её аргумента зададим значение обратной ей функции DecToBin от некоторого числа, например, от 70. Таким образом число будет переведено сначала в двоичную систему счисления, а затем обратно в десятичную. Следовательно, должно быть возвращено изначальное число – 70. Так и произошло. Обе функции работают правильно.

Однако мы можем ускорить работу функции BinToDec. Дело в том, что операция возведения числа в степень достаточно тяжёлая и использовать её в цикле не рекомендуется. Поэтому сделаем так, что в переменной i будет храниться не номер разряда текущей цифры, а её множитель. Для этого мы будем на каждом шаге цикла увеличивать значение i не на единицу, а сразу в 2 раза. А при увеличении переменной dec мы теперь будем умножать остаток от деления bin на i. Таким образом мы заменили операцию возведения числа в степень, находящуюся в цикле, умножением.

def BinToDec (bin):

    i = 1

    dec = 0

    while bin > 0:

        dec = dec + bin % 10 * i

        bin = bin // 10

        i = i * 2

    return dec

Сохраним изменённый модуль и протестируем изменённую функцию. Создадим модуль с именем test в той же папке, в которой хранится описанный модуль bin. Загрузим в модуль test из модуля bin обе описанные в нём функции так же, как мы делали это для других модулей. При этом важно, чтобы модуль, из которого загружаются функции, находился в одной папке с описываемым. Запишем в модуле test единственную инструкцию print, которая выведет на экран значение функции BinToDec, от значения функции DecToBin с аргументом, равным 60. Сохраним описанный модуль и запустим его на выполнение. На экран было выведено число 60. Задача решена.

Мы узнали:

·     Подпрограммой называется описание вспомогательного алгоритма на языке программирования.

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

·     Для возращения данных функции в основную программу используются передача данных через глобальные переменные, а также инструкция возврата return, которая завершает работу функции, возвращая в основную программу значения перечисленных параметров.

0
1876

Комментарии 0

Чтобы добавить комментарий зарегистрируйтесь или на сайт

Вы смотрели