Программирование на языке Python
§ 66. Символьные строки
1
© К.Ю. Поляков, Е.А. Ерёмин, 2018 http://kpolyakov.spb.ru
Символьные строки
2
Начальное значение:
Вывод на экран:
print ( s )
s = "Привет!"
Длина строки:
n = len ( s )
print ( s[5] )
0 | 1 | 2 | 3 | 4 | 5 | 6 |
П | р | и | в | е | т | ! |
s[0] | s[1] | s[2] | s[3] | s[4] | s[5] | s[6] |
Строка – это
последовательность
символов!
!
print ( s[-2] )
s[len(s)-2]
Алгоритмизация и программирование, язык Python, 10 класс
© К.Ю. Поляков, Е.А. Ерёмин, 2018 http://kpolyakov.spb.ru
Символьные строки
3
Ввод с клавиатуры:
s = input ( "Введите имя: " )
Изменение строки:
s[4] = "a"
Строка – это неизменяемый объект!
!
... но можно составить новую строку:
s1 = s + "a"
Алгоритмизация и программирование, язык Python, 10 класс
© К.Ю. Поляков, Е.А. Ерёмин, 2018 http://kpolyakov.spb.ru
Символьные строки
4
s = input( "Введите строку:" )
s1 = "" # строка-результат
for i in s:
if i == "а":
i= "б"
s1 = s1 + i
print ( s1 )
Задача: заменить в строке все буквы "а" на буквы "б".
перебрать все символы в строке
добавить символ к строке-результату
Строка – это неизменяемый объект!
!
Алгоритмизация и программирование, язык Python, 10 класс
© К.Ю. Поляков, Е.А. Ерёмин, 2018 http://kpolyakov.spb.ru
5
s = input( "Введите строку:" )
s1 = "" # строка-результат
for i in range(len(s)):
if s[i] == "а":
i = "б"
s1 = s1 + i
else: s1=s1+s[i]
print ( s1 )
s = input( "Введите строку:" )
print(s.replace('a','b')
Алгоритмизация и программирование, язык Python, 10 класс
© К.Ю. Поляков, Е.А. Ерёмин, 2018 http://kpolyakov.spb.ru
Сравнение строк
6
print( "Введите 2 строки:" )
s1 = input()
s2 = input()
if s1 == s2:
print( s1, "=", s2 )
elif s1 < s2:
print( s1, "<", s2 )
else:
print( s1, ">", s2 )
Алгоритмизация и программирование, язык Python, 10 класс
© К.Ю. Поляков, Е.А. Ерёмин, 2018 http://kpolyakov.spb.ru
Сравнение строк
7
| А | Б | ... | Ё | ... | Ю | Я |
CP-1251 | 192 | 193 | ... | 168 | ... | 222 | 223 |
UNCODE | 1040 | 1041 | ... | 1025 | ... | 1070 | 1071 |
| а | б | ... | ё | ... | ю | я |
CP-1251 | 224 | 225 | ... | 184 | ... | 254 | 255 |
UNCODE | 1072 | 1073 | ... | 1105 | ... | 1102 | 1103 |
5STEAM < STEAM < Steam < steam
steam < ПАР < Пар < пАр < пар < парк
Алгоритмизация и программирование, язык Python, 10 класс
© К.Ю. Поляков, Е.А. Ерёмин, 2018 http://kpolyakov.spb.ru
Операции со строками
8
Объединение (конкатенация) :
s1 = "Привет"
s2 = "Вася"
s = s1 + ", " + s2 + "!"
"Привет, Вася!"
Срезы:
s = "0123456789"
s1 = s[3:8] # "34567"
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
этот символ не входит!
Алгоритмизация и программирование, язык Python, 10 класс
© К.Ю. Поляков, Е.А. Ерёмин, 2018 http://kpolyakov.spb.ru
Операции со строками
9
Срезы:
s = "0123456789"
s1 = s[:8] # "01234567"
от начала строки
s = "0123456789"
s1 = s[3:] # "3456789"
до конца строки
s1 = s[::-1] # "9876543210"
реверс строки
Алгоритмизация и программирование, язык Python, 10 класс
© К.Ю. Поляков, Е.А. Ерёмин, 2018 http://kpolyakov.spb.ru
Операции со строками
10
Срезы с отрицательными индексами:
s = "0123456789"
s1 = s[:-2] # "01234567"
N-2
s = "0123456789"
s1 = s[-6:-2] # "4567"
N-2
N-6
Алгоритмизация и программирование, язык Python, 10 класс
© К.Ю. Поляков, Е.А. Ерёмин, 2018 http://kpolyakov.spb.ru
Удаление и вставка символов
11
Вставка:
s = "0123456789"
s1 = s[:3] + "ABC" + s[3:]
Удаление:
s = "0123456789"
s1 = s[:3] + s[9:] # "0129"
"012"
"9"
"012ABC3456789"
Строка – это неизменяемый объект!
!
Алгоритмизация и программирование, язык Python, 10 класс
© К.Ю. Поляков, Е.А. Ерёмин, 2018 http://kpolyakov.spb.ru
Стандартные функции
12
Верхний/нижний регистр:
s = "aAbBcC"
s1 = s.upper() # "AABBCC"
s2 = s.lower() # "aabbcc"
Проверка на цифры:
s = "abc"
print ( s.isdigit() ) # False
s1 = "123"
print ( s1.isdigit() ) # True
… и много других.
s.count(‘C’)
Алгоритмизация и программирование, язык Python, 10 класс
© К.Ю. Поляков, Е.А. Ерёмин, 2018 http://kpolyakov.spb.ru
Поиск в строках
13
s = "Здесь был Вася."
n = s.find ( "с" ) # n = 3
if n >= 0:
print ( "Номер символа", n )
else:
print ( "Символ не найден." )
Находит первое слева вхождение подстроки!
!
s = "Здесь был Вася."
n = s.rfind ( "с" ) # n = 12
Поиск с конца строки:
Алгоритмизация и программирование, язык Python, 10 класс
© К.Ю. Поляков, Е.А. Ерёмин, 2018 http://kpolyakov.spb.ru
Самое длинное (короткое) слово
14
s = ‘Здесь был Вася’
s1=sm=''�for i in range(len(s)):� if s[i] != ' ':� s1+=s[i]� sm = max(s1, sm, key=len)� else:� s1=''�print(sm,len(sm))
Алгоритмизация и программирование, язык Python, 10 класс
© К.Ю. Поляков, Е.А. Ерёмин, 2018 http://kpolyakov.spb.ru
Самое длинное (короткое) слово
15
s = ‘Здесь был Вася’
s=s.split()�sm=max(s,key=len)�print(sm,len(sm))
Решение в стиле Python:
Алгоритмизация и программирование, язык Python, 10 класс
© К.Ю. Поляков, Е.А. Ерёмин, 2018 http://kpolyakov.spb.ru
Самое длинная последовательность
16
s=‘CCCBACCBCCCCCACCABCACCACCC’
for i in range(len(s)):
if s[i]=='C':
s1+=s[i]
ms=max(s1,ms,key=len)
else:
s1=''
print(len(ms))
Алгоритмизация и программирование, язык Python, 10 класс
© К.Ю. Поляков, Е.А. Ерёмин, 2018 http://kpolyakov.spb.ru
Рекурсивный перебор
17
Задача. В алфавите языка племени «тумба-юмба» четыре буквы: «Ы», «Ш», «Ч» и «О». Нужно вывести на экран все слова, состоящие из L букв, которые можно построить из букв этого алфавита.
Ы | ? | ? | ? |
перебор L-1 �символов
Ш | ? | ? | ? |
Ч | ? | ? | ? |
0 | ? | ? | ? |
задача для слов длины L сведена к задаче для слов длины L-1!
Алгоритмизация и программирование, язык Python, 10 класс
© К.Ю. Поляков, Е.А. Ерёмин, 2018 http://kpolyakov.spb.ru
Рекурсивный перебор
18
перебор L символов
w[0]="Ы"
# перебор последних L-1 символов
w[0]="Ш"
# перебор последних L-1 символов
w[0]="Ч"
# перебор последних L-1 символов
w[0]="О"
# перебор последних L-1 символов
Алгоритмизация и программирование, язык Python, 10 класс
© К.Ю. Поляков, Е.А. Ерёмин, 2018 http://kpolyakov.spb.ru
Рекурсивный перебор
19
# основная программа
TumbaWords ( "ЫШЧО", "", 3 )
def TumbaWords ( A, w, L ):
if len(w) == L:
print ( w )
return
for c in A:
TumbaWords ( A, w + c, L )
нужная длина слова
слово полной длины
по всем символам алфавита
алфавит
слово
Алгоритмизация и программирование, язык Python, 10 класс
© К.Ю. Поляков, Е.А. Ерёмин, 2018 http://kpolyakov.spb.ru
Рекурсивный перебор + счётчик
20
TumbaWords ( "ЫШЧО", "", 3 )
print( count )
def TumbaWords ( A, w, L ):
if len(w) == L:
print ( w )
return
for c in A:
TumbaWords ( A, w + c, L )
будем менять глобальную переменную
увеличение счётчика
count = 0
count += 1
global count
Алгоритмизация и программирование, язык Python, 10 класс
© К.Ю. Поляков, Е.А. Ерёмин, 2018 http://kpolyakov.spb.ru
Рекурсивный перебор + условие
21
TumbaWords ( "ЫШЧО", "", 3 )
print( count )
def TumbaWords ( A, w, L ):
global count
if len(w) == L:
if not "ОО" in w:
print ( w )
count += 1
return
for c in A:
TumbaWords ( A, w + c, L )
условие отбора
count = 0
if not "ОО" in w:
Алгоритмизация и программирование, язык Python, 10 класс
© К.Ю. Поляков, Е.А. Ерёмин, 2018 http://kpolyakov.spb.ru
Рекурсивный перебор + условие (функция)
22
def TumbaWords ( A, w, L ):
global count
if len(w) == L:
if valid(w):
print ( w )
count += 1
return
for c in A:
TumbaWords ( A, w + c, L )
условие отбора
if valid(w):
def valid ( s ):
if not "ОО" in w:
return True
else:
return False
return not "ОО" in w
Алгоритмизация и программирование, язык Python, 10 класс
© К.Ю. Поляков, Е.А. Ерёмин, 2018 http://kpolyakov.spb.ru
Перебор
23
k=0�for a in 'ABC':� for b in 'ABC':� for c in 'ABC':� #if (a+b+c).count('A')==1 and(a+b+c).count('B')==1 and (a+b+c).count('C')==1 :� k+=1� print(a+b+c)�print(k)
�from itertools import product
s = product('ABC',repeat=3)
for p in s:
s1 = "".join(p)
print( s1 )
�from itertools import product
For x in product(‘ABC’,’ABC’,’ABC’)
s = ‘’.join(x)
Алгоритмизация и программирование, язык Python, 10 класс
© К.Ю. Поляков, Е.А. Ерёмин, 2018 http://kpolyakov.spb.ru
Перебор
24
�from itertools import product
s = product('ABC',repeat=3)
for p in s:
s1 = "".join(p)
print( s1 )
�from itertools import product
For x in product(‘ABC’,’ABC’,’ABC’):
s = “”.join(x)
Алгоритмизация и программирование, язык Python, 10 класс
© К.Ю. Поляков, Е.А. Ерёмин, 2018 http://kpolyakov.spb.ru
модуль itertools
25
�combinations – комбинации, например,
from itertools import combinations
s = list(combinations('ABC', 2))
print( s )
// Результат: [('A', 'B'), ('A', 'C'), ('B', 'C')]
permutations – перестановки, например,
from itertools import permutations
s = list(permutations('ABC'))
print( s )
// Результат: [('A', 'B', 'C'), ('A', 'C', 'B'),
// ('B', 'A', 'C'), ('B', 'C', 'A'), ('C', 'A', 'B'),
// ('C', 'B', 'A')]
product – декартово произведение (все возможные слова заданной длины, составленные из данного алфавита), например:
from itertools import product
s = list(product('ABC',repeat=2))
print( s )
// Результат: [('A', 'A'), ('A', 'B'), ('A', 'C'), ('B', 'A'),
// ('B', 'B'), ('B', 'C'), ('C', 'A'), ('C', 'B'), ('C', 'C')]
Алгоритмизация и программирование, язык Python, 10 класс
© К.Ю. Поляков, Е.А. Ерёмин, 2018 http://kpolyakov.spb.ru
26
Все 4-буквенные слова, составленные из букв К, Л, Р, Т, записаны в алфавитном порядке и пронумерованы. Вот начало списка:
1. КККК
2. КККЛ
3. КККР
4. КККТ
……
Запишите слово, которое стоит на 67-м месте от начала списка.
�k=0
for a in 'клрт' :
for b in 'клрт' :
for c in 'клрт' :
for d in 'клрт' :
k+=1
if k==67:
print(a+b+c+d)
Алгоритмизация и программирование, язык Python, 10 класс
© К.Ю. Поляков, Е.А. Ерёмин, 2018 http://kpolyakov.spb.ru
27
Все 4-буквенные слова, составленные из букв К, Л, Р, Т, записаны в алфавитном порядке и пронумерованы. Вот начало списка:
1. КККК
2. КККЛ
3. КККР
4. КККТ
……
Запишите слово, которое стоит на 67-м месте от начала списка.
�from itertools import product
print(*list(product('КЛРТ',repeat=4))[67-1])
� s = ['К', 'Л', 'Р', 'Т‘]
s1 = ‘’
x = 66
while x:
s1 = s[(x%4)] +s
x //= 4
print(s1)
Алгоритмизация и программирование, язык Python, 10 класс
© К.Ю. Поляков, Е.А. Ерёмин, 2018 http://kpolyakov.spb.ru
28
Все 5-буквенные слова, составленные из 5 букв А, К, Л, О, Ш, записаны в алфавитном порядке.
Вот начало списка:
1. ААААА
2. ААААК
3. ААААЛ
4. ААААО
5. ААААШ
6. АААКА
……
На каком месте от начала списка стоит слово ШКОЛА?
�k=0�for a in 'АКЛОШ' :� for b in 'АКЛОШ' :� for c in 'АКЛОШ' :� for d in 'АКЛОШ' :� for f in 'АКЛОШ' :� k+=1� if (a+b+c+d+f) =='ШКОЛА':� print(k)
Алгоритмизация и программирование, язык Python, 10 класс
© К.Ю. Поляков, Е.А. Ерёмин, 2018 http://kpolyakov.spb.ru
29
Все 5-буквенные слова, составленные из 5 букв А, К, Л, О, Ш, записаны в алфавитном порядке.
Вот начало списка:
1. ААААА
2. ААААК
3. ААААЛ
4. ААААО
5. ААААШ
6. АААКА
……
На каком месте от начала списка стоит слово ШКОЛА?
�from itertools import product
s = list(map(lambda x: ''.join(x),product('АКЛОШ',repeat=5)))
print(s.index('ШКОЛА')+1)
Алгоритмизация и программирование, язык Python, 10 класс
© К.Ю. Поляков, Е.А. Ерёмин, 2018 http://kpolyakov.spb.ru
Перебор
30
Маша составляет 5-буквенные коды из букв В, У, А, Л, Ь. Каждую букву нужно использовать ровно 1 раз, при этом буква Ь не может стоять на первом месте и перед гласной. Сколько различных кодов может составить Маша?
k = 0�for a in 'ВУАЛ':� for b in 'ВУАЛЬ':� for c in 'ВУАЛЬ':� for d in 'ВУАЛЬ':� for e in 'ВУАЛЬ':� s = a + b + c + d + e� for x in s:� if s.count(x) ! = 1:� break� else:� if s.count('ЬУ') == 0 and s.count('ЬА') == 0:� k += 1�print(k)
Алгоритмизация и программирование, язык Python, 10 класс
© К.Ю. Поляков, Е.А. Ерёмин, 2018 http://kpolyakov.spb.ru
Перебор
31
Маша составляет 5-буквенные коды из букв В, У, А, Л, Ь. Каждую букву нужно использовать ровно 1 раз, при этом буква Ь не может стоять на первом месте и перед гласной. Сколько различных кодов может составить Маша?
from itertools import permutations
k = 0
for x in permutations('ВУАЛЬ'):
s = ''.join(x)
if s[0] != 'Ь' and 'ЬУ' not in s and 'ЬА' not in s:
k += 1
print(k)
Алгоритмизация и программирование, язык Python, 10 класс
© К.Ю. Поляков, Е.А. Ерёмин, 2018 http://kpolyakov.spb.ru