1 of 31

Программирование на языке Python

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

1

© К.Ю. Поляков, Е.А. Ерёмин, 2018 http://kpolyakov.spb.ru

2 of 31

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

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 of 31

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

3

Ввод с клавиатуры:

s = input ( "Введите имя: " )

Изменение строки:

s[4] = "a"

Строка – это неизменяемый объект!

!

... но можно составить новую строку:

s1 = s + "a"

Алгоритмизация и программирование, язык Python, 10 класс

© К.Ю. Поляков, Е.А. Ерёмин, 2018 http://kpolyakov.spb.ru

4 of 31

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

4

s = input( "Введите строку:" )

s1 = "" # строка-результат

for i in s:

if i == "а":

i= "б"

s1 = s1 + i

print ( s1 )

Задача: заменить в строке все буквы "а" на буквы "б".

перебрать все символы в строке

добавить символ к строке-результату

Строка – это неизменяемый объект!

!

Алгоритмизация и программирование, язык Python, 10 класс

© К.Ю. Поляков, Е.А. Ерёмин, 2018 http://kpolyakov.spb.ru

5 of 31

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 of 31

Сравнение строк

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 of 31

Сравнение строк

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 of 31

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

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 of 31

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

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 of 31

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

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 of 31

Удаление и вставка символов

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 of 31

Стандартные функции

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 of 31

Поиск в строках

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 of 31

Самое длинное (короткое) слово

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 of 31

Самое длинное (короткое) слово

15

s = ‘Здесь был Вася’

s=s.split()�sm=max(s,key=len)�print(sm,len(sm))

Решение в стиле Python:

Алгоритмизация и программирование, язык Python, 10 класс

© К.Ю. Поляков, Е.А. Ерёмин, 2018 http://kpolyakov.spb.ru

16 of 31

Самое длинная последовательность

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 of 31

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

17

Задача. В алфавите языка племени «тумба-юмба» четыре буквы: «Ы», «Ш», «Ч» и «О». Нужно вывести на экран все слова, состоящие из L букв, которые можно построить из букв этого алфавита.

Ы

?

?

?

перебор L-1 �символов

Ш

?

?

?

Ч

?

?

?

0

?

?

?

задача для слов длины L сведена к задаче для слов длины L-1!

Алгоритмизация и программирование, язык Python, 10 класс

© К.Ю. Поляков, Е.А. Ерёмин, 2018 http://kpolyakov.spb.ru

18 of 31

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

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 of 31

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

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 of 31

Рекурсивный перебор + счётчик

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 of 31

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

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 of 31

Рекурсивный перебор + условие (функция)

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 of 31

Перебор

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 of 31

Перебор

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

25 of 31

модуль 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 of 31

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 of 31

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 of 31

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 of 31

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 of 31

Перебор

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 of 31

Перебор

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