Символьные строки (заключение)

05.06.2023 0 Автор : Марина Николаевна
Символьные строки (заключение)

Символьные строки.

Замена

Чтобы заменить в строке одну подстроку на другую, удобно использовать встроенный метод replace (по-английски — заменить). Например, эта команда заменит в строке s все знаке  «/» на точки:

date = "12/02/2018"
dateRus = date.replace ("/", ".")  # "12/02/2018"

Первый аргумент — страка-образец, второй — строка-замена. Замены выполняются по всей строке (многократно).

Если нужно заменить только первые несколько образцов (например, один), указываем третий аргумент — количество замен:

dateRus = date.replace ("/", ".", 1),   # "12.02/2018"

Этот оператор заменит на точку только первый знак «/», потому, что  третий аргумент метода perlace равен 1.

Преобразование "Строка - число"

Иногда символьная строка, которая передается программе, содержит запись числа. С таким значением нельзя выполнить арифметические операции, потому что это символы, а не число.

В языке Python  есть  встроенные функции для преобразования типов данных, некоторые из них уже были использованы:

int — переводит строку в число;

float — переводит строку в вещественное число;

str — переводит целое или вещественное число в строку.

Приведем пример преобразования строк в числовые значения:

s = "123"
n = int (s)     # n = 123
s = "123.456"
x = float (s)    # x = 123.456

Если  строку не удается преобразовать в число (например, если в ней содержатся буквы), возникает ошибка и выполнение программы завершается аварийно.

Пример обратного преобразования:

Эти операции всегда выполняются успешно (ошибка произойти не может).

Функция str используется правила форматирования, установленные по умолчанию. При необходимости можно использовать собственное форматирование, например:

Здесь значение переменной n записано в  5 позициях, т.е. в начале строки будут стоять два пробела.

Для вещественных чисел можно использовать форматы f (с фиксированной запятой) и e (научный формат, с плавающей запятой):

Формат 7,2f обозначает «вывести в 7 позициях с двумя знаками в дробной части», а формат 10.2e — «вывести в научном формате в 10 позициях с двумя знаками в дробной части».

Символьные строки в функциях

Символьные строки могут передаваться процедурам и функциям как аргументы. Функции могут возвращать символьные строки как результат.

Для примера напишем простую функцию, которая из полного адреса файла выделяет его имя (с расширением). Например, из адреса /home/ vasya/miner.exe нужно выделить имя файла miner.exe. Назовем эту функцию extractFileName (по-английски — извлечь имя файла).

Именем файла будем считать все символы после последнего символа «/» (он называется «слеш»). Найдем позицию последнего слеша с помощью метода rfind,  а затем выделим срез строки после этого символа (до конца строки), это и будет результатом функции:

Проверим, не будет ли ошибки, если в строке нет слеша. В этом случае метод rfind вернет «-1» (образец не найден), и результатом будет срез fileAddr[0:]. т.е. вся переданная строка.

В операционной системе Windows используется также обратный слеш «\». Для того чтобы функция правильно работала для обоих вариантов, в самом начале можно заменить все обратные слеши на прямые:

Необходите обратить внимание на то, что в строке — образце обратный слеш удвоен. /то связанно с тем, что этот символ особый: он используется для добавления в строку служебных символов. например, \n — это (один!) символ перехода на новую строку. Поэтому, когда мы хотим включить в строку именно обратный слэш, его нужно удвоить.

Рекурсивный перебор

Попробуем найти все трехбуквенные «слова» (цепочки символов), котоые можно составить с помощью алфавита {A, Б, В}.

Самое простое решение — это полный перебор вариантов с помощью тройного вложенного цикла:

Поскольку в переменной alphabet буквы расставлены по алфавиту, слова тоже будут выведены в алфавитном порядке.

Сложности возникают тогда, когда нужная длина слов  неизвестна заранее, например, вводится с клавиатуры, из файла или через компьютерную сеть. Неизвестно, сколько циклов нужно добавить в такую программу, поэтому и не можем ее написать, используя циклы. 

Существует красивое решение, основанное  на рекурсии. Пусть нужно построить все слова длиной К. Первая буква будет «А».  Оставшаяся (пока неизвестная) часть слова — это слово длиной К-1. Тогда для того, чтобы построить все слова длины К, начинающиеся с буквы А, нам нужно перебрать все возможные слова длины К-1, т.е. нужно решить ту же задачу, но с другими данными.

Представим рекурсивное решение: в цикле перебрать все возможные первые буквы (ставя по очереди каждую букву алфавита на первое место) и для каждого случая построить все возможные «хвосты» длиной К-1.

Остановить рекурсию ( и вывести готовое слово) нужно тогда, когда оставшаяся часть пустая (К = 0), т.е. все буквы уже выбраны. Получается такая рекурсивная процедура:

При вызове этой процедуры нужно передать ей пустую начальную строку (ни одна буква пока не выбрана), строку — алфавит (второй аргумент) и нужное значение К:

Теперь можно посчитать, сколько всего слов было найдено. Для этого подпрограмма allWords должна превратиться в функцию и возвращаить количество построенных слов. Вызвать эту функцию можно следующим образом:

Во-первых, при выводе очередного слова функция должна возвращать 1 (построено одно слово). Во-вторых, когда в цикле перебираются все возможные первые буквы слова, результаты рекурсивных вызовов нужно складывать и в конце возращать как результат функции:

Все измененияв тексте процедуры выделены фоном.