День 1 Летней школы Julia 2025
Строки
Строки в Julia это конечные последовательности символов.
Мы уже видели с вами, что Julia обладает высокой гибкостью в определении, что такое символы (Char). Но мы не будем погружаться слишком глубоко, а лишь познакомимся с основными принципами и идеями работы со строками.
Для этого создадим строку str_en. В ней "Hello, world" это последовательность символов.
str_en = "Hello, world"
Используя индексацию в виде квадратных скобок, выведем первые 6 элементов строки.
str_en[1:6]
str_en[1] = "f"
str_en[1:5] = "hello"
Символы
Перед тем, как говорить о том, что такое символы, давайте создадим строку на русском языке и обратимся к первому элементу.
И уже на этапе использования кириллических русских букв, столкнёмся со следующей проблемой
str_ru = "Строка текста состоит из русских букв."
Обратившись по индексу 1 получаем ожидаемый результат.
s[1]
Но обратившись по индексу 2 у нас уже возникает ошибка.
s[2]
Как раз на этом моменте стоит начать разбираться, что же такое символ и сколько места он занимает.
Если мы захотим узнать, какой тип у символа а в двойных ковычках - то получим результат - строка.
typeof("a")
Если же мы передадим а в одинарных кавычках, то ответом будет Char - специальный тип для символов.
typeof('a')
Обратите внимание, что размер символов в Julia - 4 байта.
sizeof('s')
И это верно как для английских букв, так и для русских
sizeof('ё')
Но ситуация становится интереснее, когда мы захотим узнать размер строки строки из английских символов. И строки из русских символов.
sizeof("cat")
sizeof("кот")
Видно, что разница составляет 2 раза. Это связано с тем, что английские буквы можно представить в виде ASCII-символов, хранящихся в таблицы из 128 элементов, то есть для их хранения нужен 1 байт.
Русские же буквы находятся в диапазоне от 128 до 65 тысяч. Поэтому для их хранения нужно 2 байта. А для хранения, например эмодзи - все 4 байта.
sizeof("🐱")
Поэтому индексация происходила некорректно. Поскольку строка в Julia это не массив, а специальный тип данных, отличный от массива. И для итерации по элементам применяются другие способы, которые мы рассмотрим позже.
Также стоит упомянуть о функции isdigit, которая показывает, является ли символ цифрой. И isletter, которая показывает, является ли символ буквой.
isdigit('a')
isletter('2')
Специальные символы
Перейдём теперь к специальным символам. Так, например, если мы напишем стих, то в нём будет присутствовать символ переноса строки, который можно прописать явно, указав \n
"Я пришёл к тебе с приветом
Рассказать, что солнце встало"
Также может возникнуть проблема при написании кавычек внутри кавычек.
Для избежания этой проблемы можно выполнить экранирование кавычек - то есть вставить обратный слеш перед ними.
print("ООО \"Моя оборона\"")
Или же можно воспользоваться тройными кавычками и писать внутри них так, как ожидаем увидеть результат при выводе.
print(""" ООО "Рога и копыта" """)
Конкатенация строк
Теперь обсудим конкатенацию строк - их последовательное соединение и получение в результате одной, общей строки.
formal = "Здравствуйте, "
informal = "Привет, "
name = "Илья"
patronymic = "Андреевич"
Для конкатенации можно воспользоваться функцией string, и через запятую указать строки,в том порядке, в котором мы хотим их сконкатенировать
формально = string(formal,name, " ", patronymic)
Также конкатенация возможно с помощью символа умножения. Обратите внимание, что знак плюс здесь не подойдёт.
неформально = informal * name
И если мы хотим повторить строку 3 раза, то мы не умножаем её на 3, а возводим в третью степень.
print("Давай! "^3, "Урааа!")
Забегая вперёд скажем, что если у нас есть вектор строк, то сконкатенировать их можно при помощи функции join
дружески = join([informal,patronymic])
Интерполяция
Интерполяция позволяет подставлять не символ переменной, а хранящееся в ней значение. Для того чтобы подставить одну переменную - достаточно указать знак доллара и после него указать переменную. Если же мы хотим вывести результат выражения, то необходимо это выражение поместить в скобки.
r = 2
print("Длина окружности радиуса $r равна $(2π*r)")
Работа со строками
Теперь обсудим работу со строками.
Строки можно сравнивать. Их сравнение происходит в лексикографическом порядке.
"ABCD" < "ABDC"
Также можно находить индексы первого и последнего вхождения символа в строку. В случае, если символ не содержится в строке, возвращается значение nothing.
w = "polymorphism"
findfirst('o',w) |> println
findlast('o',w) |> println
findfirst('z',w) == nothing
Помимо символа можно отыскивать вхождения подстроки в строке. Для этого можно воспользоваться функцией occursin.
occursin("end", "girlfriend")
occursin("end", "Garfield")