Текстовые строки: синтаксис и методы

Раздел: Типы данных -> Строковые данные

Строки (тип str) являются одним из фундаментальных типов данных в Python. Они представляют неизменяемую последовательность символов Unicode. Это означает, что после создания строку нельзя изменить: любая операция, изменяющая строку, создает новый объект. Строки широко используются для хранения и обработки текстовой информации.

Эффективное форматирование строк

Как создать строку с подстановкой переменных современным способом?

Наиболее эффективный и читаемый способ форматирования строк в Python - это f-строки (f-strings), введенные в версии 3.6. Они позволяют встраивать выражения внутрь строкового литерала, используя синтаксис f"... {выражение} ...".

name = 'Анна'
age = 30
message = f'Привет, {name}! Тебе {age} лет.'
print(message)
  

строки в языке python (строки в языке python)

Привет, Анна! Тебе 30 лет.
  

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

a = 5
b = 3
result = f'Сумма {a} и {b} равна {a + b}.'
print(result)
  
Сумма 5 и 3 равна 8.
  

Типичные ошибки:

  • Забыли префикс f перед строкой - тогда фигурные скобки останутся как текст.
  • Для вывода символа фигурной скобки применяются двойные скобки: {{ и }}.
value = 100
text = f'Значение: {{value}} равно {value}'
print(text)
    
Значение: {value} равно 100
    

Цель: Современное, быстрое и читаемое форматирование с возможностью встраивания вычислений. Рекомендуется для всех задач, где требуется подстановка значений.

Как отформатировать строку без f-строк, используя оператор %?

Оператор % - способ форматирования, заимствованный из языка C. Он подставляет значения в строку по шаблону, где спецификаторы типа начинаются с %, например %s для строки, %d для целого числа.

name = 'Иван'
age = 25
text = 'Меня зовут %s, мне %d лет.' % (name, age)
print(text)
  
Меня зовут Иван, мне 25 лет.
  

Можно использовать словарь для именованных подстановок.

data = {'name': 'Ольга', 'age': 22}
text = 'Имя: %(name)s, возраст: %(age)d' % data
print(text)
  
Имя: Ольга, возраст: 22
  

Возможные проблемы:

  • Несоответствие типа спецификатора и значения: %s принимает любой тип, но %d требует целое число. Ошибка TypeError при несовместимости.
  • Меньшая читаемость при большом количестве аргументов.

Цель: Обратная совместимость с кодом на Python 2 или использование в библиотеках логирования, где этот стиль остается популярным.

Как использовать метод format() для гибкого форматирования?

Метод str.format() предлагает более мощный и расширяемый синтаксис. Позиционные и именованные аргументы, спецификация выравнивания, числовые форматы.

name = 'Максим'
age = 28
text = 'Привет, {}. Тебе {} лет.'.format(name, age)
print(text)
  
Привет, Максим. Тебе 28 лет.
  

С именованными аргументами:

text = 'Привет, {n}. Тебе {a} лет.'.format(n=name, a=age)
print(text)
  
Привет, Максим. Тебе 28 лет.
  

Поддержка форматирования чисел с фиксированной точностью:

pi = 3.14159265
print('Число π: {:.2f}'.format(pi))
  
Число π: 3.14
  

Типичные ошибки:

  • Количество аргументов не совпадает с количеством плейсхолдеров - IndexError.
  • Неправильный спецификатор формата (например, :d для строки) вызывает ValueError.

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

Как объединить строки через конкатенацию и метод join?

Простейший способ - оператор +. Однако при объединении многих строк в цикле это неэффективно из-за создания множества промежуточных строк.

words = ['Python', 'строка', 'объединение']
result = ''
for w in words:
    result += w + ' '
print(result.strip())
  
Python строка объединение
  

Лучший способ - метод str.join(), который принимает итерируемый объект и вставляет разделитель между элементами.

words = ['Python', 'строка', 'объединение']
result = ' '.join(words)
print(result)
  
Python строка объединение
  

Ошибки:

  • При использовании join элементы должны быть строками. Если в списке есть числа, потребуется преобразование: ", ".join(str(x) for x in list).
  • Соединение пустой строки с разделителем даёт пустую строку, что иногда неожиданно.

Цель: join - наиболее эффективный способ объединения большого количества строк. Конкатенация уместна только для 2-3 частей.

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

Ниже приведены примеры различных операций и методов, которые расширяют возможности работы со строками.

Срезы строк

Срезы позволяют извлекать подстроки. Синтаксис: str[start:stop:step].

text = 'Программирование'
print(text[0:5])      # первые 5 символов
print(text[-6:])      # последние 6
print(text[::-1])     # обратный порядок
print(text[::2])      # каждый второй символ
Програм
ование
еинавориммаргоП
Пораиоае

Методы изменения регистра

s = 'Привет Мир'
print(s.lower())
print(s.upper())
print(s.title())
print(s.swapcase())
привет мир
ПРИВЕТ МИР
Привет Мир
пРИВЕТ мИР

Проверка свойств символов

s = 'abc123'
print(s.isalpha())    # есть ли только буквы
print(s.isdigit())    # только цифры
print(s.isalnum())    # буквы и цифры
print(s.isspace())    # пробельные символы
False
False
True
False

Поиск и замена

s = 'один два один три'
print(s.find('один'))        # первое вхождение
print(s.rfind('один'))       # последнее
print(s.replace('один', 'раз', 1))  # замена одного вхождения
print(s.count('один'))
0
10
раз два один три
2

Удаление пробелов и разделение

s = '  пробелы  вокруг  '
print(repr(s.strip()))
print(repr(s.lstrip()))
print(repr(s.rstrip()))
words = 'яблоко,груша,вишня'.split(',')
print(words)
'пробелы  вокруг'
'пробелы  вокруг  '
'  пробелы  вокруг'
['яблоко', 'груша', 'вишня']

Многострочные и сырые строки

multiline = '''Первая строка
Вторая строка
Третья'''
print(multiline)
raw_path = r'C:\Users\name\new_folder'
print(raw_path)
Первая строка
Вторая строка
Третья
C:\Users\name\new_folder

Кодировка и декодировка

text = 'Привет, мир!'
utf8_bytes = text.encode('utf-8')
print(utf8_bytes)
decoded = utf8_bytes.decode('utf-8')
print(decoded)
b'\xd0\x9f\xd1\x80\xd0\xb8\xd0\xb2\xd0\xb5\xd1\x82, \xd0\xbc\xd0\xb8\xd1\x80!'
Привет, мир!

Форматирование чисел с помощью f-строк

value = 123.456789
print(f'Цена: {value:.2f} руб.')
print(f'Курс: {value:+.2f}')
print(f'Процент: {value:.1%}')
Цена: 123.46 руб.
Курс: +123.46
Процент: 12345.7%

Выравнивание текста

name = 'Python'
print(f'|{name:<10}|')
print(f'|{name:>10}|')
print(f'|{name:^10}|')
|Python    |
|    Python|
|  Python  |

Использование translate для замены символов

trans_table = str.maketrans('abc', '123')
s = 'a b c'
print(s.translate(trans_table))
1 2 3

Работа с Unicode и эмодзи

emoji = '??'
print(len(emoji))        # длина в символах (не байтах)
print(emoji[0])          # первый символ
print(emoji.encode('unicode-escape'))
2
?
b'\\U0001f60a\\U0001f44d'

Интернирование строк и сравнение

a = 'hello'
b = 'hello'
print(a is b)   # обычно True из-за интернирования коротких строк
c = 'hello ' + 'world'
d = 'hello world'
print(c is d)   # может быть False, строки разные объекты
print(c == d)   # True
True
False
True

Динамическое формирование имени атрибута через getattr

class Person:
    name = 'Анна'
    age = 30
p = Person()
attr = 'age'
print(f'Возраст: {getattr(p, attr)}')
Возраст: 30

Создание строки из байтов с указанием кодировки

byte_data = b'\xd0\x9f\xd1\x80\xd0\xb8\xd0\xb2\xd0\xb5\xd1\x82'
text = byte_data.decode('utf-8')
print(text)
Привет

Строки в языке Python - comments

En
строки в языке python (python)