str у Python - це незмінна послідовність кодових точок Unicode. Вони можуть містити літери, діакритичні знаки, символи позиціонування, числа, символи валют, емодзі, розділові знаки, пробіли та символи розриву рядка тощо.
Щоб глибше зануритися в те, яку саме інформацію кодує рядок тексту (англ. string), або «як компʼютер знає, як перетворити нулі та одиниці на літери?», цей допис у блозі незмінно стане в пригоді.
Документація Python також містить дуже докладний посібник з Unicode, де розглядаються підтримка специфікації Unicode у модулях str, bytes і re, особливості локалей та деякі типові проблеми з кодуванням і перекладом.
Рядки тексту реалізують усі загальні операції з послідовностями, і їх можна перебирати за допомогою синтаксису for item in <str> або for index, item in enumerate(<str>).
До окремих кодових точок (рядків тексту довжиною 1) можна звертатися за 0-based index номером зліва або за -1-based index номером справа.
Рядки тексту можна зʼєднати за допомогою <str> + <other str> або <str>.join(<iterable>) і розбити за допомогою <str>.split(<separator>).
Вони також пропонують чимало додаткових можливостей для форматування, збирання та шаблонізації.
Рядковий літерал str можна оголосити за допомогою одинарних ' або подвійних " лапок. За потреби доступний символ екранування \.
>>> single_quoted = 'These allow "double quoting" without "escape" characters.'
>>> double_quoted = "These allow embedded 'single quoting', so you don't have to use an 'escape' character."
Багаторядкові рядки тексту оголошують за допомогою ''' або """.
>>> triple_quoted = '''Three single quotes or "double quotes" in a row allow for multi-line string literals.
Line break characters, tabs and other whitespace is fully supported. Remember - The escape "\" character is also available if needed (as can be seen below).
You\'ll most often encounter multi-line strings as "doc strings" or "doc tests" written just below the first line of a function or class definition.
They\'re often used with auto documentation ✍ tools.
'''
Конструктор str(<object>) можна використати, щоб створити рядки тексту з інших обʼєктів або привести їх до рядків:
>>> my_number = 42
>>> str(my_number)
...
"42"
Хоча конструктор str(<object>) і вміє приводити та перетворювати щось у рядок тексту, він не перебиратиме обʼєкт і не розпаковуватиме його.
Це відрізняється від поведінки конструкторів інших типів даних, як-от list(), set(), dict() чи tuple(), і може давати несподівані результати.
>>> numbers = [1,3,5,7]
>>> str(numbers)
...
'[1,3,5,7]'
До кодових точок усередині str можна звертатися за 0-based index номером зліва:
creative = '창의적인'
>>> creative[0]
'창'
>>> creative[2]
'적'
>>> creative[3]
'인'
Індексування також працює справа, починаючи з -1-based index:
creative = '창의적인'
>>> creative[-4]
'창'
>>> creative[-2]
'적'
>>> creative[-1]
'인'
У Python немає окремого типу «символ» чи «руна», тож індексування рядка тексту створює новий str довжиною 1:
>>> website = "exercism"
>>> type(website[0])
<class 'str'>
>>> len(website[0])
1
>>> website[0] == website[0:1] == 'e'
True
Підрядки можна виділяти за допомогою нотації зрізу, використовуючи <str>[<start>:<stop>:<step>], щоб отримати новий рядок тексту.
Результат не містить індекс stop.
Якщо start не вказано, початковим індексом буде 0.
Якщо stop не вказано, індексом stop буде кінець рядка тексту.
moon_and_stars = '🌟🌟🌙🌟🌟⭐'
>>> moon_and_stars[1:4]
'🌟🌙🌟'
>>> moon_and_stars[:3]
'🌟🌟🌙'
>>> moon_and_stars[3:]
'🌟🌟⭐'
>>> moon_and_stars[:-1]
'🌟🌟🌙🌟🌟'
>>> moon_and_stars[:-3]
'🌟🌟🌙'
Рядки тексту також можна розбити на менші рядки за допомогою <str>.split(<separator>), що поверне list підрядків.
Виклик <str>.split() без жодних аргументів розбиває рядок тексту за пробільними символами.
>>> cat_ipsum = "Destroy house in 5 seconds command the hooman."
>>> cat_ipsum.split()
...
['Destroy', 'house', 'in', '5', 'seconds', 'command', 'the', 'hooman.']
>>> cat_words = "feline, four-footed, ferocious, furry"
>>> cat_words.split(',')
...
['feline', ' four-footed', ' ferocious', ' furry']
>>> colors = """red,
orange,
green,
purple,
yellow"""
>>> colors.split(',\n')
['red', 'orange', 'green', 'purple', 'yellow']
Рядки тексту можна зʼєднати за допомогою оператора +.
Цей спосіб варто використовувати помірно, бо він не дуже продуктивний і його важко підтримувати.
language = "Ukrainian"
number = "nine"
word = "дев'ять"
sentence = word + " " + "means" + " " + number + " in " + language + "."
>>> print(sentence)
...
"дев'ять means nine in Ukrainian."
Якщо list, tuple, set чи іншу колекцію окремих рядків тексту потрібно поєднати в один str, кращий варіант - <str>.join(<iterable>):
# str.join() makes a new string from the iterables elements.
>>> chickens = ["hen", "egg", "rooster"] # Lists are iterable.
>>> ' '.join(chickens)
'hen egg rooster'
# Any string can be used as the joining element.
>>> ' :: '.join(chickens)
'hen :: egg :: rooster'
>>> ' 🌿 '.join(chickens)
'hen 🌿 egg 🌿 rooster'
# Any iterable can be used as input.
>>> flowers = ("rose", "daisy", "carnation") # Tuples are iterable.
>>> '*-*'.join(flowers)
'rose*-*daisy*-*carnation'
>>> flowers = {"rose", "daisy", "carnation"} # Sets are iterable, but output order is not guaranteed.
>>> '*-*'.join(flowers)
'rose*-*carnation*-*daisy'
>>> phrase = "This is my string" # Strings are iterable, but be careful!
>>> '..'.join(phrase)
'T..h..i..s.. ..i..s.. ..m..y.. ..s..t..r..i..n..g'
# Separators are inserted **between** elements, but can be any string (including spaces).
# This can be exploited for interesting effects.
>>> under_words = ['under', 'current', 'sea', 'pin', 'dog', 'lay']
>>> separator = ' ⤴️ under' # Note the leading space, but no trailing space.
>>> separator.join(under_words)
'under ⤴️ undercurrent ⤴️ undersea ⤴️ underpin ⤴️ underdog ⤴️ underlay'
# The separator can be composed different ways, as long as the result is a string.
>>> upper_words = ['upper', 'crust', 'case', 'classmen', 'most', 'cut']
>>> separator = ' 🌟 ' + upper_words[0] # This becomes one string, similar to ' ⤴️ under'.
>>> separator.join(upper_words)
'upper 🌟 uppercrust 🌟 uppercase 🌟 upperclassmen 🌟 uppermost 🌟 uppercut'
Рядки тексту підтримують усі загальні операції з послідовностями.
Окремі кодові точки можна перебирати в циклі за допомогою for item in <str>.
Індекси разом з елементами можна перебирати в циклі за допомогою for index, item in enumerate(<str>).
>>> exercise = 'လေ့ကျင့်'
# Note that there are more code points than perceived glyphs or characters.
# Care should be used when iterating over languages that use
# combining characters, or when dealing with emoji.
>>> for code_point in exercise:
... print(code_point)
...
လ
ေ
့
က
ျ
င
်
့
# Using enumerate will give both the value and index position of each element.
>>> for index, code_point in enumerate(exercise):
... print(index, ": ", code_point)
...
0 : လ
1 : ေ
2 : ့
3 : က
4 : ျ
5 : င
6 : ်
7 : ့
Python пропонує багатий набір методів рядків, які допомагають шукати, очищати, розбивати, перетворювати, перекладати та виконувати багато інших операцій. Деякі з цих методів розглядаються в іншій вправі.
Python також пропонує багатий набір інструментів для форматування і шаблонізації рядків тексту, а також складнішу обробку тексту за допомогою модулів re (регулярні вирази), difflib (порівняння послідовностей) і textwrap. Чудовий вступ до форматування рядків у Python є в цьому дописі на Real Python. А вступ до методів рядків є в статті Рядки та символьні дані в Python на тому ж сайті.
Окрім str (текстової послідовності), Python має відповідні типи бінарних послідовностей, зведені в розділі служб роботи з бінарними даними: bytes (бінарна послідовність), bytearray і memoryview для ефективного зберігання та опрацювання бінарних даних.
Крім того, потоки дозволяють надсилати й отримувати бінарні дані через мережеве зʼєднання без використання зворотних викликів.