Python: Экранированные последовательности
Как видите, результат получился не такой, как мы хотели. Строки расположились друг за другом, а не одна ниже другой. Нам нужно как-то сказать интерпретатору «нажать на Enter» — сделать перевод строки после вопросительного знака. Это можно сделать с помощью символа \n :
print("- Are you hungry?\n- Aaaarrrgh!") # => - Are you hungry? # => - Aaaarrrgh!
\n — это пример экранированной последовательности (escape sequence). Такие последовательности еще называют управляющими конструкциями. Их нельзя увидеть в том же виде, в котором их набрали.
Набирая текст в Word, вы нажимаете на Enter в конце строчки. Редактор при этом ставит в конец строчки специальный невидимый символ, который называется LINE FEED (LF, перевод строчки). В некоторых редакторах можно даже включить отображение невидимых символов. Тогда текст будет выглядеть примерно так:
- Привет!¶ - О, привет!¶ - Как дела?
Устройство, которое выводит соответствующий текст, учитывает этот символ. Например, принтер при встрече с LF протаскивает бумагу вверх на одну строку, а текстовый редактор переносит весь последующий текст ниже, также на одну строку.
Существует несколько десятков таких невидимых символов, но в программировании часто встречаются всего несколько. Кроме перевода строки, к таким символам относятся:
- табуляция \t — разрыв, который получается при нажатии на кнопку Tab
- возврат каретки \r — работает только в Windows
Распознать такую управляющую конструкцию в тексте можно по символу \ . Программисты часто используют перевод строки \n , чтобы правильно форматировать текст. Например, напишем такой код:
print("Gregor Clegane\nDunsen\nPolliver\nChiswyck")
Тогда на экран выведется:
Gregor Clegane Dunsen Polliver Chiswyck
Когда работаете с символом перевода, учитывайте следующие моменты:
- Не важно, что стоит перед или после \n : символ или пустая строка. Перевод обнаружится и выполнится в любом случае
- Строка может содержать только \n :
print('Gregor Clegane') # Строка с текстом print("\n") # Строка с невидимым символом перевода строки print('Dunsen') # Строка с текстом
Программа выведет на экран:
Gregor Clegane Dunsen
- В коде последовательность \n выглядит как два символа, но с точки зрения интерпретатора — это один специальный символ
- Если нужно вывести \n как текст (два отдельных печатных символа), то можно воспользоваться экранированием — добавить еще один \ в начале. Последовательность \\n отобразится как символы \ и n , которые идут друг за другом:
print("Joffrey loves using \\n") # => Joffrey loves using \n
В Windows для перевода строк по умолчанию используется \r\n . Такая комбинация хорошо работает только в Windows, но создает проблемы при переносе в другие системы. Например, когда в команде разработчиков есть пользователи Linux.
Дело в том, что последовательность \r\n имеет разную трактовку в зависимости от выбранной кодировки, о чем мы поговорим позже. По этой причине в среде разработчиков принято всегда использовать \n без \r .
В таком случае перевод строки всегда трактуется одинаково и отлично работает в любой системе. Не забудьте настроить ваш редактор на использование \n .
Задание
Напишите программу, которая выводит на экран:
- Did Joffrey agree? - He did. He also said "I love using \n".
При этом программа использует только один print() , но результат на экране должен выглядеть в точности, как показано выше.
Упражнение не проходит проверку — что делать?
Если вы зашли в тупик, то самое время задать вопрос в «Обсуждениях». Как правильно задать вопрос:
- Обязательно приложите вывод тестов, без него практически невозможно понять что не так, даже если вы покажете свой код. Программисты плохо исполняют код в голове, но по полученной ошибке почти всегда понятно, куда смотреть.
В моей среде код работает, а здесь нет
Тесты устроены таким образом, что они проверяют решение разными способами и на разных данных. Часто решение работает с одними входными данными, но не работает с другими. Чтобы разобраться с этим моментом, изучите вкладку «Тесты» и внимательно посмотрите на вывод ошибок, в котором есть подсказки.
Мой код отличается от решения учителя
Это нормально , в программировании одну задачу можно выполнить множеством способов. Если ваш код прошел проверку, то он соответствует условиям задачи.
В редких случаях бывает, что решение подогнано под тесты, но это видно сразу.
Прочитал урок — ничего не понятно
Создавать обучающие материалы, понятные для всех без исключения, довольно сложно. Мы очень стараемся, но всегда есть что улучшать. Если вы встретили материал, который вам непонятен, опишите проблему в «Обсуждениях». Идеально, если вы сформулируете непонятные моменты в виде вопросов. Обычно нам нужно несколько дней для внесения правок.
Кстати, вы тоже можете участвовать в улучшении курсов: внизу есть ссылка на исходный код уроков, который можно править прямо из браузера.
Полезное
- Обязательно поэкспериментируйте с выводом разных строк на сайте https://replit.com/languages/python3
- История перевода строки
Определения
- Экранированная последовательность — специальная комбинация символов в тексте. Например, \n — это перевод строки.
Python «\n» не работают в строке, которая возвращается из БД
Храню в базе данных MongoDB разные строки, например: «Abc \n Abc» , когда пытаюсь её вывести через print(my_string), то получаю вывод: «Abc \n Abc» , вместо ожидаемого:
"Abc Abc"
Вот сам код:
my_string = get_one_string_from_bd() print(my_string) print(type(my_string)) print(repr(my_string))
Abc \n Abc Abc \\n Abc
Что я делаю не так и как заставить работать перевод строки? Проблема решается если добавить (n с двумя палочками, заменить на n с одной палочкой, почему-то на этом сайте заменяется на 1) .replace(«\n», «\n») к строке, но это как-то странно.
Основы работы со строками¶
Строковый литерал может быть записан в одинарных или двойных кавычнах:
>>> "Hello" 'Hello' >>> 'World' 'World'
Разницы между этими двумя формами записи нет. Записывать строки в двойных кавычках удобно в случаях, когда в тексте содержится апостроф:
>>> "What's your name?" "What's your name?"
Запись в апострофах удобна, если в тексте есть кавычки:
>>> 'He said: "Bond, James Bond."' 'He said: "Bond, James Bond."'
Иначе интерпретатор будет считать ближайшие кавычку или апостроф закрывающими, и их нужно экранировать:
>>> 'What\'s your name?' "What's your name?" >>> "He said: \"Bond, James Bond.\"" 'He said: "Bond, James Bond."'
Внутри строки могут быть управляющие последовательности. Некоторые из них:
>>> print("Hello\nWorld") Hello World >>> print("1\t2\n30\t4") 1 2 30 4
В некоторых случаях экранирование обратного слеша может быть неудобно. Можно воспользоваться литералом сырых строк:
>>> print(r"Hello\nWorld") Hello\nWorld
Операции со строками¶
Получение длины строки:
>>> len("Hello") 5
>>> "Hello " + "World" 'Hello World'
Повторение строки n раз:
>>> "python " * 3 'python python python '
Обращение к символу i строки s . Индексация начинается с нуля. Индексы могут быть отрицательными, тогда отсчет ведется с конца строки:
>>> s = 'abcdef' >>> s[0] 'a' >>> s[5] 'f' >>> s[-1] 'f' >>> s[-2] 'e'
s[begin:end:step]
Получение среза строки от позиции begin до позиции end с шагом step . Любой параметр может быть пропущен:
>>> s = "abcdef" >>> s[1:] 'bcdef' >>> s[:-1] 'abcde' >>> s[1:-1] 'bcde' >>> s[1::2] 'bdf' >>> s[::2] 'ace' >>> s[::-2] 'fdb'
Задачи¶
- Пользователь вводит слово. Подсчитать количество символов в нем.
- Пользователь вводит слово. Вывести его первую и последнюю буквы.
- Пользователь вводит число. Вывести соответствующее количество кроликов. Пример:
Rabbits: 1 (\_/) =(^.^)= (“)_(“) Rabbits: 3 (\_/) (\_/) (\_/) =(^.^)= =(^.^)= =(^.^)= (“)_(“) (“)_(“) (“)_(“)
C:\Python3\python.exe
С помощью срезов вывести отдельно имя файла, его расширение, имя каталога и полный путь к каталогу. Пример вывода:
Имя файла: python.exe Расширение: exe Имя каталога: Python3 Полный путь к каталогу: C:\Python3\
Chapter 1: Мальчик, который выжил Page: 5 Chapter 2: Косой переулок Page: 40 Chapter 3: Человек с двумя лицами Page: 500
Мальчик, который выжил 5 Косой переулок 40 Человек с двумя лицами 500
Дополнительные задачи¶
Разработать приложение, которое запрашивает у пользователя стоимость заказа из трех пунктов и выводит чек таким образом, что все стоимости выводятся в крайнем правом столбце. Ширину чека принять за 30 символов. Пример:
Салат: 60 Первое: 45 Второе: 120 Ваш счет Салат: 60.0 Первое: 45.0 Второе: 120.0 ------------------------------ Итого: 225.0
Домашнее задание¶
На вход программе подается строка. Необходимо вывести:
- Сначала выведите третий символ этой строки.
- Во второй строке выведите предпоследний символ этой строки.
- третьей строке выведите первые пять символов этой строки.
- В четвертой строке выведите всю строку, кроме последних двух символов.
- В пятой строке выведите все символы с четными индексами (считая, что индексация начинается с 0, поэтому символы выводятся начиная с первого).
- В шестой строке выведите все символы с нечетными индексами, то есть начиная со второго символа строки.
- В седьмой строке выведите все символы в обратном порядке.
- В восьмой строке выведите все символы строки через один в обратном порядке, начиная с последнего.
- В девятой строке выведите длину данной строки.
Input: Abrakadabra Output: r r Abrak Abrakadab Arkdba baaar arbadakarbA abdkrA 11
© Copyright Revision d00c0df4 .
Built with Sphinx using a theme provided by Read the Docs.
Read the Docs v: latest
Versions latest Downloads html On Read the Docs Project Home Builds Free document hosting provided by Read the Docs.
Основы Python — кратко. Строки.
Поскольку число положительных отзывов превысило число отрицательных, продолжу выкладывание уроков. Те кто уже знаком с основами — можете или просто пропустить урок, или попробовать сделать задание 3 самым коротким способом 🙂
Для начала маленькое замечание.
Начиная с Python 2.3, всем, кто использует не-ASCII кодировку нужно добавлять указание о кодировке в самом начале программы. Для русского языка это будет в основном:
# -*- coding: cp1251 -*-
или использовать для хранения исходных текстов файлы utf-8 (что предпочтительней).
Изучив управление числами, пришла пора осваивать строки. Пайтон обладает весьма богатым набором возможностей в этой области.
Строки
Строки могут быть заключены в одинарные или двойные кавычки, строки могут использовать esc-последовательности в стиле С, многострочные константы задаются в тройных кавычках.
>>> "habrahabr" 'habrahabr' >>> 'foo bar boz' 'foo bar boz' >>> "won't" "won't" >>> 'don"t' 'don"t' >>> "couldn\"t" 'couldn"t' >>> """multi line . very long . string constant""" 'multi line\nvery long\nstring constant' >>> 'this takes \ . two lines' 'this takes two lines'
Строки можно склеивать оператором + и «размножать» оператором *
>>> "Hello "+"word" 'Hello word' >>> "Hello "*3 'Hello Hello Hello '
По сути же своей строка представляет собой последовательность символов с произвольным доступом. Для получения части символов строки можно использовать т.н. оператор «среза». Обратите внимание, что нумерация начитается с нуля (и достаточно хаотична на первый взгляд).
>>> str = "Hello, cruel world!" # получить 4 символ строки >>> str[3] 'l' # все символы с 8 по 14 >>> str[7:14] 'cruel w' # каждый второй символ со 2 по 13 >>> str[1:12:2] 'el,cul' # некоторые значения можно опускать # каждый второй символ строки. >>> str[::2] 'Hlo re ol!'
Если опустить первый из трех параметров, он считается равным нулю, если опустить второй – срез будет продолжен до конца строки.
# первые 2 символа строки >>> str[:2] 'He' # вся строка кроме 2 первых символов >>> str[2:] 'llo, cruel world!'
Срезы с неправильными границами обрабатываются следующим образом:
— если верхняя граница среза больше длины строки, то она уменьшается до длины строки
— если нижняя граница больше верхней, то возвращается пустая строка
Также срезы могут принимать отрицательные значения.
# последний символ >>> str[-1] '!' # второй символ с конца >>> str[-2] 'd' # два последних символа >>> str[-2:] 'd!' # все символы кроме последних двух >>> str[:-2] 'Hello, cruel worl'
Лучший способ запомнить, как определяются индексы в срезе — считать их указывающими между символами, с номером 0 на левой границе первого символа. А правая граница последнего символа имеет индекс равный длине строки.
Для положительных символов длина строки равна разности между числами на границе.
Для определения длины строки используется функция len().
Unicode
В последних версиях Пайтон очень хорошо поддерживается работа с Unicode-строками.
Для задания unicode-строки в виде константы используется префикс u.
>>> uni = u"Тест" >>> uni u'\u0422\u0435\u0441\u0442'
Кроме того, Пайтон позволяет создать строку в Unicode с помощью одноименной функции.
>>> uni = unicode("Тест", "UTF-8") >>> uni u'\u0422\u0435\u0441\u0442'
Эта функция функция может работать с Latin-1, ASCII, UTF-8, UTF-16, с русскими кодировками ISO-8859-5, KOI8-R, CP1251, CP866 и Mac-cyrillic, и многими другими.
Для обратного преобразования служит метод encode, который преобразует unicode-строку в строку с заданной кодировкой.
>>> uni.encode("UTF-8") '\xd0\xa2\xd0\xb5\xd1\x81\xd1\x82' >>> uni.encode("CP1251") '\xd2\xe5\xf1\xf2'
Для преобразования строки в список по определенному разделителю, используется метод split.
Этот метод в качестве параметра запрашивает разделитель, а возвращает список отдельных «слов» по которому можно «пройти» в цикле for.
>>> str = "Mary has a little lamb" >>> str.split(" ") ['Mary', 'has', 'a', 'little', 'lamb'] >>> for word in str.split(" "): . print word . Mary has a little lamb
Домашнее задание.
1. Написать программу, выводящую заданную пользователем строку как минимум в 3 разных кодировках. При этом писать вызов метода encode() в программе можно только 1 раз.
2. Написать программу поиска самого длинного слова в строке, разделенной пробелами.
3. (Повышенная сложность) Написать программу декодирования телефонного номера для АОН.
По запросу АОНа АТС посылает телефонный номер, используя следующие правила:
— Если цифра повторяется менее 2 раз, то это помеха и она должна быть отброшена
— Каждая значащая цифра повторяется минимум 2 раза
— Если в номере идут несколько цифр подряд, то для обозначения «такая же цифра как предыдущая» используется идущий 2 или более подряд раз знак #
Например, входящая строка 4434###552222311333661 соответствует номеру 4452136
Кстати, регулярные выражения использовать в этих заданиях — нельзя 🙂
