2.5. Рядкові методи та форматування

Рядки мають вбудований набір методів для перевірки та перетворення. Оскільки рядки незмінні, кожен метод повертає новий рядок – оригінал залишається незмінним.

2.5.1. Перевірка рядків

  • str.startswith() / str.endswith() – перевірка префікса або суфікса; повертає bool.

  • str.find() – позиція першого входження підрядка або -1, якщо він відсутній. str.index() робить те саме, але викидає ValueError у разі відсутності.

  • str.count() – кількість неперекриваючихся входжень.

  • Ключове слово in"MV" in name повертає True, якщо підрядок присутній де-небудь у рядку.

>>> name = "OpenMV Cam"
>>> name.startswith("Open")
True
>>> name.find("MV")
4
>>> name.count("m")
1
>>> "Cam" in name
True

2.5.2. Очищення та регістр

  • str.strip() – видалення початкових і кінцевих пробілів. Передайте рядок символів, щоб видалити власний набір (s.strip("/")).

  • str.lower() / str.upper() – перетворення регістру.

  • str.replace() – заміна підрядка.

>>> "  hello  ".strip()
'hello'
>>> "abc-123".replace("-", "_")
'abc_123'
>>> "OpenMV".lower()
'openmv'

2.5.3. Розбиття та об’єднання

  • str.split() – розбити рядок на список при кожному входженні роздільника (за замовчуванням: будь-яка послідовність пробілів).

  • str.join() – обернена операція: з’єднати послідовність рядків разом, використовуючи отримувач як роздільник. Це ефективний спосіб побудувати довгий рядок із частин.

>>> "1,2,3".split(",")
['1', '2', '3']
>>> "hello world".split()
['hello', 'world']
>>> ", ".join(["a", "b", "c"])
'a, b, c'

2.5.4. f-рядки

Найпростіший спосіб підставляти значення в рядок – це f-рядок – рядковий літерал із префіксом f. Будь-який вираз всередині {} обчислюється та вставляється:

>>> name = "OpenMV"
>>> count = 42
>>> f"{name} saw {count} blobs"
'OpenMV saw 42 blobs'

Двокрапка всередині фігурних дужок вводить специфікацію формату, яка контролює відображення значення:

  • {x:.2f} – число з плаваючою крапкою з 2 знаками після десяткової коми.

  • {x:>10} – вирівнювання по правому краю в полі шириною 10 символів.

  • {x:<10} – вирівнювання по лівому краю.

  • {x:0>4} – доповнення ведучими нулями до ширини 4.

  • {x:#x} – шістнадцяткове представлення з префіксом 0x.

  • {x:b} – двійкове представлення.

>>> f"pi is roughly {3.14159:.3f}"
'pi is roughly 3.142'
>>> f"reg = {0xAB:#x}"
'reg = 0xab'
>>> for i in range(3):
...     print(f"line {i:0>3}")
line 000
line 001
line 002

Одинарне = після назви виразу виводить і назву, і значення – зручно для швидкого налагодження:

>>> v = 3.14
>>> print(f"{v=}")
v=3.14

2.5.4.1. Перетворення цілих чисел за основою

Три вбудовані функції виконують ту саму роботу, що й специфікації формату :b / :o / :x, але повертають перетворений рядок безпосередньо:

  • bin() – основа 2, з префіксом "0b".

  • oct() – основа 8, з префіксом "0o".

  • hex() – основа 16, з префіксом "0x".

>>> hex(255)
'0xff'
>>> bin(10)
'0b1010'
>>> oct(8)
'0o10'

Зворотний напрямок – перетворення рядка в основі N назад у ціле число – використовує конструктор int із явною основою:

>>> int("ff", 16)
255
>>> int("0b1010", 2)         # the "0b" prefix is allowed
10

Використовуйте ці функції, коли потрібен сирий рядок для цілого числа (для рядка журналу, файлу конфігурації, дампу регістра). Використовуйте специфікацію формату, коли потрібне доповнення, ширина або поєднання значення з іншим текстом в одному f-рядку.

2.5.5. Старіші стилі форматування

f-рядки – рекомендований стиль, але два старіші підходи досі працюють і зустрічаються в наявному коді:

str.format() – фігурні дужки з позиційними або ключовими аргументами, переданими методу .format() рядка-шаблону:

>>> "Hello, {}".format(name)
'Hello, OpenMV'
>>> "{0} + {0} = {1}".format(2, 4)
'2 + 2 = 4'
>>> "{name}: {value}".format(name="frames", value=42)
'frames: 42'

Специфікації формату ({:.2f}, {:>10}, …) працюють так само, як і в f-рядках; єдина різниця – де надається значення.

Форматування % (стиль printf) – один оператор % підставляє значення в коди формату, одне значення на код. Передайте кілька значень як кортеж:

>>> "Hello, %s" % name
'Hello, OpenMV'
>>> "%d + %d = %d" % (2, 2, 4)
'2 + 2 = 4'
>>> "%.2f" % 3.14159
'3.14'

Найпоширеніші коди типів: %s (рядок), %d (ціле число), %f (число з плаваючою крапкою) та %x (шістнадцяткове).

Кожен код % може мати модифікатори між % і буквою типу. Повна форма: %[flags][width][.precision]type:

  • width (ширина) – мінімальна кількість символів поля. Коротші значення доповнюються пробілами; довші переповнюють поле. %10d резервує 10 символів і вирівнює число по правому краю.

  • precision (точність) – значення залежить від типу. Для чисел з плаваючою крапкою – кількість знаків після десяткової коми. %.2f дає два знаки після коми. Для рядків – максимальна кількість символів (%.5s обрізає до п’яти).

  • Left-align (вирівнювання по лівому краю) – прапор - розміщує поле зліва. %-10d розміщує цифри з лівого боку з пробілами в кінці.

  • Zero pad (доповнення нулями) – прапор 0 доповнює ведучими нулями замість пробілів (для числових типів). %05d доповнює нулями до п’яти цифр.

  • Sign (знак) – прапор + завжди показує знак числа, включаючи + для позитивних.

  • Alternate form (альтернативна форма) – прапор #. Для %x додає до виводу префікс 0x; для %o – префікс 0o.

Прапори, ширину та точність можна комбінувати:

>>> "%10d" % 42
'        42'                 # width 10, space-padded, right-aligned
>>> "%-10d|" % 42
'42        |'                # width 10, left-aligned
>>> "%05d" % 42
'00042'                      # width 5, zero-padded
>>> "%8.2f" % 3.14159
'    3.14'                   # width 8, 2 decimal places
>>> "%08.2f" % 3.14159
'00003.14'                   # width 8, zero-padded
>>> "%+d" % 42
'+42'                        # explicit sign
>>> "%#06x" % 0xAB
'0x00ab'                     # 0x prefix, zero-pad to 6 chars total

Обидва старіші стилі повільніше читаються й більш схильні до помилок, ніж f-рядки – використовуйте f-рядки в новому коді, а старіші форми розпізнавайте під час читання наявного коду.