Python Strings: Полное руководство
Изучите Python strings с нуля: создание, индексация, срезы, f-строки, встроенные методы и распространённые ошибки с примерами.
Строки — один из наиболее часто используемых типов данных в Python. Каждый раз, когда программа читает файл, выводит сообщение или разбирает ввод, она работает со строками. В этой главе рассказывается, как создавать строки, обращаться к символам по индексу, делать срезы, использовать встроенные методы и избегать типичных ошибок.
Что такое string в Python?
String — это упорядоченная неизменяемая последовательность символов Unicode. «Неизменяемая» означает, что изменить символ на месте невозможно — каждая операция, которая как будто изменяет строку, на самом деле создаёт новую. Строки могут содержать буквы, цифры, знаки препинания, пробелы и любые символы Unicode (включая эмодзи).
greeting = "Hello, world!"
print(type(greeting)) # <class 'str'>
print(len(greeting)) # 13Создание строк
Python принимает три стиля кавычек, которые полностью эквивалентны:
single = 'Python'
double = "Python"
triple = """Python""" # triple-double also works as '''Python'''Одинарные и двойные кавычки
Используйте тот вариант, который позволяет избежать экранирования кавычек внутри строки:
message1 = "It's a great day" # apostrophe is fine inside double quotes
message2 = 'She said "hello"' # double quote is fine inside single quotesТройные кавычки (многострочные строки)
Тройные кавычки позволяют строке занимать несколько строк без использования escape-последовательностей:
poem = """Roses are red,
Violets are blue,
Python is awesome,
And so are you."""
print(poem)Вывод:
Roses are red,
Violets are blue,
Python is awesome,
And so are you.Строки в тройных кавычках — это также принятый способ писать docstrings — блоки документации, которые располагаются в начале функций, классов и модулей.
Преобразование других типов в строки
Используйте встроенную функцию str(), чтобы преобразовать любой объект в его строковое представление:
num = 42
pi = 3.14
flag = True
print(str(num)) # '42'
print(str(pi)) # '3.14'
print(str(flag)) # 'True'Индексация символов
Python использует индексацию с нуля: первый символ находится по индексу 0. Также можно использовать отрицательные индексы — -1 соответствует последнему символу, -2 — предпоследнему и так далее.
Обращение к индексу за пределами допустимого диапазона вызывает IndexError.
Срезы строк
Срез извлекает часть строки с помощью синтаксиса s[start:stop:step].
| Часть | Значение | По умолчанию |
|---|---|---|
start | Индекс первого включаемого символа | 0 |
stop | Индекс первого исключаемого символа | len(s) |
step | Шаг — сколько символов пропускать каждый раз | 1 |
s = "Hello, World!"
print(s[0:5]) # Hello — characters at indexes 0–4
print(s[7:]) # World! — from index 7 to the end
print(s[:5]) # Hello — from the start to index 4
print(s[-6:]) # World! — last 6 characters
print(s[::2]) # Hlo ol! — every other character
print(s[::-1]) # !dlroW ,olleH — reversed stringПодробнее о синтаксисе срезов читайте в главе Slicing Strings.
Конкатенация и повторение строк
Оператор + объединяет две строки; оператор * повторяет строку заданное количество раз.
При масштабном объединении строк внутри цикла используйте str.join() вместо + — это значительно быстрее, поскольку не создаёт промежуточные string-объекты:
words = ["one", "two", "three"]
result = ", ".join(words)
print(result) # one, two, threeПовторение строк
Операторы in и not in
Проверьте, содержится ли подстрока в строке, с помощью in или not in:
text = "The quick brown fox"
print("quick" in text) # True
print("slow" in text) # False
print("slow" not in text) # TrueДлина строки
len() возвращает количество символов в строке:
s = "Python"
print(len(s)) # 6
empty = ""
print(len(empty)) # 0Escape-символы
Некоторые символы нельзя ввести буквально внутри строки. Python использует обратный слэш \ для обозначения escape-последовательностей:
| Последовательность | Символ |
|---|---|
\n | Перевод строки |
\t | Табуляция |
\\ | Буквальный обратный слэш |
\' | Одинарная кавычка |
\" | Двойная кавычка |
\r | Возврат каретки |
print("Line one\nLine two")
# Line one
# Line two
print("Name:\tAlice")
# Name: Alice
path = "C:\\Users\\Alice"
print(path) # C:\Users\AliceЧтобы полностью отключить обработку escape-последовательностей, добавьте перед строкой префикс r — это создаст raw string, удобную для регулярных выражений и путей Windows:
pattern = r"\d+\.\d+" # treated literally, no escaping needed
print(pattern) # \d+\.\d+Полный список escape-последовательностей смотрите в главе Escape Characters.
Форматирование строк
Python предлагает несколько способов вставлять значения переменных в строки.
f-строки (рекомендуется — Python 3.6+)
f-строка начинается с префикса f или F. Выражения внутри {} вычисляются во время выполнения:
name = "Alice"
age = 30
print(f"My name is {name} and I am {age} years old.")
# My name is Alice and I am 30 years old.
# Expressions work too
print(f"Next year I'll be {age + 1}.") # Next year I'll be 31.Метод str.format()
Форматирование через % (устаревший способ)
В старом коде на Python используется форматирование через %. Вы всё ещё будете встречать его, но f-строки — современный стандарт:
print("Hello, %s!" % "Dave") # Hello, Dave!
print("Pi ≈ %.2f" % 3.14159) # Pi ≈ 3.14Полный разбор параметров форматирования смотрите в главах String Formatting и f-Strings.
Распространённые методы строк
Тип str в Python содержит десятки встроенных методов. Наиболее часто используемые представлены ниже.
Преобразование регистра
s = "Hello, World!"
print(s.upper()) # HELLO, WORLD!
print(s.lower()) # hello, world!
print(s.capitalize()) # Hello, world!
print(s.title()) # Hello, World!
print(s.swapcase()) # hELLO, wORLD!Поиск и подсчёт
s = "hello, world"
print(s.find("o")) # 4 — index of first 'o', or -1 if not found
print(s.rfind("o")) # 8 — index of last 'o'
print(s.count("l")) # 3 — total occurrences of 'l'
print(s.startswith("he")) # True
print(s.endswith("ld")) # TrueЗамена подстрок
s = "I like cats. Cats are great."
print(s.replace("cats", "dogs"))
# I like dogs. Cats are great. (only lowercase 'cats' replaced)
print(s.replace("cats", "dogs").replace("Cats", "Dogs"))
# I like dogs. Dogs are great.Удаление пробелов
padded = " hello "
print(padded.strip()) # 'hello' — both ends
print(padded.lstrip()) # 'hello ' — left end only
print(padded.rstrip()) # ' hello' — right end onlyРазбиение и объединение
csv = "apple,banana,cherry"
items = csv.split(",")
print(items) # ['apple', 'banana', 'cherry']
print(" | ".join(items)) # apple | banana | cherryПроверка содержимого строки
Полный справочник смотрите в главе String Methods.
Неизменяемость строк — типичная ошибка
Строки нельзя изменять на месте. Попытка присвоить значение по индексу вызывает TypeError:
s = "hello"
# s[0] = "H" # TypeError: 'str' object does not support item assignmentЧтобы изменить часть строки, создайте новую:
s = "hello"
s = "H" + s[1:] # slice off everything after index 0 and prepend "H"
print(s) # HelloПеременная s теперь указывает на другой string-объект — исходная строка "hello" не изменилась (и будет удалена сборщиком мусора, если на неё больше ничто не ссылается).
Строки и bytes
Python string (str) хранит текст в Unicode. Когда нужны необработанные двоичные данные — например, для записи в файл в двоичном режиме или передачи данных по сети — используйте bytes:
b = b"hello" # bytes literal
s = b.decode("utf-8") # bytes → str
b2 = s.encode("utf-8") # str → bytes
print(type(b)) # <class 'bytes'>
print(type(s)) # <class 'str'>