Зарегистрируйтесь для доступа к 15+ бесплатным курсам по программированию с тренажером

Строки Python: Основы программирования

Строки

Кавычки

'Hello'
'Goodbye'

'G'
' '
''

Какие из этих пяти вариантов — строки?

С первыми двумя все понятно, это точно строки, мы уже работали с подобными конструкциями и говорили, что строки — это наборы символов. Любой одиночный символ в кавычках — это строка. Пустая строка '' — это тоже строка. То есть строкой мы считаем всё, что находится внутри кавычек, даже если это пробел, один символ или вообще отсутствие символов.

Ранее в уроках мы записывали строки в одинарных кавычках, но это не единственный способ. Можно использовать и двойные:

print("Dracarys!")

Теперь представьте, что вы хотите напечатать строчку Dragon's mother. Апостроф перед буквой s — это такой же символ, как одинарная кавычка. Попробуем:

print('Dragon's mother')
# SyntaxError: invalid syntax

Такая программа не будет работать. С точки зрения Python строчка началась с одинарной кавычки, а потом закончилась после буквы n. Дальше были символы s mother без кавычек — значит, это не строка. А потом была одна открывающая строку кавычка, которая так и не закрылась: '). Этот код синтаксически некорректен (это видно даже по тому, как подсвечен код).

Здесь нам помогут именно двойные кавычки. Такой вариант программы отработает корректно:

print("Dragon's mother")

Теперь интерпретатор знает, что строка началась с двойной кавычки — значит и закончиться должна на двойной кавычке. А одинарная кавычка внутри стала частью строки. Верно и обратное. Если внутри строки мы хотим использовать двойные кавычки, то саму строку надо делать в одинарных. Причем количество кавычек внутри самой строки не важно.

А что, если мы хотим создать такую строку:

Dragon's mother said "No"

В ней есть и одинарные и двойные кавычки. Как быть в этой ситуации? Нужно каким-то образом указать интерпретатору считать каждую кавычку частью строки, а не началом или концом строки.

Для этого используют символ экранирования: \ (обратный слэш). Если поставить \ перед кавычкой (одинарной или двойной), это скажет интерпретатору о том, что кавычку нужно рассматривать не как начало или конец строки, а как часть строки.

# Экранируется только ", так как в этой ситуации
# двойные кавычки имеют специальное значение
print("Dragon's mother said \"No\"")
# => Dragon's mother said "No"

Посмотрите внимательно: нам нужно было добавить \ для двойных кавычек, но не для одинарной (апостроф), потому что сама строка создана с двойными кавычками. Если бы строка создавалась с одинарными кавычками, то символ экранирования нужен был бы перед апострофом, но не перед двойными кавычками.

А что, если нужно вывести сам обратный слеш? Точно так же, как и любой другой специальный символ, его надо экранировать самим собой.

print("\\")
# => \

Экранированные последовательности

Мы хотим показать вот такой диалог:

- Are you hungry?
- Aaaarrrgh!

Если вывести на экран строку с таким текстом:

print("- Are you hungry?- Aaaarrrgh!")
# => - Are you hungry?- Aaaarrrgh!

Не то, что мы хотели. Строки расположены друг за другом, а не одна ниже другой. Нам нужно как-то сказать интерпретатору «нажать на энтер» — сделать перевод строки после вопросительного знака. Это можно сделать, используя символ перевода строки: \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

Обратите внимание на следующие моменты:

  1. Не имеет значения, что стоит перед или после \n: символ или пустая строка. Перевод будет обнаружен и выполнен в любом случае.
  2. Помните, что строка может содержать лишь один символ или вообще ноль символов? А еще строка может содержать только \n:

    print('Gregor Clegane')
    print("\n")
    print('Dunsen')
    

    Здесь мы выводим одну строку с именем, потом одну строку «перевод строки», а потом еще одну строку. Программа выведет на экран:

    Gregor Clegane
    
    Dunsen
    
  3. Несмотря на то, что в исходном тексте программы последовательность типа \n выглядит как два символа, с точки зрения интерпретатора это специальный один символ.

  4. Если нам понадобится вывести \n именно как текст (два отдельных печатных символа), то можно воспользоваться уже известным нам способом экранирования, добавив еще один \ в начале. То есть последовательность \\n отобразится как символы \ и n, идущие друг за другом.

print("Joffrey loves using \\n")
# => Joffrey loves using \n

Небольшое, но важное замечание про Windows. В Windows для перевода строк по умолчанию используется \r\n. Такая комбинация хорошо работает только в Windows, но создает проблемы при переносе в другие системы (например, когда в команде разработчиков есть пользователи как Windows, так и Linux). Дело в том, что последовательность \r\n имеет разную трактовку в зависимости от выбранной кодировки (рассматривается позже). По этой причине в среде разработчиков принято всегда использовать \n без \r, так как LF всегда трактуется одинаково и отлично работает в любой системе. Не забудьте настроить ваш редактор на использование \n.

Конкатенация

В веб-разработке программы постоянно оперируют строками. Всё, что мы видим на сайтах, так или иначе представлено в виде текста. Этот текст чаще всего динамический, то есть полученный из разных частей, которые соединяются вместе. Операция соединения строк в программировании называется конкатенацией.

# Оператор такой же, как и при сложении чисел
# но здесь он имеет другой смысл (семантику)
print('Dragon' + 'stone')  # => 'Dragonstone'

Склеивание строк всегда происходит в том же порядке, в котором записаны операнды. Левый операнд становится левой частью строки, а правый — правой. Вот еще несколько примеров:

print('Kings' + 'wood')      # => Kingswood
print('Kings' + 'road')      # => Kingsroad
print("King's" + 'Landing')  # => King'sLanding

Как видите, строки можно склеивать, даже если они записаны с разными кавычками.

Пробел — такой же символ, как и другие, поэтому сколько пробелов поставить в строке, столько и получится в итоговой строке:

# Ставим пробел в левой части
print("King's " + 'Landing')  # => King's Landing

# Ставим пробел в правой части
print("King's" + ' Landing')  # => King's Landing

Дополнительные материалы

  1. REPL для экспериментов
  2. История перевода строки
  3. Что такое кодировки?

Аватары экспертов Хекслета

Остались вопросы? Задайте их в разделе «Обсуждение»

Вам ответят команда поддержки Хекслета или другие студенты.

Ошибки, сложный материал, вопросы >
Нашли опечатку или неточность?

Выделите текст, нажмите ctrl + enter и отправьте его нам. В течение нескольких дней мы исправим ошибку или улучшим формулировку.

Что-то не получается или материал кажется сложным?

Загляните в раздел «Обсуждение»:

  • задайте вопрос. Вы быстрее справитесь с трудностями и прокачаете навык постановки правильных вопросов, что пригодится и в учёбе, и в работе программистом;
  • расскажите о своих впечатлениях. Если курс слишком сложный, подробный отзыв поможет нам сделать его лучше;
  • изучите вопросы других учеников и ответы на них. Это база знаний, которой можно и нужно пользоваться.

Об обучении на Хекслете

Открыть доступ

Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно.

  • 130 курсов, 2000+ часов теории
  • 900 практических заданий в браузере
  • 360 000 студентов
Даю согласие на обработку персональных данных, соглашаюсь с «Политикой конфиденциальности» и «Условиями оказания услуг»

Наши выпускники работают в компаниях:

Логотип компании Альфа Банк
Логотип компании Aviasales
Логотип компании Yandex
Логотип компании Tinkoff
Рекомендуемые программы

С нуля до разработчика. Возвращаем деньги, если не удалось найти работу.

Иконка программы Python-разработчик
Профессия
Разработка веб-приложений на Django
25 мая 10 месяцев

Используйте Хекслет по максимуму!

  • Задавайте вопросы по уроку
  • Проверяйте знания в квизах
  • Проходите практику прямо в браузере
  • Отслеживайте свой прогресс

Зарегистрируйтесь или войдите в свой аккаунт

Даю согласие на обработку персональных данных, соглашаюсь с «Политикой конфиденциальности» и «Условиями оказания услуг»