ББК 32.973.2-018.
1
УДК 004.43
З-63
Зингаро Даниэль
З-63 Python без проблем: решаем реальные задачи и пишем полезный код. — СПб.:
Питер, 2023. — 336 с.: ил. — (Серия «Библиотека программиста»).
ISBN 978-5-4461-1920-2
Компьютеры — это мощные машины для решения задач, способные делать практически все, если
им дать правильные инструкции. Вот тут-то и приходит на помощь программирование. Эта книга
поможет начинающим питонистам сразу создавать программы, поскольку знакомит с языком через
решение задач, которые использовались на реальных соревнованиях по кодингу.
Практикуясь в использовании основных функций, функций и методов, вы разберетесь со структу-
рами данных, алгоритмами и другими основополагающими аспектами программирования, полезными
на любом языке.
К концу книги вы не только овладеете Python, но и научитесь тому типу мышления, который
необходим для решения задач. Потому что языки программирования приходят и уходят, а способ
решения проблем — нет!
16+ (В соответствии с Федеральным законом от 29 декабря 2010 г. № 436-ФЗ.)
ББК 32.973.2-018.1
УДК 004.43
Права на издание получены по соглашению с No Starch Press. Все права защищены. Никакая часть данной книги
не может быть воспроизведена в какой бы то ни было форме без письменного разрешения владельцев авторских
прав.
Информация, содержащаяся в данной книге, получена из источников, рассматриваемых издательством как на-
дежные. Тем не менее, имея в виду возможные человеческие или технические ошибки, издательство не может
гарантировать абсолютную точность и полноту приводимых сведений и не несет ответственности за возможные
ошибки, связанные с использованием книги. Издательство не несет ответственности за доступность материалов,
ссылки на которые вы можете найти в этой книге. На момент подготовки книги к изданию все ссылки на интернет-
ресурсы были действующими.
ISBN 978-1718501324 англ. © 2021 by Daniel Zingaro. Learn to Code by Solving Problems: A Python
Programming Primer, ISBN 9781718501324,
published by No Starch Press Inc. 245 8th Street, San Francisco,
California United States 94103.
Russian edition published under license by No Starch Press Inc.
ISBN 978-5-4461-1920-2 © Перевод на русский язык ООО «Прогресс книга», 2022
© Издание на русском языке, оформление ООО «Прогресс книга», 2022
© Серия «Библиотека программиста», 2022
Оглавление
Об авторе...................................................... 18
О научном редакторе............................................. 18
Благодарности.................................................. 19
Введение....................................................... 20
Интернет-ресурсы............................................. 21
Для кого предназначена книга.................................... 21
Зачем изучать Python........................................... 21
Установка Python.............................................. 22
Windows................................................. 22
macOS................................................... 23
Linux..................................................... 23
Как читать эту книгу............................................ 23
Сайты с задачами для программистов............................... 24
Создание учетной записи........................................ 25
DMOJ................................................... 25
Timus.................................................... 26
USACO.................................................. 26
Об этой книге................................................. 26
От издательства............................................... 28
Глава 1. Приступим к работе....................................... 29
Что мы будем делать............................................ 29
Оболочка Python.............................................. 31
Windows................................................. 31
macOS................................................... 32
Linux..................................................... 33
Задача 1. Количество слов........................................34
Постановка задачи.......................................... 34
Входные данные............................................ 34
Выходные данные........................................... 34
Оглавление 7
Строки...................................................... 34
Представление строк........................................ 34
Строковые операторы....................................... 35
Строковые методы.......................................... 36
Целые числа и числа с плавающей точкой............................ 38
Переменные............................................... 40
Оператор присваивания...................................... 40
Изменение значений переменных............................... 41
Подсчет слов с использованием переменной.......................... 43
Чтение ввода от пользователя..................................... 43
Вывод результата.............................................. 44
Решение задачи: полная программа на Python......................... 45
Запуск текстового редактора.................................. 45
Программа............................................... 46
Запуск программы.......................................... 46
Отправка на сайт........................................... 47
Задача 2. Объем конуса..........................................48
Постановка задачи.......................................... 48
Входные данные............................................ 48
Выходные данные........................................... 48
Усложняем математику.......................................... 48
Доступ к PI................................................ 49
Степень.................................................. 49
Преобразование между строками и целыми числами.................... 50
Решение задачи............................................... 52
Резюме..................................................... 53
Упражнения.................................................. 53
Примечания.................................................. 54
Глава 2. Принятие решений........................................ 55
Задача 3. Команда-победитель....................................55
Постановка задачи.......................................... 55
Входные данные............................................ 56
Выходные данные........................................... 56
Условное выполнение........................................... 56
Логический тип................................................ 57
8 Оглавление
Операторы сравнения.......................................... 58
Оператор if.................................................. 61
Одиночный оператор if....................................... 61
Составной оператор с elif..................................... 62
Оператор if с оператором else................................. 63
Решение задачи............................................... 65
Задача 4. Телемаркетологи........................................67
Постановка задачи.......................................... 68
Входные данные............................................ 68
Выходные данные........................................... 68
Логические операторы.......................................... 68
Оператор or............................................... 68
Оператор and............................................. 69
Оператор not.............................................. 70
Решение задачи............................................... 71
Комментарии................................................. 73
Перенаправление ввода и вывода.................................. 74
Резюме..................................................... 76
Упражнения.................................................. 76
Примечания.................................................. 76
Глава 3. Повторяющийся код: определенные циклы....................... 77
Задача 5. Три чашки.............................................77
Постановка задачи.......................................... 77
Входные данные............................................ 78
Выходные данные........................................... 78
Зачем нужны циклы............................................ 78
Цикл for..................................................... 79
Вложенные операторы.......................................... 82
Решение задачи............................................... 84
Задача 6. Занятые места......................................... 86
Постановка задачи.......................................... 86
Входные данные............................................ 86
Выходные данные........................................... 87
Новый вид циклов.............................................. 87
Оглавление 9
Индексирование.............................................. 88
Функция range и циклы.......................................... 90
Использование функции range для перебора индексов.................. 92
Решение задачи............................................... 93
Задача 7. Тарифный план.........................................94
Постановка задачи.......................................... 94
Входные данные............................................ 94
Выходные данные........................................... 95
Чтение ввода в цикле........................................... 95
Решение задачи............................................... 95
Резюме..................................................... 98
Упражнения.................................................. 98
Примечания.................................................. 98
Глава 4. Повторяющийся код: неопределенные циклы..................... 99
Задача 8. Игровые автоматы......................................99
Постановка задачи.......................................... 99
Входные данные........................................... 100
Выходные данные.......................................... 100
Пример тестового случая....................................... 100
Ограничения цикла for......................................... 102
Цикл while.................................................. 103
Использование циклов while.................................. 103
Вложенные циклы.......................................... 107
Использование логических операторов.......................... 108
Решение задачи.............................................. 108
Оператор деления по модулю.................................... 111
Форматированные строки...................................... 114
Задача 9. Список воспроизведения................................116
Постановка задачи......................................... 116
Входные данные........................................... 116
Выходные данные.......................................... 117
Срезы строк................................................. 117
Решение задачи.............................................. 120
10 Оглавление
Задача 10. Секретное предложение.......................................................................122
Постановка задачи......................................... 122
Входные данные........................................... 122
Выходные данные.......................................... 122
Еще одно ограничение циклов for................................. 122
Перебор индексов циклом while.................................. 124
Решение задачи.............................................. 126
Операторы break и continue..................................... 127
Оператор break........................................... 127
Оператор continue......................................... 129
Резюме.................................................... 130
Упражнения................................................. 130
Примечания................................................. 131
Глава 5. Упорядоченные значения и списки............................ 132
Задача 11. Деревни у дороги.....................................132
Постановка задачи......................................... 132
Входные данные........................................... 133
Выходные данные.......................................... 133
Так зачем нам списки?......................................... 133
Списки..................................................... 135
Изменяемость списков......................................... 137
Введение в методы............................................ 139
Методы списков.............................................. 141
Добавление в список....................................... 142
Сортировка списков........................................ 143
Удаление значений из списка................................. 144
Решение задачи.............................................. 145
Как избежать повторов кода: еще два решения....................... 147
Нужен размерчик побольше.................................. 148
Составление списка размеров................................ 149
Задача 12. Студенческая поездка.................................149
Постановка задачи......................................... 150
Входные данные........................................... 150
Оглавление 11
Выходные данные.......................................... 150
Маленькая хитрость........................................ 150
Разделение строк и объединение списков........................... 151
Преобразование строки в список.............................. 151
Объединение списка в строку................................. 152
Изменение значений списка..................................... 152
Решение задачи (большей ее части)............................... 153
Тестовый пример.......................................... 154
Код.................................................... 155
Теперь про хитрость........................................... 156
Рассмотрим пример........................................ 157
Другие операции над списками................................ 157
Нахождение индекса максимума............................... 158
Решение задачи........................................... 158
Задача 13. Бонус «Бейкера»......................................160
Постановка задачи......................................... 160
Входные данные........................................... 160
Выходные данные.......................................... 160
Табличные данные............................................ 161
Тестовый пример.......................................... 161
Вложенные списки......................................... 162
Решение задачи.............................................. 164
Резюме.................................................... 166
Упражнения................................................. 166
Примечания................................................. 167
Глава 6. Пишем собственные функции............................... 168
Задача 14. Карточная игра.......................................168
Постановка задачи......................................... 168
Входные данные........................................... 169
Выходные данные.......................................... 169
Тестовый пример............................................. 170
Определение и вызов функций................................... 172
Функции без аргументов..................................... 172
Функции с аргументами..................................... 173
12 Оглавление
Именованные аргументы.................................... 175
Локальные переменные..................................... 176
Изменяемые параметры..................................... 177
Возвращаемые значения..................................... 178
Документация по функциям...................................... 181
Решение задачи.............................................. 182
Задача 15. Фигурки.............................................185
Постановка задачи......................................... 185
Входные данные........................................... 185
Выходные данные.......................................... 186
Моделирование коробок....................................... 186
Нисходящее проектирование.................................... 186
Выполним проектирование................................... 186
Верхний уровень.......................................... 187
Подзадача 1. Чтение входных данных........................... 189
Подзадача 2. Проверяем, все ли коробки упорядочены.............. 190
Подзадача 3. Оставить в коробках только крайние фигурки........... 193
Подзадача 4. Сортируем коробки.............................. 194
Подзадача 5. Определить, организованы ли коробки............... 195
Собираем все вместе....................................... 197
Резюме.................................................... 201
Упражнения................................................. 201
Примечания................................................. 201
Глава 7. Чтение из файлов и запись в них............................. 203
Задача 16. Форматирование эссе.................................203
Постановка задачи......................................... 204
Входные данные........................................... 204
Выходные данные.......................................... 204
Работа с файлами............................................ 204
Открытие файла........................................... 204
Чтение из файла........................................... 207
Запись в файл............................................ 210
Решение задачи.............................................. 211
Тестовый пример.......................................... 212
Код.................................................... 212
Оглавление 13
Задача 17. Посевная на ферме....................................214
Постановка задачи......................................... 215
Входные данные........................................... 215
Выходные данные.......................................... 215
Тестовый пример............................................. 216
Нисходящее проектирование.................................... 219
Верхний уровень.......................................... 219
Подзадача 1. Прочитать входные данные......................... 220
Подзадача 2. Определить коров............................... 222
Подзадача 3. Исключение недоступных типов травы................ 224
Подзадача 4. Выбираем тип травы с наименьшим номером........... 226
Подзадача 5. Запись вывода.................................. 227
Собираем все вместе....................................... 229
Резюме.................................................... 233
Упражнения................................................. 233
Примечания................................................. 234
Глава 8. Организация данных с помощью множеств и словарей............ 235
Задача 18. Адреса электронной почты.............................235
Постановка задачи......................................... 236
Входные данные........................................... 236
Выходные данные.......................................... 236
Использование списков........................................ 237
Очистка адреса электронной почты............................. 237
Основная программа....................................... 239
Эффективность поиска по списку................................. 240
Множества.................................................. 242
Методы множеств............................................. 244
Эффективность поиска по множеству.............................. 246
Решение задачи.............................................. 247
Задача 19. Общие слова.........................................248
Постановка задачи......................................... 248
Входные данные........................................... 248
Выходные данные.......................................... 249
Тестовый пример............................................. 249
Словари.................................................... 250
14 Оглавление
Индексирование словарей...................................... 253
Перебор словарей в цикле...................................... 255
Инвертирование словаря....................................... 258
Решение задачи.............................................. 260
Код.................................................... 260
Добавление суффикса...................................... 262
Поиск k-го по частоте слова.................................. 262
Основная программа....................................... 263
Задача 20. Города и штаты.......................................264
Постановка задачи......................................... 264
Входные данные........................................... 264
Выходные данные.......................................... 265
Тестовый пример............................................. 265
Решение задачи.............................................. 267
Резюме.................................................... 269
Упражнения................................................. 269
Примечания................................................. 270
Глава 9. Разработка алгоритмов полного поиска....................... 271
Задача 21. Спасатели...........................................272
Постановка задачи......................................... 272
Входные данные........................................... 272
Выходные данные.......................................... 272
Тестовый пример............................................. 273
Решение задачи.............................................. 274
Увольнение одного спасателя................................. 274
Основная программа....................................... 275
Эффективность программы................................... 276
Задача 22. Лыжная база.........................................278
Постановка задачи......................................... 278
Входные данные........................................... 278
Выходные данные.......................................... 279
Тестовый пример............................................. 279
Решение задачи.............................................. 281
Определение стоимости одного диапазона....................... 281
Основная программа....................................... 282
Оглавление 15
Задача 23. Коровий бейсбол.....................................284
Постановка задачи......................................... 284
Входные данные........................................... 284
Выходные данные.......................................... 284
Использование трех вложенных циклов............................. 285
Код.................................................... 285
Эффективность программы................................... 287
Сортировка прежде всего....................................... 288
Код.................................................... 288
Эффективность нашей программы.............................. 291
Модули Python............................................... 292
Модуль bisect................................................ 294
Решение задачи.............................................. 296
Резюме.................................................... 298
Упражнения................................................. 299
Примечания................................................. 299
Глава 10. «О большое» и эффективность программ...................... 301
Проблема со сроками......................................... 302
«О большое»................................................ 304
Постоянное время......................................... 304
Линейное время........................................... 306
Квадратичное время........................................ 310
Кубическое время.......................................... 313
Несколько переменных...................................... 314
Логарифмическое время..................................... 316
Время nlog n.............................................. 317
Обработка вызовов функций................................. 319
Резюме.................................................. 321
Задача 24. Самый длинный шарф.................................322
Постановка задачи......................................... 322
Входные данные........................................... 322
Выходные данные.......................................... 322
Тестовый пример............................................. 323
Алгоритм 1.................................................. 323
Алгоритм 2.................................................. 324
16 Оглавление
Задача 25. Раскрашивание лент..................................327
Постановка задачи......................................... 327
Входные данные........................................... 327
Выходные данные.......................................... 327
Тестовый пример............................................. 328
Решение задачи.............................................. 328
Резюме.................................................... 332
Упражнения................................................. 332
Примечания....................................................333
Послесловие................................................... 334
1
Приступим к работе
Программирование — это написание кода для решения не-
которой задачи. Этим мы и займемся. Поэтому не будем
сначала изучать концепции Python, а затем формулировать
задачи. Напротив, я сформулирую задачу, а уже на ее основе
стану вводить концепции, которые нужно изучить.
В этой главе мы решим две задачи: определим количество слов в строке (этим же
занимаются функции подсчета слов в текстовом редакторе) и вычислим объем
конуса. Для этого вам придется познакомиться с несколькими концепциями
Python. В какой-то момент вы можете почувствовать, что вам нужно больше
подробностей, чтобы полностью понять приведенный материал и то, как все это
сочетается друг с другом при разработке программы на Python. Не волнуйтесь:
в следующих главах мы вернемся к наиболее важным понятиям и подробно
остановимся на них.
Что мы будем делать
Как упоминалось во введении, мы будем решать задачи из области соревнователь-
ного программирования с использованием языка Python. Все представленные
задачи по соревновательному программированию можно найти на одном из
сайтов с задачами для программистов. Я предполагаю, что вы следовали ин-
струкциям, приведенным во введении: установили Python и зарегистрировались
на сайтах.
Мы напишем программы для решения всех приведенных задач. У каждой из
них есть входные данные (ввод) определенного типа, которые программа будет
30 Глава 1. Приступим к работе
получать, и ожидаемые выходные данные (вывод), тоже определенного типа.
Будем считать, что программа правильно решает задачу, если может принимать
любые допустимые входные данные и выдает в ответ правильные выходные
данные.
В целом возможных входных данных могут быть миллионы или миллиарды. Каж-
дый вариант входных данных называется экземпляром задачи. Например, в первой
задаче, которую мы решим, входные данные — это строка текста, например hello
there или bbaabbb aa abab. Наша цель — подсчитать и вывести количество слов
в строке. Одна из самых крутых вещей в программировании заключается в том,
что зачастую небольшой объем универсального кода позволяет решить бесконеч-
ное количество типовых задач. И не имеет значения, будет в строке два слова, три
или 50 — программа всегда будет делать это правильно.
Наши программы будут выполнять три задачи.
Чтение входных данных. Необходимо определить конкретный экземпляр
задачи, которую требуется решить, поэтому сначала мы считываем предо-
ставленные входные данные.
Обработка. Мы обрабатываем входные данные, чтобы определить правиль-
ные выходные данные.
Запись вывода. Решив задачу, выдаем желаемый вывод.
Границы между шагами бывают размытыми — иногда нам, возможно, придется че-
редовать обработку с получением результата. Но все равно работа в целом делится
на эти три этапа.
Вы, вероятно, ежедневно пользуетесь программами, работающими в соответствии
с моделью «ввод — обработка — вывод». Рассмотрим программу-калькулятор: вы
вводите формулу (входные данные), программа обрабатывает числа (обработка),
а затем отображает ответ (выходные данные). Или вспомним о поисковых системах
в Интернете: вы вводите поисковый запрос (входные данные), поисковая система
определяет наиболее релевантные результаты (обработка) и отображает их (вы-
ходные данные).
Сравните приведенные примеры программ с интерактивными программами, ко-
торые также выполняют ввод, обработку и вывод. Например, для набора текста
этой книги я использую текстовый редактор. Когда я набираю символ, редактор
в ответ добавляет его в мой документ. И мне не нужно печатать сразу весь доку-
мент, чтобы увидеть результат, — редактор интерактивно отображает его по мере
печатания. В этой книге мы не будем писать интерактивные программы, но если
после изучения этой книги вы заинтересуетесь их созданием, то радуйтесь: Python
определенно подходит для этого.
Оболочка Python 31
Тексты всех задач можно найти здесь и на сайте. Однако они не всегда совпадают,
потому что я переписал их ради единообразия внутри книги. Но не волнуйтесь:
в моих формулировках вы найдете ту же информацию, что и в официальной по-
становке задачи.
Оболочка Python
Для каждой задачи из книги мы хотим написать программу и сохранить ее в от-
дельном файле. Но для начала неплохо было бы знать, какую программу писать!
Для решения многих задач вам нужно будет изучить пару новых функций Python.
Лучший способ поэкспериментировать с функциями Python — использовать обо-
лочку Python. Это интерактивная среда, в которой можно ввести Python и нажать
клавишу Enter, а Python в ответ выведет результат. Как только вы получите до-
статочно знаний, чтобы решить текущую задачу, можно будет перестать работать
с оболочкой и начать писать решение в текстовом файле.
Для начала создайте на рабочем столе новую папку и назовите ее programming.
Будем использовать ее для хранения результатов работы по ходу изучения книги.
Сейчас мы откроем эту папку и запустим оболочку Python. Чтобы запустить обо-
лочку Python в своей операционной системе, выполните следующие действия.
Windows
Если вы работаете в Windows, сделайте следующее.
1. Удерживая нажатой клавишу Shift, щелкните правой кнопкой мыши на папке
с вашими программами, например programming.
2. В появившемся меню выберите пункт Open PowerShell window here (Открыть
окно PowerShell здесь). Если в контекстном меню нет такого пункта, выберите
Open command window here (Открыть окно команд здесь).
3. В появившемся окне вы увидите строку, которая заканчивается знаком
«больше» (>). Это приглашение операционной системы, и теперь она ждет,
когда вы наберете команду. Вводить здесь нужно именно команды опера-
ционной системы, а не код Python. Обязательно нажимайте клавишу Enter
после каждой команды.
4. Вы находитесь в папке programming. Можете ввести команду dir (от англ. di
rectory — «папка»), если хотите посмотреть содержимое папки. Впрочем,
пока вы не увидите никаких файлов, потому что мы их еще не создавали.
5. Введите команду python для запуска оболочки Python.
32 Глава 1. Приступим к работе
Запустив оболочку Python, вы увидите что-то вроде этого:
Python 3.9.2 (tags/v3.9.2:1a79785, Feb 19 2021, [Link])
[MSC v.1928 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>>
Здесь важно, чтобы в первой строке была указана версия Python не ниже 3.6. Если
у вас установлена более старая версия, особенно 2.x, или Python не загружается
вообще, установите последнюю версию Python, следуя инструкциям, приведенным
во введении.
Внизу этого окна вы увидите приглашение вида >>>. Здесь мы будем писать код
Python. Никогда не вводите символы >>> сами. Закончив писать программу, вы
можете нажать сочетание клавиш Сtrl+Z, а затем Enter, чтобы выйти.
macOS
В macOS сделайте следующее.
1. Откройте приложение Terminal. Для этого нажмите сочетание клавиш
Command+Пробел, введите слово terminal, а затем дважды щелкните на ре-
зультате.
2. В открывшемся окне вы увидите строку, оканчивающуюся символом дол-
лара ($). Это приглашение операционной системы, теперь можете ввести
команду. Здесь вводятся именно команды операционной системы, а не код
Python. Обязательно нажимайте клавишу Enter после каждой команды.
3. Можете ввести команду ls, чтобы получить список файлов, находящихся
в текущей папке. Вы увидите свой рабочий стол.
4. Введите команду cd Desktop, чтобы перейти в папку рабочего стола. Команда
cd означает change directory, то есть «перейти в другую папку».
5. Введите команду cd programming, чтобы перейти в папку programming.
6. Теперь введите команду python3, чтобы запустить оболочку Python (можно
попробовать ввести просто python, но в результате может запуститься старая
версия Python 2, которая не подходит для работы с этой книгой).
Когда вы запустите оболочку Python, появится что-то вроде этого:
Python 3.9.2 (default, Mar 15 2021, [Link])
[Clang 11.0.0 (clang-1100.0.33.17)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>>
Оболочка Python 33
Здесь важно, что в первой строке указана версия Python не ниже 3.6. Если у вас
более старая версия, особенно 2.x, или Python не загружается вообще, установите
последнюю версию Python, следуя инструкциям, данным во введении.
Внизу этого окна увидите приглашение >>>. Здесь вы набираете код Python. Ни-
когда не вводите символы >>> самостоятельно. Если закончили программирование,
можете нажать сочетание клавиш Ctrl+D, чтобы выйти.
Linux
Порядок действий для Linux таков.
1. Щелкните правой кнопкой мыши на папке programming.
2. В появившемся меню выберите пункт Open in Terminal (Открыть в терминале)
(а можно сначала открыть консоль и перейти в папку programming, если вам
так удобнее).
3. В открывшемся окне вы увидите строку, оканчивающуюся символом доллара
($). Это приглашение операционной системы, теперь можете ввести команду.
Здесь вводятся именно команды операционной системы, а не код Python.
Обязательно нажимайте клавишу Enter после каждой команды.
4. Вы находитесь в папке programming. Можете ввести команду ls, чтобы про-
смотреть ее содержимое. Но пока никаких файлов в ней быть не должно,
потому что мы их еще не создавали.
5. Теперь введите команду python3, чтобы запустить оболочку Python (можно
попробовать ввести просто python, но в результате может запуститься старая
версия Python 2, которая не подходит для работы с этой книгой).
Когда вы запустите оболочку Python, появится что-то вроде этого:
Python 3.9.2 (default, Feb 20 2021, [Link])
[GCC 7.5.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>
Важно, чтобы версия Python в первой строке была не ниже 3.6. Если у вас более
старая версия, особенно 2.x, или Python не загружается вообще, установите по-
следнюю версию Python, следуя инструкциям, приведенным во введении.
Внизу этого окна вы увидите приглашение Python вида >>>. Здесь мы будем писать
код Python. Никогда не вводите символы >>> сами. Закончив писать программу,
можете нажать сочетание клавиш Сtrl+D, чтобы выйти.
34 Глава 1. Приступим к работе
Задача 1. Количество слов
Пришло время для нашей первой задачи! На Python напишем небольшую програм-
му для подсчета слов. Вы узнаете, как считывать входные данные пользователя,
обрабатывать их для решения задачи и выводить результат. А также узнаете, как
управлять текстом и числами в своих программах, использовать встроенные опе-
рации Python и сохранять промежуточные результаты на пути к решению.
Это задача с сайта DMOJ, код dmopc15c7p2.
Постановка задачи
Подсчитайте количество слов во входных данных. В этой задаче словом будет счи-
таться любая последовательность строчных букв. Например, «привет» — это слово,
но и всякие бессвязные наборы букв вроде «ыфафыва» тоже считаются словами.
Входные данные
Входными данными будет одна строка текста, состоящая из строчных букв и про-
белов. Между каждой парой слов будет ровно один пробел, при этом перед первым
словом и после последнего слова их не будет.
Максимальная длина строки — 80 символов.
Выходные данные
Количество слов в строке.
Строки
Фундаментальным строительным блоком программ на Python являются значения.
У каждого значения есть тип, определяющий операции, которые над ним можно
проводить. В задаче подсчета слов мы работаем со строкой текста. В Python текст
хранится как строковое значение, поэтому нам нужно побольше узнать о том, что
это значит. Чтобы решить задачу, требуется узнать количество слов в тексте, а для
обозначения количества следует узнать о числовых значениях. Начнем со строк.
Представление строк
Строка — это тип в Python, который используется для работы с текстом. Чтобы
записать строковое значение, нужно поместить его в одинарные кавычки. В обо-
лочке Python введите следующее:
Строки 35
>>> 'hello'
'hello'
>>> 'a bunch of words'
'a bunch of words'
Оболочка Python повторяет за мной все, что я ввел.
А что, если в строке будет одинарная кавычка как ее часть?
>>> 'don't say that'
File "<stdin>", line 1
'don't say that'
^
SyntaxError: invalid syntax
Одиночная кавычка в слове don't завершает строку. Остальная часть уже не войдет
в строку, поэтому наш ввод вызывает синтаксическую ошибку. Синтаксическая
ошибка означает, что мы нарушили правила Python и написали неправильный код
Python.
Чтобы исправить положение, можем воспользоваться двойными кавычками, кото-
рые тоже подходят для разделения строк:
>>> "don't say that"
"don't say that"
Но если в рассматриваемой строке нет одинарных кавычек, то применять двойные
кавычки без причины я не буду.
Строковые операторы
Именно строки подойдут для хранения текста, количество слов в котором мы
хотим подсчитать. Чтобы считать слова или вообще что-либо делать со строками,
придется научиться работать с ними.
Над строками можно выполнять множество операций. Для некоторых из них ис-
пользуются специальные символы, вставляемые между операндами. Например,
оператор + служит для конкатенации строк:
>>> 'hello' + 'there'
'hellothere'
Ах да, нам же нужен пробел между словами. Добавим его в конец первой строки:
>>> 'hello ' + 'there'
'hello there'
36 Глава 1. Приступим к работе
А еще есть оператор *, который размножает строку на указанное количество раз:
>>> '-' * 30
'------------------------------'
Здесь 30 — это целое число. О числах подробнее поговорим в ближайшее время.
ПРОВЕРИМ ЗНАНИЯ
Что выведет следующий код?
>>> '' * 3
А. ''''''
Б. ''
В. Этот код вызывает синтаксическую ошибку (недопустимый код Python).
Ответ: Б. '' — это пустая строка — строка без символов. Трехкратное повторение
пустой строки остается пустой строкой!
Строковые методы
Метод — это операция, выполняемая над определенным типом значений. У строк,
в частности, много методов. Например, есть метод с именем upper, который пре-
вращает все буквы строки в прописные:
>>> 'hello'.upper()
'HELLO'
Информация, которую мы получаем от метода, называется возвращаемым значением
метода. Например, в предыдущем примере мы могли бы сказать, что метод upper
вернул строку 'HELLO'.
Выполнение метода над значением называется вызовом метода. Вызывается он
с помощью точечной нотации (.) между значением и именем метода. Также нуж-
но после имени метода указать круглые скобки. У некоторых методов, например
у upper, эти скобки остаются пустыми.
А для некоторых методов можно передать в скобках информацию. Остальные ме-
тоды требуют информации и без нее просто не работают. Информация, которую
мы включаем при вызове метода, называется его аргументами.
Например, у строк есть метод strip. Если вызывать его без аргументов, он удаляет
из строки все начальные и конечные пробелы:
Строки 37
>>> ' abc'.strip()
'abc'
>>> ' abc '.strip()
'abc'
>>> 'abc'.strip()
'abc'
Но мы также можем передать ему в качестве аргумента строку. Если сделать
это, аргумент скажет методу, какие именно символы нужно удалить слева
и справа:
>>> 'abc'.strip('a')
'bc'
>>> 'abca'.strip('a')
'bc'
>>> 'abca'.strip('ac')
'b'
Поговорим еще об одном строковом методе — count . Мы передаем ему стро-
ковый аргумент, и он сообщает, сколько вхождений этого аргумента найдено
в строке:
>>> 'abc'.count('a')
1
>>> 'abc'.count('q')
0
>>> 'aaabcaa'.count('a')
5
>>> 'aaabcaa'.count('ab')
1
Если вхождения строки-аргумента перекрываются, учитывается только первое:
>>> 'ababa'.count('aba')
1
В отличие от прочих методов, которые я описал, метод count пригодится для по-
ставленной задачи с подсчетом слов.
Сами подумайте: строка состоит из нескольких слов. Обратите внимание на то, что
после каждого слова стоит пробел. Фактически, если бы вам нужно было подсчитать
количество слов вручную, пробелы могли бы подсказать, где заканчивается каждое
слово. А что, если мы посчитаем количество пробелов в строке? Для этого можем
передать методу count символ пробела. Это выглядит так:
>>> 'this is a string with a few words'.count(' ')
7
Мы получили значение 7. Это не соответствует количеству слов, ведь их в строке
восемь, но значение близко. Почему мы получили 7 вместо 8?
38 Глава 1. Приступим к работе
Причина в том, что пробел стоит после каждого слова, кроме последнего. Это
значит, что при подсчете пробелов не учитывается последнее слово. Чтобы внести
поправки, нам нужно научиться обращаться с числами.
Целые числа и числа с плавающей точкой
Любое выражение состоит из значений и операторов. Рассмотрим, как писать чис-
ловые значения и комбинировать их с операторами.
В Python есть два разных типа для работы с числами: целые числа (без дробной
части) и числа с плавающей точкой (с дробной частью).
Целочисленные значения пишутся без десятичной точки. Вот несколько примеров:
>>> 30
30
>>> 7
7
>>> 1000000
1000000
>>> -9
-9
Значение само по себе — простейший вид выражения.
Привычные нам математические операторы позволяют работать с целыми числами.
Оператор + выполняет сложение, - — вычитание, * — умножение. С их помощью
можно писать более сложные выражения.
>>> 8 + 10
18
>>> 8 - 10
-2
>>> 8 * 10
80
Обратите внимание на пробелы вокруг операторов. Хотя для Python выражения
8+10 и 8 + 10 одинаковы, написание с пробелами упрощает чтение.
В Python есть два оператора деления! Оператор // выполняет целочисленное де-
ление, при котором остаток отбрасывается, а результат округляется вниз:
>>> 8 // 2
4
>>> 9 // 5
1
>>> -9 // 5
-2
Целые числа и числа с плавающей точкой 39
Если хотите получить остаток от деления, используйте оператор деления по мо-
дулю, который обозначается символом %. Например, деление 8 на 2 выполняется
без остатка:
>>> 8 % 2
0
При делении 8 на 3 в остатке 2:
>>> 8 % 3
2
Оператор /, в отличие от //, не округляет результат:
>>> 8 / 2
4.0
>>> 9 / 5
1.8
>>> -9 / 5
-1.8
И вот тут-то полученные результаты уже не являются целыми числами! Они пи-
шутся через дробную точку и принадлежат другому типу Python, называемому float
(число с плавающей точкой). Чтобы писать значения с плавающей точкой, нужно
добавить собственно точку:
>>> 12.5 * 2
25.0
Но пока вернемся к целым числам, а о числах с плавающей точкой поговорим в за-
даче про объем конуса позже в этой главе.
Когда мы используем в выражении несколько операторов, Python определяет по-
рядок их применения согласно правилам приоритета. У каждого оператора есть
приоритет. Ровно так же, как делали вы, решая примеры в школьных тетрадях,
Python сперва выполняет операции умножения и деления (у них более высокий
приоритет), а потом сложения и вычитания (более низкий приоритет):
>>> 50 + 10 * 2
70
Опять же, как и при вычислениях на бумаге, операции в круглых скобках имеют
наивысший приоритет. Зная это, мы можем заставить Python выполнять операции
в любом нужном нам порядке:
>>> (50 + 10) * 2
120
40 Глава 1. Приступим к работе
Программисты часто добавляют в выражения круглые скобки, даже если это особо
и не требуется. Дело в том, что в Python довольно много операторов и в процессе
написания легко запутаться в приоритетах, что чревато ошибками, а это плохо.
Вы можете спросить: а есть ли у целых чисел и чисел с плавающей точкой методы,
как у строк. Есть! Но они не так уж и полезны. Например, есть метод, который со-
общает нам, сколько памяти компьютера выделено на целое число. Чем оно больше,
тем больше памяти ему требуется:
>>> (5).bit_length()
3
>>> (100).bit_length()
7
>>> (99999).bit_length()
17
В этом случае вокруг чисел нужны круглые скобки, иначе точечная нотация будет
воспринята как десятичная точка и мы получим синтаксическую ошибку.
Переменные
Теперь вы умеете писать строковые и числовые значения. Неплохо бы еще получить
возможность где-то хранить результаты вычислений, чтобы можно было восполь-
зоваться ими позже. В задаче о подсчете слов было бы удобно где-нибудь хранить
строку слов и подсчитанное количество слов в ней.
Оператор присваивания
Переменная — это имя, которое ссылается на некоторое значение. Всякий раз, когда
мы позже используем имя переменной, оно будет заменяться значением, на которое
ссылается эта переменная. Чтобы она ссылалась на значение, применяется оператор
присваивания. Он состоит из переменной, знака равенства (=) и выражения. Python
вычисляет выражение и заставляет переменную ссылаться на результат. Пример
оператора присваивания:
>>> dollars = 250
Имя dollars всегда заменяется числом 250:
>>> dollars
250
>>> dollars + 10
260
>>> dollars
250