Методы ввода и вывода данных и обработка исключений

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

С действием, которое осуществляет оператор присваивания, мы познакомились ранее при чтении параграфа 1.6. Напомним, что в языке Python он имеет вид знака равенства (=).

Функция input будет использоваться в кодах программ для получения значений (ввода данных), которые будет вводить пользователь с клавиатуры. Она имеет следующий синтаксис:

имя переменной = три1("Приглашение")

Такая запись очень похожа на синтаксис оператора print. Однако отличия все же имеются. Прежде всего, расскажем о самом понятии «функция». В ходе изучения языка программирования Python мы должны в совершенстве овладеть программированием на основе использования функций, но сейчас, в качестве небольшого знакомства, следует отметить: никого не удивляет тот факт, что при вычислении функции sin(x) пользователь, работая, например, с программой Microsoft Excel, выбирает из категории Формулы/Вставка/Математика и тригонометрия функцию SIN и начинает с ней работать, вычисляя значение этой функции от какого-то аргумента.

Между тем, функция SIN - это сложный знакопеременный математический ряд, который может быть вычислен по формуле:

X3 ХЭ X7 , чп х2п+|

Sin X = X -

  • (2п + 1)!
  • — +---+ ... + (-1)
  • 3! 5! 7! v '

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

Однако следует уяснить, что для получения результата от ее использования в среде программирования вы должны не просто указать ее имя sin и значение аргумента в скобках (sin(x)), но слева от имени функции указать имя переменной, а также оператор присваивания, т. е., вызов функции будет осуществлен в виде оператора y=sin(x).

Теперь надо запомнить, что понятие «функция» относится не только к категории математических действий, но и распространяется на другие. Когда мы будем использовать функцию input для того, чтобы разместить в ячейке оперативной памяти какое-либо значение, полученное от пользователя (в этом, напомним, заключается действие оператора присваивания), слева от этого оператора, мы должны будем указать имя переменной.

Учитывая вышесказанное, синтаксис функции input, записываемой как имя переменной = input("Приглашение"), не должен вызвать какие-либо вопросы.

В редакторе сценариев напишем программный код, приведенный на рис. 16.

Текст программы «Сложить два числа»

Рис. 16. Текст программы «Сложить два числа»

Для того чтобы было удобнее его прокомментировать, выделим его в отдельный листинг 1.

Листинг 1

а=Поа1:(іпри<:("Введите 1 число ")) b=float(input("BBeflHTe 2 число ")) c=a+b

print(" CyMMa = ", с)

іпри^"пНажмите ENTER для выхода")_

Вывод результата в программе может гарантировать оператор print, синтаксис которого несколько иной, чем в случае вывода на экран просто строки, а именно,

ргіпІ("Приглашение", идентификатор), где

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

Можно еще раз отметить, что Escape-последовательность п, содержащаяся в двух последних строках программы, дает указание интерпретатору перевести курсор на новую строку.

Что же может быть еще непонятно в коде программы Сложить два числа в настоящее время? Только применение функции float и то, что, несмотря на вышеприведенные рассуждения, функция input вызывается без упоминания имени переменной слева от оператора присваивания, который тоже отсутствует в строке программного кода іприІ("пНажмите ENTER для выхода”).

Тем не менее, все должно быть интуитивно понятно. В частности, при объяснении типов данных, используемых в языке Python (см. параграф 1.7), упоминался вещественный тип данных (float), используемый, когда программа должна работать с дробными числами. Так вот, функция input, как принято говорить, возвращает строковый тип данных. То есть то число, которое будет принято от пользователя, будет восприниматься компьютером не как число, а как строковое значение, а следовательно, никакие математические операции над строками выполнить мы не сможем. Таким образом, функция float играет роль функции приведения одного типа данных к другому (в данном случае конвертирует строковый тип в вещественный).

Оператор іпри^'^пНажмите ENTER для выхода"), в целом, необязателен. Если его не будет в программе, то, конечно, не изменится ее результат с точки зрения математики, и, кроме того, после получения результата и нажатия ENTER, как такого выхода из программы не произойдет. Осуществится лишь переход к приглашению »>. Тем не менее, психологически это готовит пользователя к тому, что его программа завершена и надо принять какое-то решение: либо осуществить выход из среды программирования, либо возобновить действия с программой.

К тому же использование функции input в данном операторе не приводит к получению числового значения от пользователя, а только лишь к считыванию внутреннего кода клавиши ENTER, который непосредственно не может изменить результат математического действия сложения чисел. Следовательно, возможен и другой синтаксис функции input, который и продемонстрирован в примере. Результат ввода данных и получения результата представлен на рис. 17.

Результат работы программы

Рис. 17. Результат работы программы

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

Обработчик ошибок в Python использует блок try...except...finally. Блок try...except должен окружать ту часть кода, где может возникнуть исключительная ситуация. Блок Finally всегда исполняется, поэтому в него помещают те инструкции, которые должны выполниться независимо от того, произошло ли исключение.

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

Таблица 5. Типы исключений

Тип исключения

Описание

IО Error

Возникает при появлении ошибок, связанных с операциями ввода/вывода

IndexError

Возникает, если в последовательности не найден элемент с указанным индексом

NameError

Возникает, если не найдено имя переменной, имя функции

SyntaxError

Возникает в случае синтаксической ошибки в программе

TypeError

Возникает, если стандартная операция применяется к объекту несоответствующего типа

ValueError

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

ZeroDivisionError

Возникает в случае выполнения операции деления на нуль

Приведем пример использования конструкции try...except...finally и напишем программу для получения частного от деления двух чисел. Ее код приведен в листинге 2.

Листинг 2

a=fioat(input("BBeflHTe 1 число ")) b=float(input("BBeflHTe 2 число "))

try:_

c=a/b

print(" Частное от деления = ", с)

except ZeroDivisionError: print ("Вы делите на нуль!") finally:

рпп!("Давайте запустим программу еще раз или пНажмите ENTER для выхода")_

Обратите внимание на отступы в данном коде. Дело в том, что в отличие от других популярных языков программирования, таких как С#, Microsoft Visual Basic, Pascal-ориентированных языков, где отступы в блоках кода советуют делать для того, чтобы программу было легче читать и отлаживать, но сам принцип их простановки необязателен, в Python отступы являются частью синтаксиса программных конструкций. Для того чтобы сделать отступ в строке кода, достаточно нажать клавишу Tab или нажать четыре раза клавишу Пробел.

Базовой программной конструкцией в вышеприведенном коде является конструкция try...except...finally, поэтому стоит не сделать отступ хотя бы в одной программной строке этого блока, так, например, как это показано на рис. 18 (не сделан отступ в операторе с=а/Ь), и программа перестанет работать, выдавая ошибку, показанную на рис. 19.

•Пример try...except.py - C:/Users/Cepre?/AppData/Local/Programs/Python/Python35-32/My_Proj...

File Edit Format Run Options Window Help

a=float(input("Звелите 1 число "))

b=float(input("Звелите 2 число "))

try:

(t=a/b

print(" Частное от деления = ", с) except ZeroDivisionError:

print ("Зы делите на нуль!") finally:

print("Давайте запустим программу еще раз или ЧпНажмите ENTER для выхода")

print(" Частное от деления = ", с)

I except ZeroDivisionError:

print ("Зы делите на нуль!") finally:

print("Давайте запустим программу еще раз или ХпНажмите ENTER для выхода")

Ошибка, полученная из-за отсутствия отступа

Рис. 19. Ошибка, полученная из-за отсутствия отступа

Ln: 4 Col: О

Рис. 18. He сделан отступ в операторе с=а/Ь

Пример try...except.py - C:/Users/Cepren/AppData/Local/Programs/Python/Python35-32/My Proje... а

(U

22

File Edit Format Run Options Window Help

a=float(input("Звелите 1 число ")) b=float(input("Звелите 2 число ")) try:

|=a/b

Также обратите внимание на то, что если вы сделаете отступ в строке программного кода, которая не относится к блоку операторов, например, в a=float(input("Введите 1 число ")), то программа также перестанет функционировать и интерпретатор выдаст ошибку.

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

Вернемся к комментарию кода программы. Мы окружили код, где возможно возникновение ошибки деления на нуль, блоком try...except...finally, при этом использовали ожидаемый тип исключения ZeroDivisionError (см. табл. 5). Приведенный блок перехватывает конкретную ошибку переполнения, возникающую вследствие деления на нуль.

Предположим, мы введем число 5, а второе число - равное 0. При выполнении этого кода появится сообщение: «Вы делите на нуль!». Результат работы программы показан на рис. 20.

Python 3.5.1 Shell

File Edit Shell Debug Options Window Help

Python 3.5.1 (v3.5.1:37a07cee5969, Dec 6 2015, 01:33:43) [И ^ SC v.1900 32 bit (Intel)] on Win32

Type "copyright”, "credits" or "license()" for more informat ion.

»>

RESTART: C: UsersCepre?iAppDataLocalPrograir.sPythonPyth оп35-32Мои проектыФункиия для суммы массива.ру Зведите 1 число 5

Звените 2 число 0

Зы делите на нуль!

Ln: 10 Col: 4

Давайте запустим программу еще раз или Нажмите ENTER для выхода

г

Рис. 20. Программа выдает сообщение «Вы делите на нуль!»

Попробуем усовершенствовать программу. Дело в том, что наша программа не совсем корректна: ведь пользователь по ошибке может вместо чисел ввести обычные символы, расположенные на клавиатуре. Нижеприведенный код, представленный в листинге 3, перехватит другую ошибку, связанную как раз с неверным форматом ввода. В нем, во-первых, оператор try разместим в том месте, где возможно возникновение подобной ошибки - это инструкции ввода данных. Во-вторых, воспользуемся тем, что обработка нескольких исключений может быть перехвачена с помощью нескольких вложений конструкции except, и включим в наш код исключение ValueError (см. табл. 5), которое возникает, если стандартная операция применяется к объекту соответствующего типа, но с неподходящим значением. Наш код примет следующий вид.

Листинг З

try:

а=Аоа1(іпри1("Введите 1 число ")) b=float(input("BBenmre 2 число ")) с=а/Ь

print(" 4acTHoe от деления = ", с)

except ZeroDivisionError: print ("Вы делите на нуль!") except ValueError:

print ("Вы ввели не числовое значение!")

finally:

ргіпі("Давайте запустим программу еще раз")

іпри^"пНажмите ENTER для выхода")_

Теперь программа надежно защищена от неправильного ввода. Предположим, значение первого числа пользователь вводит правильно 5.2, а при вводе второго числа пользователь ошибается и вводит в качестве разделителя не точку, а символ ю (поскольку и точка, и символ ю расположены на одной клавише). Однако такая ошибка не приведет к исключительной ситуации с точки зрения остановки программы. При ее выполнении появится сообщение «Вы ввели не числовое значение!» (рис. 21).

Программа выдает сообщение «Вы ввели не числовое значение!»

Рис. 21. Программа выдает сообщение «Вы ввели не числовое значение!»

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

Листинг 4

try:

a=float(input("BBenHTe 1 число ")) b=float(input("BBenHTe 2 число ")) c=a/b

print(" 4acTHoe от деления = ", с)

except (ZeroDivisionError, ValueError):

print ("Вы делите на нуль или вы ввели не числовое значение!")

finally:

ргіпі("Давайте запустим программу еще раз пНажмите ENTER для выхо-

да")_

Результат работы программы будет аналогичен представленному на рис. 21, однако код программы стал короче.

Контрольные вопросы

  • 1. Расскажите о назначении IDLE. С какими способами создания программ в IDLE вы познакомились?
  • 2. Какие операторы ввода и вывода данных используются для приложений, разрабатываемых на языке Python? Напишите синтаксис используемых операторов.
  • 3. В каких случаях при разработке концепции глобальной обработки ошибок применяется конструкция try...except...finally? Поясните работу обработчиков исключений на примерах.
  • 4. Назовите основные типы исключений и укажите причины их возникновения.
  • 5. Какова роль отступов в программах, написанных на языке Python?
 
< Пред   СОДЕРЖАНИЕ     След >