М. Лутц - Изучаем Python (4-е издание)- 2011 (1126907), страница 95
Текст из файла (страница 95)
Нижеприводится пример с использование метода get для получения значения поумолчанию:>>> branch = {‘spam’: 1.25,...‘ham’: 1.99,Синтаксические правила языка Python...379‘eggs’: 0.99}>>> print branch.get(‘spam’, ‘Bad choice’)1.25>>> print branch.get(‘bacon’, ‘Bad choice’)Bad choiceПрименение оператора in проверки на вхождение в инструкции if может обеспечить получение того же результата по умолчанию:>>>>>>............Badchoice = ‘bacon’if choice in branch:print(branch[choice])else:print(‘Bad choice’)choiceСловари хорошо подходят для выбора значений, ассоциированных с ключами,но как быть в случае более сложных действий, которые можно запрограммировать в инструкциях if? В четвертой части книги вы узнаете, что словари такжемогут содержать функции, выполняющие сложные действия при ветвлении,реализуя обычные таблицы переходов.
В этом случае функции, играющиероль значений в словаре, часто создаются как лямбда-функции и вызываютсядобавлением круглых скобок. Подробнее об этом вы прочитаете в главе 19.Множественное ветвление на базе словаря довольно удобно использовать в программах, которые имеют дело с динамическими данными, однако большинство программистов согласятся, что использование инструкции if являетсянаиболее простым способом организации множественного ветвления. Обычнопри колебаниях при выборе того или иного подхода предпочтение следует отдавать более простому и более удобочитаемому способу.Синтаксические правила языка PythonПервое знакомство с синтаксической моделью языка Python состоялось в главе 10. Теперь, когда мы подошли к таким крупным инструкциям, как if, настало время пересмотреть и дополнить сведения о синтаксисе, введенные ранее.Вообще язык программирования Python обладает простым синтаксисом, основанным на применении инструкций.
Однако он обладает некоторыми особенностями, о которых вам необходимо знать:•• Инструкции выполняются последовательно, одна за другой, пока не будетпредусмотрено что-то другое. Обычно интерпретатор выполняет инструкции в файле или в блоке от начала до конца, но такие инструкции, как if (и,как будет показано далее, циклы), заставляют интерпретатор выполнять переходы внутри программного кода. Так как путь интерпретатора Python через текст программы называется потоком управления, такие инструкции,как if, часто называются инструкциями управления потоком выполнения.•• Границы блоков и инструкций определяются автоматически.
Как мы ужевидели, в языке Python отсутствуют фигурные скобки или разделители«begin/end», окружающие блоки программного кода. Вместо этого принадлежность инструкций к вложенному блоку определяется по величине отступов. Точно так же инструкции в языке Python обычно не завершаются380Глава 12. Условная инструкция if и синтаксические правилаточкой с запятой; обычно признаком конца инструкции служит конец строки с этой инструкцией.•• Составные инструкции = “заголовок + «:» + инструкции с отступами”.Все составные инструкции в языке Python оформляются одинаково: строка с заголовком завершается двоеточием, далее следуют одна или болеевложенных инструкций, обычно с отступом относительно заголовка.
Этиинструкции с отступами называются блоком (или иногда набором). В инструкции if предложения elif и else являются не только частями инструкции if, но и заголовками с собственными вложенными блоками.•• Пустые строки, пробелы и комментарии обычно игнорируются. Пустыестроки игнорируются в файлах (но не в интерактивной оболочке, когдаони завершают составные инструкции).
Пробелы внутри инструкций и выражений игнорируются практически всегда (за исключением строковыхлитералов, а также когда они используются для оформления отступов).Комментарии игнорируются всегда: они начинаются с символа # (не внутристроковых литералов) и простираются до конца строки.•• Строки документирования игнорируются, но сохраняются и отображаются специализированными инструментами.
В языке Python поддерживается дополнительная форма комментариев, которая называется строкамидокументирования, которые, в отличие от комментариев, начинающихсяс #, сохраняются и доступны для просмотра во время выполнения. Строкидокументирования – это обычные строки, которые располагаются в началефайлов с программами и в некоторых инструкциях. Интерпретатор игнорирует их содержимое, но они автоматически присоединяются к объектамво время выполнения и могут отображаться инструментами доступа к документации. Строки документирования являются частью стратегии документирования в языке Python и будут рассматриваться в последней главеэтой части книги.Как уже говорилось ранее, в языке Python отсутствует необходимость объявлять типы переменных – только один этот факт упрощает синтаксис языка больше, чем любые другие особенности.
Но для большинства новых пользователей самой необычной особенностью синтаксиса языка Python кажетсяотсутствие фигурных скобок и точек с запятой, используемых в качестве разделителей блоков и инструкций во многих других языках, поэтому давайтерассмотрим их поближе.Разделители блоков: правила оформления отступовИнтерпретатор автоматически определяет границы блоков по величине отступов – то есть по ширине пустого пространства слева от программного кода.Все инструкции, смещенные вправо на одинаковое расстояние, принадлежатк одному и тому же блоку кода. Другими словами, инструкции в блоке выстроены по вертикальной линии. Блок заканчивается либо с концом файла, либокак только встретится строка с меньшим отступом; более глубоко вложенныеблоки имеют более широкие отступы, чем инструкции в объемлющем блоке.Например, на рис. 12.1 показана структура блоков следующего фрагмента программного кода:x = 1if x:381Синтаксические правила языка Pythony = 2if y:print ‘block2’print ‘block1’print ‘block0’Блок 0Заголовок:Блок 1Заголовок:Блок 2Блок 1Блок 0Рис. 12.1.
Вложенные блоки программного кода: вложенный блок начинаетсяс инструкции, имеющей больший отступ, и заканчивается либо когда будетвстречена инструкция с меньшим отступом, либо в конце файлаДанный фрагмент содержит три блока: первый (программный код верхнегоуровня) вообще не имеет отступов, второй (внутри внешней инструкции if)имеет отступ из четырех пробелов и третий (инструкция print внутри вложенной инструкции if) имеет отступ из восьми пробелов.Вообще программный код верхнего уровня (не вложенный) должен начинатьсяв строках с позиции 1. Вложенные блоки могут начинаться с любой позиции –отступ может состоять из любого числа пробелов и символов табуляции, главное, чтобы все инструкции в одном блоке имели одинаковые отступы.
То естьдля интерпретатора не важно, как будут оформляться отступы, главное, чтобыоформление было непротиворечивым. Наиболее часто для смещения на одинуровень используются четыре пробела или один символ табуляции, но в этомотношении не существует никаких стандартов.Правила оформления отступов в программном коде являются вполне естественными.
Например, в следующем фрагменте демонстрируются типичныеошибки, связанные с оформлением отступов:x = ‘SPAM’# Ошибка: отступ в первой строкеif ‘rubbery’ in ‘shrubbery’:print(x * 8)x += ‘NI’# Ошибка: неуместный отступif x.endswith(‘NI’):x *= 2print(x)# Ошибка: непоследовательное оформление отступовПравильно оформленная версия этого фрагмента приводится ниже – даже в таком простом примере, как этот, правильное оформление отступов делает программный код намного более удобочитаемым:382Глава 12. Условная инструкция if и синтаксические правилаx = ‘SPAM’if ‘rubbery’ in ‘shrubbery’:print(x * 8)x += ‘NI’if x.endswith(‘NI’):x *= 2print(x)# Выведет “SPAMNISPAMNI”Единственное, где в языке Python пробелы имеют большое значение, – это когда они находятся левее программного кода; в большей части других случаевневажно, есть пробелы или нет.
При этом отступы в действительности являются частью синтаксиса языка, а не просто предложением по оформлению: всеинструкции внутри любого заданного блока должны иметь одинаковые отступы, в противном случае интерпретатор сообщит о синтаксической ошибке. Т.к.вам не требуется явно отмечать начало и конец вложенного блока, различныесинтаксические элементы, которые можно найти в других языках, в языкеPython не нужны.Как уже отмечалось в главе 10, отступы, как часть синтаксической модели, стали важным компонентом обеспечения удобочитаемости в языках структурногопрограммирования, таких как Python.
Иногда синтаксис языка Python����������������описывают фразой «what you see is what you get» (что видишь, то и получаешь) –отступ каждой строки однозначно говорит, к какому блоку она принадлежит.Такой непротиворечивый внешний вид программного кода на языке Pythonобеспечивает простоту его сопровождения и многократного использования.Отступы выглядят в программном коде куда более естественно, чем можнобыло бы подумать, и они обеспечивают отражение его логической структуры.Программный код, в котором отступы оформлены непротиворечивым образом,всегда будет соответствовать правилам языка Python. Кроме того, многие текстовые редакторы (включая IDLE) упрощают следование модели отступов, автоматически выравнивая программный код по мере его ввода.Не смешивайте пробелы и символы табуляции:новый механизм проверки ошибок в версии 3.0Для оформления отступов допускается использовать пробелы и символы табуляции, но обычно не принято смешивать их внутри блока – используйтечто-то одно – или пробелы, или символы табуляции.
С технической точкизрения считается, что символ табуляции смещает текущую позицию в строкедо ближайшей позиции с номером, кратным 8, и программный код будет интерпретироваться безошибочно, если пробелы и символы табуляции смешиваются непротиворечивым способом. Однако такой программный код будетдостаточно сложно изменять. Хуже того, смешивание пробелов и символовтабуляции ухудшают удобочитаемость программного кода – символы табуляции могут отображаться в текстовом редакторе другого программиста совсемне так, как у вас.В действительности, по только что описанным причинам, интерпретатор ���Python�������������������������������������������������������������������� 3.0 считает ошибкой непоследовательное смешивание пробелов и символов табуляции в пределах блока (то есть, когда величина отступов из смешанных символов в пределах блока может отличаться в зависимости от интерпретации ширины символов табуляции).