Марк Лутц - Изучаем Python, Четвертое издание (1184811), страница 96
Текст из файла (страница 96)
Иногда синтаксис языка Python����������������описывают фразой «what you see is what you get» (что видишь, то и получаешь) –отступ каждой строки однозначно говорит, к какому блоку она принадлежит.Такой непротиворечивый внешний вид программного кода на языке Pythonобеспечивает простоту его сопровождения и многократного использования.Отступы выглядят в программном коде куда более естественно, чем можнобыло бы подумать, и они обеспечивают отражение его логической структуры.Программный код, в котором отступы оформлены непротиворечивым образом,всегда будет соответствовать правилам языка Python. Кроме того, многие текстовые редакторы (включая IDLE) упрощают следование модели отступов, автоматически выравнивая программный код по мере его ввода.Не смешивайте пробелы и символы табуляции:новый механизм проверки ошибок в версии 3.0Для оформления отступов допускается использовать пробелы и символы табуляции, но обычно не принято смешивать их внутри блока – используйтечто-то одно – или пробелы, или символы табуляции.
С технической точкизрения считается, что символ табуляции смещает текущую позицию в строкедо ближайшей позиции с номером, кратным 8, и программный код будет интерпретироваться безошибочно, если пробелы и символы табуляции смешиваются непротиворечивым способом. Однако такой программный код будетдостаточно сложно изменять.
Хуже того, смешивание пробелов и символовтабуляции ухудшают удобочитаемость программного кода – символы табуляции могут отображаться в текстовом редакторе другого программиста совсемне так, как у вас.В действительности, по только что описанным причинам, интерпретатор ���Python�������������������������������������������������������������������� 3.0 считает ошибкой непоследовательное смешивание пробелов и символов табуляции в пределах блока (то есть, когда величина отступов из смешанных символов в пределах блока может отличаться в зависимости от интерпретации ширины символов табуляции).
В ������������������������������������Python������������������������������ 2.6 допускается подобное смешивание. Однако эта версия интерпретатора имеет ключ -t командной строки,при использовании которого интерпретатор будет предупреждать о непосле-Синтаксические правила языка Python383довательном использовании символов табуляции, а при запуске с ключом -ttон будет считать ошибкой такое оформление программного кода (вы можетеуказывать эти ключи в командной строке при запуске своего сценария, например: python –t main.py).
Режим работы интерпретатора Python 3.0 эквивалентензапуску интерпретатора версии 2.6 с ключом -tt.Разделители инструкций:строки и многострочные инструкцииВ языке Python инструкция обычно заканчивается в конце строки. Однакоесли инструкция слишком велика, чтобы уместиться в одной строке, можноиспользовать следующие специальные правила размещения инструкции в нескольких строках:•• Инструкции могут располагаться в нескольких строках, если они окружены синтаксической парой скобок. Язык Python позволяет продолжить вводинструкции в следующей строке, когда содержимое инструкции заключенов пару скобок (), {} или [].
Примерами инструкций, которые могут располагаться в нескольких строках, могут служить выражения в круглых скобках, литералы словарей и списков – инструкция не считается законченной,пока интерпретатор Python не встретит строку с закрывающей скобкой (), }или ]). Промежуточные строки (вторая и последующие строки инструкции)могут иметь любые отступы, но желательно, чтобы вы обеспечили одинаковое выравнивание по вертикали для повышения удобочитаемости, еслиэто возможно.
Это правило относится также к генераторам словарей и множеств в Python 3.0.•• Инструкции могут располагаться в нескольких строках, если они завершаются символом обратного слеша. Это несколько устаревшая особенность, но если необходимо разместить инструкцию в нескольких строках,можно в конец каждой предшествующей строки вставить символ обратногослеша, который будет служить признаком, что инструкция продолжаетсяна следующей строке. Так как существует возможность использовать круглые скобки для заключения длинных конструкций, символы обратногослеша практически никогда не используются. При использовании такогоподхода легко допустить ошибку: обычно интерпретатор замечает отсутствие символа \ и выводит сообщение об ошибке, но если текущая и следующая строки могут интерпретироваться, как самостоятельные и независимые инструкции, ошибка не будет замечена, а результат может оказатьсянепредсказуемым.•• Литералы строк в тройных кавычках могут располагаться в несколькихстроках.
Очень длинные строковые литералы можно разместить в нескольких строках – блоки строк в тройных кавычках, с которыми мы встретились в главе 7, предназначены именно для этих целей. Там же, в главе 7, мыузнали, что к строковым литералам применяется неявная операция конкатенации – в соответствии с правилом скобок, упоминавшимся выше, использование круглых скобок позволит расположить несколько строковыхлитералов в разных строках.•• Другие правила. Существует еще несколько моментов, которые хотелось быупомянуть. Хотя это и используется редко, инструкции можно завершатьточкой с запятой – иногда это соглашение применяется, чтобы компактноразместить несколько инструкций в одной строке. Кроме того, в любом ме-384Глава 12. Условная инструкция if и синтаксические правиласте в файле могут присутствовать пустые строки и комментарии.
Комментарии (которые начинаются с символа #) простираются до конца строки.Несколько специальных случаевНиже показано, как выглядит инструкция при использовании правила использования скобок. Конструкции, заключенные в скобки, могут заниматьпроизвольное число строк:L = [“Good”,“Bad”,“Ugly”]# Пара скобок может охватывать несколько строкЭтот прием также можно использовать с круглыми скобками (выражения, аргументы функций, заголовки функций, кортежи и выражения-генераторы)и с фигурными скобками (словари, литералы множеств в версии 3.0, а такжегенераторы множеств и словарей). С некоторыми из этих инструментов мы познакомимся в следующих главах, однако это правило охватывает большинствоконструкций, которые могут располагаться в нескольких строках.При желании можно использовать символы обратного слеша, но этот приемредко используется на практике:if a == b and c == d and \d == e and f == g:print(‘olde’)# Символы обратного слеша позволяют продолжить...Поскольку любое выражение можно заключить в круглые скобки, то лучшеиспользовать их, когда возникает необходимость расположить инструкциюв нескольких строках:if (a == b and c == d andd == e and e == f):print(‘new’)# Но круглые скобки позволяют то же самоеНа практике символы обратного слеша к использованию не рекомендуются,потому что они малозаметны и их легко пропустить по случайности.
В следующем примере задача состояла в присваивании переменной x значения 10, еслиучесть наличие символа обратного слеша. Однако если обратный слеш случайно опустить, переменной x будет присвоено значение 6; при этом никаких сообщений об ошибке не появится (+4 – это допустимая инструкция выражения).В действующих программах подобная случайность в более сложных инструкциях присваивания могла бы привести к весьма неприятным проблемам:1x = 1 + 2 + 3 \+41# Отсутствие \ существенно изменяет смысл выраженияОткровенно говоря, меня очень удивило, что возможность использования символаобратного слеша таким способом не была ликвидирована в Python 3.0, особенно еслиучесть, насколько грандиозны были некоторые из изменений! (В табл. П.2, в предисловии, приводится список возможностей, которые были убраны в версии 3.0, – некоторые из них кажутся весьма безобидными по сравнению с опасностями, которыетаит в себе такое использование символа обратного слеша.) С другой стороны, цельэтой книги – изучение языка Python, а не популистские разглагольствования, поэтому я могу только посоветовать: не используйте эту возможность.385Проверка истинностиЕще один специальный случай: в языке Python допускается записыватьв одной строке несколько несоставных инструкций (то есть инструкций, которые не имеют вложенных инструкций), разделяя их точками с запятой.
Некоторые программисты используют эту возможность для экономии пространствав файле, однако удобочитаемость будет выше, если в каждой строке размещатьтолько одну инструкцию:x = 1; y = 2; print(x) # Несколько простых инструкций в одной строкеКак мы узнали в главе 7, строковые литералы в тройных кавычках также могут занимать несколько строк. Кроме того, если два строковых литерала следуют друг за другом, они объединяются, как если бы между ними стоял операторконкатенации +. Согласно правилу скобок, если несколько строковых литералов окружить круглыми скобками, их можно будет расположить в разныхстроках. В первом примере ниже между строками будет вставлен символ концастроки и переменной S будет присвоен результат ‘\naaaa\nbbbb \ncccc’, а во втором примере будет выполнена неявная операция конкатенации и переменнойS будет присвоена строка ‘aaaabbbbcccc’.
Во втором случае комментарии будутигнорироваться, а в первом они станут частью строки S:S = “””aaaabbbbcccc”””S = (‘aaaa’‘bbbb’‘cccc’)# Этот комментарий игнорируетсяИ наконец, Python позволяет располагать тело составной инструкции в однойстроке с заголовком при условии, что тело образует простая (несоставная) инструкция. Вам часто придется видеть следующий вариант использования простых инструкций с единственным условием и действием:if 1: print(‘hello’)# Простая инструкция в строке заголовкаЭти специальные случаи можно комбинировать между собой, чтобы писатьпрограммный код, который будет сложно читать, но я не рекомендую поступать так – старайтесь записывать по одной инструкции в строке и выравнивайте все блоки; исключение могут составлять только простейшие случаи. Когдавам придется вернуться к своей программе спустя полгода, вы будете рады, чтопоступали именно так.Проверка истинностиПонятия сравнения, равенства и значений истинности были введены в главе 9.Инструкция if – это первая инструкция на нашем пути, которая используетрезультаты проверки, поэтому здесь мы подробнее поговорим о некоторых изэтих идей.