Математический анализ. 3е издание
Скачать 4.86 Mb.
|
284 Глава 10. Введение в инструкции языка Python как блоки else в условных инструкциях if, с которыми мы встретимся ниже) также должны располагаться в отдельных строках. Тело инст рукции может состоять из нескольких простых инструкций, разделен ных точкой с запятой, но такой стиль оформления не приветствуется. Вообще, хотя это не является обязательным требованием, но если вы будете размещать инструкции в отдельных строках и всегда будете оформлять отступы для вложенных блоков, ваш программный код бу дет проще читать и вносить в него изменения. Чтобы увидеть одно из этих правил в действии (когда однострочная инструкция if использует ся для прерывания выполнения цикла), давайте перейдем к следующе му разделу, где мы напишем и опробуем настоящий программный код. Короткий пример: интерактивные циклы Мы увидим все эти синтаксические правила в действии, когда будем совершать турне по конкретным составным инструкциям языка Py thon в нескольких следующих главах, но эти правила работают одина ково везде в языке Python. Для начала рассмотрим короткий практи ческий пример, который продемонстрирует способ применения син таксических правил к оформлению инструкций и вложенных блоков на практике и попутно познакомит вас с некоторыми инструкциями. Простой интерактивный цикл Предположим, что от нас требуется написать программу на языке Py thon, которая взаимодействует с пользователем в окне консоли. Воз можно, программа будет принимать информацию для дальнейшей пе редачи в базу данных или числа для выполнения расчетов. Независи мо от конечной цели вам необходимо написать цикл, который будет считывать одну или более строк, введенных пользователем с клавиату ры, и выводить их обратно на экран. Другими словами, вам нужно на писать классический цикл, выполняющий операции чтения/вычисле ния/вывода. В языке Python для реализации таких интерактивных циклов исполь зуется типичный шаблон, который выглядит, как показано ниже: while True: reply = raw_input('Enter text:') if reply == 'stop': break print reply.upper() В этом фрагменте использованы несколько новых для вас идей: • Программный код выполняется в цикле while, который в языке Py thon является наиболее универсальной инструкцией цикла. Под робнее об инструкции while мы будем говорить позднее, но в двух словах замечу, что она состоит из слова while, за которым следует условное выражение. Результат этого выражения интерпретирует ся как истина или как ложь. Далее следует вложенный блок про Короткий пример: интерактивные циклы 285 граммного кода, который продолжает выполняться в цикле, пока условное выражение возвращает истину (слово True здесь всегда возвращает значение истины). • Встроенная функция raw_input, с которой мы уже встречались ранее в этой книге, используется здесь как универсальное средство полу чения ввода с клавиатуры – она выводит подсказку, текст которой содержится в необязательном строковом аргументе, и возвращает введенный пользователем ответ в виде строки. • Однострочная инструкция if, которая оформлена в соответствии со специальным правилом для вложенных блоков: тело инструкции if располагается в той же строке, что и основная инструкция, после символа двоеточия, а не на отдельной строке под ней с соответст вующим отступом. Она одинаково хорошо работала бы при любом из двух вариантов оформления, но при таком подходе нам удалось сэкономить одну строку. • Наконец, для немедленного выхода из цикла использована инст рукция break – она просто выполняет выход за пределы инструкции цикла и программа продолжает свою работу с первой инструкции, которая расположена вслед за циклом. Без этой инструкции цикл while работал бы вечно, поскольку его условное выражение всегда возвращает истину. В результате такая комбинация инструкций означает следующее: «чи тать строки, введенные пользователем, и выводить их после преобра зования всех символов в верхний регистр, пока пользователь не введет строку "stop"». Существуют и другие способы записи такого цикла, но данная форма очень часто встречается в программном коде на языке Python. Обратите внимание, что все три строки, вложенные в инструкцию цик ла while, имеют одинаковые отступы, благодаря этому они визуально образуют вертикальную линию блока программного кода, ассоцииро ванного с инструкцией цикла while. Тело цикла завершается либо с кон цом файла, либо с первой инструкцией, имеющей меньший отступ. Запустив этот фрагмент, мы получили следующий порядок взаимо действий с ним: Enter text:spam SPAM Enter text:42 42 Enter text:stop Математическая обработка данных пользователя Итак, наш сценарий работает, а теперь предположим, что вместо пре образования символов текстовой строки в верхний регистр нам необхо димо выполнить некоторые математические действия над введенными 286 Глава 10. Введение в инструкции языка Python пользователем числами, – например, вычислить квадраты чисел, что может получиться не совсем так, как ожидают наиболее молодые и не терпеливые пользователи. Для достижения желаемого эффекта мы могли бы попробовать использовать следующие инструкции: >>> reply = '20' >>> reply ** 2 ...текст сообщения об ошибке опущен... TypeError: unsupported operand type(s) for ** or pow(): 'str' and 'int' (Перевод: TypeError: неподдерживаемые типы операндов для ** или pow():'str' и 'int') Это не работает, потому что (как обсуждалось в предыдущей части книги) интерпретатор выполняет преобразование типов объектов в вы ражениях, только если они являются числами, а ввод пользователя всегда передается сценарию в виде строки. Мы не можем возвести строку цифр в степень, не преобразовав ее в целое число вручную: >>> int(reply) ** 2 400 Вооружившись этой информацией, мы можем переделать наш цикл для выполнения математических действий: while True: reply = raw_input('Enter text:') if reply == 'stop': break print int(reply) ** 2 print 'Bye' В этом сценарии используется однострочная инструкция if, которая, как и прежде, производит выход из цикла по получении от пользова теля строки "stop", а кроме того, выполняется преобразование введен ной строки для выполнения необходимой математической операции. В данную версию сценария также было добавлено сообщение, которое выводится в момент завершения работы сценария. Поскольку инст рукция print в последней строке не имеет такого отступа, как инструк ции вложенного блока, она не считается частью тела цикла и будет вы полняться только один раз – после выхода из цикла: Enter text:2 4 Enter text:40 1600 Enter text:stop Bye Обработка ошибок проверкой ввода Пока все идет хорошо, но посмотрите, что произойдет, если пользова тель введет неверную строку: Enter text:xxx Короткий пример: интерактивные циклы 287 ...текст сообщения об ошибке опущен... ValueError: invalid literal for int() with base 10: 'xxx' (Перевод: ValueError: неверный литерал для int() по основанию 10: 'xxx') Встроенная функция int возбуждает исключение, когда сталкивается с ошибкой. Если нам необходимо обеспечить устойчивость сценария, мы должны предварительно проверить содержимое строки с помощью строкового метода isdigit: >>> S = '123' >>> T = 'xxx' >>> S.isdigit(), T.isdigit() (True, False) Для этого в наш пример необходимо добавить вложенные операторы. В следующей версии нашего интерактивного сценария используется полная версия условного оператора if, с помощью которого предотвра щается возможность появления исключений: while True: reply = raw_input('Enter text:') if reply == 'stop': break elif not reply.isdigit( ): print 'Bad!' * 8 else: print int(reply) ** 2 print 'Bye' Более подробно мы будем рассматривать инструкцию if в главе 12. Это очень простой инструмент программирования логики выполнения сценария. В своей полной форме инструкция содержит слово if, за ко торым следуют выражение проверки условия и вложенный блок кода, одну или более необязательных проверок elif ("else if") и соответст вующих им вложенных блоков кода и необязательная часть else со связанным с ней блоком кода, который выполняется при несоблюде нии условия. Интерпретатор выполняет первый блок кода, для кото рого проверка дает в результате истину, проходя инструкцию сверху вниз, либо часть else, если все проверки дали в результате ложь. Части if, elif и else в предыдущем примере принадлежат одной и той же инструкции, так как вертикально они расположены на одной ли нии (т. е. имеют одинаковые отступы). Инструкция if простирается до начала инструкции print в последней строке. В свою очередь весь блок инструкции if является частью цикла while, потому что вся она сме щена вправо относительно основной инструкции цикла. Вложение ин струкций станет для вас естественным, как только вы приобретете со ответствующие навыки. Теперь новый сценарий будет обнаруживать ошибки прежде, чем они будут обнаружены интерпретатором, и выводить (возможно, глупое) сообщение: 288 Глава 10. Введение в инструкции языка Python Enter text:5 25 Enter text:xyz Bad!Bad!Bad!Bad!Bad!Bad!Bad!Bad! Enter text:10 100 Enter text:stop Обработка ошибок с помощью инструкции try Предыдущее решение работает, но, как будет показано далее в книге, в языке Python существует более универсальный способ, который со стоит в том, чтобы перехватывать и обрабатывать ошибок с помощью инструкции try. Эта инструкция подробно будет рассматриваться в по следней части книги, но, использовав инструкцию try в качестве пред варительного знакомства, мы можем упростить программный код пре дыдущей версии сценария: while True: reply = raw_input('Enter text:') if reply == 'stop': break try: num = int(reply) except: print 'Bad!' * 8 else: print int(reply) ** 2 print 'Bye' Эта версия работает точно так же, как и предыдущая, только здесь мы заменили явную проверку наличия ошибки программным кодом, ко торый предполагает, что преобразование будет выполнено, и выполня ет обработку исключения, если такое преобразование невозможно. Эта инструкция try состоит из слова try, вслед за которым следует основ ной блок кода (действие, которые мы пытаемся выполнить), с после дующей частью except, где располагается программный код обработки исключения. Далее следует часть else, программный код которой вы полняется, если в части try исключение не возникло. Интерпретатор сначала выполняет часть try, затем выполняет либо часть except (если возникло исключение), либо часть else (если исключение не возникло). В терминах вложенности инструкций, так как слова try, except и else имеют одинаковые отступы, все они считаются частью одной и той же инструкции try. Обратите внимание, что в данном случае часть else связана с инструкцией try, а не с условной инструкцией if. Как будет показано далее в книге, ключевое слово else в языке Python может по являться не только в инструкции if, но и в инструкции try и в циклах – величина отступа наглядно показывает, частью какой инструкции оно является. В заключение 289 Напомню, что к инструкции try мы еще вернемся далее в этой книге. А пока вам достаточно будет знать, что эта инструкция может исполь зоваться для перехвата любых ошибок, уменьшения объема программ ного кода, проверяющего наличие ошибок, и представляет собой доста точно универсальный подход к обработке необычных ситуаций. Три уровня вложенности программного кода Теперь рассмотрим последнюю версию сценария. В случае необходи мости мы могли бы создать еще один уровень вложенности, например, чтобы выполнить проверку правильности ввода, основываясь на вели чине введенного числа: while True: reply = raw_input('Enter text:') if reply == 'stop': break elif not reply.isdigit( ): print 'Bad!' * 8 else: num = int(reply) if num < 20: print 'low' else: print num ** 2 print 'Bye' В эту версию сценария добавлена еще одна инструкция if, вложенная в выражение else другой условной инструкции if, которая в свою оче редь вложена в цикл while. Когда код выполняется по некоторому ус ловию или в цикле, как в данном случае, достаточно просто выпол нить дополнительный отступ вправо. В результате сценарий работает так же, как и предыдущая версия, но для чисел меньше 20 выводит слово «low» (низкое значение): Enter text:19 low Enter text:20 400 Enter text:spam Bad!Bad!Bad!Bad!Bad!Bad!Bad!Bad! Enter text:stop Bye В заключение В этой главе мы коротко познакомились с синтаксисом инструкций языка Python. Здесь были представлены основные правила записи ин струкций и блоков программного кода. Как было сказано, в языке Py thon обычно в каждой строке программы располагается единственная 290 Глава 10. Введение в инструкции языка Python инструкция и все инструкции в одном и том же блоке имеют одинако вые отступы (отступы являются частью синтаксиса языка Python). Кроме того, мы рассмотрели несколько исключений из этих правил, включая многострочные инструкции, однострочные условные инструк ции и циклы, а также рассмотрели синтаксис инструкций в действии. В следующей главе мы приступим к глубокому изучению основных процедурных инструкций языка Python. Как будет показано далее, все инструкции следуют тем же основным правилам, которые были представлены здесь. Закрепление пройденного Контрольные вопросы 1. Какие три синтаксических элемента, обязательные в языках, по добных языку C, опущены в языке Python? 2. Каким образом обычно завершаются инструкции в языке Python? 3. Как обычно определяется принадлежность инструкций к вложен ному блоку в языке Python? 4. Как можно разместить одну инструкцию в нескольких строках? 5. Как можно разместить составную инструкцию в одной строке? 6. Существуют ли какиелибо объективные причины для завершения инструкций точкой с запятой? 7. Для чего предназначена инструкция try? 8. Какую наиболее распространенную ошибку допускают начинаю щие программисты на языке Python? Ответы 1. Обязательными синтаксическими элементами в Сподобных языках программирования являются круглые скобки, окружающие выра жения проверки условий в некоторых инструкциях, точка с запя той, завершающая каждую инструкцию, и фигурные скобки, окру жающие вложенные блоки программного кода. 2. Конец строки является концом инструкции, расположенной в этой строке. Если в одной строке располагается несколько инструкций, они должны завершаться точками с запятой. Если инструкция рас полагается в нескольких строках, она должна завершаться закры вающей скобкой. 3. Все инструкции во вложенном блоке имеют одинаковые отступы, состоящие из одинакового числа символов пробела или табуляции. 4. Инструкция может располагаться в нескольких строках, если за ключить ее в пару круглых, квадратных или фигурных скобок. Ин Закрепление пройденного 291 струкция заканчивается в строке, где интерпретатор Python встре чает закрывающую парную скобку. 5. Тело составной инструкции может располагаться в той же строке, что и основная инструкция, сразу после символа двоеточия, но при условии, что тело не содержит других составных инструкций. 6. Только когда возникает потребность разместить несколько инст рукций в одной строке, при условии, что ни одна из инструкций не является составной. Однако такой способ размещения инструкций приводит к снижению удобочитаемости программного кода. 7. Инструкция try используется для перехвата и обработки исключе ний (ошибок), возникающих в сценариях на языке Python. Как правило, она представляет альтернативу программному коду, кото рый создается для выявления ошибочных ситуаций. 8. Наиболее распространенная ошибка среди начинающих програм мистов состоит в том, что они забывают добавлять двоеточие в кон це основной части составных инструкций. 11 Присваивание, выражения и print Теперь, когда мы кратко ознакомились с синтаксисом инструкций в языке Python, начиная с этой главы, мы приступим к более подроб ному изучению конкретных инструкций языка Python. Сначала мы рассмотрим самые основы – инструкции присваивания, инструкции выражений и инструкцию вывода на экран. Мы уже видели все эти ин струкции в действии, но здесь мы восполним подробности, которые опускались ранее. Несмотря на всю простоту этих инструкций, в чем вы могли убедиться ранее, каждая из них имеет дополнительные воз можности, которые пригодятся, когда вы начнете писать настоящие программы на языке Python. Инструкции присваивания Ранее мы уже использовали инструкции присваивания для назначе ния имен объектам. В канонической форме цель присваивания записы вается слева от знака равно, а объект, который присваивается, – спра ва. Цель слева может быть именем или компонентом объекта, а объек том справа может быть произвольное выражение, которое в результате дает объект. В большинстве случаев присваивание выполняется доста точно просто, однако оно обладает следующими особенностями, кото рые вам следует иметь в виду: • Инструкция присваивания создает ссылку на объект. Как говори лось в главе 6, в языке Python инструкция присваивания сохраняет ссылки на объекты в переменных или в элементах структур дан ных. Они всегда создают ссылки на объекты и никогда не создают копии объектов. Вследствие этого переменные в языке Python боль ше напоминают указатели, чем области хранения данных. • Переменные создаются при первом присваивании. Интерпретатор Python создает переменные, когда им впервые присваиваются зна |