Символьные строки
Символьная строка – это последовательность символов, расположенных в памяти рядом (в соседних ячейках). Для работы с символами во многих языках программирования есть переменные специального типа: символы, символьные массивы и символьные строки (которые, в отличие от массивов, рассматриваются как цельные объекты). Основной тип данных для работы с символьными величинами в языке Python – это символьные строки (тип string).
Строки в процедурах и функциях
Строки можно передавать в процедуры и функции как параметры, а также возвращать как результат функций. Построим процедуру, которая заменяет в строке s все вхождения слова-образца wOld на слово-замену wNew (здесь wOld и wNew – это имена переменных, а выражение «слово wOld» означает «слово, записанное в переменную wOld»).
Функция на языке Python. Её параметры – это исходная строка s, строка-образец wOld и строка-замена wNew:
def replaceAll( s, wOld, wNew ): lenOld = len(wOld)
res=""
while len(s) > 0:
p=s.find( wOld ) if p<0:
return res + s if p>0:
res = res + s[:p] res=res+wNew
if p+lenOld>=len(s):
s="" else:
s = s[p+lenOld:] return res
Переменная p – это номер первого символа первого найденного слова-образца wOld, а в пере- менной lenOld записана длина этого слова. Если после поиска слова значение p меньше нуля (образец не найден), происходит выход из цикла:
if p<0: res=res+s; return
Если p > 0, то слева от образца есть какие-то символы, и их нужно «прицепить» к строке res:
if p>0: res=res+s[:p]
Условие p+lenOld >= len(s) означает «образец стоит в самом конце слова», при этом остаток строки s – пустая строка. В конце программы результат записывается на место исходной строки s.
Пример использования этой функции:
s = "12.12.12"
s=replaceAll( s, "12", "A12B" )
print( s )
Так как операция замены одной подстроки на другую используется очень часто, в языке Python есть встроенная функция, которая выполняет эту операцию. Она оформлена как метод для переменных типа «строка» (str) и вызывается с помощью точечной записи:
s = "12.12.12"
s=s.replace( "12", "A12B" )
print( s )
Алгоритм выполнения, чтобы избежать проблем: 1) записываем результат в другой символьной строке res, удаляя из строки s уже обработанную часть. Предположим, что на некотором ша- ге в оставшейся части строки s обнаружено слово wOld. Для этого нужно выполнить следующие действия: 1) ту часть строки s, которая стоит слева от образца, «прицепить» в конец строки res;
2) «прицепить» в конец строки res слово-замену wNew;
3) удалить из строки s начальную часть, включая найденное слово-образец.
Поиск в строках
Метод rfind
Аналогичный метод rfind (от англ. reverse find – искать в обратную сторону) ищет послед- нее вхождение образца в строке.
Для той же строки s, что и в предыдущем примере, метод rfind вернёт 12 (индекс последней буквы «с»): s="Здесь был Вася."
n=s.rfind( "с" ) # n = 12
Метод find
Функция find, она определена для символьных строк и вызывается как метод, с помощью точечной записи. В скобках нужно указать образец для поиска: s="Здесь был Вася."
n=s.find( "с" ) # n = 3 if n>=0:
print( "Номер символа", n ) else:
print( "Символ не найден." )
Метод find возвращает целое число – номер символа, с которого начинается образец (буква "с") в строке s. Если в строке несколько образцов, функция находит первый из них. Если образец не найден, функция возвращает «–1». В рассмотренном примерев переменную n будет записано число 3.
Преобразования число<->строка
Для вещественных чисел можно использовать форматы f (с фиксированной точкой) и e (экспоненциальный формат, с плавающей точкой): X = 123.456
s="{:7.2f}".format(X) # s ="◦123.46"
s = "{:10.2e}".format(X) # s= "◦◦ 1.23e+02"
В первом случае формат «7.2f» обозначает «вывести в 7 позициях с 2 знаками в дробной части», во втором – формат «10.2e» обозначает «вывести научном формате в 10 позициях с 2 знаками в дробной части».
str – переводит целое или вещественное число в строку
Функция str использует правила форматирования, установленные по умолчанию. При необходимости можно использовать собственное форматирование. Например, в строке:
s = "{:5d}".format(N)
В строке значение переменной N будет записано по формату d (целое число) в 5 позициях, то есть в начале строки будут стоять два пробела:
◦◦123
Примеры обратного преобразования: N=123
s=str( N ) # s = "123"
X = 123.456
s=str( X ) # s = "123.456"
Эти операции всегда выполняются успешно (ошибка произойти не может).
float – переводит строку в вещественное число
Пример преобразования строк в числовые значения: s = "123.456"
X=float( s ) # X = 123.456
int – переводит строку в целое число
Пример преобразования строк в числовые значения: s = "123"
N=int( s ) # N = 123
Сравнение и сортировка строк
С помощью языка Python удобно записать строки в массив (список) и затем отсортировать с помощью метода sort: aS=[]
print ( "Введите строки для сортировки:" ) while True:
s1 = input()
if s1=="": break aS.append( s1 )
aS.sort(). print( aS )
Строки заносятся в список aS. Сначала этот список пустой, затем в цикле мы вводим очередную строку с клавиатуры и записываем её в переменную s1. Ввод заканчивается, когда введена пустая строка, то есть вместо ввода строки пользователь нажал клавишу Enter. В этом случае сработает условный оператор и выполнится оператор break, прерывающий цикл.
С другими символами (цифрами, латинскими буквами)?
Цифры стоят в кодовой
таблице по порядку, причём раньше, чем латинские буквы; латинские буквы – раньше, чем русские; заглавные буквы (русские и латинские) – раньше, чем соответствующие строчные. Поэтому
«5STEAM» < «STEAM» < «Steam» < «steam» < «ПАР» < «Пар» < «пар».
Строки, как и числа, можно сравнивать. Для строк, состоящих из одних букв (русских или ла- тинских), результат сравнения очевиден: меньше будет та строка, которая идет раньше в алфавит- ном порядке.
Рекурсивный перебор
Это типичная задача на перебор вариантов, которую удобно свести к задаче меньшего размера. Процедура для перебора слов может быть записана так: def TumbaWords( A, w, L ): if len(w)==L:
print( w )
return
for c in A:
TumbaWords( A, w+c, L )
В параметре A передаётся алфавит языка, параметр w – это уже построенная часть слова, а L – нужная длина слова. Когда длина построенного слова станет равна L, то есть будет получено слово требуемой длины, слово выводится на экран и происходит выход из процедуры (окончание рекурсии). Если слово не достроено, в цикле перебираем все символы, входящие в алфавит, по очереди добавляем каждый из них в конец строки и вызываем процедуру рекурсивно.
Пример обработки строк
Метод split, который возвращает спи- сок слов, полученных при разбиении строки
Полная программа:
print( "Введите имя, отчество и фамилию:" )
s = input()
fio = s.split()
s=fio[2]+" "+fio[0][0]+"."+fio[1][0]+"."
print( s )
Срезы и метод find
Полная программа:
print( "Введите имя, отчество и фамилию:" ) s = input()
n=s.find( " " )
name=s[:n] #вырезать имя
s = s[n+1:]
n=s.find( " " )
name2=s[:n] #вырезать отчество
s=s[n+1:] #осталась фамилия
s=s+" "+ name[0]+"."+name2[0]+"."
print( s )
Встроенные методы для работы с символьными строками.
Метод isdigit проверяет, все ли символы строки – цифры, и возвращает логическое значение: s = "abc"
print ( s.isdigit() ) # False s1 = "123"
print ( s1.isdigit() ) # True
Методы upper и lower позволяют перевести строку соответственно в верхний и нижний регистр: s = "aAbBcC"
s1 = s.upper() # "AABBCC" s2 = s.lower() # "aabbcc"
Операции со строками
Реверс строки
Срезы позволяют выполнить реверс строки (развернуть её наоборот):
s1 = s[::-1]
Так как начальный и конечный индексы элементов строки не указаны, задействована вся строка. Число «–1» означает шаг изменения индекса и говорит о том, что все символы перебираются в обратном порядке.
Срезы
С помощью срезов можно вставить новый фрагмент внутрь строки: s = "0123456789"
s1 = s[:3] + "ABC" + s[3:]
Переменная s получит значение "012ABC3456789".
Удаление части строк
Для удаления части строки нужно составить новую строку, объединив части исходной строки до и после удаляемого участка: s = "0123456789" s1 = s[:3] + s[9:]
Срез s[:3] означает «от начала строки до символа s[3], не включая его», а запись s[9:] – «все символы, начиная с s[9] до конца строки». Таким образом, в переменной s1 остаётся значе- ние "0129".
Выделение части строки (подстроки)
Применяется операция получения среза (англ. slicing), например s[3:8] означает символы строки s с 3-го по 7-й (то есть до 8-го, не включая его). Следующий фрагмент копирует в строку s1 символы строки s с 3-го по 7-й (всего 5 символов):
s = "0123456789"
s1 = s[3:8]
В строку s1 будет записано значение "34567".
Объединения (сцепления) строк
Оператор '+' . Эта операция иногда называется конкатенация. Например:
s1 = "Привет"
s2 = "Вася"
s = s1 + ", " + s2 + "!"
В результате выполнения приведённой программы в строку s будет записано значение "Привет, Вася!".