# Строки --- ## Сами строки ---- Строка представляет последовательность символов в кодировке Unicode, заключенных в кавычки. Причем для определения строк Python позволяет использовать как одинарные, так и двойные кавычики: ``` message = "Hello World!" print(message) # Hello World! name = 'Tom' print(name) # Tom ``` ---- Если строка длинная, ее можно разбить на части и разместить их на разных строках кода. В этом случае вся строка заключается в круглые скобки, а ее отдельные части - в кавычки: ``` text = ("Laudate omnes gentes laudate " "Magnificat in secula ") print(text) ``` ---- Если же мы хотим определить многострочный текст, то такой текст заключается в тройные двойные или одинарные кавычки: ``` ''' Это комментарий ''' text = '''Laudate omnes gentes laudate Magnificat in secula Et anima mea laudate Magnificat in secula ''' print(text) ``` При использовани тройных одинарных кавычек не стоит путать их с комментариями: если текст в тройных одинарных кавычках присваивается переменной, то это строка, а не комментарий. ---- Строка может содержать ряд специальных символов - управляющих последовательностей или escape-последовательности. Некоторые из них: * \\: позволяет добавить внутрь строки слеш * \\': позволяет добавить внутрь строки одинарную кавычку * \\": позволяет добавить внутрь строки двойную кавычку * \n: осуществляет переход на новую строку * \t: добавляет табуляцию (4 отступа) ---- Используем некоторые последовательностей: ``` text = "Message:\n\"Hello World\"" print(text) ``` ---- Хотя подобные последовательности могут нам помочь в некоторых делах, например, поместить в строку кавычку, сделать табуляцию, перенос на другую строку. Но они также могут и мешать. Например: ``` path = "C:\python\name.txt" print(path) ``` ---- Здесь переменная path содержит некоторый путь к файлу. Однако внутри строки встречаются символы "\n", которые будут интерпретированы как управляющая последовательность. Так, мы получим следующий консольный вывод: ``` path = r"C:\python\name.txt" print(path) ``` --- ## Операции над строками ---- И мы можем обратиться к отдельным символам строки по индексу в квадратных скобках: ``` string = "hello world" c0 = string[0] print(c0) c6 = string[6] print(c6) c11 = string[11] print(c11) ``` ---- Индексация начинается с нуля, поэтому первый символ строки будет иметь индекс 0. А если мы попытаемся обратиться к индексу, которого нет в строке, то мы получим исключение IndexError. Например, в случае выше длина строки 11 символов, поэтому ее символы будут иметь индексы от 0 до 10. ---- Чтобы получить доступ к символам, начиная с конца строки, можно использовать отрицательные индексы. Так, индекс -1 будет представлять последний символ, а -2 - предпоследний символ и так далее: ``` string = "hello world" c1 = string[-1] # d print(c1) c5 = string[-5] # w print(c5) ``` ---- При работе с символами следует учитывать, что строка - это неизменяемый (immutable) тип, поэтому если мы попробуем изменить какой-то отдельный символ строки, то мы получим ошибку, как в следующем случае: ``` string = "hello world" string[1] = "R" ``` ---- С помощью цикла for можно перебрать все символы строки: ``` string = "hello world" for char in string: print(char) ``` ---- При необходимости мы можем получить из строки не только отдельные символы, но и подстроку. Для этого используется следующий синтаксис: * string[:end] * string[start: end] * string[start: end: step] ---- ``` string = "hello world" # с 0 до 5 индекса sub_string1 = string[:5] print(sub_string) # со 2 до 5 индекса sub_string2 = string[2:5] print(sub_string2) # с 2 по 9 индекса через один символ sub_string3 = string[2:9:2] print(sub_string3) ``` ---- Одной из самых распространенных операций со строками является их объединение или конкатенация. Для объединения строк применяется операция сложения: ``` name = "Tom" surname = "Smith" fullname = name + " " + surname print(fullname) ``` ---- С объединением двух строк все просто, но что, если нам надо сложить строку и число? В этом случае необходимо привести число к строке с помощью функции str(): ``` name = "Tom" age = 33 info = "Name: " + name + " Age: " + str(age) print(info) # Name: Tom Age: 33 ``` ---- Для повторения строки определенное количество раз применяется операция умножения: ``` print("a" * 3) # aaa print("he" * 4) # hehehehe ``` ---- Особо следует сказать о сравнении строк. При сравнении строк принимается во внимание символы и их регистр. Так, цифровой символ условно меньше, чем любой алфавитный символ. Алфавитный символ в верхнем регистре условно меньше, чем алфавитные символы в нижнем регистре. Например: ``` str1 = "1a" str2 = "aa" str3 = "Aa" print(str1 > str2) # False, так как первый символ в str1 - цифра print(str2 > str3) # True, так как первый символ в str2 - в нижнем регистре ``` ---- Поэтому строка "1a" условно меньше, чем строка "aa". Вначале сравнение идет по первому символу. Если начальные символы обоих строк представляют цифры, то меньшей считается меньшая цифра, например, "1a" меньше, чем "2a". Если начальные символы представляют алфавитные символы в одном и том же регистре, то смотрят по алфавиту. Так, "aa" меньше, чем "ba", а "ba" меньше, чем "ca". Если первые символы одинаковые, в расчет берутся вторые символы при их наличии. ---- Зависимость от регистра не всегда желательна, так как по сути мы имеем дело с одинаковыми строками. В этом случае перед сравнением мы можем привести обе строки к одному из регистров. Функция lower() приводит строку к нижнему регистру, а функция upper() - к верхнему. ``` str1 = "Tom" str2 = "tom" print(str1 == str2) # False - строки не равны print(str1.lower() == str2.lower()) # True ``` ---- Поскольку строка содержит символы Unicode, то с помощью функции ord() мы можем получить числовое значение для символа в кодировке Unicode: `print(ord("A")) # 65` ---- Для получения длины строки можно использовать функцию len(): ``` string = "hello world" length = len(string) print(length) # 11 ``` ---- С помощью выражения term in string можно найти подстроку term в строке string. Если подстрока найдена, то выражение вернет значение True, иначе возвращается значение False: ``` string = "hello world" exist = "hello" in string print(exist) # True exist = "sword" in string print(exist) # False ``` ---- Так же работает и с условным оператором: ``` if 'a' in 'raw': print('yes') ``` --- ## Методы строк ---- Для поиска подстроки в строке в Python применяется метод find(), который возвращает индекс первого вхождения подстроки в строку и имеет три формы: * find(str) * find(str, start) * find(str, start, end) ---- Если подстрока не найдена, метод возвращает -1: ``` welcome = "Hello world! Goodbye world!" index = welcome.find("wor") print(index) index = welcome.find("wor",10) print(index) index = welcome.find("wor",10,15) print(index) ``` ---- Для замены в строке одной подстроки на другую применяется метод replace(): * replace(old, new) * replace(old, new, num) ``` phone = "+1-234-567-89-10" # замена дефисов на пробел edited_phone = phone.replace("-", " ") print(edited_phone) # удаление дефисов edited_phone = phone.replace("-", "") print(edited_phone) # замена только первого дефиса edited_phone = phone.replace("-", "", 1) print(edited_phone) ``` ---- Метод split() разбивает строку на список подстрок в зависимости от разделителя. В качестве разделителя может выступать любой символ или последовательность символов. Данный метод имеет следующие формы: * split() * split(delimeter) * split(delimeter, num) ---- ``` text = "Это был огромный, в два обхвата дуб, с обломанными ветвями и с обломанной корой" # разделение по пробелам splitted_text = text.split() print(splitted_text) print(splitted_text[6]) # разбиение по запятым splitted_text = text.split(",") print(splitted_text) print(splitted_text[1]) # разбиение по первым пяти пробелам splitted_text = text.split(" ", 5) print(splitted_text) print(splitted_text[5]) ``` ---- При рассмотрении простейших операций со строками было показано, как объединять строки с помощью операции сложения. Другую возможность для соединения строк представляет метод join(): он объединяет список строк. Причем текущая строка, у которой вызывается данный метод, используется в качестве разделителя: ---- ``` words = ["Let", "me", "speak", "from", "my", "heart", "in", "English"] # разделитель - пробел sentence = " ".join(words) print(sentence) # разделитель - вертикальная черта sentence = " | ".join(words) print(sentence) ``` ---- Вместо списка в метод join можно передать простую строку, тогда разделитель будет вставляться между символами этой строки: ``` word = "hello" joined_word = "|".join(word) print(joined_word) ``` ---- Метод count() принимает символ или подстроку в качестве аргумента и возвращает количество раз, когда исходная подстрока появляется в строке `string.count(string, start_index,end_index)` --- ## Задачи ---- 1. Дана строка. Сначала выведите третий символ этой строки. Во второй строке выведите предпоследний символ этой строки. В третьей строке выведите первые пять символов этой строки. В четвертой строке выведите всю строку, кроме последних двух символов. В пятой строке выведите все символы с четными индексами (считая, что индексация начинается с 0, поэтому символы выводятся начиная с первого). В шестой строке выведите все символы с нечетными индексами, то есть начиная со второго символа строки. В седьмой строке выведите все символы в обратном порядке. В восьмой строке выведите все символы строки через один в обратном порядке, начиная с последнего. В девятой строке выведите длину данной строки. ---- 2. Дана строка. Замените в этой строке все цифры 1 на слово one. ---- 3. Дана строка. Удалите из этой строки все символы @. ---- 4. Дана строка, состоящая из слов, разделенных пробелами. Определите, сколько в ней слов. ---- 5. Дана строка, состоящая ровно из двух слов, разделенных пробелом. Переставьте эти слова местами. Результат запишите в строку и выведите получившуюся строку. При решении этой задачи не стоит пользоваться циклами и инструкцией if. ---- 6. Дана строка, в которой буква h встречается минимум два раза. Удалите из этой строки первое и последнее вхождение буквы h, а также все символы, находящиеся между ними. ---- 7. Дана строка. Замените в этой строке все появления буквы h на букву H, кроме первого и последнего вхождения. ---- 8. Дана строка. Разрежьте ее на две равные части (если длина строки — четная, а если длина строки нечетная, то длина первой части должна быть на один символ больше). Переставьте эти две части местами, результат запишите в новую строку и выведите на экран. При решении этой задачи не стоит пользоваться инструкцией if. ---- 9. Дана строка. Если в этой строке буква f встречается только один раз, выведите её индекс. Если она встречается два и более раз, выведите индекс её первого и последнего появления. Если буква f в данной строке не встречается, ничего не выводите. При решении этой задачи не стоит использовать циклы. ---- 10. Дана строка. Найдите в этой строке второе вхождение буквы f, и выведите индекс этого вхождения. Если буква f в данной строке встречается только один раз, выведите число -1, а если не встречается ни разу, выведите число -2. ---- 11. Дана строка, в которой буква h встречается как минимум два раза. Разверните последовательность символов, заключенную между первым и последним появлением буквы h, в противоположном порядке. ---- 12. Дана строка. Удалите из нее все символы, чьи индексы делятся на 3.
{"metaMigratedAt":"2023-06-17T02:12:49.280Z","metaMigratedFrom":"Content","title":"Строки","breaks":true,"contributors":"[{\"id\":\"0d39d5a3-691d-488c-8f1e-1a0fb0be4f13\",\"add\":11652,\"del\":37}]"}
    265 views