Строки в Python: подробное объяснение
Знакомство со строками в Python
Как задать строковое значение?
Для создания строки в Python применяются кавычки. Основной способ - одинарные кавычки, так как это требует меньше нажатий клавиш.
s = 'Привет, мир!'Set str python (множество из строки в python)
print(s) # Привет, мир!
Python переменная время (переменные для времени в python)
Двойные кавычки удобны при наличии одинарной кавычки внутри строки.
s = 'It\\'s a string'Python объект тип (тип объекта в python)
print(s) # It's a string
вещественные значения python (вещественные значения в python)
Тройные кавычки (одинарные или двойные) позволяют создавать многострочные строки.
multiline = '''Первая строка\nВторая строка'''вывести тип данных python (вывод типа данных в python)
print(multiline)\n# Первая строка\n# Вторая строка
Python двоичные данные (работа с двоичными данными в python)
Проблема: если внутри строки используются те же кавычки, что и снаружи, возникает SyntaxError. Решение: применить кавычки другого типа или экранировать внутреннюю кавычку обратной косой чертой.
s = 'It\\'s a string' # экранированиепеременная int python какая переменная (переменная int в python - что это?)
Как объединить строки?
Современный и эффективный способ - использование f-строк (f-strings), появившихся в Python 3.6. Они позволяют вставлять переменные и выражения прямо в строку.
name = 'Анна'
age = 25
s = f'{name} исполнилось {age} лет'логические значения python (логические значения в python)
print(s) # Анна исполнилось 25 лет
длина переменной python (длина числа и переменной в python)
Альтернативы: оператор + (конкатенация) и метод join. Конкатенация с + создаёт новую строку каждый раз, что может быть неэффективно в циклах.
s1 = 'Hello'
s2 = 'World'
result = s1 + ' ' + s2 # Hello Worldопределение объекта python (определение типа объекта в python)
Метод join эффективен для объединения списка строк.
words = ['Python', 'это', 'здорово']
result = ' '.join(words) # Python это здоровоопределение типа данных python (определение типов данных в python)
Старый способ - оператор % (форматирование с кортежем) и метод format.
name = 'Мир'
s = 'Привет, %s!' % name # Привет, Мир!
s2 = 'Привет, {}!'.format(name)Python максимальное целое число (максимальное целое число в python)
Типичная ошибка: попытка объединить строку с числом без преобразования вызывает TypeError. Решение: привести число к строке через str() или использовать f-строку.
age = 25
# print('Возраст: ' + age) # TypeError
print('Возраст: ' + str(age)) # Возраст: 25List values python (список значений словаря в python)
Как извлечь подстроку?
Основной способ - срезы (slicing) с помощью квадратных скобок и трёх параметров: start, stop, step.
s = 'Python programming'
sub = s[0:6] # 'Python'числа с плавающей запятой python (числа с плавающей запятой в python)
print(sub) # Python
является ли числом python (проверка, является ли значение числом в python)
Можно опускать start (по умолчанию 0), stop (по умолчанию длина строки) и step (по умолчанию 1). Отрицательные индексы отсчитывают от конца.
s = 'Hello'
print(s[1:]) # 'ello'
print(s[:3]) # 'Hel'
print(s[::2]) # 'Hlo'
print(s[::-1]) # 'olleH' (реверс)Python пустые значения (пустые значения в python)
Ошибка IndexError возникает при попытке доступа к одному символу по индексу за пределами строки. Срезы же не вызывают ошибку, а просто возвращают пустую строку.
s = 'abc'
print(s[5]) # IndexError: string index out of range
print(s[5:10]) # '' (пустая строка)оператор float python (оператор float в python)
Как изменить регистр символов?
Для преобразования регистра используются методы lower() и upper(). Это основной способ.
s = 'Python'
print(s.lower()) # python
print(s.upper()) # PYTHONтип данных словарь python (словарь (dict) в python)
Другие методы: capitalize (первая заглавная), title (каждое слово с заглавной), swapcase (смена регистра).
s = 'hello world'
print(s.capitalize()) # Hello world
print(s.title()) # Hello World
print(s.swapcase()) # HELLO WORLDстроковые значения python (строковые значения в python)
Важно: строки неизменяемы, поэтому эти методы возвращают новую строку, а не изменяют исходную. Забывать об этом - частая ошибка.
Как удалить лишние пробелы?
Метод strip() удаляет пробельные символы (пробелы, табуляции, переводы строки) с начала и конца строки.
s = ' Привет, мир! '
print(s.strip()) # 'Привет, мир!'Type 0 python (тип 0 в python)
Методы lstrip() и rstrip() удаляют пробелы только слева или справа. Можно передать строку с символами, которые нужно удалить.
s = '..Hello..'
print(s.strip('.')) # 'Hello'
print(s.lstrip('.')) # 'Hello..'
print(s.rstrip('.')) # '..Hello'функция bool python (функция bool в python)
Обратите внимание: эти методы не изменяют строку, а возвращают новую. Исходная строка остаётся прежней.
Как выполнить поиск и замену?
Для поиска подстроки используется метод find(), который возвращает индекс первого вхождения или -1, если подстрока не найдена. Для замены - replace().
s = 'Python - отличный язык'
print(s.find('отличный')) # 8
print(s.replace('отличный', 'превосходный')) # Python - превосходный языкS type python (тип s в python)
Метод index() аналогичен find, но вызывает ValueError при отсутствии. Метод count() считает количество вхождений.
s = 'abc abc abc'
print(s.count('abc')) # 3
print(s.index('abc')) # 0
# print(s.index('xyz')) # ValueErrorPython тип значения в ответе (тип значения в ответе python)
При использовании replace без указания третьего аргумента заменяются все вхождения. Для ограничения количества замен передают параметр count.
s = 'one one one'
print(s.replace('one', 'two', 2)) # two two oneтип элемента python (тип элемента в python)
Как проверить содержание подстроки?
Самый простой и быстрый способ - оператор in, возвращающий True или False.
s = 'Hello, World!'
print('World' in s) # True
print('Python' in s) # FalsePython type (функция type в python)
Методы startswith() и endswith() проверяют начало и конец строки соответственно.
s = 'image.jpg'
print(s.startswith('image')) # True
print(s.endswith('.jpg')) # TrueType code python (примеры кода с type в python)
Оператор in чувствителен к регистру. Для регистронезависимого поиска следует предварительно привести строки к одному регистру.
Как разбить строку на части и собрать обратно?
Метод split() разбивает строку по указанному разделителю и возвращает список. Метод join() склеивает список строк в одну строку с заданным разделителем.
s = 'apple,banana,cherry'
fruits = s.split(',') # ['apple', 'banana', 'cherry']
new_s = '; '.join(fruits) # 'apple; banana; cherry'Type d python (type(d) для словаря в python)
Метод rsplit() разбивает справа, а partition() делит строку на три части по первому вхождению разделителя и возвращает кортеж.
s = 'a,b,c,d'
print(s.rsplit(',', 1)) # ['a,b,c', 'd']
print(s.partition(',')) # ('a', ',', 'b,c,d')целое положительное число python (целое положительное число)
Если не указать разделитель, split() разбивает по произвольным пробельным символам и удаляет пустые строки. Это может привести к неожиданному поведению, если нужно строгое разбиение.
s = 'one two three'
print(s.split()) # ['one', 'two', 'three']
print(s.split(' ')) # ['one', '', '', 'two', '', '', 'three']Int python значения (целочисленные значения (int) в python)
Как работать с escape-последовательностями?
Для подавления экранирования обратной косой черты используются raw-строки (префикс r или R). Это основной способ при работе с регулярными выражениями или путями Windows.
raw_path = r'C:\Users\Name\Documents'
print(raw_path) # C:\Users\Name\Documentsчисловые значения python (числовые значения в python)
Без raw обратная косая черта интерпретируется как начало escape-последовательности, например \n, \t.
s = 'строка\nс новой строки'
print(s) # строка (перевод строки) с новой строкиPython объекты чисел (числовые объекты в python)
Частая ошибка - забыть экранировать обратную косую черту в обычной строке (например, путь 'C:\Users'). В raw-строках экранировать не нужно, но сама обратная косая черта остаётся символом, только не интерпретируется.
Как работать с Unicode и кодировками?
Для преобразования строки в байты используется метод encode(), обратно - decode(). По умолчанию применяется UTF-8.
s = 'Привет'
b = s.encode('utf-8') # b'\xd0\x9f\xd1\x80\xd0\xb8\xd0\xb2\xd0\xb5\xd1\x82'
s2 = b.decode('utf-8') # ПриветPython named type (именованный тип в python)
Функции ord() и chr() позволяют получить код символа Unicode и символ по коду.
print(ord('A')) # 65
print(chr(65)) # AStr string python (функция str и строковый тип в python)
Неправильная кодировка при попытке декодировать байты приводит к UnicodeDecodeError. Можно указать параметр errors='ignore' или 'replace'.
b = b'\xff\xfe'
print(b.decode('utf-8', errors='replace')) # ���
Как сравниваются строки?
Строки сравниваются лексикографически по кодам Unicode. Оператор == проверяет равенство значений, != - неравенство.
print('abc' == 'abc') # True
print('abc' < 'abd') # True, так как 'c' < 'd'
Операторы >, <=, >= также работают. Оператор is проверяет идентичность объектов, а не равенство значений, и его не следует использовать для сравнения строк.
a = 'hello'
b = 'hello'
print(a is b) # True (из-за интернирования, но не стоит полагаться)
c = 'hello world'
d = 'hello world'
print(c is d) # False (для длинных строк интернирование не всегда работает)
Использование is вместо == для сравнения строк может привести к неожиданному поведению, так как интерпретатор может не интернировать строки, полученные в результате операций.
Какие типичные ошибки возникают при работе со строками?
- Неизменяемость: методы строк не изменяют исходную строку, а возвращают новую. Забывая присвоить результат, разработчик может думать, что строка изменилась.
- Путаница с индексами: первый символ имеет индекс 0, а не 1. Срез s[0:5] включает символы с 0 по 4.
- Конкатенация строки и числа: забывают преобразовать число в строку через str().
- Кодировки: при чтении из файла или сети без указания кодировки можно получить искажённые символы.
- Экранирование: в регулярных выражениях и путях Windows часто забывают использовать raw-строки.
Расширенные примеры работы со строками
Ниже представлены примеры, демонстрирующие более глубокие возможности строковых операций.
Пример 1: Форматирование чисел с помощью f-строк
F-строки поддерживают спецификаторы форматирования, аналогичные методу format.
pi = 3.14159265
print(f'pi = {pi:.2f}') # pi = 3.14
print(f'pi = {pi:+010.3f}') # pi = +00003.142
pi = 3.14 pi = +00003.142
Пример 2: Использование maketrans и translate для сложной замены символов
Метод str.maketrans создаёт таблицу перевода, которая затем применяется через translate.
# Замена букв кириллицы на латиницу (упрощённо)
cyrillic = 'абвгдеёжзийклмнопрстуфхцчшщъыьэюя'
latin = 'abvgdeejzijklmnoprstufhc4sh6#y\'eu9a'
table = str.maketrans(cyrillic, latin)
text = 'привет мир'
print(text.translate(table)) # privet mir
privet mir
Пример 3: Метод splitlines для разбиения на строки
splitlines() разбивает строку по границам строк (\n, \r\n) и возвращает список строк. В отличие от split('\\n'), он корректно обрабатывает разные комбинации.
text = 'строка1\nстрока2\r\nстрока3'
print(text.splitlines()) # ['строка1', 'строка2', 'строка3']
['строка1', 'строка2', 'строка3']
Пример 4: Сравнение с использованием casefold для правильного сравнения букв немецкого языка
Метод casefold() более агрессивно приводит строку к нижнему регистру для корректного сравнения, учитывая особенности Unicode (например, ß -> ss).
s1 = 'straße'
s2 = 'STRASSE'
print(s1.lower() == s2.lower()) # False (неправильно)
print(s1.casefold() == s2.casefold()) # True
False True
Пример 5: Использование Template из string для безопасного форматирования
Модуль string предоставляет класс Template для форматирования с меньшим риском ошибок, чем format.
from string import Template
t = Template('Привет, $name! Тебе $age лет.')
print(t.substitute(name='Анна', age=25)) # Привет, Анна! Тебе 25 лет.
Привет, Анна! Тебе 25 лет.
Пример 6: Преобразование между str и bytes с разными кодировками и обработкой ошибок
При работе с внешними источниками данных часто требуется указать кодировку и решить, что делать с недопустимыми последовательностями.
s = 'Привет, мир!'
b = s.encode('cp1251')
print(b) # b'\xcf\xf0\xe8\xe2\xe5\xf2, \xec\xe8\xf0!'
print(b.decode('utf-8', errors='ignore')) # может потерять символы
b'\xcf\xf0\xe8\xe2\xe5\xf2, \xec\xe8\xf0!' (вывод может быть разным в зависимости от консоли)
Пример 7: Использование регулярных выражений для поиска и замены с функцией
re.sub позволяет передать функцию для замены, что даёт гибкость.
import re
text = 'Сегодня 10 градусов, завтра 15.'
def multiply(match):
number = int(match.group())
return str(number * 2)
result = re.sub(r'\d+', multiply, text)
print(result) # Сегодня 20 градусов, завтра 30.
Сегодня 20 градусов, завтра 30.
Пример 8: Строковые методы isalpha, isalnum, isspace на примерах
Эти методы полезны для проверки типа содержимого строки.
print('abc'.isalpha()) # True
print('abc123'.isalnum()) # True
print(' '.isspace()) # True
print('123'.isalpha()) # False
True True True False