Математический практикум по Питону.
Вводится базовы объект из Питона (Python): строчка (str). Показано как создавать, преобразовывать, искать подсроки и тому подобное.
Это предварительная версия! Любые замечания приветсвуются.
С объектом строка мы уже ранее встречались. В данной заметки будут показаны дополнительные с ней взаимодействия.
Создание
'текстовая строка' # Одинарные кавычки.
"можно и в двойных кавычках" # Теперь кавычки двойные.
# Но результат содержит одинарные.
type("строка"), type('ещё одна') # Тип в любом случае будет строка -- str.
s = 'некая строка' # Можно конечно её присвоить переменной.
# Длина строки,
len(s) # т.е. количество символом в её представлении.
# Напомню:
s + ' завершилась.'
list('строка')
Индекс
Индекс работает также как и для списка, list. Не будем подробно останавливаться. Строка текста тоже на самом деле может быть проиндексирована, т.е. можно считать букву по индексу.
"индекс"[1] # Считываем второй символ строки.
s[4] # Тоже для переменной типа str.
s[-1]
# Даже такое.
s[1::2] # Результат тоже строка.
# Поэтому можно опять взять индекс.
s[1::2][1] # Индекс от индекса.
Но есть и существенные отличия. Например, строка неизменяемый объект, константный.
# Но присовить новое значение нельзя.
s[4] = 'a' # Присвоить новое значение нельзя.
Касательно равенства
Проверка на равенство по сути, т.е. как строчки в обычном поимании.
# По сути они равны.
'строка' == "строка"
# А эти строки нет.
'строка 1' == "строка 2" # Строки не совпадают.
Строки хранятся единожды, т.е. в одном экземпляре. Поэтому их и нельзя изменять.
# Экономия места благодаря константности строк.
id( 'строка' ) == id("строка") # Указатель на них один и тот же.
# Например, схожая вещь для целых чисел.
id(6), id(3+3)
# Отдельные цифры тоже являются константными объектами.
6 = 7 # Нельзя присвоить 6 7.
В сложных выражениях тоже будет работать.
['aa',['bb']] == ['aa', ['bb']]
id( ['строка'] ) == id( ["строка"] )
Сравнение нужно делать аккуратно.
["строка"], ["строка"][0] # Это понятно.
# Сравним список со строкой и саму строку.
id( ['строка'] ) == id( ["строка"][0] )
# Конечно не равны.
Красивая печать
# В фигурные скобки подставляются значения аргументов метода format.
"первое число {}, а теперь второе {}".format(4,2)
# первый аргумент вместо первой пары фигурных скобок, а второй вместо второй.
Конечно можно подставить любой объект. Например строчку.
"{} получила {} баллов за котрольную.".format('Маша',15)
Можно указать порядковый номер аргумента в фигурных скобоках явно.
"или иначе, для начала второе число {1}, а теперь первое число {0}".format(4,2)
# Позволяет менять порядок вывода аргументов.
# Номер в фигурных скобрах можно повторять.
"или даже повторять {0}, {1}, {0}.".format(4, 2)
Есть и более прдвинутый подход, где вместо номера указываем именной аргумент.
# Она подставляется автоматически в строке,
'sss {a} ff'.format(a=77) # т.е. там, где она заключена в фигурные скобки.
a = 55 # Происвоем переменной.
'sss {a} ff'.format() # Имя a должно быть в format.
Можно и саму переменную использовать в скобках (метода format тогда не будет использоваться ). Так, можно оперировать не порядковым номером, а именем переменной.
# Сначала присваиваем некой переменной значение.
a = 77 # Далее будем её использовать.
# Обращаю внимание на f перед строкой.
f'sss {a} ff'
'sss {a} ff' # А вот что будет без f до строки.
Выравнивание
# Центрируем текст.
s = 'center'.center(10) # В скобке указывается длина итоговой строки.
s
len( s) # Длина строки.
s[2:-2] # Проверим что это так.
# Если трока больше требуемой величины.
s = 'center'.center(5) # то ничего не делается.
s
len(s)
# Пробелы превичной строки не учитываются,
l = 'q '.center(8) # т.е. пробелы как обычные символы.
l
len(l)
'Заявление'.center(80)
# Выравненная на левый край.
t = ' qq qq'.ljust(10)
t, len( t )
# Выравненная на правый край.
t = ' qq qq'.rjust(10)
t, len( t )
'Сидоров Иван Иванович'.rjust(80)
Упорядочивание
'aaa' + 'bbbb' # Ещё наз напомню.
Вместо операции + можно применить и другие. Например, операцию меньше, больше. Строчки можно сравнивать посредством логических операций в алфавитном порядке.
# Возвращает истину если первое слово ижет раньше второго алфавитном порядке.
'Максим' < 'Дима' # Знак < вместо знака +.
'Максим' < 'Федор'
# Это можно рассматривать как единое целое,
'Максим' == 'Федор' # т.е. что операция == и < обе логические.
# Возьмем, например, список имен.
names = ['Максим', 'Дима', 'Алексей', 'Олег']
names
Раз есть операция сравнения, то объекты списка можно упорядочить (отсортировать).
names.sort() # сортируем объекты в списке,
names # т.е. имена в списке.
misc = [4, 'Максим', 'Дима', 11]
Отсортировать объекты без определенной над объектами операции сравнения нельзя.
# В частности, ранородные: содержащие и цифры и строчки.
misc.sort()
# Действительно. Нельзя сравнить.
3 < "Дима" # Пытаемся сравнить цифру и слово.
# Превратим цифры в строчки.
misc = ['4', 'Максим', 'Дима', '11']
misc.sort() # Теперь сработала сортировка.
misc # Она считает, что цифры идут раньше букв.
Интегральные базовые проверки
Интегральость обозначает, что что-то делается для всех. В данном случае выполняется та или иная проверка.
Если истинно утверждение для всех символов строки, то итоговы ответ истинен. Иначе ложь.
s = 'some text'
# Все ли символы явлются буковй?
s.isalpha() # Нет, не все. Пробел не буква.
'fff'.isalpha(), 'f1ff'.isalpha() # Цифра (1) не буква.
' \t\n'.isspace(), ' a \t\n'.isspace() # Буква (a) не пробел.
# Истина тогда и только тогда когда строчка состоит из цифр.
'034'.isdigit()
# Наличие одного не того символа достаточно для ложного ответа.
'5x88'.isdigit() # x -- не число.
'23'.isdecimal(), '23.5'.isdecimal()
'23'.isnumeric(), '23.5'.isnumeric() # Сложно объяснить...
# Проверка на строчный, верхний регистр символа.
'as'.islower(), 'AB4'.isupper(), 'bA'.isupper()
Поиск
dat = '... Город: Москва'
# Поиск подстроки.
dat.find('Город: ',0,-1) #
dat[4:]
dat.rfind('Город: ')
'17:23:22'.find(':')
'17:23:22'.rfind(':')
# В случае, если строчка не найдена,
dat.find('Страна') # то возвращается -1.
dat.index('Страна') # Бросает исключение.
'17:23:22'.index(':'), '17:23:22'.rindex(':')
tt = 'с 12 час 23 мин по 14 час 31 мин'
# Извлекаем время. Пользуемся тем, что сначала идет время начальное, а потом конечное.
fr = tt.find('час') # from с
tl = tt.rfind('час') # till до
# Печатаем найденное время.
tt[fr-3:fr-1], tt[tl-3:tl-1]
Префикс и суфикс
Истина, если начинается с нужной строки.
'aa'.startswith('a')
'abcde'.startswith('bc')
'abcde'.startswith('bc', 1) # можно указать номер символа с которого начинать сравнение.
'часов'.startswith('час'), 'час'.startswith('час'), 'час'.startswith('часов')
Истина, если завершается нужной строкой.
'sdefgh'.endswith('gh')
'asdfg'.endswith('df')
'asdfg'.endswith('df', 0, -1)
'12 часов'.endswith('часов'), '12 минут'.endswith('часов')
Чистка пробелов
s = ' q q '
# Убираем лишние 'пробелы' в начале и конце строки.
s.strip()
# Убераем пробелы только с одного из концов строки.
s.lstrip(), s.rstrip()
Разбиение на подстроки и объединение
Иногда бывает нужным разбить строчку по пробелам.
# Разбиение по пробелу.
'Маша Катя Лена'.split(' ') # rsplit splitlines
# На самом деле можно и по другому символу.
'Маша; Катя; Лена'.split('; ') # '; ' разделитель из двух символов.
# По одному пробелу.
'Маша Катя Лена '.split(' ') # В списке появилась пустая строка.
А бывает, что нужно наоборот объеденить список строк. Между объединяемыми строками будем вставлена нужная строка.
names
# Объединяем список строчек посредством строки.
', '.join(names) # В данном случае ', '
', '.join(names) + '.' # Добавим и концевую точку.
# Совсем педантично.
', '.join(names[:-1]) + ' и ' + names[-1] + '.'
Отсечение
'a ggg ggg'.partition(' ') #rpartition
tt
ss = tt.partition('по')
ss
# Тогда получится, что
ss[0] # это время с
ss[0].startswith('с ')
ss[2] # это время по.
Преобразования
Данные методы выполняют преобразование строчки согласно определенному правилу.
'цифровая обработка изображений'.capitalize()
# Ц стала заглавной.
# Случай, когда начало строки является пробелом.
' курс по выбору'.capitalize() # Пробел нельзя сделать заглавным.
# Делает заглавие согласно правилам английского языка.
'python course'.title()
# Для русского текста тоже дает корретный результат.
'цифровая обработка изображений'.title()
Нормализация строк
'ΣίσυφοςQ'.upper().lower()
'Σίσυφος'.upper().lower() # Последняя буква не та.
# Приведение к нормальному виду. Важно для машинного обучения.
'ΣίσυφοςQ'.upper().casefold()
# Теперь все буквы совпадают с первой строкой (кроме q).
'Σίσυφος'.upper().casefold()
"ß".lower(), "ß".upper().lower() # Не совпадают.
"ß".lower().casefold(), "ß".upper().casefold() # Совпадают.
Сложные преобразования
ss = '*\tАня\n*\tКатя'
print(ss)
ss
len(ss)
tt = ss.expandtabs(4) # Заменяем каждый символ табуляции на определенное количество пробелов.
tt
len(tt) # Каждая табуляция 4 символа.
print(tt)
grades = 'Имя\tБаллы\nАня\t25\nКатя\t27'
print( grades )
print(grades.expandtabs(16))
Замена
'студентка пришла на спецкурс.'.replace('студентка', 'Маша')
'студентка пришла на спецкурс.'.replace(['студентка'], ['Маша'])
Кодировки
q = 'aa'.encode('utf16') # На выходе тип -- строка байтов.
q, type(q)
win1251 = 'винда'.encode('windows-1251')
win1251
win1251.decode('windows-1251')
win1251.decode('koi8-r') # Старые добрые времена...