Занятие № 6. Применение строк для решения задач
Цель: изучить особенности реализации строк в Python; научиться применять строки при решении задач.
Теория
Строковые литералы
Строка - это последовательность пронумерованных символов. Строковые значения в Python имеют тип str. Чтобы записать строковый литерал используются одиночные и двойные кавычки:
name = 'Иван' last_name = "Иванов" print(name, last_name)
Если заключить строковый литерал в тройные кавычки, то сохраняется форматирование строк и отступов:
code = """
for i in range(1, 10):
if i == 5:
continue
print(i)
"""
print(code)
Если использовать в примере выше одиночные кавычки, то произойдёт ошибка. Python сообщит, что в строке не хватает закрывающей кавычки.
Оператор индексирования строки
Каждый символ в строке обладает порядковым номером - индексом. Нумерация символов начинается с 0 (слева направо). Отсчёт символов также идёт и справа налево, но уже с помощью отрицательных чисел. В таком случае индекс последнего символа строки равен -1. Рисунок 1 показывает пример расстановки индексов в строке Язык Python:
Чтобы обратиться к символу по его индексу используется оператор индексирования [<индекс>]:
msg = "Язык Python" print(msg[2]) # берём третий слева символ print(msg[-4]) # берём четвертый справа символ
Обращение к символу по индексу создаёт новое значение типа str, содержащее один символ. В Python нет отдельного типа для хранения символов.
Значения в строковом типе - не изменяемы. Нельзя заменить отдельные символы, обратившись к ним по индексу:
msg = "Кот" msg[1] = "и" # ошибка!
В квадратных скобках может быть любое выражение, результатом вычисления которого будет целое число:
Что будет выведено на экран в результате выполнения следующего кода:
Рисунок 1 подскажет правильный ответ.
Правильно. Отсчёт индексов начинается с нуля.
Отсчёт индексов начинается с 0 а не 1.
Выражение msg[-8] вернуло бы нам букву к. Но в примере индекс - положительное число.
В этом коде нет синтаксических ошибок.
Длина строки
Под длинной строки будем понимать количество символов в ней, включая пробелы. Чтобы узнать длину строки можно использовать функцию len():
st = "Язык Python" print(len(st))
Чтобы получить последний символ строки, хотелось бы записать:
st = "Язык Python" st[len(st)] # возникнет ошибка!
но это приведёт к ошибке. Длина строки Язык Python равна
x , а индекс последнего символа равен
x . Возникает ошибка выхода значения индекса за границу допустимых значений. Чтобы получить последний символ строки нужно из длины строки вычесть 1 или обращаться по индексу -1:
st = "Язык Python" last = st[len(st) - 1] print(last) last = st[-1] print(last)
В некоторых случаях может понадобиться получить символ стоящий в середине строки. Для этого понадобится оператор целочисленного деления //:
st = "Язык Python" print(st[len(st) // 2])
Стоит учитывать, что строка может быть пустой. В таком случае, её длина будет равна 0:
empty = "" # пустая строка print(len(empty))
Оператор получения среза
Для того, чтобы получить подстроку в Python используется оператор среза - [<начало>:<конец>]. Внутри оператора указывается начальный индекс подстроки и, через двоеточие, индекс символа, до которого проходит срез (не включая сам символ).
writers = "Ильф и Петров" print(writers[0:4]) print(writers[7:13])
Если не указать <начало> или <конец> среза, то копирование строки начнётся с первого или до последнего символа соответственно:
writers = "Ильф и Петров" print(writers[:4]) print(writers[7:])
Если пропустить и <начало> и <конец>, то получим копию строки:
writers = "Ильф и Петров" print(writers) copy = writers[:] # сохраняем копию строки print(copy)
Что будет выведено на экран в результате выполнения следующего кода:
Правильно. Мы получаем срез начиная с символа с индексом 7 и заканчивая индексом 9.
Для этого мы бы записали s[8:13].
Когда внутри [] два числа, значит мы хотим получить срез строки. Если число одно - получаем символ с этим индексом.
Для этого мы бы записали s[0:6] или s[:6] .
На самом деле, внутри [] может быть три значения, разделённых :. Это будет общая форма записи оператора среза: [<начало>:<граница>:<шаг>]. Последнее значение определяет с каким шагом нужно брать символы из строки:
word = 'тшеикфсрт' # берём символы начиная с первого и до конца строки через 1 first = word[0::2] # берём символы начиная со второго и до конца строки через 1 second = word[1::2] print(first) print(second)
Конкатенация и повторение строк
К строковым значениям применимы два арифметических оператора - сложение и умножение.
Сложение строковых значений называется конкатенацией:
name = "Иван" last_name = "Иванов" print(name + " " + last_name)
При сложении нельзя смешивать значения разных типов:
print("Год: " + 2024) # Возникнет ошибка
Числа нужно явно преобразовать в строковый тип функцией str():
print("Год: " + str(2024))
Если умножить строку на число, будет создана новая строка, в которой оригинал повторяется указанное количество раз:
print("-#-" * 5)
В этом примере получится новая строка длиной в x символов.
Оператор принадлежности in
С помощью оператора in можно выяснить входит ли подстрока в строку:
st = "Привет"
print("ри" in st)
print("по" in st)
Результат работы оператора - логическое значение. Если добавить перед in логический оператор not, то мы проверим, что подстрока не входит в строку:
st = "Привет"
print("вет" not in st)
Например, после вычисления выражения "кот" not in "Кот в мешке" мы получим значение
x
True, так как есть разница между строчными и прописными буквами.
Методы класса str
Все строковые значения являются объектами класса str. В этом можно убедится с помощью функции type(), которая возвращает тип аргумента:
s = "Скрипт" print(type(s))
Класс str обладает рядом методов, которые упрощают обработку строк.
str
| Метод | Назначение |
|---|---|
s.count(sub) |
Количество вхождений подстроки sub в строку s |
s.find(sub) |
Находит индекс первого вхождения подстроки sub в строку s |
s.replace(old, new) |
Заменяет подстроку old на new; возвращает новую строку |
s.upper() |
Преобразование всех символов в прописные; возвращает новую строку |
s.lower() |
Преобразование всех символов в строчные; возвращает новую строку |
Вот примеры использования этих методов:
s = "целым овладевают по частям"
print(s.count('a')) # количество букв 'а' в строке
print(s.find('по')) # индекс первого вхождения подстроки 'по'
s_new = s.replace(" ", "-*-") # меняем пробелы на '-*-'
print(s_new)
s_big = s.upper() # делаем все буквы прописными
print(s_big)
Все инструкции и операторы для обработки строковых значений находятся в следующей таблице:
| Инструкции и операторы | Назначение |
|---|---|
+ |
Конкатенация |
* |
Повторение |
<строка>[] |
Индексирование |
<строка>[ : ] |
Срез |
len(<строка>) |
Длина строки |
in, not in |
Нахождение в строке |
for <символ> in <строка> |
Перебор символов |
Какое значение будет хранится в переменной ty после выполнения следующего кода:
Правильно. Когда мы ищем строку больше чем из одного символа, метод find вернёт нам индекс первого символа из найденной подстроки.
Когда мы ищем строку больше чем из одного символа, метод find вернёт нам индекс первого символа из найденной подстроки а не последнего.
Метод find вернёт индекс первого вхождения подстроки. Поиск происходит слева направо.
Метод find вернёт индекс первого вхождения подстроки. Поиск происходит слева направо.
В этом коде нет синтаксических ошибок.
Что будет выведено на экран в результате выполнения следующего кода:
Мы вызываем метод upper(), который делает все буквы прописными. Но будет ли сохранён результат этих изменений?
Такой результат мог бы получиться, если использовать метод lower(), который делает все буквы строчными.
В этом коде нет синтаксической ошибки, но есть семантическая.
После ответа на все вопросы становятся доступны кнопки перехода между вопросами.
Практика обработки строк
В переменной st хранится строковое значение. Запишите результат вывода для каждой строки кода. Все символы в строке и в примерах кода записаны кириллицей.
print(st[4]) ↪︎
x
?
print(st[2:7]) ↪︎
x
?
print('р' not in st) ↪︎
x
?
print(len(st[5:])) ↪︎
x
?
print(st[0:2] + st[10] + st[4:6]) ↪︎
x
?
print(st[6]) ↪︎
x
?
print(st[3:8]) ↪︎
x
?
print('ф' in st) ↪︎
x
?
print(len(st[:5])) ↪︎
x
?
print(st[2:4] + st[0] + st[7:9]) ↪︎
x
?
print(st[3]) ↪︎
x
?
print(st[1:4]) ↪︎
x
?
print('т' in st) ↪︎
x
?
print(len(st[2:])) ↪︎
x
?
print(st[:2] + st[4] + st[3]) ↪︎
x
?
print(st[5]) ↪︎
x
?
print(st[1:6]) ↪︎
x
?
print('а' in st) ↪︎
x
?
print(len(st[:4])) ↪︎
x
?
print(st[6:8] + st[0] + st[10]) ↪︎
x
?
print(st[7]) ↪︎
x
?
print(st[0:4]) ↪︎
x
?
print('г' in st) ↪︎
x
?
print(len(st[3:])) ↪︎
x
?
print(st[1:3] + st[5] + st[2:4]) ↪︎
x
?
print(st[2]) ↪︎
x
?
print(st[5:9]) ↪︎
x
?
print('к' not in st) ↪︎
x
?
print(len(st[:6])) ↪︎
x
?
print(st[0] + st[6:8] + st[3]) ↪︎
x
?
print(st[8]) ↪︎
x
?
print(st[4:9]) ↪︎
x
?
print('м' in st) ↪︎
x
?
print(len(st[2:])) ↪︎
x
?
print(st[5:7] + st[1] + st[0]) ↪︎
x
?
print(st[0]) ↪︎
x
?
print(st[3:6]) ↪︎
x
?
print('ц' in st) ↪︎
x
?
print(len(st[:5])) ↪︎
x
?
print(st[4:6] + st[2] + st[1:3]) ↪︎
x
?
print(st[4]) ↪︎
x
?
print(st[1:5]) ↪︎
x
?
print('о' in st) ↪︎
x
?
print(len(st[3:])) ↪︎
x
?
print(st[2] + st[5] + st[0:2]) ↪︎
x
?
print(st[3]) ↪︎
x
?
print(st[0:3]) ↪︎
x
?
print('с' not in st) ↪︎
x
?
print(len(st[:4])) ↪︎
x
?
print(st[4:] + st[1] + st[2]) ↪︎
x
?
print(st[2]) ↪︎
x
?
print(st[1:4]) ↪︎
x
?
print('с' in st) ↪︎
x
?
print(len(st[1:])) ↪︎
x
?
print(st[3] + st[:1] + st[2]) ↪︎
x
?
print(st[5]) ↪︎
x
?
print(st[2:5]) ↪︎
x
?
print('у' in st) ↪︎
x
?
print(len(st[:3])) ↪︎
x
?
print(st[1:3] + st[4] + st[0]) ↪︎
x
?
print(st[1]) ↪︎
x
?
print(st[4:7]) ↪︎
x
?
print('с' in st) ↪︎
x
?
print(len(st[2:])) ↪︎
x
?
print(st[0] + st[5] + st[3:5]) ↪︎
x
?
print(st[6]) ↪︎
x
?
print(st[3:7]) ↪︎
x
?
print('м' not in st) ↪︎
x
?
print(len(st[:5])) ↪︎
x
?
print(st[2:4] + st[7] + st[1]) ↪︎
x
?
Примеры
Познакомьтесь с готовыми решениями задач. Ответьте на вопросы после кода решения каждой задачи.
Пример № 1 (ex01.py)
Напишите программу, которая преобразует строку с датой из формата
мм/дд/ггггвдд.мм.гггг. Если номер дня или месяца состоит из одной цифры, при вводе слева записывается ноль.
Примеры работы программы:
мм/дд/гггг: <{03/18/2026}> ++enter++
18.03.2026мм/дд/гггг: <{07/04/2012}> ++enter++
04.07.2012Получим отдельные компоненты исходной даты (день, месяц, год) с помощью оператора x среза. Этот оператор в Python записывается с помощью x квадратных скобок.
Пример № 2 (ex02.py)
Напишите программу, которая из введённых имени, фамилии и номера группы студента составит логин для доступа в ресурсный центр. Логин должен быть результатом сложения первых трёх букв имени и фамилии и последних четырёх символов в номере группы. Если символов в имени, фамилии или номере группы меньше чем требуется, берётся вся строка.
Примеры работы программы:
Имя: <{Альберт}> ++enter++
Фамилия: <{Эйнштейн}> ++enter++
Номер группы: <{240425}> ++enter++
Логин: АльЭйн0425Имя: <{Георг}> ++enter++
Фамилия: <{Ом}> ++enter++
Номер группы: <{25}> ++enter++
Логин: ГеоОм25Получим отдельные компоненты логина помощью оператора среза. Объединим компоненты логина с помощью операции сложения строк, также называемой
x
конкатенацией. Операция сложения строк в Python реализуется с помощью оператора
x
+.
Решение задачи:
name = input("Имя: ")
last_name = input("Фамилия: ")
group = input("Номер группы: ")
p1 = name[0:3] # первые три символа имени
p2 = last_name[:3] # первые три символа фамилии
p3 = group[-4:] # последние четыре символа группы
# используем конкатенацию строк
login = p1 + p2 + p3
print("Логин:", login)Пример № 3 (ex02.py)
Посчитайте сумму цифр в строке, введённой с клавиатуры.
Примеры работы программы:
Введите строку: <{ab12cd3e}> ++enter++
Сумма равна 6Введите строку: <{без цифр}> ++enter++
Сумма равна 0nums = input("Введите строку: ")
# переменная-аккумулятор для накопления суммы
summa = 0
# перебираем все символы в строке nums
# на каждом шаге цикла очередной символ
# будет находится в переменной-цикла ch
for ch in nums:
# если очередной символ в ch - цифра...
if ch.isdigit():
# увеличиваем сумму на значение цифры
summa = summa + int(ch)
print("Сумма равна", summa)Задания для самостоятельной работы
Решите следующие задачи самостоятельно.
Задание № 1 (sam01.py)
С клавиатуры вводятся имя, фамилия и отчество. Выведите на экран текст с инициалами.
Пример работы программы:
Фамилия: <{Алферов}> ++enter++
Имя: <{Жорес}> ++enter++
Отчество: <{Иванович}> ++enter++
Ж.И. АлферовЗадание № 2 (sam02.py)
С клавиатуры вводится строка, которая содержит строчные буквы, пробелы и знаки препинания. Слова разделены одним пробелом. Посчитайте и выведите на экран количество букв и слов в строке.
Примеры работы программы:
Строка: <{уча других, учусь сам.}> ++enter++
слов: 4, букв: 17Строка: <{спокойствие}> ++enter++
слов: 1, букв: 11count() (Таблица 1).
Задание № 3 (sam03.py)
Создайте программу, с помощью которой можно заменить одно слово на другое. Пользователь вводит строку. После этого программа запрашивает слово, которое нужно заменить и слово для замены. Регистр слов важен. После замены, программа выводит новую строку и количество произведённых замен.
Пример работы программы:
Строка: <{Группа 240424. Задания для 240424.}> ++enter++
Заменить: <{240424}> ++enter++
На: <{240425}> ++enter++
Новый текст: Группа 240425. Задания для 240425.
Количество замен: 2Задание № 4 (sam04.py)
Дана строка. Посчитайте количество гласных и согласных букв в ней. Все буквы в строке - строчные.
Примеры работы программы:
Строка: <{телескоп}> ++enter++
Гласных букв: 3
Согласных букв: 5Строка: <{123!@#}> ++enter++
Гласных букв: 0
Согласных букв: 0Задание № 5 (sam05.py)
Напишите программу, которая проверяет, подходит ли введённая строка в качестве пароля. Требования к паролю:
- минимальная длина - 8 символов;
- содержит минимум 3 цифры;
- не содержит пробелов.
Если пароль не подходит, программа выводит причину.
Примеры работы программы:
Введите пароль: <{ps123}> ++enter++
Меньше 8 символовВведите пароль: <{passw_12}> ++enter++
Меньше 3 цифрВведите пароль: <{passw 123}> ++enter++
Есть пробелыВведите пароль: <{whitehat123}> ++enter++
Пароль whitehat123 подходитЗадание № 6 (sam06.py)
Пользователь вводит друг за другом два слова. Программа должна определить, можно ли из букв слова с наибольшим количеством букв, составить слово с наименьшим количеством букв.
Примеры работы программы:
Введите первое слово: <{око}> ++enter++
Введите второе слово: <{окно}> ++enter++
Из слова окно можно составить слово окоВведите первое слово: <{программа}> ++enter++
Введите второе слово: <{строка}> ++enter++
Составить нельзя