Перейти к содержимому
Editor

Строки в Python: создание, индексы, срезы и работа с текстом

Начальный25 min7 упр.135 XP

Этот урок переведён с английского оригинала.Read in EnglishLeer en españolСообщить об ошибке в переводе

0/7 упр.

Подумайте о своём телефоне. Почти всё, что вы видите на экране, состоит из текста: имена в контактах, сообщения от друзей, результаты поиска, уведомления. За кулисами весь этот текст хранится и обрабатывается в виде строк.

Строка позволяет Python хранить текст и работать с ним. Это может быть одна буква, целое предложение или даже целая книга. Если это текст, значит, это строка.

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

Что такое строки в Python?

Строка представляет собой последовательность символов, заключённую в кавычки. Можно использовать одинарные, двойные или тройные кавычки. Python считает строкой любой из этих вариантов.

Представьте строку как бусы. Каждая бусина соответствует одному символу, а кавычки работают как застёжка, которая скрепляет бусы.

Три способа создать строку
# Single quotes
greeting = 'Hello, world!'
print(greeting) # Hello, world!
# Double quotes - exactly the same
greeting = "Hello, world!"
print(greeting) # Hello, world!
# Triple quotes - for multi-line text
poem = """Roses are red,
Violets are blue,
Python is awesome,
And so are you."""
print(poem)
Вывод
Hello, world!
Hello, world!
Roses are red,
Violets are blue,
Python is awesome,
And so are you.

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

Смешиваем типы кавычек
# Use double quotes when your text has single quotes
message = "It's a beautiful day"
print(message)
# Use single quotes when your text has double quotes
html = '<div class="container">Hello</div>'
print(html)
Вывод
It's a beautiful day
<div class="container">Hello</div>

Даже пустая пара кавычек создаёт строку. В пустой строке нет ни одного символа, но это всё равно полноценная строка.

Пустые строки и строки с пробелами
empty = ""
print(type(empty)) # <class 'str'>
print(len(empty)) # 0
# A string with just a space is NOT empty
space = " "
print(len(space)) # 1
Вывод
<class 'str'>
0
1

Как получить отдельный символ строки?

У каждого символа строки есть номер позиции, который называется индексом. Чтобы получить любой символ, укажите его индекс в квадратных скобках.

Самое важное: Python начинает счёт с 0, а не с 1. Первый символ стоит под индексом 0, второй под индексом 1 и так далее. Это называется индексацией с нуля.

Получаем символы по положительным индексам
word = "Python"
# Positive indexing (left to right)
# P y t h o n
# 0 1 2 3 4 5
print(word[0]) # P - first character
print(word[1]) # y - second character
print(word[5]) # n - last character
Вывод
P
y
n

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

Что такое отрицательные индексы в Python?

Python также позволяет считать с конца с помощью отрицательных индексов. Последний символ имеет индекс -1, предпоследний -2 и так далее.

Получаем символы по отрицательным индексам
word = "Python"
# Negative indexing (right to left)
# P y t h o n
# -6 -5 -4 -3 -2 -1
print(word[-1]) # n - last character
print(word[-2]) # o - second to last
print(word[-6]) # P - first character
Вывод
n
o
P

Как работают срезы строк в Python?

Индекс достаёт один символ. Срез достаёт целый кусок строки. Это как отрезать ломоть из середины буханки хлеба.

Синтаксис такой: string[start:stop]. Срез берёт символы от start до stop (но не включая его). Правило «до, но не включая» относится к самым важным вещам, которые стоит запомнить.

Простые срезы строк
text = "Hello, World!"
# text[start:stop] - includes start, excludes stop
print(text[0:5]) # Hello - characters 0,1,2,3,4
print(text[7:12]) # World - characters 7,8,9,10,11
print(text[0:1]) # H - just one character
Вывод
Hello
World
H

Начало или конец среза можно не указывать. Без начала Python стартует с первого символа. Без конца он идёт до самого конца строки.

Сокращённая запись срезов
text = "Hello, World!"
print(text[:5]) # Hello - from the beginning to index 5
print(text[7:]) # World! - from index 7 to the end
print(text[:]) # Hello, World! - a copy of the whole string
Вывод
Hello
World!
Hello, World!

Как работает параметр step в срезах?

К срезу можно добавить третье число: string[start:stop:step]. Шаг (step) задаёт, как далеко прыгать от одного символа к следующему. Шаг 2 берёт каждый второй символ.

Срезы с шагом
text = "abcdefghij"
# Every other character
print(text[::2]) # acegi - step of 2
# Every third character
print(text[::3]) # adgj - step of 3
# Slice and step together
print(text[1:8:2]) # bdfh - start at 1, stop before 8, step 2
Вывод
acegi
adgj
bdfh

Самое известное применение шага: разворот строки. Шаг -1 проходит по всей строке в обратном направлении.

Разворачиваем строку с помощью [::-1]
word = "Python"
# Reverse a string with [::-1]
print(word[::-1]) # nohtyP
# This works on any string
print("racecar"[::-1]) # racecar - a palindrome!
Вывод
nohtyP
racecar

Как объединить строки в Python?

Конкатенация означает соединение строк. В Python для этого используется оператор +. Это как сцепить два кубика LEGO и получить деталь подлиннее.

Соединяем строки с помощью +
first_name = "Ada"
last_name = "Lovelace"
# Concatenation with +
full_name = first_name + " " + last_name
print(full_name) # Ada Lovelace
# You can chain as many as you want
greeting = "Hello" + ", " + "world" + "!"
print(greeting) # Hello, world!
Вывод
Ada Lovelace
Hello, world!

Повторение выполняется оператором *. Он повторяет строку заданное количество раз. Это неожиданно полезно, когда нужны разделители, узоры или выравнивание.

Повторяем строки с помощью *
# Repeat a string with *
print("Ha" * 3) # HaHaHa
print("-" * 30) # ------------------------------
print("abc " * 4) # abc abc abc abc
# Great for creating visual separators
title = "My Report"
print(title)
print("=" * len(title)) # =========
Вывод
HaHaHa
------------------------------
abc abc abc abc 
My Report
=========

Как узнать длину строки?

Функция len() сообщает, сколько символов в строке. Сюда входят буквы, цифры, пробелы и специальные символы. Считается каждый символ.

Измеряем длину строки
message = "Hello, World!"
print(len(message)) # 13
# Spaces count!
print(len("a b c")) # 5 - three letters + two spaces
# Empty string has length 0
print(len("")) # 0
# Common use: get the last index
word = "Python"
last_index = len(word) - 1
print(word[last_index]) # n
Вывод
13
5
0
n

Как проверить, есть ли текст внутри строки?

Оператор in проверяет, входит ли одна строка в другую. Он возвращает True или False. Это похоже на поиск слова в документе через Ctrl+F.

Поиск с помощью оператора in
sentence = "The quick brown fox jumps over the lazy dog"
# Check if a word is in the sentence
print("fox" in sentence) # True
print("cat" in sentence) # False
print("quick" in sentence) # True
# Check if something is NOT in the string
print("cat" not in sentence) # True
Вывод
True
False
True
True
Поиск с in без учёта регистра
# Case-sensitive gotcha
text = "Hello World"
print("hello" in text) # False - wrong case!
print("hello" in text.lower()) # True - convert to lowercase first
# Practical example: checking user input
user_answer = "Yes"
if "yes" in user_answer.lower():
print("User said yes!")
Вывод
False
True
User said yes!

Что такое экранированные символы в строках Python?

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

Часто используемые экранированные символы
# \n - new line
print("Line 1\nLine 2\nLine 3")
# \t - tab
print("Name\tAge\tCity")
print("Alice\t25\tParis")
print("Bob\t30\tTokyo")
# \\ - literal backslash
print("File path: C:\\Users\\Documents")
# \" or \' - quote inside a string
print("She said \"hello\"")
Вывод
Line 1
Line 2
Line 3
Name	Age	City
Alice	25	Paris
Bob	30	Tokyo
File path: C:\Users\Documents
She said "hello"

Вот краткая шпаргалка по экранированным символам, которые нужны чаще всего:

ЗаписьЧто делаетПример вывода
\nНовая строкаТекст с новой строки
\tТабуляцияДобавляет отступ табуляцией
\\Обратная косая чертаВыводит один \
\"Двойная кавычкаВыводит " внутри строки в кавычках "
\'Одинарная кавычкаВыводит ' внутри строки в кавычках '

Почему нельзя изменить символ в строке Python?

Строки в Python неизменяемые. Это значит, что после создания строки нельзя изменить ни один её символ. Нельзя заменить букву или исправить опечатку внутри существующей строки.

Представьте строку как напечатанную книгу. Прочитать можно любую страницу, но стереть слово и написать вместо него другое нельзя. Если нужно что-то изменить, придётся напечатать новую книгу.

Строку нельзя изменить на месте
word = "Hello"
# This will CRASH with a TypeError
try:
word[0] = "J" # Can't change individual characters!
except TypeError as e:
print(f"Error: {e}")
Вывод
Error: 'str' object does not support item assignment

Как же тогда «изменить» строку? Нужно создать новую строку с нужными изменениями. Срезы и конкатенация отлично для этого подходят.

Ошибка: изменяем строку на месте
word = "Hello"
word[0] = "J"  # TypeError!
Работает: создаём новую строку
word = "Hello"
new_word = "J" + word[1:]
print(new_word)  # Jello

Практические упражнения

Пора потренироваться! Эти упражнения охватывают всё, что было в уроке. Они начинаются с простого и постепенно усложняются.

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

Упражнение 1: приветствие через конкатенацию
Напишите код

Даны две переменные: first_name со значением "Ada" и last_name со значением "Lovelace". Создайте переменную greeting, которая объединяет их в сообщение, и выведите её.

Ожидаемый вывод:

Hello, Ada Lovelace! Welcome to Python.

Соберите приветствие с помощью конкатенации строк (+).

first_name = "Ada"
last_name = "Lovelace"
# Create the greeting using concatenation (+)
# Print the greeting
Упражнение 2: первый и последний символ
Напишите код

Дана переменная word со значением "Programming". Выведите первый и последний символы на отдельных строках.

Ожидаемый вывод:

P
g

Получите каждый символ по его индексу.

word = "Programming"
# Print the first character
# Print the last character
Упражнение 3: разверните строку
Напишите код

Дана переменная text со значением "Python". Выведите эту строку задом наперёд.

Ожидаемый вывод:

nohtyP

Разверните её одним срезом.

text = "Python"
# Print the reversed string using slicing
Упражнение 4: предскажите результат среза
Угадайте вывод

Не запуская код, предскажите, что выведет каждая строка. Помните: срез записывается как [start:stop], и stop в него не входит.

Запишите свои предположения в комментариях, а затем запустите код и проверьте себя.

word = "Hello"
print(word[1:4]) # Your prediction:
print(word[:3]) # Your prediction:
print(word[2:]) # Your prediction:
Упражнение 5: исправьте ошибку при изменении строки
Исправьте ошибку

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

Исправьте код так, чтобы он выводил:

Hello World

Создайте новую строку вместо того, чтобы менять старую.

message = "Hello Wurld"
# Fix the typo: change "u" to "o"
message[7] = "o"
print(message)
Упражнение 6: есть ли слово в предложении
Напишите код

Даны переменные sentence и search_word. Проверьте без учёта регистра, встречается ли искомое слово в предложении, и выведите результат.

Ожидаемый вывод:

True

Перед проверкой приведите обе строки к одному регистру.

sentence = "The quick brown Fox jumps over the lazy Dog"
search_word = "fox"
# Check if search_word is in sentence (case-insensitive)
# Print True or False
Упражнение 7: извлеките домен из адреса электронной почты
Напишите код

Адрес электронной почты хранится в переменной email. Извлеките из него только доменное имя (часть после символа @) и выведите его.

Ожидаемый вывод:

gmail.com

Найдите символ @ методом .find(), а затем срезом возьмите всё, что идёт после него.

email = "alice@gmail.com"
# Find the position of the @ symbol
# Slice the string to get the domain
# Print the domain

Итоги: строки в Python

Краткая шпаргалка по всему, что вы узнали:

ПонятиеСинтаксисПример
Создание строки"text" или 'text'name = "Alice"
Индексацияstring[i]"Hello"[0] даёт "H"
Отрицательные индексыstring[-i]"Hello"[-1] даёт "o"
Срезstring[start:stop]"Hello"[1:4] даёт "ell"
Срез с шагомstring[::step]"Hello"[::-1] даёт "olleH"
Конкатенация+"Hi" + " there" даёт "Hi there"
Повторение*"Ha" * 3 даёт "HaHaHa"
Длинаlen(string)len("Hello") даёт 5
Проверка вхожденияin"fox" in "a fox" даёт True
Экранированные символы\n, \t, \\Специальные символы в строках

Главное: строки неизменяемые. Символы можно читать, вырезать срезами, искать и объединять, но изменить строку на месте нельзя. Любое «изменение» создаёт совершенно новую строку.

Что дальше?

Теперь вы умеете создавать строки и делать срезы, и пора научиться их преобразовывать. В следующем уроке, [Методы строк в Python](/python/python-string-methods), вы познакомитесь со встроенными методами .upper(), .replace(), .split() и .strip(), с которыми работать с текстом становится намного приятнее.

Похожие уроки

Урок был полезен?