Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Чаплыгин А.Н. Учимся програмировать вместе с Пи...doc
Скачиваний:
3
Добавлен:
01.07.2025
Размер:
3 Мб
Скачать
☆

§6.6. Специальные и экранируемые символы

В этом разделе мы немного отвлечемся от циклов, чтобы внести ясность в вопрос специальных текстовых последовательностей, с одной из которых мы уже столкнулись в предыдущем разделе: "\t". Дело в том, что в кодовых таблицах (наборах цифровых кодов, обозначающих различные символы, которые компьютер может выводить на экран) есть целая группа так называемых непечатаемых символов. Непечатаемые символы используются для управления вводом/выводом. Самые часто используемые из них: знак табуляции,

69

Ревизия: 170

Циклы

перенос на новую строку и знак «возврата каретки». Т.к. в кодовой таблице нет символов, отображаемых на экране, для их обозначения придумали специальные последовательности:

Последовательность

Назначение

\t

Табуляция

\п

Перевод на новую строку

\г

Возврат «каретки» (курсора) в начало строки13

Таким образом, если в программе нужно вывести текст из нескольких строк, то на помощь приходят специальные последовательности:

>» print "hello\rH\n\tworld" Hello

world

Разберем, что происходит при выводе строки "hello\rH\n\tworld". Сначала выводится строка "hello" - только после нее интерпретатор встречает первую специальную последовательность: "\г" - символ возврата «каретки» на начало строки. Затем Выводится символ "Н", но происходит это на позиции первого символа! При этом уже имеющийся на этой позиции символ заменяется новым14. После этого последовательности "\п" и "\t" дают указание произвести перевод на новую строку и оставить отступ в одну табуляцию. Далее выводится оставшаяся часть строки "world".

Разумеется, не стоит применять специальные последовательности там, где это не обязательно: например, проще было исправить первый символ строки вместо добавления "\гН". Иначе вашу программу будет сложнее читать.

  1. Термин «каретка» возник с появлением механических пишущих машинок, которые были устроены так, что после перехода на новую строку нужно было возвращать специальную подвижную часть механизма в положение, соответствующее началу строки. Эта подвижная часть и называлась «кареткой». В процессе печати «каретка» перемещалась справа налево вместе с листом бумаги, «подставляя» место для следующего символа под рычажки с оттисками символов, приводимые в в движение клавишами машинки.

  2. Кстати, опытные секретарши, работавшие с пишущими машинками, так исправляли опечатки в документах: они перемещали «каретку» в нужное положение и перепечатывали символ поверх старого, который обычно немного подтирали старательной резинкой или закрашивали корректором.

70

Ревизия: 170

Циклы

Упражнение. Напишите выражение на языке Питон, которое будет выводить строку такого вида:

I can use

tabs and

new lines

in program output.

Теперь рассмотрим такую ситуацию: предположим, что нам необходимо вывести, например, такую строку "Main \template/".

>» print "Main \template/"

Main emplate/

Интерпретатор распознал последовательность "\t" и вставил специальный символ, а это не то, чего мы хотели добиться.

В подобных ситуациях перед специальным символом "\" ставится так называемый экранирующий символ: еще одна косая черта "\".

>» print "Main Wtemplate/"

Main \template/

Теперь все в порядке. А как вывести кавычки?

>» print "I

said:

"Hello

wor

Id""

File "<stdin>",

line 1

print "I

said:

"Hello

wor

Id""

SyntaxError:

inval

id syntax

Интерпретатор воспринимает вторую кавычку, как завершение строкового значения, но следующее за ней продолжение строки некорректно с точки зрения синтаксиса Питона. Попробуем экранировать кавычки:

>» print "I said: V'Hello world\"" I said: "Hello world"

Еще один вариант решения проблемы - использование одинарных кавычек:

>» print 'I said: "Hello world"' I said: "Hello world"

Главное, чтобы каждая неэкранированная кавычка имела пару и при этом не нарушалась синтаксическая структура выражения. Поэтому, работая с кавьиками, будьте внимательны.

Кстати, в тексте программ тоже используются специальные символы. Более того, символ переноса на новую строку является признаком завершения выражения, или, иначе говоря, разделителем выражений. Интересно, что в Питоне его тоже можно экранировать. Зачем? Ну, например, если выражение слишком длинное, и для удобства чтения программы вы хотите разбить его на несколько строк. Вот пример из реальной программы:

71

Ревизия: 170

Циклы

print "Значение переменной п должно быть целым положительным" \ + " числом,\ппопробуйте еще раз."

В конце первой строки стоит символ "\" (обратите внимание: он находится за пределами строкового значения), который экранирует символ переноса строки. Таким образом разделитель выражений Питона игнорируется интерпретатором, и выражение благополучно продолжается на следующей строке.