str у Python - це незмінна послідовність кодових точок Unicode. Вони можуть містити літери, діакритичні знаки, позиційні символи, числа, символи валют, емодзі, розділові знаки, пробіли та символи розриву рядка тощо. Оскільки str незмінний, значення обʼєкта str у памʼяті не змінюється; методи, які нібито змінюють рядок тексту (англ. string), повертають нову копію або примірник цього обʼєкта str.
Літерал 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."
>>> escapes = 'If needed, a \'slash\' can be used as an escape character within a string when switching quote styles won\'t work.'
Багаторядкові рядки тексту оголошують за допомогою ''' або """.
>>> triple_quoted = '''Three single quotes or "double quotes" in a row allow for multi-line string literals.
Line break characters, tabs and other whitespace are fully supported.
You\'ll most often encounter these 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.
'''
Рядки тексту можна зʼєднувати за допомогою оператора +. Цей спосіб варто використовувати помірно, бо він не дуже продуктивний і його важко підтримувати.
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'
>>> 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]
>>> separator.join(upper_words)
'upper 🌟 uppercrust 🌟 uppercase 🌟 upperclassmen 🌟 uppermost 🌟 uppercut'
До кодових точок у 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 = '🌟🌟🌙🌟🌟⭐'
sun_and_moon = '🌞🌙🌞🌙🌞🌙🌞🌙🌞'
>>> moon_and_stars[1:4]
'🌟🌙🌟'
>>> moon_and_stars[:3]
'🌟🌟🌙'
>>> moon_and_stars[3:]
'🌟🌟⭐'
>>> moon_and_stars[:-1]
'🌟🌟🌙🌟🌟'
>>> moon_and_stars[:-3]
'🌟🌟🌙'
>>> sun_and_moon[::2]
'🌞🌞🌞🌞🌞'
>>> sun_and_moon[:-2:2]
'🌞🌞🌞🌞'
>>> sun_and_moon[1:-1:2]
'🌙🌙🌙🌙'
Рядки тексту також можна розбити на менші рядки за допомогою <str>.split(<separator>), який поверне list підрядків. Цей масив можна далі індексувати або розбивати за потреби. Якщо викликати <str>.split() без аргументів, рядок розбивається за пробільними символами.
>>> cat_ipsum = "Destroy house in 5 seconds mock the hooman."
>>> cat_ipsum.split()
...
['Destroy', 'house', 'in', '5', 'seconds', 'mock', 'the', 'hooman.']
>>> cat_ipsum.split()[-1]
'hooman.'
>>> cat_words = "feline, four-footed, ferocious, furry"
>>> cat_words.split(', ')
...
['feline', 'four-footed', 'ferocious', 'furry']
Роздільник для <str>.split() може містити більше ніж один символ.
Для розбиття використовується весь рядок тексту.
>>> colors = """red,
orange,
green,
purple,
yellow"""
>>> colors.split(',\n')
['red', 'orange', 'green', 'purple', 'yellow']
Рядки тексту підтримують усі типові операції над послідовностями.
Окремі кодові точки можна перебирати в циклі за допомогою for item in <str>.
Індекси разом з елементами можна перебирати в циклі за допомогою for index, item in enumerate(<str>).
>>> exercise = 'လေ့ကျင့်'
# Note that there are more code points than perceived glyphs or characters
>>> 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 : ့
Ми допомагаємо молодшій сестрі з її домашнім завданням з англійської лексики, яке їй здається дуже нудним. Її клас учиться утворювати нові слова, додаючи префікси та суфікси. Дано набір слів, і вчитель шукає правильно перетворені слова з правильним правописом, додаючи префікс на початок або суфікс у кінець.
Завдання складається з чотирьох вправ, кожна з яких має набір тексту або слів для роботи.
Серед найпоширеніших префіксів англійської мови є un, який означає «не».
У цій вправі сестрі потрібно утворити заперечні слова, тобто слова зі значенням «не», додаючи до них un.
Реалізуйте функцію add_prefix_un(<word>), яка приймає word як параметр і повертає нове слово з префіксом un:
>>> add_prefix_un("happy")
'unhappy'
>>> add_prefix_un("manageable")
'unmanageable'
Є ще чотири поширені префікси, які вивчає клас сестри:
en (що означає «вкласти в» або «накрити»),
pre (що означає «перед» або «вперед»),
auto (що означає «сам» або «той самий»),
та inter (що означає «між» або «серед»).
У цій вправі клас створює групи лексичних слів за допомогою цих префіксів, щоб вивчати їх разом. Кожен префікс подано в масиві з поширеними словами, з якими він уживається. Учням потрібно застосувати префікс і утворити рядок тексту (англ. string), який показує префікс, застосований до всіх слів.
Реалізуйте функцію make_word_groups(<vocab_words>), яка приймає vocab_words як параметр у такому вигляді:
[<prefix>, <word_1>, <word_2> .... <word_n>], і повертає рядок тексту з префіксом, застосованим до кожного слова, у такому вигляді:
'<prefix> :: <prefix><word_1> :: <prefix><word_2> :: <prefix><word_n>'.
Створювати цикл for або цикл while для обробки вхідних даних тут не потрібно.
Поміркуйте, які методи рядків (і роздільники) можна використати замість цього.
>>> make_word_groups(['en', 'close', 'joy', 'lighten'])
'en :: enclose :: enjoy :: enlighten'
>>> make_word_groups(['pre', 'serve', 'dispose', 'position'])
'pre :: preserve :: predispose :: preposition'
>> make_word_groups(['auto', 'didactic', 'graph', 'mate'])
'auto :: autodidactic :: autograph :: automate'
>>> make_word_groups(['inter', 'twine', 'connected', 'dependent'])
'inter :: intertwine :: interconnected :: interdependent'
ness - поширений суфікс, що означає «стан буття».
У цій вправі сестрі потрібно знайти початкове кореневе слово, прибравши суфікс ness.
Але, звісно, є прикрі правила правопису: якщо кореневе слово початково закінчувалося на приголосний, за яким ішла «y», то «y» змінювалася на «i».
Прибирання «ness» має відновлювати «y» в тих кореневих словах. Наприклад: happiness --> happi --> happy.
Реалізуйте функцію remove_suffix_ness(<word>), яка приймає word і повертає кореневе слово без суфікса ness.
>>> remove_suffix_ness("heaviness")
'heavy'
>>> remove_suffix_ness("sadness")
'sad'
Суфікси часто використовують, щоб змінити частину мови, до якої належить слово.
Поширена в англійській мові практика «verbing» або «verbifying», коли прикметник стає дієсловом за допомогою додавання суфікса en.
У цьому завданні сестра практикуватиме «verbing» слів, витягуючи прикметник із речення та перетворюючи його на дієслово. На щастя, усі слова, які тут потрібно перетворити, є «правильними»: їм не потрібні зміни в правописі, щоб додати суфікс.
Реалізуйте функцію adjective_to_verb(<sentence>, <index>), яка приймає два параметри.
sentence із використанням лексичного слова та index слова після розбиття цього речення.
Функція має повернути виділений прикметник як дієслово.
>>> adjective_to_verb('I need to make that bright.', -1 )
'brighten'
>>> adjective_to_verb('It got dark as the sun set.', 2)
'darken'
Зареєструйтеся на Exercism, щоб вивчати й опановувати Python, а також 17 концепцій146 вправ та справжнє наставництво від людей, і все це безкоштовно.