Марк Лутц - Изучаем Python, Четвертое издание (1184811), страница 84
Текст из файла (страница 84)
Однако такой подход не можетприменяться к составным инструкциям. Другими словами, в одной строкеможно размещать только простые инструкции, такие как присваивание, printи вызовы функций. Составные инструкции по-прежнему должны находитьсяв отдельной строке (иначе всю программу можно было бы записать в одну строку, что, скорее всего, не нашло бы понимания у ваших коллег!).История о двух if333Другое специальное правило, применяемое к инструкциям, по сути являетсяобратным к предыдущему: допускается записывать одну инструкцию в нескольких строках. Для этого достаточно заключить часть инструкции в парускобок – круглых (()), квадратных ([]) или фигурных ({}).
Любой программныйкод, заключенный в одну из этих конструкций, может располагаться на нескольких строках: инструкция не будет считаться законченной, пока интерпретатор Python не достигнет строки с закрывающей скобкой. Например, литерал списка можно записать так:mlist = [111,222,333]Так как программный код заключен в пару квадратных скобок, интерпретаторвсякий раз переходит на следующую строку, пока не обнаружит закрывающуюскобку.
Литералы словарей в фигурных скобках (а также литералы множестви генераторы словарей и множеств в Python 3.0) тоже могут располагаться в нескольких строках, а с помощью круглых скобок можно оформить многострочные кортежи, вызовы функций и выражения. Отступы в строках, где продолжается инструкция, в учет не принимаются, хотя здравый смысл диктует, чтостроки все-таки должны иметь некоторые отступы для обеспечения удобочитаемости.Круглые скобки являются самым универсальным средством, потому что в нихможно заключить любое выражение. Добавьте левую скобку, и вы сможете перейти на следующую строку и продолжить свою инструкцию:X = (A + B +C + D)Между прочим, такой прием допускается применять и к составным инструкциям.
Если вам требуется записать длинное выражение, оберните его круглыми скобками и продолжите на следующей строке:if (A == 1 andB == 2 andC == 3):print(‘spam’ * 3)Еще одно старое правило также позволяет переносить инструкцию на следующую строку: если предыдущая строка заканчивается символом обратного слеша:X = A + B + \ # Альтернативный способ, который может быть источником ошибокC + DНо это устаревшее правило, которое не рекомендовано к использованию в новых программах, потому что символы обратного слеша малозаметны и ненадежны – не допускается наличие каких-либо других символов после символаобратного слеша, а случайное удаление символа обратного слеша может приводить к неожиданным эффектам, если следующая строка может интерпретироваться, как самостоятельная инструкция. Кроме того, это рассматриваетсякак пережиток языка C, где очень часто используются макроопределения #���define; в Питонляндии нужно все делать так, как это делают Питонисты, а не какпрограммисты на языке C.334Глава 10.
Введение в инструкции языка PythonСпециальный случай оформления блокаКак уже говорилось выше, инструкции во вложенном блоке обычно объединяются по величине отступа. Специальный случай: тело составной инструкцииможет располагаться в той же строке, что и основная инструкция, после символа двоеточия:if x > y: print(x)Это позволяет записывать в одной строке условные операторы, циклы и так далее. Однако такой прием будет работать, только если тело составной инструкции не содержит других составных инструкций.
То есть после двоеточия могутследовать только простые инструкции – инструкции присваивания, инструкции print, вызовы функций и подобные им. Крупные инструкции по-прежнемудолжны записываться в отдельных строках. Дополнительные части составныхинструкций (такие как блоки else в условных инструкциях if, с которыми мывстретимся ниже) также должны располагаться в отдельных строках. Тело инструкции может состоять из нескольких простых инструкций, разделенныхточкой с запятой, но такой стиль оформления не приветствуется.Вообще, хотя это не является обязательным требованием, но если вы будетеразмещать инструкции в отдельных строках и всегда будете оформлять отступы для вложенных блоков, ваш программный код будет проще читать и вносить в него изменения.
Кроме того, некоторые инструменты профилированияоказываются неспособными справиться с ситуациями, когда несколько инструкций располагаются в одной строке или когда тело составной инструкцииоказывается на одной строке вместе с основной инструкцией. Поэтому в вашихинтересах всегда стремиться оформлять программный код как можно проще.Чтобы увидеть одно из этих правил в действии (когда однострочная инструкцияif используется для прерывания выполнения цикла), давайте перейдем к следующему разделу, где мы напишем и опробуем настоящий программный код.Короткий пример: интерактивные циклыМы увидим все эти синтаксические правила в действии, когда будем совершатьтурне по конкретным составным инструкциям языка Python в нескольких следующих главах, но эти правила работают одинаково везде в языке Python.
Дляначала рассмотрим короткий практический пример, который продемонстрирует способ применения синтаксических правил к оформлению инструкцийи вложенных блоков на практике и попутно познакомит вас с некоторыми инструкциями.Простой интерактивный циклПредположим, что от нас требуется написать программу на языке Python, которая взаимодействует с пользователем в окне консоли. Возможно, программабудет принимать информацию для дальнейшей передачи в базу данных иличисла для выполнения расчетов. Независимо от конечной цели, вам необходимо написать цикл, который будет считывать одну или более строк, введенныхпользователем с клавиатуры, и выводить их обратно на экран. Другими словами, вам нужно написать классический цикл, выполняющий операции чтения/вычисления/вывода.Короткий пример: интерактивные циклы335В языке Python для реализации таких интерактивных циклов используетсятипичный шаблон, который выглядит, как показано ниже:while True:reply = input(‘Enter text:’)if reply == ‘stop’: breakprint(reply.upper())В этом фрагменте использованы несколько новых для вас идей:•• Программный код выполняется в цикле while, который в языке Pythonявляется наиболее универсальной инструкцией цикла.
Подробнее об инструкции while мы будем говорить позднее, но в двух словах замечу, что онасостоит из слова while, за которым следует условное выражение. Результатэтого выражения интерпретируется как истина или как ложь. Далее следует вложенный блок программного кода, который продолжает выполнятьсяв цикле, пока условное выражение возвращает истину (слово True здесь всегда возвращает значение истины).•• Встроенная функция input, с которой мы уже встречались ранее в этой книге, используется здесь как универсальное средство получения ввода с клавиатуры – она выводит подсказку, текст которой содержится в необязательном строковом аргументе, и возвращает введенный пользователем ответв виде строки.•• Однострочная инструкция if, которая оформлена в соответствии со специальным правилом для вложенных блоков: тело инструкции if располагается в той же строке, что и основная инструкция, после символа двоеточия,а не на отдельной строке под ней с соответствующим отступом.
Она одинаково хорошо работала бы при любом из двух вариантов оформления, но притаком подходе нам удалось сэкономить одну строку.•• Наконец, для немедленного выхода из цикла использована инструкцияbreak – она просто выполняет выход за пределы инструкции цикла и программа продолжает свою работу с первой инструкции, которая расположена вслед за циклом.
Без этой инструкции цикл while работал бы вечно, поскольку его условное выражение всегда возвращает истину.В результате такая комбинация инструкций означает следующее: «читатьстроки, введенные пользователем,4 и выводить их после преобразования всехсимволов в верхний регистр, пока пользователь не введет строку “�����������stop�������”». Существуют и другие способы записи такого цикла, но данная форма очень частовстречается в программах на языке Python.Обратите внимание, что все три строки, вложенные в инструкцию цикла while,имеют одинаковые отступы, благодаря этому они визуально образуют вертикальную линию блока программного кода, ассоциированного с инструкциейцикла while. Тело цикла завершается либо с концом файла, либо с первой инструкцией, имеющей меньший отступ.Запустив этот фрагмент, мы получили следующий порядок взаимодействийс ним:Enter text:spamSPAMEnter text:4242Enter text:stop336Глава 10.
Введение в инструкции языка PythonПримечание, касающееся различий между версиями: Этот пример написан для работы под управлением интерпретатора версии 3.0. Если вы используете Python 2.6 или более раннюю версию, этот пример будет работать точно так же, но вместо функции input вы должны использовать функцию raw_input и можетеопустить круглые скобки в инструкции print. В версии 3.0 функция raw_input была переименована, а инструкция print превратилась во встроенную функцию (подробнее об инструкции printрассказывается в следующей главе).Математическая обработка данных пользователяИтак, наш сценарий работает, а теперь предположим, что вместо преобразования символов текстовой строки в верхний регистр нам необходимо выполнитьнекоторые математические действия над введенными пользователем числами, – например, вычислить квадраты чисел, что может получиться не совсемтак, как ожидают наиболее молодые и нетерпеливые пользователи.
Для достижения желаемого эффекта мы могли бы попробовать использовать следующиеинструкции:>>> reply = ‘20’>>> reply ** 2...текст сообщения об ошибке опущен...TypeError: unsupported operand type(s) for ** or pow(): ‘str’ and ‘int’Этот прием не работает, потому что (как обсуждалось в предыдущей части книги) интерпретатор выполняет преобразование типов объектов в выражениях,только если они являются числами, а ввод пользователя всегда передается сценарию в виде строки.
Мы не можем возвести строку цифр в степень, не преобразовав ее в целое число вручную:>>> int(reply) ** 2400Вооружившись этой информацией, мы можем переделать наш цикл для выполнения математических действий:while True:reply = input(‘Enter text:’)if reply == ‘stop’: breakprint(int(reply) ** 2)print(‘Bye’)В этом сценарии используется однострочная инструкция if, которая, каки прежде, производит выход из цикла по получении от пользователя строки“������������������������������������������������������������������������stop��������������������������������������������������������������������”, а кроме того, выполняется преобразование введенной строки для выполнения необходимой математической операции.