W3docs

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 — предпоследнему и так далее.

python— editable, runs on the server

Обращение к индексу за пределами допустимого диапазона вызывает 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.

Конкатенация и повторение строк

Оператор + объединяет две строки; оператор * повторяет строку заданное количество раз.

python— editable, runs on the server

При масштабном объединении строк внутри цикла используйте str.join() вместо + — это значительно быстрее, поскольку не создаёт промежуточные string-объекты:

words = ["one", "two", "three"]
result = ", ".join(words)
print(result)   # one, two, three

Повторение строк

python— editable, runs on the server

Операторы 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))   # 0

Escape-символы

Некоторые символы нельзя ввести буквально внутри строки. 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— editable, runs on the server

Форматирование через % (устаревший способ)

В старом коде на 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

Проверка содержимого строки

python— editable, runs on the server

Полный справочник смотрите в главе 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'>

Практика

Практика
In Python, which of the following are valid ways for declaring a string?
In Python, which of the following are valid ways for declaring a string?
Was this page helpful?