Лутц М. - Изучаем Python (1077325), страница 62
Текст из файла (страница 62)
Существуют и другие способы записи такого цикла, но данная форма очень часто встречается в программном коде на языке Ру1ьоп. Обратите внимание, что все три строки, вложенные в инструкцию цикла нл11е, имеют одинаковые отступы, благодаря этому они визуально образуют вертикальную линию блока программного кода, ассоциированного с инструкцией цикла ив т1е. тело цикла завершается либо с концом файла, либо с первой инструкцией, имеющей меньший отступ. Запустив этот фрагмент, мы получили следующий порядок взаимодействий с ним: Ептег техт:арак ЯРАМ Ептег техт;42 42 ептег техт;втов Математическая обработка данных пользователя Итак, наш сценарий работает, а теперь предположим, что вместо преобразования символов текстовой строки в верхний регистр нам необходимо выполнить некоторые математические действия над введенными 286 Глава 10. Введение в инструкции языка Ру(Поп пользователем числами, — например, вычислить квадраты чисел, что может получиться не совсем так, как ожидают наиболее молодые и нетерпеливые пользователи.
Для достижения желаемого эффекта мы могли бы попробовать использовать следующие инструкции: »> гер1у '20' »> гер1у ° * 2 ... текст сообеення об ошибке опуаен... туреЕггог; ипворрогсео орегапо суре(в) гог ° * ог рон(): 'всг' апо 'спс' (Перевод: ТуреЕггог; неподдерхиваемые типы операндов дпя ° ипи рош();'вгг' и 'спС') Это не работает, потому что (как обсуждалось в предыдущей части книги) интерпретатор выполняет преобразование типов объектов в выражениях, только если они являются числами, а ввод пользователя всегда передается сценарию в виде строки.
Мы не можем возвести строку цифр в степень, не преобразовав ее в целое число вручную: »> Спт(гер1у) ° ° 2 400 Вооружившись этой информацией, мы можем переделать наш цикл для выполнения математических действий: мяс1е Тгпе. гер1у = ган спрос('епсег сехс;') ст гер1у == 'асор'; Ьгеах рыпг спС(гер1у) ** 2 ргспС 'Вуе В этом сценарии используется однострочная инструкция су, которая, как и прежде, производит выход из цикла по получении от пользователя строки "вСор", а кроме того, выполняется преобразование введенной строки для выполнения необходимой математической операции.
В данную версию сценария также было добавлено сообщение, которое выводится в момент завершения работы сценария. Поскольку инструкция рг1пС в последней строке не имеет такого отступа, как инструкции вложенного блока, она не считается частью тела цикла н будет выполняться только один раз — после выхода из цикла: Епгег техт:2 4 Ептег Сехг:40 1600 Ептег Сехг;втор Вуе Обработка ошибок проверкой ввода Пока все идет хорошо, но посмотрите, что произойдет, если пользователь введет неверную строку: Епсег секс;ххх Короткий пример: интерактивные циклы 287 текст сообшенил об ошибке опушен .. На1оеЕггог: !пуа1тб 1!тега1 тог !пт() нттЬ раве !О: 'ххх' (Перевод; На!оеЕггог: неверный литерал дпп тп(() по основанию 1О, 'ххх') Встроенная функция !ПТ возбуждает исключение, когда сталкивается с ошибкой. Если нам необходимо обеспечить устойчивость сценария, мы должны предварительно проверить содержимое строки с помощью строкового метода ! 801011: »> 8 = '123' »> Т = 'ххх' »> 8.!ее!0!1(), Т.!во!0!т() (Тгие, Еа1ве) Для этого в наш пример необходимо добавить вложенные операторы.
В следующей версии нашего интерактивного сценария используется полная версия условного оператора ! Т, с помощью которого предотвращается возможность появления исключений: нп!1е Тгое. гер1у = ган горо!('ептег техт:') !т гер1у == 'втор' Ьгеак е1тт пот гер1у,шбтд11( ). ргтпт 'Ваб'' 8 е1ве. ргтпт шт(гер1у) .* 2 ргтпт 'Вуе' Более подробно мы будем рассматривать инструкцию 1Е в главе 12. Это очень простой инструмент программирования логики выполнения сценария.
В своей полной форме инструкция содержит слово ! Т, за которым следуют выражение проверки условия и вложенный блок кода, одну или более необязательных проверок е11Т ('"е1ве Ы") и соответствующих им вложенных блоков кода и необязательная часть е1ве со связанным с ней блоком кода, который выполняется при несоблюдении условия.
Интерпретатор выполняет первый блок кода, для которого проверка дает в результате истину, проходя инструкцию сверху вниз, либо часть е1ве, если все проверки дали в результате ложь. Части 1Т, е11Е и е1ве в предыдущем примере принадлежат одной и той же инструкции, так как вертикально они расположены на одной линии (т. е.
имеют одинаковые отступы). Инструкция 1Е простирается до начала инструкции рг!пт в последней строке. В свою очередь весь блок инструкции тр является частью цикла нп!1е, потому что вся она смещена вправо относительно основной инструкции цикла. Вложение инструкций станет для вас естественным, как только вы приобретете соответствующие навыки.
Теперь новый сценарий будет обнаруживать ошибки прежде, чем они будут обнаружены интерпретатором, и выводить (возможно, глупое) сообщение: 288 Глава 10. Введение в инструкции языка Рут)100 Ептаг СахС 5 25 Ептаг Сект:хуа Вас'Вап'Вас,'Вари Вав!Вас!Вас.'Вавн епсаг сехс:10 100 епсег сехс;асср Обработка ошибок с помощью инструкции тгу Предыдущее решение работает, но, как будет показано далее в книге, в языке Ру(Поп существует более универсальный способ, который состоит в том, чтобы перехватывать и обрабатывать ошибок с помощью инструкции с г у. Эта инструкция подробно будет рассматриваться в последней части книги, но, использовав инструкцию С гу в качестве предварительного знакомства, мы можем упростить программный код предыдущей версии сценария: пы1е Тгпа гер1у = гам !прас('Епсаг сехс:') сг гер1у == 'асср': пгеах сгу.
ппя = спс(гер1у) ехсерс: рг!пс 'Вави ' * 8 е1ае: ргспт спт(гер1у) * 2 рг!пт 'Вуа' Эта версия работает точно так же, как и предыдущая, только здесь мы заменили явную проверку наличия ошибки программным кодом, который предполагает, что преобразование будет выполнено, и выполняет обработку исключения, если такое преобразование невозможно. Эта инструкция Сгу состоит из слова Сгу, вслед за которым следует основной блок кода (действие, которые мы пытаемся выполнить), с последующей частью ехсерс, где располагается программный код обработки исключения. Далее следует часть е18е, программный код которой выполняется, если в части Сгу исключение не возникло. Интерпретатор сначала выполняет часть сгу, затем выполняет либо часть ехсерс (если возникло исключение), либо часть е1ае (если исключение не возникло). В терминах вложенности инструкций, так как слова Сгу, ехсерС и е18е имеют одинаковые отступы, все они считаются частью одной и той же инструкции Сгу.
Обратите внимание, что в данном случае часть е18е связана с инструкцией С гу, а не с условной инструкцией с(. Как будет показано далее в книге, ключевое слово е1ае в языке Ру1Ьоп может появляться не только в инструкции 1(, но и в инструкции С гу и в циклах— величина отступа наглядно показывает, частью какой инструкции оно является. 2ай В заключение Напомню, что к инструкции С гу мы еще вернемся далее в этой книге. А пока вам достаточно будет знать, что эта инструкция может использоваться для перехвата любых ошибок, уменьшения объема программного кода, проверяющего наличие ошибок, и представляет собой достаточно универсальный подход к обработке необычных ситуаций.
Три уровня вложенности программного кода Теперь рассмотрим последнюю версию сценария. В случае необходимости мы могли бы создать еще один уровень вложенности, например, чтобы выполнить проверку правильности ввода, основываясь на величине введенного числа: нос1е Сгое гер1У = ган спросс'Епсег сехс ') Сг гвр1У == 'Ведар'; огеак е)сс поС гер1у.свасрсС( ): ргспС 'Вав'' * В е1ве; пов = ьпС(гер1у) су пов < 20: рппС '1он' е1ве: ргспС пов * 2 ргспС Вуе В зту версию сценария добавлена еще одна инструкция И, вложенная в выражение е1ве другой условной инструкции 1г, которая в свою очередь вложена в цикл ил11е. Когда код выполняется по некоторому условию или в цикле, как в данном случае, достаточно просто выполнить дополнительный отступ вправо. В результате сценарий работает так же, как и предыдущая версия, но для чисел меньше 20 выводит слово «1оуу» (низкое значение): Епсег сехс;19 1он Епсег сехс;20 400 ЕпСег Сехг:ВРав Вав!Вав!Вав'Вав!Вав!Вав)'Вав'Вав' Епсег сехс вТор Вуе В заключение В этой главе мы коротко познакомились с синтаксисом инструкций языка Рув)соп.
Здесь были представлены основные правила записи инструкций и блоков программного кода. Как было сказано, в языке Рув)соп обычно в каждой строке программы располагается единственная 290 Глава 10. Введение в инструкции языка Ру11тол инструкция и все инструкции в одном и том же блоке имеют одинаковые отступы (отступы являются частью синтаксиса языка Ру1Ьоп). Кроме того, мы рассмотрели несколько исключений из этих правил, включая многострочные инструкции, однострочные условные инструкции и циклы, а также рассмотрели синтаксис инструкций в действии. В следующей главе мы приступим к глубокому изучению основных процедурных инструкций языка РуФЬоп.
Как будет показано далее, все инструкции следуют тем же основным правилам, которые были представлены здесь. Закрепление пройденного Контрольные вопросы 1. Какие три синтаксических элемента, обязательные в языках, подобных языку С, опущены в языке РуФЬоп? 2. Каким образом обычно завершаются инструкции в языке РуФЬоп? 3. Как обычно определяется принадлежность инструкций к вложенному блоку в языке Ру$Ьоп? 4.
Как можно разместить одну инструкцию в нескольких строках? 5. Как можно разместить составную инструкцию в одной строке? 6. Существуют ли какие-либо объективные причины для завершения инструкций точкой с запятой7 7. Для чего предназначена инструкция с гу? 8. Какую наиболее распространенную ошибку допускают начинающие программисты на языке РуФЬоп? Ответы 1.
Обязательными синтаксическими элементами в С-подобных языках программирования являются круглые скобки, окружающие выражения проверки условий в некоторых инструкциях, точка с запятой, завершающая каждую инструкцию, и фигурные скобки, окружающие вложенные блоки программного кода. 2. Конец строки является концом инструкции, расположенной в этой строке. Если в одной строке располагается несколько инструкций, они должны завершаться точками с запятой.