Перейти до змісту

Символьні рядки

Символьнлий рядок — немутабельна послідовність кодів символів Юнікод.

Символьні рядки представлені класом str.

Створюються символьні рядки за допомогою літералів "лапки" або "апостроф". Сусідні літерали склеюються:

>>> s = 'This is '  "a long" 'string'
>>> s
'This is a longstring'
>>>

Символи Юнікод можна задавати вказуючи їх код у шістнадцятковій системі числення після префікса \u:

>>> s='\u0457'
>>> s
'ї'
>>>

Також можна вказати назву символа в стандарті Юнікод:

>>> s='\N{GRINNING FACE}'
>>> print(s)
😀
>>> print('\N{BLACK CHESS PAWN}')

>>>

Робота з окремими символами

Python не надає нам окремого типу даних для окремого символа. Якщо нам необхідно виконувати певні операції з символами, ми використовуємо символьні рядки довжиною 1. В Python є дві функції для роботи з символами:

  • chr(code) — повертає символ з кодом code
  • ord(ch) — повертає код символа ch

Приклади:

>>> ord('ї')
1111
>>> chr(1111)
'ї'
>>> ord('abc')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: ord() expected a character, but string of length 3 found
>>>

Кодування символьних рядків

Щоб закодувати символьний рядок використовуючи певну кодову таблицю використовують метод:

encode(encoding='UTF-8',errors='strict')

Параметр encoding — це назва кодової таблиці, за замовчуванням зазвичай UTF-8.

Параметр errors вказує, що робити якщо у процесі кодування відбуваються помилки. Значення за замовчуванням — strict — означає, що у випадку виникнення помилки буде піднято виняток UnicodeError.

Метод повертає об'єкт класа bytes — послідовність окремих байт.

>>> 'abc'.encode()
b'abc'
>>> 'Вітаю'.encode()
b'\xd0\x92\xd1\x96\xd1\x82\xd0\xb0\xd1\x8e'
>>> 'Вітаю'.encode('cp1251')
b'\xc2\xb3\xf2\xe0\xfe'
>>>

Форматування рядків

Метод str.format() дозволяє виконувати підстановку змінних, форматувати значення і об'єднувати елементы в один рядок шляхом позиційного форматування. Використовуючи форматування рядків код програми стає більш читабельним.

Заголовок метода:

 str.format(*args, **kwargs)

Тут, як зовсім не важко здогадатись, args — позиційні аргументи, і kwargs — відповідно іменовані.

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

Тобто метод повертає копію символьного рядка, у якому плейсхолдери замінено текстовими значениями з відповідних аргументів.

Декілька прикладів рядка з плейсхолдером:

'This is a string with {placeholder}' # один плейсхолдер
'{}+{}={}' # три плейсхолдера
'String contains {{}}' # якщо треба включити фігурні дужки, їх подвоюють

Плейсхолдер може включати в себе:

  • наіменування — необов'язково
  • приведення — необов'язково, починається з символа "!", розташовується за іменуванням
  • формат — необов'язково, починається з символа ":", розташовується за приведенням

Наіменування

Наіменування являє собою ім'я або індекс. Ім'я вказує на відповідний іменований аргумент функції format. При цьому плейсхолдери з однаковим іменем можна використовувати декілька раз:

>>> 'Hello {name}'.format(name='Kitty')
'Hello Kitty'
>>> 'Hello {name}, bye {name}'.format(name='Kitty')
'Hello Kitty, bye Kitty'
>>>

У вищенаведеному прикладі плейсхолдер з іменем name відповідає іменованому аргументу name функції format.

У наіменуванні замість імені можна вказати індекс. У такому разі індекс буде вказувати на відповідний позиційний аргумент функції format:

>>> 'I have {0} and {1}'.format('an apple', 'a plum')
'I have an apple and a plum'
>>> 'I have {1} and {0}'.format('an apple', 'a plum')
'I have a plum and an apple'
>>>

Вказувати можна тільки "реальні" індекси:

>>> 'I have {0} and {2}'.format('an apple', 'a plum')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: tuple index out of range
>>>

Якщо індекси складають послідовність (0, 1, 2...), тобто йдуть підряд, то їх (індекси) може бути пропущено усі разом, але не вибірково:

>>> '{}+{}={}'.format(2,3,2+3)
'2+3=5'
>>>

Часом у функцію format зручно передавати позиційні та іменовані аргументи "розпаковуючи" відповідно кортежі та словники:

>>> values=[1, 2, 3]
>>> '{}-{}-{}'.format(*values)
'1-2-3'
>>> values=range(2,5)
>>> '{}-{}-{}'.format(*values)
'2-3-4'
>>> '{}-{}-{}'.format(*range(3))
'0-1-2'
>>>
>>> '{one}-{two}-{three}'.format(**{'two': 2, 'one': 1, 'three': 3})
'1-2-3'
>>>

В наіменуванні також можна дістатись до певного елемента контейнера вказавши індекс у квадратних дужках (викликається магічний метод __getitem__):

>>> l=['abc','def']
>>> '{0[0]}'.format(l)
'abc'
>>> '{0[0][1]}'.format(l)
'b'
>>> '{some_list[0][1]}'.format(some_list=l)
'b'
>>> '{[0][1]}'.format(l)
'b'
>>>

Також можна вказати атрибут об'єкта через символ ".". Буде задіяно getattr():

>>> class Temp:
...     attr = 'some attribute'
...
>>> obj = Temp()
>>> 'Object with {.attr}'.format(obj)
'Object with some attribute'
>>>

Приведення

За замовчуванням відформатоване значення повертає метод __format__(). Але бувають випадки, коли необхідно виконати примусове приведення, наприклад, до символьного рядка.

Підтримується 3 додаткові приведення:

значення функція
!s str()
!r repr()
!a ascii()

Приклад:

class Temp:
    def __str__(self):
        return 'str method'
    def __repr__(self):
        return 'repr method'
    def __format__(self, format_spec):
        return 'format method'

obj = Temp()
print('{}'.format(obj))
print('{!s}'.format(obj))
print('{!r}'.format(obj))

Результат виконання буде наступним:

format method
str method
repr method
>>>

Формат

Формат визначає, як саме має бути представлено значення, включаючи інформацію про довжину, вирівнювання, додаток до рядка, точність для чисел, інше. Кожен тип може мати свою міні-мову форматування. Більшість вбудованих в Python типів використовують загальну міні-мову.

Специфікація формата виглядає так:

<заповнювач> <вирівнювання> <знак> # 0 <ширина> , .<точність> <тип>

Усі складові є необов'язковими. Ось їх значення:

  • заповнювач — символ, крім "{" або "}"
  • вирівнювання — один з символів "<", ">", "=", "^"
  • знак — один з символів "+", "-", " "
  • ширина — ціле число
  • точність — ціле число
  • тип — один з символів "b", "c", "d", "e", "E", "f", "F", "g", "G", "n", "o", "s", "x", "X", "%"

Вирівнювання відбуваються за допомогою заповнювача. Можливі наступні варіанти вирівнювання:

символ значення
< символ-заповнювач буде праворуч (вирівнювання об'єкта по лівому краю), за замовчуванням
> вирівнювання об'єкта по правому краю
= заповнювач буде після знака, але перед цифрами (тільки для числових типів)
^ вирівнювання по центру

<Знак> може приймати наступні значення:

символ значення
+ знак буде присутнім для усіх чисел
- мінус для від'ємних, нічого для додатніх
<пробіл> мінус для від'ємних, пробіл для додатніх

Складова <тип> може приймати наступні значення:

символ значення
d, i, u десяткове число
o число у вісімковій системі численння
x число у шістнадцятковій системі числення, букви у нижньому регістрі
X число у шістнадцятковій системі числення, букви у верхньому регістрі
e дійсне число у експоненціальній формі, знак експоненти у нижньому регістрі
E дійсне число у експоненціальній формі, знак експоненти у верхньому регістрі
f, F дійсне число, звичайний формат
c символ (рядок з одного символа) або код символа
s символьний рядок
% дійсне число помножене на 100, знак процента за ним

Декілька прикладів:

>>> 'start {:>30} end'.format('right aligned')
'start                  right aligned end'
>>> 'start {:^30} end'.format('centered')
'start            centered            end'
>>> 'start{:*^30}end'.format('centered')  # зірочка як заповнювач
'start***********centered***********end'
>>> '{:+f}; {:+f}'.format(3.14, -3.14)  # знак числа присутній завжди
'+3.140000; -3.140000'
>>> '{: f}; {: f}'.format(3.14, -3.14)  # пробіл для додатніх замість мінуса
' 3.140000; -3.140000'
>>> "int: {0:d};  hex: {0:x};  oct: {0:o};  bin: {0:b}".format(42)
'int: 42;  hex: 2a;  oct: 52;  bin: 101010'
>>> '{:.2%}'.format(.987654321)
'98.77%'
>>>

Додаткові матеріали:


Back to top