Символьні рядки
Символьнлий рядок — немутабельна послідовність кодів символів Юнікод.
Символьні рядки представлені класом 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%'
>>>