воскресенье, 19 января 2020 г.

Урок 5-А. Символьные (текстовые) строки

5-А. Символьные (текстовые) строки

Текстовые строки в Python - это структурный объект: упорядоченная последовательность любых символов. Символы могут быть любыми и в любом порядке. Группы символов не имеют лексического значеня, поэтому лучше их называть не текстовыми, а символьными.
Ранее мы уже встречались с символьными строками - это были объекты импа str. Для того, чтобы величина стала символьной строкой, ей нужно присвоить последовательности символов, заключённую в кавычки. Например:
In [ ]:
a= 'Python3!'; b= 'первый, второй и третий'; c= '123 321'
Некоторые специальные символы: '\n' - перевод строки; '\t' - табуляция; '' - пустой символ.
In [3]:
print (c,'\n',a,'\t',a,'\t',a)
123 321 
 Python3!   Python3!   Python3!

Срезы

Строки в Python - это упорядоченная последовательность символов. Значит, каждый символ имеет свой порядковый номер (начиная с нуля). Упорядоченный структуры позволяют нам выполнять над ними срезы. Например, для строки x:
  • x[i] - отдельный символ из x под № i
  • x[:i] - префикс: все от начала до символа под № i (не включая)
  • x[i:] - постфикс: все от символа по № i и до конца
  • x[i:j] - подстрока от символа по № i и до символа под № i (не включая)
  • x[i:j:k] - подпоследовательность символов от №i до №j, с шагом k
Можно использовать отрицательные номера, где -1 - это № последнего символа
In [42]:
x='abc321'
print( x[3], x[:3], x[-3:], x[2:-2], x[1:-1:2], x[-2:1:-1] )
3 abc 321 c3 b3 23c

Операции над строками

"+" - операция конкатенация, то есть добавления одной строки к другой.\ Например, если a='aa' и b='bb', то после выполнения операции c=a+b, значение величины с будет равно 'aabb'.
"" - операция дублирования строк, то есть повторения строки несколько раз.\ Например, если a='aa', то после выполнения операции b=a3, значение величины b будет равно 'aaaaaa'.
In [33]:
# Примеры конкатенации и дублирования:
a = '123'
b = '456'
c= a + b
print (c)
c= b * 3
print (c)
123456
456456456

Включаем логику

В результате приминения к символьным строкам операций сравнения, из них мы получим величины логического типа (высказывания принимающих значения True и False). Операции срвнения:
  • == - равно
  • != - не равно
  • > - больше
  • >= - больше или равно
  • < - меньше
  • <= - меньше или равно
Строки сравниваются по кодам символов, входящих в них. Для символов-цифр порядок их кодов соответствует порядку числовых значений цифр. Для символов-букв порядок их кодов соответствует их порядку в алфавите.
In [30]:
print('Вася'>'Маша','12'!='23','F35'<='F22','T14'=='T14')
False True False True

Логические операции

Как известно из темы "Основы алгебры логики", над над высказываниями можно выполнять логические операции: andor и not.
Кроме того, для строк, как и для других структурных объектов, можно применять логическую операцию in.
  • in - истина, если элемент (символ) присутствует в последовательности (строке), иначе возвращает ложь.
In [32]:
# Пример. Есть ли символ ’а’ в строке x?
x=input()
print('а' in x)
Ура
True

Ввод символьных строк

До сих пор наши программы решали только одну частную задачу. Как сделать так, чтобы программа решала задачу для любых исходных данных? Для этого в программе нужно предусмотреть, чтобы она сама запрашивала ввод исходных данных.
Для ввода с клавиатуры символьной строки в Python3 используется функция ввода input().
Задача: запросить имя человека и повторить его на экране с приветствием
Программа решения:
In [5]:
x= input()
print('Привет',x+'!')
Миша
Привет Миша!
Встретив функцию input(), программа останавливается и ждет, пока пользователь наберет строку и нажмёт клавишу "Enter". 
После её нажатия, набранной (введенной) строке будет дано имя x. 
Если во время ввода, пользователь набрал Петя, 
то функция print() выведет на экран: Привет Петя!
Обратите внимание, что во время ввода, можно было набрать любое имя и программа будет приветствовать любого человека. Таким образом, наша программа решает задачу для любых исходных данных.

Пример задачи

В разных сроках вводятся фамилия, имя и отчество. В двух следующих строках вывести:
  1. Имя и отчество
  2. Фамилия и первую букву имени с точкой.
Пример, для ввода:
Иванов
Петр
Сидорович
Вывод:
Петр Сидорович
Иванов П.
Решение:
In [8]:
a,b,c = input(),input(),input()
print(b,c)
print(a, b[0]+'.')
Иванов
Петр
Сидорович
Петр Сидорович
Иванов П.

Некоторые функции и методы текстовых строк

Функции:

  • ord(символ) - Определяет числовой код символа
  • chr(код) Определяет символ по его коду
In [12]:
print( ord(a[-1]) )
print( chr(53) )
52
5
a[-1] - последний символ в строке a='1234' => 52 - код символа '4'
символ с кодом 53 - это символ '5'

Задача

  1. Получить все символы с кодами от 48 до 58
  2. Получить все символы с кодами от 65 до 75
  3. Получить все символы с кодами от 97 до 107
In [15]:
cod=48
while cod<58:
  print(str(cod)+':'+chr(cod),end=' ')
  cod=cod+1
48:0 49:1 50:2 51:3 52:4 53:5 54:6 55:7 56:8 57:9 
In [16]:
cod=65
while cod<78:
  print(str(cod)+':'+chr(cod),end=' ')
  cod=cod+1
65:A 66:B 67:C 68:D 69:E 70:F 71:G 72:H 73:I 74:J 75:K 76:L 77:M 
In [17]:
cod=97
while cod<107:
  print(str(cod)+':'+chr(cod),end=' ')
  cod=cod+1
97:a 98:b 99:c 100:d 101:e 102:f 103:g 104:h 105:i 106:j 

Задание

Какие выводы можно сделать из решения этой задачи?

Стандартные функции для строк

К текстовым строкам можно применять некоторые стандартные функции, которые есть в Python3, для любых составных объектов
  • max() - находит максимальный символ (с максимальным кодом)
  • min() - находит минимальный символ
  • len(строка) - Определяет длину (количество символов) для строки
In [9]:
a='1234'
print( len(a))
4
In [24]:
x= 'abcba'
print( max(x) + min(x))
ca

Некоторые методы строк

  • a.find( подстрока, от, до ) - Поиск подстроки в строке a. Возвращает номер первого вхождения подстроки в строке a или -1. Поиск с строке a ведется от символа с номером "от" и до символа с номером "до"
  • a.replace( подстрока1,подстрока2 ) - Замена в строке a подстроки1 на подстроку2
  • a.split(разделитель) - Разбиение строки a по разделителю. Если разделитель не указан, то - по пробелу
  • разделитель.join( список строк или символов ) - Сборка строки из нескольких строк через разделитель
  • a.count( подстрока, от, до ) - Возвращает количество непересекающихся вхождений подстроки в строке a
In [23]:
a='1234'
print( a.find('1') , a.find('1',2), a.find('4',2), a.find('2',1,3)) 
b=a.replace('2','55')
print( b)
print(a.split('2'))
print('+'.join(a))
0 -1 3 1
15534
['1', '34']
1+2+3+4

Последовательная обработка символов

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

Пример 1.

Из исходной строки, получить новую, которая состоит из символов первой, но между символами добавлен символ "+" (см. последний пример выше).
Для следующих примеров необходимо использовать генератор последовательного перебора:
( действие_над_каждым_выбранным_элементом_структуры
  for имя_выбранного_элемента
  in из_какой_структуры,_например,_строки
  if при_каком_условии_будет_выбран_элемент  )

Пример 2.

Вводятся две строки. Получить новую, состоящую из символов первой строки, если эти символы есть во второй. Например: из строк 'город' и 'деревня' получится 'рд'.
In [44]:
a,b = input(), input()
print ( ''.join(i for i in a if i in b) )
город
деревня
рд
Аналогично можно работать не только с символами, ни и со словами в введенной строке, если ее предварительно разбить через пробел.

Пример.

Дано предложение. Напечатать его снова, но без слов 'опять' и 'и'. Например: из предложения 'Везде и повсюду, опять и опять меня окружают загадки' получим 'Везде повсюду, меня окружают загадки'.
In [46]:
print( ' '.join( i for i in input().split() if i not in ('опять','и') )  )
Везде и повсюду, опять и опять меня окружают загадки
Везде повсюду, меня окружают загадки

Комментариев нет:

Отправить комментарий

AI