Python/Справочник по языку Python 3.1: различия между версиями
Содержимое удалено Содержимое добавлено
Hittih (обсуждение | вклад) мНет описания правки |
Hittih (обсуждение | вклад) Добавлен перевод |
||
Строка 180:
Если кодировка задана, то название кодировки должно быть распознано Python. Кодировка используется на этапе лексического анализа, в том числе для последовательностей символов (строк), комментарии и идентификаторы. Название кодировки должно содержаться в той же строке, в которой происходит задание кодировки.
=== 2.1.5. Явное объединение строк ===
Две или более физических строк могут быть объединены в одну условную строку при помощи символа бэкслэш (\) следующим образом: когда строка заканчивается бэкслэшем, не являющимся частью текстовых данных или комментария, она объединяется со следующей, составляя единую условную строку, не включающую бэкслэш и следующий за ним символ окончания строки. Например:
if 1900 < year < 2100 and 1 <= month <= 12 \
and 1 <= day <= 31 and 0 <= hour < 24 \
and 0 <= minute < 60 and 0 <= second < 60: # Похоже ли на дату
return 1
Строка, оканчивающаяся бэкслэшем, не может содержать комментарий. Комментарий или другую лексему кроме текстовых данных, начатые на одной строке, нельзя продолжить с помощью бэкслэша на другой строке. Кроме конца физической строки бэкслэш допустим только внутри текстовых данных.
=== 2.1.6. Неявное объединение строк ===
Выражения в скобках - круглых, квадратных либо фигурных - могут быть разделены на несколько физических строк без использования бэкслэша. Например:
month_names = ['Januari', 'Februari', 'Maart', # Это
'April', 'Mei', 'Juni', # голландские
'Juli', 'Augustus', 'September', # названия
'Oktober', 'November', 'December'] # месяцев
Неявно продолженные строки могут содержать комментарии. Отступы не играют роли в продолженных строках. При продолжении разрешены пустые строки. Лексемы NEWLINE не должно быть в неявно продолженных строках. Строки в тройных кавычках (см. ниже) также могут быть неявно продолженными, в этом случае они не могут содержать комментарий.
=== 2.1.7. Пустые строки ===
Условные строки, содержащие только пробелы, знаки табуляции или перевода страницы и комментарии игнорируется (т.е. не создается лексемы NEWLINE). Во время интерактивного ввода операторов обработка пустой последовательности может отличаться в зависимости от реализации цикла чтение-вычисление-вывод. В стандартном интерактивном интерпретаторе полностью пустая условная строка (т.е. не содержащая даже пробел или комментарий) завершает многострочный оператор.
=== 2.1.8. Отступы ===
Знаки пробела и табуляции начинающие условную строку используются для вычисления уровня отступа строки, который, в свою очередь, определяет группировку операторов.
Знаки табуляции заменяются (слева напрво) по одному на восемь пробелов так, что общее число символов после замены кратно восьми (здесь использовано то же правило, что и в Unix). Общее число знаков перед первым непустым символом определяет отступ строки. Отступ не может быть разделен между многими физическими строками с помощью бэкслэша; знаки пробела и табуляции до первого бэкслэша определяют отступ.
Отступы не принимаются из-за противоречивости, если исходный файл смешивает табуляции и пробелы таким образом, что делает смысл зависящим от размера табуляции в пробелах; в таком случае генерируется «TabError» .
Замечание о кроссплатформенной совместимости: из-за особенностей текстовых редакторов на не-UNIX платформах - не следует использовать смесь пробелов и табуляций для отступов в одном исодном файле. Также следует отметить, что различные платформы могут явно ограничивать максимальный уровень отступов.
Символ перевода страницы (formfeed) может находится в начале строки, тогда он игнорируется при расчете отступов. В любом другом месте символ перевода страницы между пробелами в начале строки может обрабатываться неопределенным образом (например, может сбрасывать счетчик предыдущих пробелов до нуля).
Уровни отступа строк используются для создания лексем INDENT (отступ) и DEDENT (конец отступа) при помощи стека, как описано ниже.
Перед чтением первой строки файла в стек записывается значение «0», это значение никогда не будет извлечено. Числа, заносимые в стек, будут строго возрастать. В начале каждой условной строки уровень отступа сравнивается с максимальным значением на верху стека; если они равны, то ничего не происходит. Если уровень отступа больше, то он заносится в стек, и создается одна лексема «INDENT». Если уровень меньше, то это число уже должно быть в стеке; все числа, которые больше, удаляются, и для каждого удаленного числа создается лексема «DEDENT» . В конце файла лексемы «DEDENT» создаются для всех оставшихся в стеке чисел больше нуля.
Здесь приведен пример кода на Питоне с правильно (но странновато) расставленными отступами:
def perm(l):
# Расчет списка всех перестановок l
if len(l) <= 1:
return [l]
r = []
for i in range(len(l)):
s = l[:i] + l[i+1:]
p = perm(s)
for x in p:
r.append(l[i:i+1] + x)
return r
Следующий пример показывает различные ошибки в отступах:
for i in range(len(l)): # error: not indented
s = l[:i] + l[i+1:]
p = perm(l[:i] + l[i+1:]) # error: unexpected indent
for x in p:
r.append(l[i:i+1] + x)
return r # error: inconsistent dedent
(Вообще-то, первые три ошибки найдены парсером, и только последняя - лексическим анализатором: уровень отступа return r не совпадает с уровнем в стеке.)
=== 2.1.9. Пробелы между лексемами ===
Кроме начала логической строки или в записи текстовых данных символы пробела, табуляции и перевода страницы могут быть взаимозаменяемы при разделении лексем. Эти символы необходимы между двумя лексемами только, если результат их объединения может быть интерпретирован как другая лексема (например : «ab» - это одна лексема, но «a b» - две лексемы) .
== 2.2. Другие лексемы ==
Кроме «NEWLINE» , «INDENT» и «DEDENT» , существуют следующие категории лексем: идентификаторы, ключевые слова, литералы (непосредственная запись данных) , операторы и разделители. Символы пробелов (кроме знаков конца строки, описанных ранее) не являются лексемами, а служат для их разделения. Если появляется неопределенность, лексема включает самую длинную возможную последовательность, представляющую собой действительную лексему (чтение происходит слева направо) .
== 2.3. Идентификаторы и ключевые слова ==
Идентификаторы (также называемые "имена") описаны следующим лексическим определением.
== Продолжение перевода ==
<small>Перевод происходит, например, на : "http://notabenoid.com/book/5672/" ...</small>
<!--
2.3. Identifiers and keywords¶
|