/
Теги: языки программирования компьютерные технологии
ISBN: 978-5-9775-1182-7
Текст
PYTHON VpV
ДЛЯ ДЕТЕЙ, $5 \
КОТОРЫЕ ПОКА H|
НЕ ПРОГРАММИРУЮТ
В задачах, экспериментах, проектах,
диалогах, играх и сновидениях
Материалы
на www.jbhKru
HE ПРОГРАММИРУЮТ
Санкт-Петербург
«БХВ- Петербург»
2023
УДК 004.43-053.2
ББК 32.973.26-018.1
К85
Крылова Е. Г.
К85 Python для детей, которые пока не программируют. — СПб.: БХВ-Петербург,
2023. — 208 с.: ил.
ISBN 978-5-9775-1182-7
Назначение книги — помочь ребёнку 10-13 лет сделать первые шаги в про-
граммировании, используя популярный язык Python, и получить удовольствие
от этого процесса. Книга даст базовые навыки создания программ, поможет под-
готовиться к экзамену в IT-класс хорошей школы, станет первой ступенькой на
пути к профессии программиста.
В каждой главе читатель-школьник сталкивается с проблемой, эксперимен-
тирует, выслушивает мнения экспертов, решает задачи и выполняет проекты,
как простые, доступные каждому, так и повышенной трудности. Сюжеты задач
и проектов реалистичные или фантастические, но всегда занимательные.
На страницах встречаются неожиданные персонажи с собственным взглядом
на программирование — всё это превращает овладение азами Python в увле-
кательную игру.
В книге есть ответы и подсказки к задачам и тестам, а в электронном архиве,
доступном на сайте издательства, — рабочие материалы, тексты программ, на-
боры тестовых значений.
УДК 004.43-053.2
ББК 32.973.26-018.1
ISBN 978-5-9775-1132-7
Группа подготовки издания:
Руководитель проекта
Зав. редакцией
Иллюстрации
Компьютерная верстка
Дизайн обложки
Евгений Рыбаков
Людмила Гауль
Елены Крыловой
Людмилы Гауль
Зои Канторович
«БХВ-Петербург», 191036, Санкт-Петербург, Гончарная ул., 20.
© ООО «БХВ», 2023
© Оформление. ООО «БХВ-Петербург». 2023
Содержание
llllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll
Введение для родителей....................................................9
Зачем школьнику эта книга..........................................9
Как установить Python.............................................10
Введение для детей..................................................... 12
Питон: зачем и как?-----------........ -----------------............................. 12
Знакомьтесь: Чайник, Кофейник и другие............................13
Элементы книги.................................................. 14
Глава 1. Очень приятно, Пайтон...........................................15
Языки программирования........................................... 15
Зачем и как придуман Python.......................................16
Питон интерактивный и файловый....................................17
Эксперимент: интерактивная арифметика — проба пера............17
Эксперимент: создаём файл с программой........................19
Конспект: полезные возможности IDLE Python................... 20
Практикум.........................................................22
Эксперимент: приключения трёхзначного числа...................22
Задача: от роста к весу — программируем по аналогии...........22
Проект: псевдографический конструктор.........................23
Микротест: что мы знаем о Питоне..............................24
Глава 2. Данные и действия с ними....................................... 25
Программа: ввод — обработка — вывод...............................25
Типы да иных в Python............................................ 26
Эксперимент: строки и числа...................................28
Конспект: типы данных.........................................29
Капелька информации: нецелые числа............................30
Операции с числами................................................31
Капелька информации: возведение в степень.....................32
Конспект: арифметические операции и выражения.................33
От задачи к программе через формулу...............................34
Эксперимент: как решать задачу, или Курить вредно!............34
Практикум.........................................................36
Эксперимент: шесть единиц.....................................36
Задачи: повседневная арифметика...............................36
Микротест: что мы знаем о данных..............................37
Глава 3. Интерфейс программы...............................................• 38
Что такое «интерфейс»?..................................................38
Интерфейсы плохие и хорошие.............................................39
Эксперимент: программа без интерфейса...............................39
Инструменты для интерфейса.......................................... 43
Конспект: input..................................................43
Конспект: print..................................................44
Практикум........................................................45
Проект: бот-продавец.............................................45
Проект: игра в чепуху 4 5
Микротест: что мы знаем об интерфейсе............................47
Глава 4. Разветвления в программе........................................ 48
Наша жизнь — сплошные «если».........................................48
Блок-схема — описание алгоритма................................... 49
Конспект: блок-схема............................................ 51
Условный оператор................................................... 52
Эксперимент: вводим и исполняем программу с ветвлениями..........55
Конспект: типы условных операторов...............................55
Капелька информации: отрицательные числа и модуль................58
Практикум............................................................58
Задача: программа по блок-схеме..................................58
Эксперимент: сравнение строк............................... 59
Задача: уравнивание яблок 59
Задача: распознавание объектов............................. 59
Эксперимент: анализируем программу с ветвлениями.................60
Проект: тестер...................................................61
Задача: ищем ошибки «на глазок»..................................61
Микротест: что мы знаем о ветвлениях.............................62
Глава 5. Логика в жизни и программировании................................ 63
Вложенные условные операторы............................................63
Конспект: вложенные алгоритмические структуры....................64
Конспект: правила вложенности в Python...........................66
Логические операции »«« I I №№«> I !**+»** I I * I I №»«> I I №*«< I IMH I -№«< *¥* I I I И-Ф4-1 I I I I I I И-ФФ-И I №» 66
Конспект: логические операции в Python...........................69
Эксперимент: логические значения и приоритеты
логических операций..............................................70
Капелька информации: логические операции в математике............71
Практикум............................................................72
Задача: лесная дорога............................................72
Задача: партийные взносы....................................72
Проект: сло-о-о-жные правила жизни..........................73
Микротест: что мы знаем о логических операциях..............74
Глава 6. Программа и программист: как понять друг друга................75
Как программировать понятно и без ошибок...................... 75
Эксперимент: исправляем программу...........................79
Практикум...................................................... 81
Задача* сколько дней в месяце 81
Проект: забавная нумерология................................82
Микротест: что мы знаем о культуре программирования.........83
Глава 7. Повторения.................................................. 84
Компьютер — машина для повторений?..............................84
Программирование повторений.................................... 85
Эксперимент: исследуем range ().............................86
Конспект: цикл for, диапазон range..........................87
Повторения — блок-схема.................................. 88
Практикум.......................................................89
Задача: генератор заклинаний................................89
Задача: таблица умножения...................................90
Микротест: что мы знаем о повторениях..................... 91
Глава 8. Классические алгоритмы........................................92
Что такое классика I I Miki I Й-** I Mi MM I МЙ I Йй-44 I IMM I I I MM I IMi l IMM4 I IM й * Mi MM I I MM I MMI MM I MM I »**« I IM 92
Накопление..................................................... 94
Конспект: алгоритм накопления...............................95
Эксперимент: а теперь произведение..........................95
Подсчёт.........................................................96
Конспект: алгоритм подсчёта.................................97
Эксперимент: а если и чётные?............................. 98
Выбор...........................................................98
Конспект: алгоритм выбора...................................99
Эксперимент: может, и минимум заодно? .....................100
Перебор натуральных чисел......................................101
Капелька информации: арифметическая прогрессия.............102
Капелька информации: факториал.............................103
Практикум........................................ ..........103
Задача: таблица умножения (уровни 3 и 4)...................103
Задача: 10 чисел............................................104
Микротест: что мы знаем о классических алгоритмах..........104
Глава 9. Циклы............................................................105
Типы циклов...............................................................105
Цикл с условием................................................... 109
Конспект: цикл с условием......................................110
Эксперимент: что делает программа?.............................111
Эксперимент: бесконечная «бесконечность».......................112
Конспект: оператор прерывания цикла............................112
Практикум..........................................................113
Задача: распознавание объектов-2...............................113
Задача: решение подбором и перебором...........................114
Проект: угадайка*..............................................114
Конспект: бинарный поиск*......................................115
Микротест: что мы знаем о циклах...............................11 б
Глава 10. Списки..................................................... 117
Список — пронумерованные данные.................................117
Конспект: список и его элементы.............................118
Что можно делать со списком.....................................119
Конспект: действия со списком............................. 121
Сортировка: подробности.........................................123
Эксперимент: странная сортировка............................123
Конспект: сортировка списка.................................124
Практикум.......................................................124
Эксперимент: что выведет программа?.........................124
Эксперимент: тройные скобочки*..............................125
Задача: сколько дней в месяце-2.............................125
Проект: взлом Пентагона................................... 125
Микротест: что мы знаем о списках...........................127
Глава 11. Случайное число, случайное слово.......................... 128
Может ли компьютер придумывать числа?...........................128
Эксперимент: гадание на ромашке.............................129
Случайные числа.................................................129
Конспект: модуль random.....................................131
Эксперимент: случайны ли случайные числа?...................132
Капелька информации: случайности и вероятности........... 133
Практикум..................................................... 134
Задача: тест на устный счёт.................................134
Задача: ДА/НЕТ-ответчик.....................................135
Эксперимент: копаем картошку наперегонки с Пятачком.........135
Задача: раздача домино......................................136
Проект: «однорукий бандит»................................... 136
Микротест: что мы знаем о случайных числах..................137
Глава 12. Манипуляции со строками........................................138
Строка — последовательность символов...............................138
Эксперимент: нарезаем колбасу............................... 139
Конспект: срезы...............................................140
Строки и списки ФФ* vmPVMVf 1 I №№¥«4 ! I I ♦*** I IMM! MM I I ! IMMIi MMI!
Эксперимент: строка и список..................................141
Что ещё могут строки..............................................142
Конспект: функции и методы строк............................. 145
Операторы, функции и методы.......................................146
Практикум.........................................................147
Задача: словесные игры со срезами.............................147
Задача: словесная архитектура.................................148
Задача: пересечение слов......................................148
Проект: игра в анаграммы.................................... 149
Микротест: что мы знаем о строках и срезах....................149
Глава 13. Олимпиадное программирование: первые шаги......................150
Программирование «нормальное» и олимпиадное.......................150
Конспект: ввод и вывод данных в авто проверяемых программах....152
Особенности олимпиадных задач.....................................152
Задача: лотерея...............................................154
Задача: произведение цифр.....................................156
Конспект: полезные советы начинающему «олимпийцу».............156
Практикум.........................................................158
Задача: купание слона Васи....................................158
Задача: команды на Гонку Героев................................159
Задача: получить тройку.......................................159
Задача: Хауко и Мурисио.......................................160
Задача: нарушители самоизоляции.................. .............160
Задача: Пукка Юкканен..........................................161
Задача: меньше жрать...........................................162
Задача: тимуровцы.............................................163
Задача: контрастный душ....................................... 163
ПРИЛОЖЕНИЕ 1.
20+ идей проектов, которые вы можете реализовать.........................165
Проекты к главам книги............................................165
Вырасти своего Питона!........................................165
Время: от и до................................................165
Бот-психотерапевт.............................................166
Бот-жулик.....................................................167
Бот-руководитель..............................................168
Генератор фенечек.................................169
Делители числа....................................170
Решатель кубических уравнений.....................172
У-тестер..........................................172
Гадалка...........................................174
14 гр а В и сел и а^174
...И несколько полезных проектов.................... 175
Универсальный решатель уравнений...............175
Тестер с чтением из файла.........................176
Шифровальная машина...............................177
...И ещё несколько проектов бесполезных, но забавных.178
Игра в даты 178
Тараканьи бега....................................179
Разборчивая невеста...............................180
Архипелаг.........................................181
Генератор имён персонажей.........................182
Кассир............................................183
Калейдоскоп.......................................184
Оптимизатор заклинаний*...........................186
ПРИЛОЖЕНИЕ 2. Подсказки.................................. 188
ПРИЛОЖЕНИЕ 3. Ответы............................... 196
ПРИЛОЖЕНИЕ 4. Состав электронного архива
207
Введение для родителей
IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII1IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIHIIIIII
Зачем школьнику эта книга
Назначение книги — помочь ребёнку 10-13 лет сделать первые
шаги в программировании и получить удовольствие от этого про-
цесса.
Почему не «научить программировать», «освоить Python», «под-
готовиться к олимпиадам»? Потому что всё это будет вторым, тре-
тьим, п-м шагами на пути программиста. А для начала нужно на этот
путь встать и проверить, подходит ли он тебе. В 4-6 классах школы
нужно как можно больше всего попробовать, чтобы к 7-9 классу
найти то, что нравится и хорошо получается и углубиться в него, а в
10-11 прагматично идти к будущей профессии.
Почему Python и работа с числовыми и строковыми данными,
а не визуальный язык и визуальное программирование? Потому что
в основе профессии «программист» — прочные навыки алгоритми-
зации, а работа с данными на аскетичном структурном Питоне — са-
мый быстрый путь к выработке этих навыков.
В основе книги — методика «программирования по аналогии»,
когда ребёнок сначала экспериментирует с текстами программ, мо-
дифицирует их, догадывается о работе операторов и языковых кон-
струкций, и только потом обобщает приобретённый опыт. За рубе-
жом такой стиль обучения используется давно, а в последние годы
стал широко применяться и у нас с разной степенью успешности.
Книга сделана по мотивам курса для учеников 5-7 классов, по-
строенного именно на этой методике и проведённого онлайн (что
лишало преподавателя кнута и вынуждало рассчитывать только на
пряники). Курс удался: интересно и весело было всем, и примерно
пятая часть учеников продолжила программировать самостоятельно
после его завершения, — это примерно соответствует доле людей,
которые могут быть счастливы, программируя1. А остальные, попро-
бовав программирование, убедились, что оно интересное и нестраш-
ное, и побежали примерять на себя другие виды деятельности.
1 Абсолютно ненаучные данные из жизненного опыта автора, более 20 лет обуча-
ющего программированию детей и взрослых.
Читателю предлагаются задания — задачи и проекты — раз-
ных уровней (те, что со звёздочкой, требуют нестандартных идей),
с привлекательными для детей сюжетами. К сложным заданиям есть
подсказки, к принципиальным — ответы. Полные тексты программ,
в том числе версии реализации проектов, можно найти в электрон-
ном архиве, прилагаемом к книге, и на веб-странице книги на сайте
издательства www.bhv.ru.
Для работы на Python, естественно, понадобятся язык и среда
программирования. Всё это можно совершенно бесплатно и без осо-
бых технических проблем скачать с официального сайта —
, выбрав версию, подходящую для вашей
операционной системы. Хорошо, если ребёнок примет участие в про-
цессе, однако вряд ли стоит полностью доверять ему это ответствен-
ное дело.
Как установить Python
1. Идём на официальный сайт Python —
2. Нажимаем жёлтую кнопку (на ней могут быть другие цифры — пока
книжку издадут, «питонщики» уже пяток новых версий выпустят).
й https //www. ру t h on .о rg/d о wnl oads/
Python
PSF
Docs
gipython
About Downloads Documentation Commur
Download the latest version for Windows
Download Python 3.10.4
Looking for Python with a different OS? Python for Windows,
Linux/UNIX, macOS, Other
Сегодня (1)
python-3.10.4-amd64.exe
Тип: Приложение
3. Запускаем установщик Python.
4. Ставим галочки у предложений сделать Python доступным для всех
пользователей и запомнить путь к папке Python.
5. Щелкаем по ссылке Install Now, запомнив, куда мы устанавливаем
Python.
6. Дожидаемся сообщения, что установка завершилась успешно, и за-
крываем окно.
Если ваше чадо — уверенный пользователь компьютера, можно
с этого момента оставить его с книгой наедине. Если вы в этом не
уверены, то стоит, наверное, вместе найти и запустить Python, что-
то понаколачивать на клавиатуре, убедиться, что ребёнок сумеет и
переключить раскладку, и найти на клавиатуре кавычку и двоеточие.
А можно, если интересно, и всю первую главу вместе пройти (если
чадо не возражает). А можно и не только первую.
Введение для детей
IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII
Питон: зачем и как?
Питон (Python, «Пайтон») — язык программирования. Настоящий
«взрослый» язык, один из самых популярных в мире. При этом не-
многословный и логичный. Местами забавный. И название у него
прикольное: можно почувствовать себя заклинателем змей. И если
уж начинать программировать, то на Питоне.
Осваивать его вы будете в отличной компании (на следующей
странице познакомитесь), будет с кем поболтать и посмеяться, най-
дётся, к кому обратиться за подсказкой.
Только программируя, можно научиться программировать. Поэто-
му расслабленно читать книгу, лёжа на диване, не получится: придёт-
ся экспериментировать, вводить коды из книги и придумывать свои.
Главы книги не уроки: одну вы преодолеете за вечер, с другой
проведёте пару недель, доводя до совершенства свой проект. Книга
тем и хороша, что читать её можно медленно или быстро, пропускать
то, что и так понятно, возвращаться к тому, что понравилось. Можно
отвлечься на чай с печеньками или пролетающего за окном кроко-
дила. Можно отодвинуть книгу в сторону и колотить по клавишам,
реализуя только что пришедшую в голову идею... а потом вернуться
к книге и увидеть: то, что заняло у вас два экрана, можно было запро-
граммировать в три строки.
Ваша первая книга по программированию немного научит вас
языку Python, слегка познакомит с основами алгоритмизации, по-
кажет, как придумывать свои проекты и реализовывать их. Но глав-
ное — позволит вам получить удовольствие от создания забавных
программ или решения не совсем обычных задач. А дальше вы сами
решите, хочется вам программировать ещё или нет.
Контрольный вопрос (проверка умения читать): в каком аб-
заце упоминался крокодил и что он там делал?
Знакомьтесь: Чайник, Кофейник и другие
Чайник
Ваш ровесник, в меру любопытный, неглупый, но
пока неопытный. Не боится задавать глупые вопросы и
делать дурацкие ошибки.
Кофейник
Взрослый. Знает не всё, но очень много. Про про-
граммирование, про свойства чисел и законы логики,
про повадки пресмыкающихся и привычки школьников...
И у него масса интересных знакомых.
Пайтон
Вполне дружелюбное пресмыкающееся. Язык-тёзку
знает в совершенстве, из-за этого слегка задаётся. При-
ползает и уползает, когда захочет.
Эксперты
С ними вы познакомитесь по ходу дела. Они в каж-
дой главе разные.
Предупреждение: не надо удивляться тому, что все персонажи
С-1__: курса, включая хвостатых, крылатых и вообще на вид неодушев-
лённых, программируют (разговаривают, думают...) на Питоне.
Жить в мире, где всё мыслит, значительно интереснее. А если
чайники, коты, кукушки думают — почему бы им не думать на
Питоне?
Элементы книги
Теория в диалогах — видна по картинкам
с персонажами.
Эксперимент — наколотить текст программы, запус-
тить, осмыслить то, что получилось.
Конспект — короткий справочник с описанием ко-
манд и другой полезной информацией.
Задача — проблема, для решения которой чаще все-
го нужно написать программу по заданным требованиям.
Иногда задачи объединяются в серии по теме или приме-
няемым приёмам.
Тест — вопросы, на которые нужно ответить, а потом
сверить ответы. Не нравится — не делайте...
Проект — самое интересное: вы придумываете свою
программу на предложенную тему и создаёте её. Оценить
её могут родители, друзья, одноклассники.
Капелька информации — это тоже теория, но не про
программирование, а про что-то другое. Например, кусо-
чек математики, без знакомства с которым ваше удоволь-
ствие от общения с Питоном будет неполным.
Переход на новый уровень — доступ к проекту, с
которым вы теперь справитесь, или ещё к чему-то инте-
ресному.
Глава 1
Очень приятно, Пайтон
IllllllllllllllllllllllllllllllllUlllllllllllllllllllllllllllllllltllllllllllllllllllllllll
Языки программирования
— Так... Ну, я готов! Где этот ваш Питон? Мне Миксер,
который в 7 классе, рассказывал, что Питон —- такой кру-
той язык программирования, на котором можно игры пи-
сать. Поехали! л
— А почему для написания программ нужен какой-то И
особый язык — вы не задумывались? Почему нельзя объяс- V* v
нить компьютеру, что надо делать, по-человечески? J
Ч: Ну, он, наверное, тупит... ой, простите! Компьютер — он как
иностранец: знает свой язык, а наш не знает. И поэтому приходится
говорить с ним на его родном языке.
К: Направление мысли правильное. Но в действительности язык
программирования — вовсе не родной язык компьютера. Это такой
язык, который понятен и компьютеру, и нам. Вы японский не знаете,
верно? Предположим, вам очень надо что-то спро-
сить у японца, не говорящего по-русски. Как вы это
сделаете?
Ч: Спрошу на английском — скорее всего, он
его знает. Я буду использовать только самые про-
стые слова (я ж только их и знаю). И он, видимо, ответит мне так же.
К: Так вот, язык программирования — это
такой компьютерный английский. Вот (слева)
Ч1ЛСЛ&.,
пример программы на языке человека.
А программа в памяти компьютера, кото-
рую он в состоянии выполнить,
выглядит примерно так:
Ч: В смы-ы-ы-сле?
К: Компьютер — электронное устройство. Память
его состоит из элементов с двумя состояниями: есть
сигнал — 1, нет сигнала — 0. Мозг компьютера, процессор, преоб-
разует сигналы, пропуская их через сложные электронные схемы, и
получает результаты. Но вы не пугайтесь — Вас никто не заставляет
разговаривать с компьютером, вводя с клавиатуры нолики и единич-
ки. Вот так выглядит, к примеру, программа на Питоне. А рядом —
программа на Small Basic.
а = int(input()) а = Textwindow.ReadNumber()
b = int (input () ) b = Textwindow.ReadNumber()
print(a+b) Textwindow.WriteLine(a+b)
Ч: Не-не, лучше Питон, там буковок меньше! Зачем вообще дру-
гие языки?
Вопрос для размышления: действительно, почему есть много
языков программирования, а не какой-то один, лучший? Ответ
Кофейника — в Ответах. ОТВЕТ»>
Зачем и как придуман Python
— Лучше Питон? Уверены? Давайте спросим эксперта.
Гвидо ван Россум — «тот, кто придумал Пайтон». Гвидо, не
могли бы Вы рассказать, чем Питон отличается от других
языков?
— Привет! А у вас картинка устарела, я сейчас
без бороды!
Про Python? Когда мы его придумывали, хо-
телось сделать язык без лишних знаков препинания,
расставляемых по сложным правилам, и чтобы во-
обще текст программы был коротким и при этом
понятным. И вроде получилось.
Почему он «питон»? Ну, вообще-то это не
в честь змеи, а в честь одного телешоу... впрочем,
неважно. Так вышло, что на Питоне можно писать программы в смеш-
ном таком стиле — вся программа вписывается в одну длинную строку
с множеством скобок. Так что змеистое название языку подошло.
Сейчас Python — один из самых популярных языков програм-
мирования. И к нему можно подключать множество библиотек — та-
ких дополнений к языку, заточенных под конкретные виды задач.
Да, самое-то важное! Python — свободная программа, его можно
совершенно бесплатно поставить на свой комп.
Ч: А игры на нем делать можно?
— Да конечно! Всё можно — хоть игрушку, хоть сайт, хоть искусст-
венный интеллект... Скачивайте и начинайте работать! Это просто
и весело. Удачи!
Питон интерактивный и файловый
— Э-э-э... а где взять этот самый Python и как
программировать?
— Посмотрите в главном меню — есть там
вот такая штучка?
Python 3.10
Новые
на нём
IDLE (Python 3.10 64-bit)
Новые
Если нет — попросите родителей открыть своё, взрослое «Вве-
дение» и вместе с вами установить Python по инструкции. Должна ж
быть от родителей какая-то польза!
ЭКСПЕРИМЕНТ:
интерактивная арифметика — проба пера
Запустите IDLE Python. Как? Ну, напри-
мер, через главное меню. А можно вос-
пользоваться поиском по слову Python
или IDLE.
IDLE (Python 3.10 64-bit) Вот эта штука и есть IDLE (читается
приложение «айдл») — программа для разработки про-
грамм. Не заморачивайтесь многословным
выведенным текстом. Вводить мы будем после знаков »> — это
сигнал о том, что Python готов к работе и ждёт нашей команды.
Введите >» 5+3 и нажмите клавишу <Enter>. Верно сосчитал
Python?
А если посложнее? И с множеством разных действий? К приме-
ру, вот это: »>5*8 + 77/11
Теперь вы знаете, как в Питоне обозначают умножение и деление
(с пл юсом и минусом и без того всё понятно). А давайте-ка проверим,
как Python отнесётся к большим числам: введём
»> 999999999*999999999*999999999
Верно? Не уверены? А вы проверьте на калькуляторе! Чего-о-о?
- Слабак ваш калькулятор! Я могу правильно ра-
ботать с числами любой длины. Правда, иногда прихо-
дится несколько секунд подумать... ну и результат
долго выводится.
Продолжим. Введите а = 13.
Ничего не произошло. А теперь введите просто а. Вывелось 13.
Мы выполнили сейчас очень важное действие: записали число 13
в переменную с именем «а». И теперь можем его использовать в на-
ших вычислениях.
Проверим: вводите примеры, в которых используется наша
переменная — например, а* (а+1). Убедитесь, что в переменной
а по-прежнему 13. Кстати, вы заметили, что теперь в тексте не
картинки, а просто то, что вы должны вводить? От остального текста
отличается другим шрифтом — тем же, что в IDLE.
А теперь введём а=а*а. И выведем а. Произошло ещё одно
важное событие — мы изменили содержимое переменной, при-
своив ей значение вычисленного выражения.
г-'Яр — Вау! Я могу писать программы!
— То, что мы делали — это ещё не программа, а так,
наброски к ней. Программа — это файл, который хранится
в памяти. Его можно использовать многократно, выполняя
для разных данных. Чтобы перейти в режим работы с файлом,
надо его создать. Потом наполнить содержимым, сохранить Ну Ш
и исполнить. При этом не факт, что программа сразу окажет- I
ся правильной... <___)
ЭКСПЕРИМЕНТ:
создаём файл с программой
1. Откройте меню File и выберите New File (это же действие мож-
но выполнить, одновременно нажав клавиши <Ctrl>+<N>)\
File Edit Shell Debug Options Window Help
IDLE Shell 3.10.4
New File Ctrl+N |(tags/v3.10*4:
Open... Ctrl+O t32
2, Введите текст программы, К примеру, вот такой:
print("Привет! Ты кто?")
u = input ()
print (’’ Круто * Мне впервые встречается'1, u + "I")
Да, сло-о-о-жно-о-о — приходится переключаться с русского на
английский и искать всякие знаки препинания. А зато цвет сам
собой меняется!
3. Готово? Запускаем программу, нажи-
мая клавишу <F5> или же выбирая в
меню Run команду Run Module. Ой,
вылезло окошко! Это вам напомина-
ют, что файл должен быть сохранён.
Жмите ОК и сочиняйте имя для сво-
ей первой программы. И стоит обра-
Save Before Run or Check
Source Must Be Saved
OK to Save?
Отмена
тить внимание, на какой диск и в какую папку вы всё это сохра-
Имя файла: ZJ5J
Тип файла: Python files (*.py;*.pyw)
няете. Если ничего не менять, файлы
будут там же, где сам Python — для
начала сойдёт.
4. Если вы всё ввели правильно, программа задаст вопрос, вы вве-
дёте ответ... получится что-то вроде этого:
1 Для непродвинутых пользователей: <Ctrl>+<N> — это нажать клавишу <Ctrl>
и, не отпуская её, другим пальцем (той же или другой руки, ноги и т. п.) нажать
<N>. А не нажимать последовательно <С>, <T>, <R>, <1_>, <+>...
Привет! Ты кто ?
Конь в пальто
Круто1 Мне впервые встречается Конь в пальто!
»>
5. А вот если вы что-то ввели неправильно (например, поменяли
местами «)» и «"» в первой строке) — IDLE скажет, что вы непра-
вы. Причём почувствует она эту ошибку только на следующей
строке.
Исправляйте ошибку и возвращайтесь к пункту 3:
Е SyntaxError
print ("Привет! Ты кто?)"
u = input()
print (11 Круто 1 Мне впервые
invalid syntax
I о< I
КОНСПЕКТ:
полезные возможности IDLE Python
1. Окно выполнения (то, где мы работаем в интерактивном режиме
и видим результат выполнения программы) одно. Но при этом
может быть открыто несколько файлов. Переключение между
окнами — через меню Windows.
I ф ЬопыииеЧиопа.ру - Е:/Ру1пон/ЬольшиеЧисла
File Edit Format Run Options Window Help
p = 7
p = (p + p) ** (p * p)
print(р)
IDLE Shell 3-10-4
File Edit Shell Debug Options Window Help
1
1446351159983
IDLE Shell 3.W.4
Mylpy - E:/Python/My1,py (3,10Л)
ЕюльшиеЧислару - F У Python/Бо л ьщиеЧисл^ру (3 10Л)
>»
2. Можно изменить размеры окна файла и окна выполнения и рас
положить их на экране рядом.
3. Хорошо бы сразу настроить IDLE так, чтобы вам в ней было ком-
фортно. В меню Options щёлкните по Configure IDLE и выберите
подходящий размер шрифта (те, кто уже испортил зрение, могут
ещё и жирность использовать).
4. Полезная штука — номера строк. Их можно включить в том же
меню Options — Show Line Numbers.
5. Операции с файлами — естественно, в меню File.
Сохранение файла
в другое место или
с другим именем
Открытие файла,
который уже есть
Создание нового
файла
New File
Open...
Open Module...
Recent Files
Module Browser
Path Browser
БольшиеЧисла.ру - CyUsers/elenak/AppData/Local/ProgrJ
File Edit Format Run Opt tons Window Help
Ctrl+N
Ctrl+Q
Alt+M
** (p * p)
Alt+C
Save Save As... Save Copy As . Ctrl+S Ctrl+Shift+S Alt+Shift+S
Print Window Ctrl+P
Close Alt+M
Exit Ctrl+Q
6.
Масса полезных возможностей в меню Edit. Для начала нам хва-
тит того, что сверху. И хорошо бы выучить клавиатурные ком-
бинации.
Отмена последнего действия
!£> БольшиеЧисла.ру - CyUsers/elenaMAppData/L
• — r:i в EaHrit СаГАЧЧ* Run Options Window Help
Отмена отмены © L 21 О V""- Undo Redo Ctrl+Z Ctrl+Shift+Z
f Стандартные операции 1 I Cut Ctrl+X
с буфером обмена. I 3 j Copy Ctrl+C
v Не знаете? Гугл в помощь! у— j Paste Ctrl+V
Select All Ctrl+A
Поиск по слову j Finck Ctrl+F
Практикум
ЭКСПЕРИМЕНТ:
приключения трёхзначного числа
1. Создаём новый файл и вводим текст программы (красненькие
комментарии вводить не надо, они вам потребуются для осмы-
сления).
s = input("Введите трёхзначное число: ")
s = s + s # склеили то, что ввели, с самим собой
п яг int(s) # сделали из строки число
п - п // 7 # разделили число на 7
n = п // 11 # потом разделили на 11
n = п // 13 # ну и на 13 разделили
print( 'Результат:”, п)
2. Сохранив программу и убедившись, что в ней нет ошибок, за-
пускаем её несколько раз. Сколько? Столько, чтобы заметить не-
которую странную закономерность.
Почему так получается — вот мы курочим число, делим его на
всякие гадкие числа, а оно делится да ещё и даёт в итоге интересный
результат? ПОДСКАЗ КА»> ОТВЕТ»>
ЗАДАЧА:
от роста к весу - программируем по аналогии
Имеется текст программы, которая просит пользователя ввести
рост в сантиметрах, и переводит его в метры и в миллиметры.
Превратите её в программу, которая получает от пользователя
его вес в килограммах, и выводит его в пудах (Гугл в помощь! Или
бабушка!) и в граммах.
rest = int(input("Введите ваш рост в см: "))
m = rost / 100
пип = rest * 10
print('Ваш рост в метрах =", ш)
print ("Ваш рост в мм =" , пип)
Если вам ну очень трудно вводить текст программы, можете
скачать его из архива рабочих материалов книги (файл 1-1.ру в
папке 1). Но вообще-то это для слабаков.
ПРОЕКТ:
псевдографический конструктор
Вот текст программы. А справа — результат её работы.
аО =
al = "..
а2 =
аЗ =
а4 « ”#.
а5 =
аб =
а7 = "###"
print(а6+3*а5+а3)
print(а7*5)
print(а6+3*а5+а3)
print(a4+3*a7+al)
###############
Я#-#.##-##-#.##
#..#########..#
А вот ещё несколько примеров изображений, построенных из
этого конструктора.
#######... ..........######.. ........#.#######. .#—#... .#####.
.. .#....и#.##.###.. .......#. .##................
.##.......##. .#..... .##..##.......#.....######. .##....##..#.#. .#
.. .#....##.......##.. .######...###........#.....#—#. .##.......
...».......##..##....#...........#..........#.....
#######.....«#........#...........#..........#.....#___. .#
>» |
.............................
-------#---------♦...........
.............................
.......#.........#...........
.............................
............♦................
............♦. .##...........
............♦ .##............
............♦................
............#................
.............. #.............
..........#................
...*.......*......
.. .##....♦#.......
. .................
...##*##«***.......
. ..##.###.##......
...##♦#.####-------
.. ................
......###..........
.. ...............#
Вам предлагается соорудить из псевдографического1 конструк-
тора — строк а0-а7 — свои изображения. Какие? Любые. Лишь бы
они вам нравились. Если понравятся кому-то ещё — совсем здорово
будет.
Лентяи могут текст конструктора не вводить, а скопировать
(файл 1-2.ру в палке 1).
Вопрос для размышления: как связаны номера строк-
картинок и их содержание? "1ОДСКАЗКА>>> ОТВЕТ>»
1 Псевдографика — построение изображений из символов.
МИКРОТЕСТ:
что мы знаем о Питоне
Вы уже кое-что знаете о Python. И кое-какое мнение о нём у вас
уже есть. Давайте вы отметите те утверждения, с которыми согласны,
а потом сверим ваше мнение с мнением автора.
A. Python придумали в Южной Америке, потому он и Питон.
Б. Python — язык не новый, он давно стал популярным и оброс
полезными дополнениями.
В. Со строками и с числами Python работает по-разному: например,
знак «+» строки склеивает, а числа складывает.
Г. Максимальный размер числа в Python — 64 цифры.
Д. IDLE — среда для разработки программ на Python.
Е, Можно выполнять команды Python по одной, не записывая
в файл.
Ж. Файлы с текстом программы на Python имеют расширение .pi.
Прошли тест? Вы заслужили маленький бонус! Вот та-
кой значок показывает, что теперь вам доступен проект
в приложении: «Вырасти своего Питона!»
Глава 2
Данные и действия с ними
llllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllinillllllllllllllllllllll
Программа: ввод — обработка — вывод
— Ну как, удалось превратить программу про рост в
программу про вес? Сколько пудов вы весите? XJ
—Ой... Программу-то я написал. Запустил. Она
спрашивает — сколько, мол, в вас килограммов?
I А во мне килограммов нет. Потому что их меньше одного.
А меньше одного — это ноль. Ввёл 0. Программа сказала,
что во мне всего 0, даже граммов, обидно. Во мне ж пол-
кило (ну почти)! Ввёл «полкило». Питон сказал, что у меня ошибка.
Я по-всякому пробовал — и «пол-кило», и «полкилло»...
К: Вы разве десятичные дроби в школе не проходили? Надо будет
вам объяснить...
Ч: Да уже не надо, мне Бонбоньерка объяснила.
Она в элитной школе с миллионерским уклоном, их
с первого класса учили правильно записывать курс
доллара. У меня всё получилось, но я же должен был
рассказать, как это было тру-у-у-дно!
К: Отлично. Кстати, она вам в ВК объясняла? Пере-
шлите мне, пожалуйста, мы из этого сделаем Капель-
ку информации. Автора укажем. А для вас упражне-
ние на закрепление материала. Возьмите ту же самую программу про
рост и вес и превратите её в программу, которая по двум сторонам
прямоугольника определяет его площадь. Про площадь проходили?
Ч: Ещё во втором классе! Значит, так: вводим одну сторону, вто-
рую, считаем, выводим.
а = int(input("Длина = ”))
Ь = int(input("Ширина = "))
s = а * b
print ("Площадь =” , s)
Слушайте, это только мне кажется, что все программы друг на
друга похожи, или это и вправду так?
К: Смотря что вы имеете в виду. Попробуйте объяснить подробней.
Ч: Все программы начинаются с input или int (input) — за-
дают вопрос, а потом вводят ответ. Потом с этим ответом что-то де-
лают. А потом выводят то, что получилось — print (). Так?
К: Если не вдаваться в лишние детали, именно так. И давайте это
запишем крупными буквами, потому что это действительно важно:
ПРОГРАММА =
Ввод данных
Действия с данными
Вывод данных
Типы данных в Python
— Ключевое слово тут — «данные». Вот как вы полагаете,
Чайник, данные — это что?
— Данные — то, что нам дано. Нет, не нам — ' —
компьютеру. И компьютер это помнит и изменяет. Пра-
вильно?
К: С точки зрения программиста примерно так. Только
щё, что данные имеют определённый тип. А данные разных
обрабатывают по-разному.
ак это из-за типа мы пишем иногда input (), а иногда
int (input ()) ? Вот теперь я понял: если мы вводим числа, в память
записываются числа, если буквы — буквы. Компьютер смотрит, что
там записано, и понимает, что с этим можно делать. Так?
К: Не совсем. В памяти и числа, и буквы представляются одина-
ково — как числа в двоичной системе счисления (буквы ведь тоже
можно закодировать числами). А компьютер по вводимому значению
догадывается, что это за тип, и запоминает. Это называется «утиная
типизация». Нужно, наверное, позвать эксперта, чтобы рассказал об
этом подробнее.
Ч: Специалиста по уткам?
К: Почему бы и нет? Знакомьтесь: Чайник —
Зоя Петровна Кряквина, птичница с 30-летним
стажем.
— Добрый день. Утиная типизация — это про-
сто. Основной принцип такой: «If it looks like а
duck, swims like a duck and quacks like a duck, then it
probably is a duck». Это так называемый «утиный
тест».
Ч: Э-э-э... ы-ы-ы.. ???! Сейчас загуглю...
— Не пугайтесь, объясню сейчас.
Сначала на утках. Вот живое существо —
не то цыплёнок, не то утёнок, не то ещё
какая-то птица. Но похоже на утку. По крайней мере, плавать умеет.
И крякает. И мы, хотя это существо нам официально не представле-
но, и бирочки с названием на нём нет, считаем его далее уткой.
Теперь о данных. Вот переменная. Назовём её, скажем, z, И вот
мы ей присваиваем значение: z = 5. И компьютер в соответствии
с «утиным тестом» понимает: ага, этой штуке присвоили числовое
значение, значит, это число. А вот если бы мы написали так: z =
' пять' — это был бы другой тип данных — строка.
Ч: А какая разница — строка это или число?
— Разница появляется, когда мы начинаем выполнять действия.
Вот пример.
>» п — 5
»> s = "три”
»> п + п
10
»> S + S
f тритри'
»> П * S
’тритритритритриг
»> П + S
Traceback (most recent call last):
File ”<pyshell#6>"f line 1, in <module>
n + s
TypeError: unsupported operand type(s) for +:
rintr and rstrr
Сложение чисел и строк по-разному происходит, видите? А ещё
есть такая забавная штука — умножение строки на число. А если по-
пытаться сложить строку с числом, будет сообщение об ошибке.
Ч: Это то, что по-английски и вывелось красным цветом? А как
понять, что Питону не нравится?
- Как-как, прочитать. Там же ясно сказано — в первой
строке ошибка типа, неподдерживаемая операция: сложе-
ние строки с числом. Совсем распустились, лень перевод-
чик вызвать... Зоя Петровна, как ваша автоматическая
линия по сортировке яиц? Всё работает?
— Да, всё, тьсру-тьсру, нормально. Но надо будет программу моди-
фицировать — у меня ж теперь и страусы, и пингвины, там категории
яиц другие. Так что заползайте как-нибудь вечерком — чайку попьём,
новые значения добавим, ещё одну веточку на алгоритм навесим!
ЭКСПЕРИМЕНТ:
строки и числа
Посмотрите на пример работы Python в интерактивном режиме:
»> str3 = "ТРИ"
»> int3 = 3
»> (str3 + str(int3 +1)) * (int3 + 2)
'ТРИ4ТРИ4ТРИ4ТРИ4ТРИ4'
Как видите, здесь две переменные: одна — строка, другая —
целое число. То, что строки можно складывать, как и числа, и что
можно умножать строку на число, вы уже знаете.
Любое число можно превратить в строку: str (число). Это вы
теперь тоже знаете.
А сейчас — пять вопросов.
1. Изменится ли результат работы, если назвать переменные ина-
че — например, вместо str3 везде писать Мурзик, а вместо
int3 — Барсик?
2. Как, используя эти же значения str3 и int3, вывести вот такую
строку? * 1ТРИТРИТРИЗЗЗЗЗ1
3. Любое число можно преобразовать в строку. А можно ли преоб-
разовать строку в число? Любую?
4. Изменится ли что-то, если в первой строке ввести значение не в
двойных кавычках, а в одинарных (апострофах), как их выводит
Python?
5. Почему «str» везде чёрное, а в одном месте фиолетовое?
ОТВЕТ» >
КОНСПЕКТ:
типы данных
1. Данные в Python бывают разных типов. Пока для нас важны три:
целые числа, нецелые (вещественные) числа и строки.
2. Тип зависит от значения. Например, после таких вот действий
(они называются «присваивания») h станет целочисленной пе-
ременной, t — вещественным числом, a name — строкой.
h ^7
t = 36.6
name = "Онуфрий”
3. То, что программа получает с клавиатуры через input (), — это
всегда строка, что бы ни ввёл пользователь.
4. Значение можно преобразовать к нужному типу, используя int
(превратить значение в целое число), float (в вещественное),
str (в строку). В примере Ь и с получают одно и то же значение,
но действия с ним выполняются по-разному, потому что Ь — ве-
щественное число, ас — строка.
а = int(input("а = "))
Ь = float (input (11Ь = "))
с = input(”с = ")
print(а, Ь, с)
print(а * Ь)
print (а * с)
а = 2
Ь = 3.14
с = 3.14
2 3.14 3.14
6.28
3.143.14
5. Если значение, которое мы пытаемся присвоить переменной,
не соответствует её типу или не может быть преобразовано
к нему, возникает сообщение об ошибке. Например, если при
запуске программы из пункта 4 ввести в качестве значения 2
значение 2.0 (то же число, но в нецелом формате), мы увидим
вот что:
а = int(input("a = "))
ValueError: invalid literal for int() with base 10: r2.0’
КАПЕЛЬКА ИНФОРМАЦИИ:
нецелые числа
(Автор — Бонбоньерка, ученица 4 класса школы
с бизнес-уклоном)
Нецелые числа правильнее называть вещественными, потому
что они постоянно встречаются нам в реальном мире, описывают
какие-то свойства вещей.
Вот пирожок в школьном буфете. Важное его свойство — цена.
12.75
На ценнике написано «12.75», и мы понимаем,
что это 12 рублей 75 копеек. В рубле 100 ко-
пеек, копейка — сотая часть рубля. Число
12.751 можно прочитать вслух как «12 целых
и 75 сотых».
Доли бывают не только сотые. К примеру, длина колпачка руч-
ки 3 см 4 мм может быть записана как 3.4 см, 3 целых и 4 десятых.
Миллиметр — десятая доля сантиметра.
А 723 метра от дома до школы — это 0.723 километра, 723 ты-
сячных.
Вещественные числа — вполне нормальные числа, с ними
можно выполнять нормальные арифметические действия. Но мы
не будем тут учиться это делать, потому что у нас есть комп, а на
нём Python.
1 В школе в таких числах ставят не точку, а запятую. В жизни и в языках про-
граммирования — точку. А если вас смущает что-то на картинке — это нор-
мально.
Операции с числами
— Про операции с числами всё ясно: сложение, вы-
читание, умножение, деление... всё!
— Не всё. Есть и ещё несколько полезных опе-
раций. Например, вот эти две. Догадайтесь-ка, что
они означают?
»> print(17//3, 17 % 3)
5 2
»> print (50 // 7, 50 % 7)
7 1
Ч: Похоже на деление... Ой, точно, это же деление с остатком!
Круто — калькулятор так не умеет, у него если что-то на что-то не
делится, получается это... как его... вещественное число! А зачем эти
деления с остатком нужны?
К: Ясное дело, не для того, чтобы сделать домашки. Вот, к при-
меру, есть килограмм мороженого — целая тысяча граммов. А на
порцию коктейля идёт 150 граммов. На сколько порций хватит мо-
роженого?
Ч: Это смотря где. Если дома — 1000 // 150, на б порций.
А оставшиеся 1000 % 150, 100 граммов, можно съесть в награду за
ударный труд на кухне. А вот в кафе наверняка воспользуются обыч-
ным делением и превратят «почти 7» в 7, а то и в 8-9...
К: Неплохо вы разбираетесь в жизненной арифметике. Вот ещё
одна операция.
»> print(3 "** 2? 2 ** ЗГ~1О **”10)
9 8 10000000000
Ч: Ого... число с десятью нулями... Такое может получиться, если
перемножить десять десяток. А остальное... Ну да: 9 — это 3*3, про-
изведение двух троек. А 8 получится, если перемножить три двойки.
Ну и как это называется? Мне что, опять с Бонбоньеркой чатиться?
Она ж зазнается!
К: Я лучше сам объясню. А то в её постах грамматических ошибок
почти столько же, сколько слов — устал исправлять.
КАПЕЛЬКА ИНФОРМАЦИИ:
возведение в степень
/Iй — А в степени В — произведение В сомножителей, каждый
из которых равен А.
Например, 34 = 3- 3- 3- 3 = 81.И теперь к двум способам запи-
сать 4 с помощью двух двоек (2 + 2 и 2 • 2) добавился третий: 22.
Любое число в степени 0 равно 1 — это проще запомнить, чем
понять.
Ещё у степеней есть всякие симпатичные свойства. Например,
дв+с_ Ав. дс (можете сами это доказать).
Степень — вполне жизненная операция. К при-
меру, если поголовье микробов на немытых руках
ежесекундно удваивается, а сейчас там один микроб
(вон, видите — побежал по пальцу?), то уже через
10 секунд микробов будет больше 1000, потому что
***м»»Ч 210 — это 1024. Захотелось помыть руки? Помойте,
это всегда полезно.
Можно возводить в степень и нецелые числа.
Например, если ваша бабушка взяла на год кредит 1000 рублей
под 5% в месяц (надо ехать в гости к внуку, а пенсия только через
2 дня, а обещанный конструктор стоит почти тысячу) — отдавать
ей придётся 1000 • (1.0512) = 1795.8563260221301 рублей. Про про-
центы мы тут объяснять не будем, а вы не берите, пожалуйста, ни-
какие кредиты, пока с процентами не разберётесь. И бабушке не
разрешайте. Потому что степень — операция коварная: даже не-
большое число, чуть больше единицы, при возведении в степень
растёт очень быстро.
Возведение в степень моложе других арифметических опера-
ций, ему всего лет 400. Но сама идея многократных умножений
известна с глубокой древности. Погуглите про задачу о зёрнах
на шахматной доске: это поучительная история с неожиданным
финалом.
у^/2] КОНСПЕКТ:
4£j арифметические операции и выражения
+ — сложение // — деление нацело
— вычитание * — умножение % — остаток от деления ** — возведение в степень
/ — деление с нецелым результатом Доступны с любыми типами чисел
Арифметические выражения могут содержать числа, имена чис-
ловых переменных, знаки арифметических операций, скобки.
- Когда в программе встречается арифметическое
выражение, оно вычисляется, и далее используется
его значение: присваивается числовой переменной
или выводится на экран.
Если значение не может быть вычислено, выводит-
ся сообщение об ошибке. Чаше всего такое происхо-
дит, если какое-то из значений неподходящего типа
или вообще не задано.
Вопрос для размышления. Как вы думаете, чем недоволен
Пайтон?
»> а = 13
>» print (а + 3)
Traceback (most recent call last):
File ”<pyshell#20>”, line 1, in <module>
print(a + 3)
NameError: name 1 a1 is not defined
А. Он не любит число 13.
Б. Он решил, что а — это строка.
В. Он перепутал тройку с буквой 3.
Г. Пользователь ухитрился ввести а в одном месте на английском,
а в другом — на русском.
Д. Он сегодня не в настроении. ОТВЕТ»>
От задачи к программе через формулу
— Мы сегодня программы писать будем, или как?
— Что, уже готовы? Отлично. Напишем
программу для решения вполне практичной ,
задачи — создадим Калькулятор вреда от курения. .
Предположим, мы знаем, что одна сигарета сокращает
жизнь на час1. Нужно создать программу, позволяющую каждому
курильщику вычислить, сколько лет жизни он потерял, по стажу
курения и количеству сигарет в день.
Ч: Не по-о-о-нял... Какие действия надо делать? И с чем?
К: Элементарно. Сначала разберёмся, какие у нас будут входные
данные и какие — выходные. А потом выразим формулой зависимость
выходных данных от входных. Если трудно, можно завести
промежуточные данные для хранения промежуточных результатов —
это будет как бы привал на нелёгком пути решения задачи.
ЭКСПЕРИМЕНТ:
как решать задачу, или Курить вредно!
1. Перечитаем ещё раз условие задачи. Мы знаем, что одна сига-
рета сокращает жизнь на час. Нужно сделать программу, позво-
ляющую каждому курильщику вычислить, сколько лет жизни он
потерял, по стажу курения и количеству сигарет в день.
2. Определим, что должно быть выведено в результате работы
программы. Это число (скорее всего, нецелое) — количество
лет жизни, растворившихся в дыму из-за курения. Обозначим
его, например,р1 2.
3. А какие данные мы получим от пользователя? Количество лет
курения и количество выкуриваемых за день сигарет. Скорее
всего, пользователь введёт целые значения. Но на всякий слу-
чай будем готовы и к вещественным. Назовём переменные для
этих данных g и s.
1 Это неточно. Возможно, всё ещё хуже.
2 Вообще-то в программировании считаются хорошим тоном длинные внятные име-
на, например, wasted_years или хотя бы poteryannye_gody, но лени-и-и-и-во-о-о...
4. Чтобы было легче думать дальше, напишем начало и конец про-
граммы:
g = float (input ("Сколько лет вы курите?11))
s = float (input ("Сколько сигарет в день \
вы выкуриваете ?"))
#. . .
print("Количество потерянных из-за курения \
лет жизни:", р)
Знак \ — перенос текста на другую строку (в IDLE просто пи-
шите в одну строку, без \, там места хватит). А вместо #. . .
появится формула для расчёта р через g и s.
5. Сразу написать формулу трудно. Попробуем сначала сосчитать,
сколько сигарет выкурил за свою жизнь наш пользователь. Зна-
чение назовём, например, v (выкуренное), и рассчитаем так:
v = g * s * 365. Мы пренебрегли високосными годами —
это нехорошо. Но, с другой стороны, даже для курильщика
с 60-летним стажем, выкуривающего пачку в день, это породит
ошибку всего в несколько дней, и мы готовы с этим смириться.
б. Каждая сигарета отнимает час жизни. Но нас-то интересуют
годы. Чтобы перевести часы в дни, надо значение v поделить
на 24. А потом ещё и на 365, чтобы перевести в годы. Записыва-
ем, получаем готовую программу:
g = float (input ("Сколько лет вы курите?"))
s = float (input ("Сколько сигарет в день вы \
выкуриваете ?"))
v = g * s * 365
р = (v / 24) / 365
print("Количество потерянных из-за курения лет \
жизни:", р)
Запускаем, получаем результат:
Сколько лет вы курите?5
Сколько сигарет в день вы выкуриваете?10
Количество потерянных из-за курения лет жизни:
2.083333333333333
А что ещё можно улучшить в этой программе?
А. Убрать из обеих формул 365 — это число не влияет на результат.
Б. Собрать две формулы в одну.
В. Сделать красивые начало и конец программы: пусть сначала
выведет своё название, а в конце выдаст какой-нибудь анти-
курительный лозунг.
Г. В конце запросов в input'ax поставить пробельчики, чтобы
вводимые значения не прилипали к вопросам. ОТВЕТ»>
Практикум
Есть
ЭКСПЕРИМЕНТ:
шесть единиц
Python. Есть print (). В скобочках вы можете записать
шесть единичек и один — любой, на выбор! — знак арифметической
операции. Ваша задача — получить как можно большее число.
— Если всё сделаете правильно, то число будет
такое большое, что вам трудно будет сравнивать его
с ответом. Проще сравнить с длиной ответа длину чис-
ла. Длину можно вывести так:
print("Длина числа:", len(str((...))
Там, где многоточие, поместите те самые 6 единиц и знан опе-
рации, что в предыдущем print. ОТВЕТ»>
ЗАДАЧИ:
повседневная арифметика
1. Плата за воду. Разработайте программу, которая по текущим по-
казаниям счётчика воды и его показаниям месяц назад опреде-
ляет, сколько следует заплатить за воду в этом месяце. Во что
обходится нам кубометр воды, спросите у бабушки или Гугла
(в запросе укажите слова «тарифы водоснабжения» и название
своего города). Помните, что и показания счётчика, и тарифы —
нецелые числа! ПОДСКАЗКА>»
2. Квасим капусту. На десяти литровое ведро квашеной капу-
сты, в соответствии с рецептом бабушки автора, уходит 12 кг
капусты, 1.2 кг моркови, стакан соли и 3 столовые ложки семян
укропа. Разработайте программу, которая узнаёт у пользовате-
ля, сколько литров квашеной капусты ему требуется на зиму,
и рассчитывает, сколько для этого потребуется килограммов ка-
пусты и моркови, стаканов соли и граммов укропного семени.
Если в вашей семье применяют другую рецептуру, можете на-
писать программу для неё. ПОДСКАЗКА>»
3. Содержимое копилки. Представьте себе, что вы разбили ко-
пилку с монетками. А там — множество монет разного досто-
инства: копейки, пятикопеечные, десятикопеечные, монеты
в 50 копеек, 1 рубль, 2 рубля, 5 рублей и 10 рублей. Вам нужно
спросить у пользователя (себя), сколько имеется монет каждого
достоинства, а затем определить, сколько всего у вас денег в ру-
блях и копейках (вы, конечно, понимаете, что 11 рублей 735 ко-
пеек — это на самом деле 18 руб. 35 коп.). ПОДСКАЗКА>>>
МИКРОТЕСТ:
что мы знаем о данных
Как и в прошлой главе, отметьте те утверждения, которые счи-
таете верными. Если в чём-то не уверены — проверьте экспери-
ментально.
А. В Python тип данных определяется по их значению, и это назы-
вается гусиной типизацией.
Б. Результат операции 100 * 1.5 будет вещественным числом.
В. Python позволяет перемножать строку и число.
Г, '99' больше, чем Т100'.
Д. Для Python «строка» и 'строка' — это одно и то же.
Е. Результат операции % всегда будет целым числом.
Ж.После выполнения print (20 - 5 * 3) будет выведено число 45.
Прошли тест? Вот бонус.
Для вас открыт проект «Время: от и до».
Глава 3
Интерфейс программы
llllllllllllllllllllllillllllllllllllllllllllllllllllllllllltllllllllllllllllllllllllllnill
Что такое «интерфейс»?
— Добрый день, коллега! Опаздываете... И какой-то вид
у вас слегка закипающий. Что случилось?
— Закипишь тут... Показал в школе Самовару Са-
моварычу, нашему информатику, свою «Повседневную
арифметику». Думал, оценит, похвалит. А он как начал
причитать — тут, мол, «интерфейс» ужасный, а тут его
вообще нет... Что за штука этот интерфейс? И если он ужасный — по-
чему плохо, что его нет?
К: Могли бы погуглить. Но давайте попробуем сами разобраться.
Вы же английский немножко знаете, да? «Фейс» — это что?
Ч: Было такое слово... На страничке, где «ноуз», «айз»... а, лицо!
К: Отлично. А «интер» — латинское слово, означающее «между».
«Интерфейс» — «между лицами». Что у нас происходит между двумя
лицами?
Ч: Это смотря какие лица. Если лица разумные — наверное, диа-
лог. Если не очень разумные...
К: В IT-сфере всё разумно. Когда
вы работаете за компьютером, одно-
временно ведётся много диалогов: и
между разными устройствами, и меж-
ду разными программами. Чтобы про-
граммы и устройства понимали друг друга, обмен информацией дол-
жен совершаться по определённым правилам. Вот такой «диалог по
правилам» и называется интерфейсом.
Ч: Но моя-то программа ни с чем информацией не обменивает-
ся... разве что с тем, кто её запустил.
К: Тот, кто запустил программу, называется пользователем, А ор-
ганизация диалога между пользователем и программой — пользова-
тельским интерфейсом.
Интерфейсы плохие и хорошие
_ — Так чем же плох диалог с пользователем в моих
f ^>/"5 программах? Пользователь вводит данные, программа
выводит результат. Для ввода — input (), для вывода —
print ().
— Сейчас покажу. Экспериментально. Вот ваша програм- ffl
ма к проекту «Время: от и до», которая определяет, сколько
времени вы потратили на дорогу в школу.
ЭКСПЕРИМЕНТ:
программа без интерфейса
Вот программа. Давайте её введём {или откроем, скачав файл
3-1.ру) и запустим.
# дорога в школу
cl = int(input())
с2 = int(input())
ml = int(input())
m2 = int(input())
t = (c2 * 60 + m2) - (cl * 60 + ml)
tc = t // 60
tm = t % 60
print(tc, tm)
Что? Программа запустилась и таинственно молчит? Чего она
от нас ждёт?
Я
Подглядев в текст, мы догадываемся, что надо
ввести, если мы вышли из дома в 8:40 и вбежали 4
в школу в 9:05. И можем догадаться: то, что про- 5
грамма вывела, означает, что дорога в школу за- о 25
няла у нас 25 минут.
А как быть, если нет возможности заглянуть в текст? Ведь
именно так используют готовые программы. Давайте сделаем ин-
терфейс программы понятным пользователю.
1. Во все input () добавьте тексты запросов к пользователю.
2. В print () снабдите числовые значения строковыми поясне-
ниями.
Теперь программа выглядит так:
# дорога в школу
cl = int(input("Время выхода из дома, часы: "))
с2 = int(input("Время входа в школу, часы: "))
ml = int(input("Время выхода из дома, минуты: ''))
m2 = int(input("Время входа в школу, минуты: "))
t = (с2 * 60 + m2) - (cl * 60 + ml)
tc = t // 60
tm = t % 60
print("Дорога в школу заняла", tc, "час", tm, "мин")
Что вводить — теперь понятно. Но вот порядок значений
какой-то странный. Пользователю ведь удобнее ввести сначала
часы и минуты начала пути, потом — часы и минуты конца.
3. Поменяйте местами строки программы, чтобы последователь-
ность ввода данных стала логичной.
4. И чтобы пользователь с самого начала знал, что собирается де-
лать программа, снабдите её заголовком. Например, таким, как
показано ниже.
РАСЧЁТ ДЛИТЕЛЬНОСТИ ДОРОГИ В ШКОЛУ
iiiiliiilliillilililiiiiiiiilllliiiiiiiiiiiHiiiillllilllliiiiiiiiiilillHiiliiiiiiiiiilliMiliiiiiiiiiiiliililiiiiiiiiiiiiiiiililliiilliiiiiiiiiiiiiiiiiEiiiiiiiiiiiiJililliliiiiiiililiiiliitillliiiiiiiiilliilllliilliiiiiiii
Автор программы - Чайник.
Время выхода из дома, часы: 8
Время выхода из дома, минуты: 40
Время входа в школу, часы: 9
Время входа в школу, минуты: 5
Дорога в школу заняла 0 час 25 мин
— Лайфхак: чтобы не писать много раз
print(" 111... I"), можно создать строковую пере-
менную s и присвоить ей значение, к примеру,
50 * ’ | ’. А потом в нужных местах писать print (s).
— Я понял, как делать правильный интерфейс! Надо
сверху выводить название программы в рамочке, потом
автора...
— Не всегда, и не обязательно именно так.
Всё зависит от того, зачем и для кого написана программа.
Нужно, чтобы её потенциальному пользователю было с ней
комфортно. А пользователи — они разные.
Ч: А откуда мне знать, что понравится какому пользователю,
если они такие разные? И как одновременно угодить и Самоварычу,
и двоечнику Ковшику с последней парты?
К: Об этом стоит поговорить с экспертом. Знакомьтесь — это
Дима, пиарщик.
— Ну, какой из меня эксперт... И пиарщик
я начинающий, совсем недавно университет
закончил... ой, поздороваться забыл!
Ч: Здравствуйте. А кто такой «пиарщик»?
— Пиарщик — это от «PR», public relations.
Специалист по связям с общественностью.
Пиарщик помогает делать рекламу, которая
заточена именно под тех, кому адресована. Он
может формулировать вопросы так, чтобы по-
лучать на них внятные (или нужные) ответы. Он даёт рекомендации
по такой структуре сайта, что на нём не заблудится даже самый дре-
мучий пользователь...
Ч: Тогда вы, наверное, и в интерфейсе программы разбираетесь.
Как его надо делать, чтобы пользователю понравилось?
— Ух, непростой вопрос. Критериев качества интерфейса много.
Давайте я попробую упорядочить их по убыванию важности.
Понятность. Пользователь всегда должен понимать, с какой про-
граммой он имеет дело, что и в какой форме вводить, какие резуль-
таты он получил.
Удобство. Оно складывается, например, из того, что дан-
ные вводятся в естественном для пользователя порядке. Ещё важ-
но, чтобы пользователю не пришлось вводить слишком много —
имя-то он своё пусть вводит полностью, а вот пол лучше попросить
его ввести одной буквой (М, Ж), а не словом.
Грамотность. Да. И здесь тоже надо без ошибок. Жизнь — боль.
Гибкость. Программа принимает разные варианты ввода значе-
ния — «Да», «ДА», «да». «Тупость» программы, которая «не пони-
мает» пользователя, очень его бесит.
Эстетичность. На экран должно быть приятно смотреть. Даже
если это простая программа и общается она с пользователем в обыч-
ном чёрно-белом окне.
Адресность. Учитывайте, для кого предназначена программа. Ва-
шему приятелю Ковшику будет, наверное, приятно, если програм-
ма начнёт разговор с ним с «Привет, чувак!». А вот Самовару Само-
варовичу такое обращение явно не понравится. Можно в начале про-
граммы спросить у пользователя, как к нему обращаться, а потом
поддерживать вежливый естественный диалог.
Универсальность. Если вы пишете программу, которая будет по-
лезна широкому кругу пользователей — ну, например, Спасатель мира
или Универсальный находи тель вещей в захламлённой квартире, —
стоит делать интерфейс нейтральным.
фрагментация. На экране должно быть легко ориентироваться.
Например, если игра состоит из нескольких партий, стоит, наверное,
как-то нумеровать их и отделять одну от другой.
Лаконизм. Лучше не грузить пользователя лишней инфор-
мацией,
Ч: А ничего, что эти критерии друг другу противоречат? И их мно-
го! И я не знаю, например, как сделать, чтобы «Да», «ДА» и «да» были
одним и тем же, и как сделать, чтобы при «Да» и «Нет» выполнялись
разные действия!
К: Спокойно, коллега. Кое-что полезное есть в конспектах этой
главы, что-то вы найдёте в следующих главах. Сегодня программы
будут без математических «умностей», но зато с разнообразными ин-
терфейсами. Дима, спасибо, успехов!
Инструменты для интерфейса
КОНСПЕКТ:
input
Операция ввода данных:
^Переменная,
в которую
записывается
Команда
ввести
введённое
значение j
данные
с клавиатуры
Не забывайте
закрывать
скобочки!
int(input( Введите
любое целое число
п
Преобразование к нужному типу
(для строк не надо)
Текст запроса,
выводимого на экран
Введите любое целое число: 13
Если хочется, чтобы ввод осуществлялся на другой строке:
Ввод нескольких однотипных значений:
print("Введите три различных цифры через Enter:")
nl = int(input()) >
n2 = int (input ()) > Общий запрос к нескольким
П3 = int (input ()) I последующим вводам
Введите три различных цифры через Enter:
5
7
4
— А вот если бы в первом примере кот не спал,
а ловил мышей, у нас бы были проблемы: «Кот поймал
21 мышЬ», «Кот поймал 33 мышИ», «Кот поймал 15 мы-
шЕЙ»._. Чтобы проблем не было, вывод лучше строить так:
print('Количество пойманных мышей:1, т)
— Я вроде даже выучил, где на клавиатуре двоеточие.
Я сегодня больше двоеточий поставил, чем за всю пред-
шествующую жизнь.
— Дальше двоеточий будет ещё больше: они будут
встречаться не только внутри выводимых строк. Есть два популяр-
ных стиля интерфейса: один с двоеточиями — когда то, что
вводится и то, что выводится, предваряется пояснением, — Гу Ш
а другой со знаком Второй способ выглядит более «ком- ГС* \
пьютерно».
Практикум
ПРОЕКТ:
б от-продавец
Бот — программа, поддерживающая диалог с пользователем и
помогающая ему решить какие-то проблемы (выбрать подходящий
товар, получить необходимую информацию, убить время и т. п.).
Вам предстоит сделать программу, которая:
1. Знакомится с пользователем, устанавливает с ним доверитель-
ные отношения.
2. Информирует его о товаре и убеждает купить его. При этом,
естественно, сообщается и цена товара (рубли и копейки).
3. Выясняет у пользователя, сколько единиц товара (штук, кило-
граммов, ящиков, вёдер и т. п.) он готов приобрести.
4. Вычисляет стоимость покупки (в рублях и копейках) и сообщает
её пользователю.
Учтите, что стиль разговора связан с тем, какой товар вы про-
даёте: покупатель рогатки очень сильно отличается от покупателя
лекарства от склероза, и оба они совсем непохожи на покупатель-
ницу светящейся декоративной косметики...
ПРОЕКТ:
игра в чепуху
Разновидностей игры в чепуху много. Давайте мы запрограмми-
руем ту, в которой игроку задают разные вопросы, а потом показы-
вают рассказ, в который его ответы вплетены самым неожиданным
образом. Обычно получается бредово, но забавно. Вот пример:
#################################
########## чепуха ##########
тттштшштштш
Давайте вместе сочиним рассказ.
Вы ответите на вопросы,а остальное сделает Python.
шшштшшшшшшш
Сколько времени вы в состоянии провести без смартфона?
полдня
Какое животное вам наиболее симпатично?
крокодил
Назовите первое попавшееся заклинание из "Гарри Поттера":
Люмос!
Кто обычно делает вам замечания?
завуч Ольга Петровна
Какой предмет в вашем доме самый тяжёлый?
шкаф
Какими словами вы обычно выражаете крайнее удивление?
Ого!
Чем бы вы воспользовались, чтобы отбиться от комаров?
пылесосом
Каким продуктом питания вас можно порадовать?
ряженкой
шшшшшшшшшшшшшшшшшш##
Даже крокодил знает: если полдня повторять заклинание
"Люмос!", размахивая при этом пылесосом, — оно
сработает! И шкаф г радостно похрюкивая, запрыгает
от радости, а завуч Ольга Петровна скажет: "Ого!
Получилось!11 и побежит в магазин за ряженкой.
##################################################### *
Как это сделать, вы, наверное, уже догадались. Если нет — по-
смотрите файл 3-2.ру. Только не забудьте точно согласовывать па-
дежи предполагаемых ответов на вопросы со словами, окружаю-
щими место их вставки.
— Если вам хочется создать в рассказе полноценный
iyJTxv* диалог, а для этого нужны кавычки — внутри строки ка-
вычку обозначают так: V. Если этого не сделать, а про-
сто пихнуть кавычку в текст, она закончит строну, а на
экране не выведется.
МИКРОТЕСТ:
что мы знаем об интерфейсе
Всё как обычно: отмечаете верные утверждения, потом све-
ряете с ответами в конце.
А. Программа всегда начинается с input ().
Б. Для вывода с помощью print () все числа необходимо преоб-
разовать в строки.
В. Когда значения в скобочках после print () перечисляются
через запятую, выведутся они через пробел.
Г. IDLE Python подчёркивает красным в выводимом тексте слова,
в которых есть грамматические ошибки.
Д. При разработке интерфейса программисту приходится вживаться
в роль того, кто будет пользоваться программой.
Е. При формировании строк из повторяющихся символов можно
использовать операцию умножения.
Ж.Выводимый на экран с помощью print() текст не может со-
держать знаков препинания.
3. Чтобы вывести на кран кавычку, нужно поставить перед ней "\"
И. Текст запроса в input О — это не более чем одна строка,
возможно, склеенная знаком '*+" из кусочков.
Очень гуманитарная получилась тема. Проект тоже гу-
манитарный — «Бот-психотерапевт».
Глава 4
Разветвления в программе
iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiniiiiiiiii
Наша жизнь - сплошные «если» J’nj
— Судя по выражению лица, вы, коллега, решаете сейчас I \
какой-то арх и сложный вопрос...
— Строю планы на завтра. Если первым позвонит за-
нуда Сливочник и позовёт есть пончики — скажу ему, что
мне некогда, надо делать математику... и придётся реаль-
но делать математику. А если первой успеет позвонить
Бонбоньерка, мы пойдём кататься на роликах, а матема-
тика подождёт. Я вот сейчас только что понял: в жизни всё не так, как
в программе. В программе нужные действия выполняются себе одно
за другим, и никаких тебе «если». А в жизни мы постоянно решаем,
что делать, в зависимости от условий: на красный свет стоим — на
зелёный идём; пьём сок, если он есть — пьём чай, если сока нет...
В программе тоже можно выполнять те
С / или иные Действия, в зависимости от условий.
хТ// Но прежде чем осваивать новые команды, при-
6* дется сперва научиться эти условия и завися-
щие от них действия чётко формулировать.
Ч: Да что тут осваивать? Звонит Сливочник — делаю математику,
звонит Бонбоньерка — катаемся на роликах!
К: А если никто из них не позвонит?
Ч: Да, этого я, похоже, не учёл. Ну, тогда я быстро-быстро сделаю
математику, потом покатаюсь на велике по набережной, а вечером
попрограммирую — если вы, конечно, объясните мне, как правильно
описывать наши «если».
К: Вы уже поняли, что аккуратно продумать действия во всех
ситуациях непросто. И очень непросто объяснить их на словах.
Но можно попытаться это нарисовать, для этого придуман специаль-
ный способ описания алгоритмов — блок-схема.
Ч: Минуточку, мне погуглить надо... так, «алгоритм — точное опи-
сание последовательности действий для достижения цели». Звучит
неплохо. Только как это связано с компьютером и программой?
К: Программа — алгоритм, выполняемый компьютером и опи-
санный на понятном ему языке. А блок-схема — наглядное описание
алгоритма, понятное человеку.
Блок-схема — описание алгоритма
— Блок-схема — это фигуры, соединённые стрелками.
Стрелки указывают последовательность действий. Вид фигу-
ры соответствует виду действия: ввод-вы вод, проверка усло-
вия, изменение данных...
— Постойте-постойте! Какие данные? Мы ж пока не
программу пишем, а решаем, что мне делать завтра!
К: Даже в житейских алгоритмах есть данные —
информация, которую мы получаем и сохраняем в памяти.
И даже в простеньком алгоритме построения плана на день (цель —
провести день интересно и полезно) будут как минимум три типа
блоков: начало-конец, провер-
ка условия и действие. Вот,
посмотрите, как это может вы-
глядеть.
Ч: Действительно, всё по-
нятно. И при любом ходе собы-
тий план на день выстроится и
алгоритм завершится.
К: Да, видно, что алгоритм
обладает однозначностью и ко-
нечностью — этими свойствами
должен обладать каждый поря-
дочный алгоритм.
Кстати, блок-схему можно сделать и на компьютере, с помощью
любой программы, работающей с векторной графикой’ (векторная —
это когда изображение представляет собой совокупность фигур). Вот,
смотрите:
Ч: Ого! Теперь мой план на завтра выглядит так, что прямо хочет-
ся его выполнить точь-в течь!
К: Да, аккуратная блок-схема и должна вызывать такое желание.
Но чаще рисуют её не ради воспитания пунктуальности, а для того,
чтобы зафиксировать свои мысли по поводу алгоритма и программы.
А мысли имеют свойство быстро ускользать, поэтому и запечатлевать
их мы будем по-быстрому, от руки.
1 Самый простой инструмент — PowerPoint или другая программа для создания
презентаций.
КОНСПЕКТ:
блок-схема
Блок-схема — графический способ описания алгоритма. Шаги
обозначаются фигурами, их последовательность — стрелками. Со-
держание шага — текст внутри фигуры.
Шаги разных типов обозначаются разными фигурами.
У блок-схемы одно начало и один конец. Начальный блок мо-
жет содержать название алгоритма или просто слово «Начало».
От фигуры отходит не более одной стрелки, если это не про-
верка условия.
От условия отходят две стрелки, обозначенные ДА и НЕТ1: по
какой идти — зависит от того, выполнено ли условие.
Основные элементы блок-схем:
Что делать
завтра
Конец
Начало
Начало и конец алгоритма
Действие
По мере движения по книге мы познакомимся ещё с несколь-
кими элементами блок-схем.
1 В книгах или на сайтах вы можете увидеть и другие обозначения вместо ДА
и НЕТ: Yes и No, Т (True) и F (False), иногда даже + и - соответственно.
Условный оператор
— И как от блок-схемы перейти к программе? Должны
же быть какие-то команды, которые проверяют условия и
отправляют по той или иной стрелочке? Объясните, или
эксперта позовём? Ой, а зачем вы портфель достали? Ой,
хвост!..
— Знакомьтесь. Наш эксперт — Беня. Профессия — кот.
Полиглот: думает на 11 языках, от иврита до Питона.
— Добрый день. Я начну издалека.
Моя жизнь очень предсказуема — все со-
бытия наступают чётко в положенное время,
одно за другим. В 8 все встают. Вера Соломо-
новна готовит завтрак, Наум Маркович идёт
в киоск за газетой, я перед зеркалом привожу
себя в порядок. В 8:25 все кушают. Ну и так
далее. И никакие обстоятельства эту последовательность ежеднев-
ных действий не изменят. Мы живём по линейному алгоритму. Так
называется алгоритм, где шаги следуют один за другим вне зависи-
мости от каких-то условий. Это удобно. Но скучновато.
Но 18 часов в сутки я сплю (работа такая: спать в положенном ме-
сте в красивой позе, создавая в доме уют). И смотрю сны — это уже
не работа, это хобби. И сны я-таки выбираю сам! Но, поскольку лю-
блю порядок, делаю это по правилам (правила, впрочем, я тоже при-
думываю сам и иногда их меняю).
Когда я только-только увлёкся
креативным дримвьюингом1, я смо-
трел сны по очень простому правилу:
днем сны не смотрел, а если за окном
темно — заказывал себе сон про то,
как мы едим фаршированную щуку. На
блок-схеме это выглядело так.
Ч: А на Питоне так можно?
1 Не ищите этот термин в Википедии — его там нет. Dream — сновидение,
viewing — просмотр. Термин придумал Беня. Этакое интеллектуальное пижонство,
присущее котам.
— Почему нет? Пусть это будет программа, напутствующая меня
при засыпании. Операции «посмотреть в окно» в Питоне нет, поэто-
му заменим это вводом ответа на вопрос. А остальное — практически
так, как произносится: «Если за окном темно: заказать сон про фар-
шированную щуку». Получается такая вот программа:
# Правильное засыпание
г = input(”3а окном темно? (да/нет): ")
if г == ”да1т:
print(”Заказать сон про фаршированную щуку.")
print("Заснуть.”)
Обратите внимание: после условия стоит двоеточие. А действие,
которое выполняется только при выполнении условия, записывается
с отступом: перед ним четыре пробела. При вводе программы этот
отступ получается сам в тот момент, когда после двоеточия нажима-
ют клавишу <Enter>. А команда вывода слова «Заснуть» выполняется
вне зависимости от времени суток, она размещена без отступа (для
удаления отступа нужно нажать клавишу < Backs расе>).
Извините, а два знака равенства — так надо или так вышло?
— Так надо — для того, чтобы не пу-
тать условие и присваивание, И «=» вместо
«==» — самая частая ошибка у начинающих
программистов.
Продолжим. Я решил не тратить по-
напрасну дневные часы. Щука мне к тому
времени на-
доела, поэтому, когда было светло, я
смотрел сны про охоту на летающих
тараканов, а когда наоборот — про
Софочку, которая прогуливается по
соседнему балкону, распушив хвост.
Софочка... впрочем, не будем от-
влекаться. Вот блок-схема, а вот про-
грамма.
# Правильное засыпание - 2
г = input("За окном светло? (да/нет): ")
if г == "да":
print("Заказать сон про летающих тараканов.”)
else:
print ("Заказать сон про Софочку, ")
print("Заснуть.")
Видите, я проверяю только одно условие: светло, А когда не свет-
ло — это темно. Слово else — «иначе» — отмечает место, с которо-
го начинается описание действий в
(начало^ случае невыполнения условия. По-
__ еле него — двоеточие, не забывай -
_ЗАОКНОМ^-Д-Д 1 _„|
П Т£‘
Заказать
А потом мы переехали в Петер-
бург1. А тут помимо «светло» и
«темно» есть сумерки. И теперь при
свете дня я смотрю сны про игры
с мячиком и прочую физкультуру
(от них худеют), ночью — сны про
астрофизику (от них умнеют), а в
сумерках — про Софочку. Теперь
мой алгоритм выбора сна выглядит
4—так. А ниже — программа.
# Правильное засыпание - 3
г = input("За окном светло? (да/нет/непонятно): ")
if г == "да":
print("Заказать сон про игры с мячиком.")
elif г == "нет": —л
print("Заказать сон про астрофизику")
else:
print ("Заказать сон про Софочку.") /Czf /
print ("Заснуть . ") /Х
Заметили слово elif, «иначе если»? Оно нужно для X. /
взаимоисключающих условий, следует после if или х
другого elif (их может быть много). Если какое-то из проверяемых
условий истинно, выполняются соответствующие ему действие и да-
1 Спокойно! Автор имеет право на вымысел, а хозяева Бени — на эксцентричные
поступки.
лее алы идём туда, где на блок-схеме все веточки сходятся, к концу
условного оператора.
Вот и все три вида условного оператора if. Нет больше вопро-
сов? Тогда, если не возражаете, я вас покину — пора на работу.
ЭКСПЕРИМЕНТ:
вводим и исполняем программу
с ветвлениями
Создайте в IDLE новый файл и введите последнюю из программ
Бени — ту, что с тремя ветками (для лентяев — 4-1.ру в электрон-
ном архиве).
Убедитесь, что она правильно работает. Для этого придётся
трижды её выполнять, вводя разные ответы на вопрос.
Всё хорошо? А попробуйте в качестве ответа на вопрос ввести
«Не знаю, окно занавешено». Что выведет программа?
Исправлять программу не будем (если Беня чуть чаще будет
смотреть сны про Софочку, Софочки от этого не убудет). Продол-
жим: заменим вопрос «За окном светло?» на «За окном темно?»
Что надо изменить в программе, чтобы она, получив ответ на этот
вопрос, предлагала в зависимости от времени суток те же сны, что
и раньше?
Ещё один эксперимент. Теперь программа задаёт вопрос так:
«Какое сейчас время суток?», и в зависимости от ответа (день,
ночь, утро, вечер, что-то ещё) предлагает разные темы снов. Темы
можете придумать сами. Количество elif в условном операторе
не ограничено, можно ни в чём себе не отказывать.
КОНСПЕКТ:
типы условных операторов
Условные операторы позволяют выполнять те или иные дей-
ствия в зависимости от условий.
Условия в Python — это результаты операций сравнения:
а > Ь, г == "да", number ! = 13 и т. п.
♦ Операции сравнения:
== — равно > — больше >= — больше или равно
! — — не равно < — меньше <= — меньше или равно
Оператор if:
i f Условие:
Дейс твия , е ели
условие выполнено
Продолжение
Пример: программа, которая выводит
модуль1 числа.
n = int(input("Введите число: ))
if п < 0:
п = -п
print("Модуль числа =", п)
Оператор if-else:
if Условие:
Действия, если
условие выполнено
else:
Действия, если
условие
не выполнено
Пр одолжение
Пример: программа, которая
определяет, является ли вве-
дённое число отрицательным.
n = int(input("Введите число: "))
if п < 0:
print("Отрицательное")
else:
print("Неотрицательное")
print("число1)
1 Не знаете, что такое модуль? И про положительные и отрицательные числа
не знаете? Получите Капельку информации чуть ниже.
Оператор if-elif-else:
if Условие 1:
Действия, если условие 1 выполнено
elif Условие 2:
Действия f если условие 2 выполнено
else:
Действия, если ни одно условие не выполнено
Пр одолжение
Пример: программа определяет, является ли число положитель-
ным, отрицательным или нулём.
n = int(input(”Введите число: *))
if п < 0:
print (11 Отрицательное число . ")
elif п > 0:
print (" Положительное число.11)
else:
print (” Это 0.11)
— Обратите внимание: действия, связанные с усло-
вием. могут состоять и из нескольких строк.
Нужный отступ IDLE делает сама. Но если вы и IDLE
друг друга не поняли, исправить отступы можно с помо-
щью такого лайфхака: выделяем строки, которые нужно
подвинуть влево или вправо, двигаем с помощью ко-
манд Indent region и Deindent region в меню
Format (есть и комбинации клавиш для этого).
КАПЕЛЬКА ИНФОРМАЦИИ:
отрицательные числа и модуль
Отрицательные числа — те, которые меньше нуля.
Казалось бы, ноль — это «ничего», а меньше, чем «ничего»
быть не может, так?
Посмотрите на термометр, измеряющий температу-
ру на улице (в старых питерских семьях он обычно ви-
сит за окном кухни). Температура может быть ниже нуля
(как на картинке). И на шкале ниже нуля расположены
значения со знаком «минус»: -5, -10... Это и есть отрица-
тельные числа. Чем число ниже, тем оно меньше.
А модуль числа — это расстояние от нуля до числа. Модуль
положительного числа равен самому числу, модуль отрицательно-
го — тому же числу без минуса. В математике модуль числа обо-
значается вертикальными палочками: |—3] = 3.
Нужны отрицательные числа не только для измерения тем-
ператур. Например, отрицательной может быть прибыль фирмы,
если потратила она больше, чем получила. И могли бы стать отри-
цательными школьные оценки, если бы учителя за каждую ошибку
снижали оценку на 1.
Практикум
ЗАДАЧА:
программа
по блок-схеме
Вот блок-схема. А вам пред-
стоит написать по ней программу
и тщательно её протестировать.
Имейте в виду: а и b тут —
целые числа. Почему это важно,
поймёте в ходе эксперимента.
ПОДСКАЗКА>»
ЭКСПЕРИМЕНТ:
сравнение строк
А теперь сделаем а и b строками — просто уберём int при
вводе.
Что выведет программа при вводе «сто» и «два»?
Что выведет программа при вводе «100» и «2»?
Что выведет программа при вводе «Анна» и «Anna»?
Что выведет программа при вводе «www» и «WWW»?
Что выведет программа при вводе «!!» и «!!!!!»?
ЗАДАЧА:
уравнивание яблок
У Анечки А яблок. А у Боречки... правильно, В. Разработайте
программу, которая вводит количество яблок у каждого и опреде-
ляет, кто, кому и сколько должен отдать яблок, чтобы количество
яблок у Анечки и Боречки стало одинаковым. Если оно и так оди-
наковое — ну, пусть программа так и скажет.
Два важных замечания.
1. Программа должна иметь хороший интерфейс.
2. При необходимости яблоки можно разрезать ножом на поло-
винки. ПОДСКАЗКА>>>
ЗАДАЧА:
распознавание объектов
Вам предстоит написать программу, помогающую астробиоло-
гам распознавать обитателей планеты Ююя. Все аборигены плане-
ты обладают виляйками, но их количество у разных видов различ-
но. Вот описание известных науке видов ююйской фауны.
♦ Эдакер — количество виляек может быть любым, но оно
всегда нечётно.
♦ Двутыкалка — 2 виляйки.
♦ Пузяйка — 4 виляйки.
♦ Шушунд — 10, 12 или 14 виляек в зависимости от сезона.
♦ Хых — 20, 22, 24, 26 или 28 виляек (хыхи — они такие...)
♦ Лохмыдра — не менее 40 виляек, они растут парами.
Если у объекта вообще нет виляек, он не местный. А если чис-
ло виляек не подходит ни под одну категорию — нам попалось
существо неизвестного вида.
Запутались уже? Вот потому и нужна программа: один раз во
всём разобраться, а потом всё будет просто: ввёл количество ви-
ляек — узнал, кто это, ПОДСКАЗКА>»
— Очень полезная штука — двойные неравенства.
Например, условие «п не меньше 5 и не больше 13»
можно записать так: 5 <= п <= 13. А условие «число
п нечётно» можно записать так: п % 2 == 1.
ЭКСПЕРИМЕНТ:
анализируем программу с ветвлениями
Введите текст программы. Убедитесь, что она работает.
n = int(input( ’n="))
if n % 2 > 0:
print("Б”)
else:
print("T")
n = n // 2
if n % 2 > 0:
print("0")
else:
print("У")
n = n // 2
if n % 2 > 0:
print("P”)
else:
print("K”)
А теперь ответьте на вопросы.
Будем считать, что п > 0.
1. Сколько различных слов могут
быть результатом работы этой
программы?
2. При каком наименьшем значе-
нии п программа выведет на-
звание лиственного дерева?
3. При каком наименьшем значе-
нии л программа выведет слово,
обозначающее и горного козла,
и этап чемпионата по футболу, и
туристическую поездку?
4. При каком наименьшем значении л выведется существитель-
ное, к которому подходят прилагательные «правый» и «левый»?
Значения остальных слов, выводимых программой, можете по-
гуглить сами — это именно слова, а не случайные сочетания букв.
ОТВЕТ»>
ПРОЕКТ:
тестер
Разработать программу, которая задаёт пользователю вопросы
(например, 5), на каждый вопрос получает ответ и оценивает, пра-
вилен ли он. В конце программа должна вывести количество вер-
ных ответов. ПОДСКАЗКА>»
ЗАДАЧА:
ыУ ищем ошибки «на глазок»
В школе у Бонбоньерки оценки ставят по 100-балльной шкале:
80 и больше — 5, от 60 до 79 — 4, от 40 до 59 — 3, от 20 до 39 —
2, меньше 20 — вообще 1.
Вот программа для перевода оценок из 100-балльной шка-
лы в 5-балльную. Стоп! Не надо её наколачивать! Во-первых, она
неправильная. А во-вторых, ваша задача — ответить на вопросы
без ввода программы.
print("Введите оценку в 100-балльной системе:"))
Ь = int(input())
if n >= 80:
print("Это 5")
elif n < 40:
print ("Это 2")
elif n < 20:
print("Это 1")
if 40 <= n < 60:
print("Это 3")
elif 60 <= n <= 80:
print("Это 4")
else:
print ("Вы что-то напутали’’’)
1. Что выведет программа про оценку 33? А про 99? А про 80?
А про ббб? Про -13??
2. Приведите пример какой-нибудь оценки, которая будет переве-
дена в 5-балльную шкалу правильно.
3. Как изменить программу, чтобы она стала правильной?
ОТВЕТ»
МИКРОТЕСТ:
что мы знаем о ветвлениях
Какие из этих высказываний верны?
А. В программе может быть не более одного условного оператора.
Б. В условном операторе может быть не более одного else.
В. В Python числа можно сравнивать на ==, 1=, >, <, >=, <=, а строки —
только на == и !=.
Г. Все элементы условного оператора (if, elif, else) содержат
условие и заканчиваются двоеточием.
Д. Действия при выполнении условия не могут занимать более
одной строки.
Е. Если какое-то из условий, проверяемых в условном операторе
с elif, выполнено, следующие условия не проверяются.
Ж. Конец ветвления в Python обозначается командой endif.
Если вам кажется, что одно из высказываний «верно, но не со-
всем» — считайте его неверным. А почему — узнаете в следующей
главе. ОТВЕТ»>
Простой проект, использующий ветвления, — «Бот-
жулик». Он, в отличие от предшественников, не болтает,
а занимается серьёзным делом: мошенничеством по от-
ношению к пользователю.
Глава 5
Логика в жизни
и программировании
IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIHIII
Вложенные условные операторы
— Пуфф... успел? Извините, вышел позже,
чем надо: забыл, что по средам мне надо сюда,
а не на шахматы...
— Ещё и шахматы?
Ч: Да, по вторникам и четвергам. Ещё по понедельникам, пятни-
цам и субботам — лыжи, но только если есть снег. Прошлой зимой
всего две тренировки было. И ещё вечером в пятницу мы к бабушке
в гости ездим.
К: А ко мне вы ходите по средам и воскре-
сеньям. Впору писать программу, чтобы по дню
недели она определяла, какие у вас в этот день
занятия.
Ч: Я пробовал. Сделал программу, где поль-
зователь вводит день недели и есть ли снег, а
потом идёт условный оператор с семью веточ=
ками — какие занятия в какой день. Но получилось как-то и много-
словно и многослойно. Лыжи, скажем, в трёх веточках появляются.
И каждый раз надо ещё снег проверять... Вот так можно?
elif day == "ПТ":
if snow == "ДА":
print( 'Лыжи.")
print ("К бабушке.")
К: Можно и нужно!
КОНСПЕКТ:
вложенные алгоритмические структуры
- Обратите внимание! Это важно! ВКЛАДЫВАТЬСЯ,
а не пересекаться или переплетаться!
— Про «вкладываться» — это я понял. Как матрёшки,
одна в другую. Хотя нет: в одной матрёшке всего одна сле-
дующая, а у нас бывает и больше... как коробочки в бабуш-
кином наборе швейных принадлежностей. Но в жизни-то
не так!
Вот нарисовал я блок-схему, определяющую, надо ли мне наде-
вать шапку, выходя на улицу. Моя бабушка считает, что я обязан быть
в шапке, когда температура ниже нуля. А ещё когда выше нуля, но
ниже +6 и ветер больше 8 м/с. Схема правильная — по ней я прини-
маю верные решения. Но как-то я тут
не вижу вложенных конструкций.
— Вы нарисовали схему
исходя из жизненной логи-
ки, и получилось пересече- !\
ние: у вас надевание шап-
ки находится сразу на двух ветках
разных уровней — это как если бы
в швейном наборе одна и та же ка-
тушка ниток лежала сразу в двух коробочках. К этому блоку можно
прийти двумя разным путями. Старые языки программирования та-
кое допускали: можно было команду пометить, а потом переходить
к ней из любого места программы с помощью команды перехода к
метке, GOTO.
- «К метке»? А потом к другой метке? А потом
мне ползать туда-сюда по программе, пересекая соб-
ственный хвост, забывая, что я уже сделал, а что
ещё нет, что у меня в какой переменной? Нет! Толь-
ко строгая вложенность!1 А кто не согласен - может
дальше программировать без меня!
К: Строгая вложенность — это
вот так. Схема стала побольше,
но зато она понятна, и видно, что
все ситуации предусмотрены.
Язык Питон был задуман
именно так, чтобы программист
создавал чётко структурирован-
ные программы. Структура про-
граммы и вложенность частей
видны даже без чтения текста.
Сама среда программирования
заставляет соблюдать правила
вложенности.
1 На самом деле Питон переходить к метке умеет (если выполнить с ним кое-какие
манипуляции). Но очень не любит. И правильно делает.
КОНСПЕКТ:
правила вложенности в Python
t = int(input("Температура: "))
w = int(input("Скорость ветра: ”))
if t < 00
I--Sprintf’1 В шапке.')
elif t < 60
I-->if w > 8:
I print (" В шапке,11)
I >elseQ
I *>|---Sprint ("Бев шапки. ")
elseQ
I Sprint("В шапке.")
♦ Оператор, после которого следуют вложенные операторы,
завершается двоеточием.
♦ Вложенные в него операторы смещены вправо относительно
его начала.
♦ Стандартный отступ в Python — 4 пробела.
♦ Возвращение на 4 позиции влево (на уровень выше) — кла-
виша <BackSpace> (большая такая, со стрелочкой влево).
Логические операции
К: Покажите-ка ту программу про лыжи и шахматы це-
ликом... Неплохо, сами освоили вложенные условные опера-
торы и «защиту от дурака» сделали симпатично1. Но можно
проще. Попробуйте-ка просто чётко сформулировать слова- J
ми, в каком случае у вас бывает лыжная тренировка.
Ч: Если сегодня понедельник, или пятница, или суббо-
[ та, и ПРИ этом есть снег.
‘К: А теперь я переведу это на Питон. Сделаем как у
вас: day — день недели, a snow — ответ на вопрос «Есть снег?» Усло-
вие будет выглядеть так:
1 Полный текст программы Чайника есть в электронном архиве.
If (day == "ПН” or day == "ПТ" or day == "СБ") and
snow == "ДА”:
Ч: Питон понимает, когда ему просто говорят что-то по-английски?
Или это специальные команды?
К: Нет, обычную английскую речь Питон не поймёт. Но or и and —
это логические операции, которые Питон умеет выполнять.
Ч: Стоп! Я боюсь запутаться. Вот if — условный оператор. A or —
операция. Это одно и то же?
К: Нет, это разные понятия. Оператор — отдельное законченное
действие, например ввод, присваивание, проверка условия. Обычно
оператору соответствует определённое слово в языке программиро-
вания (print, =). Операция — часть оператора: например, в операто-
ре присваивания могут использоваться арифметические операции. А
ещё есть операнды — то, с чем выполняются операции. Понятно?
Ч: Ну, примерно. Операторы выполняют операции над операн-
дами. Давайте про логические операции! Эксперт будет? Интересно,
кто? Программист, юрист, философ?
К: Бабушка. Правильная бабушка — и философ, и юрист, и про-
граммист. Знакомьтесь — Ольга Андреевна, для своих пятерых вну-
ков — Баба Оля.
— Здравствуйте! Да, внуков пятеро. Трое Ивано-
вых, двое Петровых. На Питоне это выглядит так:
if name == "Миша” or name == "Коля";
surname = "Петров”
else:
surname = "Иванов”
Ч: Вы тоже на Питоне разговариваете?
— Немного. Дима пока только начал его изучать. Логические опе-
рации мы уже прошли. Вот она, операция — or, или, Стоит в условии
между двумя операциями сравнения, они приходятся нашей опера-
ции or операндами. Условие будет выполнено, если хотя бы один из
операндов истинный. Проверим? Добавим ввод имени внука и вывод
фамилии. Миша — Петров. Вася — Иванов. Коля — Петров...
Ч: А можно покороче записать?
if name == "Миша" or "Коля”?
— Давайте попробуем.
Ч: Так, вводим «Миша» — выводится «Петров». Вводим «Вася»,.,
ой, тоже Петров! Почему?
— Потому что логические операции работают корректно и пред-
сказуемо только тогда, когда операндами их является то, что может
быть истинно или ложно. Результаты операций сравнения — пра-
вильные операнды. А просто «Миша» или «Коля» — строки.
Про о перацию and лучше рассказать на другом примере. ПроДеда
Мороза. Он, как известно, приносит подарки 31 декабря и только тем,
кто хорошо себя вёл. Пусть day — сегодняшняя дата, а behavior —
ответ на вопрос «Как ты себя вёл?». Тогда решение о том, будет ли
подарок, принимается так:
if day == "31.12” and behavior == "ХОРОШО":
print("Сегодня ты получишь подарок от Деда Мороза!")
else:
print("Увы, сегодня подарка не будет :(((")
А ещё есть операция not. Скажем, все мои внуки, кроме Коли,
любят борщ. Поэтому, когда в гости приезжает не Коля, я борщик
готовлю. На Питоне это пишется так1 (v — имя при-
езжающего внука):
if not v == "Коля": Иногда из логических
print ("Борщ’") операций приходится вы-
страивать сложные конст-
рукции — логические выражения. Вот так, например,
выглядит условие надевания внуком шапки (t — тем-
пература воздуха, w — скорость ветра в метрах в секунду):
1 А можно и не так — есть же операция > = . (Примечание Пайтона
умничает...)
if (t < 0) or (t < 6 and w > 8) or (t < 11 and w > 12):
print(”Нужно надеть шапку1*)
else:
print (’’Можно без шапки”)
Всё понятно, правда? А представьте, как это вы-
глядело бы без логических операций, через вло-
женные if...
Ой, пора мне уже, надо успеть Колю покормить
между бальными танцами и пэчворком1. Приятно
вам попрограммировать!
Ч: Забавно, что все бабушки одинаково
серьёзно относятся к тому, в шапке ли внук.
К: Не все. Вот моя бабушка «моржует» и
к отсутствию шапки у внуков относится спо-
койно. Зато не позволяет мне ездить на ве-
лосипеде без шлема!
КОНСПЕКТ: Л
логические операции в Python
Логические операции нужны для формулировки сложных условий.
Их три — and, or, not. Первые две — бинарные: ставятся между
операндами. Третья — унарная: ставится перед операндом (как
минус, делающий число отрицательным).
Операндами логических операций чаще всего являются сравне-
ния: х > 0, otvet == ''ДА".
Можно применять такие операции и к логическим выражениям:
(а < 0 and Ъ < 0) or (а > 0 and Ь > 0)
Операция Пример
and И а > 9 and а % 2 -- 0 Число а больше 9 и чётное
or ИЛИ п % 10 — 1 or п % 10 -- 6 Число п заканчивается цифрой 1 или 6
not НЕ not (z >- 10 and z <- 100} Число z не является двух- значным
1 Пэчворк — шитьё из лоскутков. Вполне программистский вид рукоделия.
ЭКСПЕРИМЕНТ:
логические значения и приоритеты
логических операций
Приоритет — порядок выполнения операций в выражении.
Например, 5 + 3- 2= 11,а не 16, потому что приоритет умноже-
ния выше, чем приоритет сложения.
1. Создайте в IDLE новый файл и напишите вот такие две строчки:
а = (1 == 1)
print(а)
Запустите программу. Что означает выведенное английское
слово?
Замените последнюю единицу двойкой и запустите программу.
А это слово что означает?
Теперь мы знаем, что можно сохранять в переменных значения
операций сравнения. Это ИСТИНА или ЛОЖЬ, True или False
на Python.
2. Изменим программу. Будем присваивать трём переменным
значения True или False и выводить значение логического
выражения,
а = True
b = True
с = True
print(not a or b or c)
print(not(a or b or c))
Почему появление скобок изменило результат?
3. Продолжим: теперь программа такая:
а = True
b = True
с = False
print(a or b and с)
print((a or b) and c)
Что выводит программа? Какая операция в выражении a or Ь
and с выполнялась первой — or или and?
4. При тех же значениях переменных замените
последние две строки:
print(not с and а)
print(not(с and а))
not
У какой операции — not или and — приоритет выше?
Мы выяснили, что приоритет у not выше, чем у and, а у and —
выше, чем у or. Это логично, потому что именно таковы
приоритеты логических операций в математике.
КАПЕЛЬКА ИНФОРМАЦИИ:
логические операции в математике
Математическая логика — раздел математики, имеющий дело
с высказываниями и логическими операциями. Причём для мате-
матика содержание высказывания совершенно неважно — важ-
но только истинно оно или ложно. Высказывания обозначают
латинскими буквами, как логические переменные со значениями
True и False (правда, в математике True чаще обозначают как 1,
a False — как 0).
Логические операции в математике обозначаются и называют-
ся не так, как в Python. К этому надо быть готовым — а то вдруг
в школе на информатике1 начнут произносить всякие страшные
слова, а вы не узнаете старых знакомых и испугаетесь.
Python Математика
and — И True and True == True True and False = False and True == == False and False = False A — конъюнкция, логическое умножение 1 A 1 = 1 1 лО — 0а1—OaO — 0
or — И False and False == True True and False = False and True == == True and True == True v — дизъюнкция, логическое сложение 0 v 0 = 0 1v0=0v1=1v 1 = 1
not — HE not False == True not True -- False — отрицание, инверсия -0=1 -1=0
’ В школе математическую логику изучают на информатике, а не на математике.
Где логика?
Практикум
ЗАДАЧА:
лесная дорога
Протяжённость лесной дороги — 20 км. < ^ji-17/
Километры с 1-го по 3-й, с 8-го по 12-й, а так-
же 17-й километр дороги проходят по краси-
вому сосновому бору. 13-й километр — дюны
у озера. 5-, 6- и 14-й километры — болото. 20-й километр — луг.
А всё остальное — смешанный лес.
Разработайте программу, которая по номеру километра доро-
ги определяет характер местности на нём.
Если в вашей программе есть условный оператор, в котором
более 5 веточек, почитайте ещё раз про логические операции.
А если веточек 20, ещё и про двойные неравенства.
ЗАДАЧА:
партийные взносы
Члены Партии любителей денег ежемесячно платят партий-
ные взносы. Если доход за месяц больше миллиона или меньше
20 000 дырлей1 — член партии от уплаты взносов освобождает-
ся. Остальные уплачивают взнос в 1/10 000 от своих доходов, но
не меньше 10 дырлей. Всякие там десятые и сотые
части дырля при расчёте величины взносов отбра-
сываются. \ У) J
Вот примеры (их можно использовать и как тес-
товые значения):
Доход (дыр.) Взнос (дыр.) Доход (дыр.) Взнос (дыр.)
1 000 001 0 43 580 10
317 283 31 17 000 0
1 Что вас смущает? Дырль — официальная денежная единица Гдетотамии, А вы
что, подумали, что это тут, у нас?
Разработайте программу, которая по величине дохода за ме-
сяц рассчитывает величину взноса.
Попробуйте решить эту задачу двумя способами: с применени-
ем математических операций и без них (если применить матема-
тику, можно будет обойтись без вложенных условных операторов).
ОТВЕТ»>
— Есть такие полезные штуки — if а > ь~
СЦ • max (максимум) и min (минимум). с = а
V -'" Вот такую конструкцию из четырёх else:
строчек ----------------------> с = Ь
можно заменить на с = max (а, Ь). Это
поможет без лишних ветвлений разобраться с «не меньше
10 дырлей».
ПРОЕКТ:
сло-о-о-жные правила жизни
В повседневной жизни при принятии решений нам часто при-
ходится учитывать разные правила. К примеру, в этой главе есть и
Правило лыжной тренировки, и Правило надевания шапки...
Постарайтесь вспомнить {ну или сочинить) какое-то о-о-очень
сло-о-о-жное правило жизни и запрограммировать его. Ничего не
приходит в голову? Ну вот несколько вариантов.
♦ Какая футбольная команда из двух разместится выше в тур-
нирной таблице?
♦ Как реагировать на «Мяу!» вашего кота?
♦ Нужно ли делать домашнее задание?
В каждой из ситуаций следует хорошо обдумать входные дан-
ные (то, на основе чего мы принимаем решение) и возможные ре-
шения (в случаях с футболом и домашкой их два, а вот в случае
с котом может быть много).
МИКРОТЕСТ:
что мы знаем о логических операциях
Какие из этих высказываний верны?
A. (True and False) — это не «частично верно» или «не совсем
истинно», это ложно, False.
Б. Логическая операция всегда стоит между двумя операндами.
В. True or True and False — это будет False.
Г. Порядок выполнения логических операций можно изменять
с помощью скобок.
Д. Двойное неравенство 5 <= х <= 13 эквивалентно х >= 5 or
х <= 13.
Е. Логическое выражение (х == 3) or not (х == 3) истинно
при любом значении х.
Ж.Внутри условных операторов могут быть вложенные условные
операторы.
3. Операнды могут включать операции и операторы.
И. В математической логике 1 обозначает ИСТИНА, 2 — ЛОЖЬ.
К. Высказывание НЕ (Дима любит борщ) ИЛИ (Дима изучает Python)
истинно, если речь идёт о внуке Бабы Оли.
Проверили ответы на тест? Сошлись? Хотите заслу-
женный бонусный проект? Теперь вам по силам ещё
один бот (последний!) — «Бот-руководитель».
Глава 6
Программа и программист:
как понять друг друга
iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiniiiiiiiiiiiii
Как программировать понятно
и без ошибок
— Похоже, опять какие-то проблемы? Самовар Само-
варыч влепил трояк по информатике?
— Почти. Самовар Самоварыч, чтобы я не особо умни-
чал на уроке, дал мне книжку по Питону. Взрослую. Я там
только первые две главы прочитал, узнал столько нового!
Оказывается, можно делать программы намного короче,
если писать команды в одной строке!.. А вот с задачкой, которую Са-
моварыч решить предложил, что-то не получилось.
К: Рассказывайте, что за задача, и показывайте код.
Ч: Код? Какой код?
К: Так программисты называют текст программы. А процесс напи-
сания программы называют кодированием. И это довольно точно: ко-
дирование — представление информации в другой форме для удоб-
ства работы с ней. Программист, пишущий программу, представляет
свои мысли в форме, понятной компьютеру, — кодирует, на сленге
программистов — «кодит».
Ч: Понятно. В задачке нужно было проверить, идут ли циф-
ры четырёхзначного числа в порядке возрастания или убывания.
Код — вот:
n = int(input("Введите четырёхзначное число:"))
if n < 1000 or n > 9999: print ("Это не четырёхзначное \
число!")
a = n // 1000; b = n % 10; c = n // 100; d = n % 10
if a < b < c < d: print ("Цифры в порядке возрастания")
if а > b > с > d: print ("В порядке убывания")
К: Та-а-а-к... Вам как лучше помочь: конкретно с этой программой
или научить программировать так, чтобы вы понимали ваши про-
граммы, а компьютер понимал вас?
Ч: Лучше, конечно, научить, если есть какие-то общие правила.
А эксперт будет?
К: Сразу два. Боюсь, один не справится: искоренить возникающие
у Вас дурные привычки будет непросто. Эксперты очень крутые. Оба
учат программистов: Хэл Абельсон — профессор Массачусетского
технологического института, Брайан Керниган — автор отличных
книг по программированию.
— Здравствуйте. Я не похож! В реальности я ста-
рее и значительно серьёзней!
— Вы, Хэл, просто не видите себя со стороны.
Вот я не похож: борода у меня длиннее и очень ак-
куратная. Чем мы можем помочь
юному коллеге?
— Думаю, ссрормулируем ка-
кие-то общие принципы, не зависящие от языка.
Сначала самое важное. Выделите это, пожалуй-
ста, жирным шрифтом.
Программы должны писаться для людей, ко-
торые будут их читать.
Если программа понятна человеку — и тому, кто
её написал, и тому, кто хочет разобраться, как она ра-
ботает, — у компьютера, скорее всего, проблем при
её выполнении не будет, А теперь несколько конкрет-
ных советов.
Обдумайте структуру программы до ее напи-
сания. Хорошие программисты, как правило, думают
ручкой на бумаге.
Не ленитесь давать данным хорошие имена. Если
во всех программах у вас используются имена типа а,
Ь, с, d, то через сутки вам будет не вспомнить, что из
них для чего предназначено. Скажем, в Вашей програм-
ме логично было бы назвать переменные для цисрр
digiti, digit2 и так далее.
Ч: Извините, а можно называть их по-русски? А то с английским
у меня плохо...
— Не советую. Не все проблемы с кодами букв кириллицы реше-
ны, поэтому во избежание неприятностей лучше писать латиницей.
Плохо с английским? Используйте транслит1. Продолжим.
Пишите так, чтобы структура программы была хорошо вид-
на. Отступы в Python для того и придуманы, чтобы чётко показы-
вать структуру программы. А еще
разумно части программы (ввод
данных, обработка данных, вывод
результата) отделять друг от друга
t h tг+ s " Памперсы1*
пустыми строками.
Не пренебрегайте комментариями! Если
пишете программу для себя, и она несложная,
можно, пожалуй, обойтись внятными имена-
ми переменных. Но если в программе приме-
нена, к примеру, формула, которую вы рань-
ше не знали и не факт, что запомнили — не
поленитесь поставить # и коротко описать, что тут за формула и где
вы ее нашли.
Ч: Скажите пожалуйста, мистер Абельсон, комментарии надо
вставлять в программу, когда она уже готова, или прямо во время
написания?
— Хороший вопрос! Писать
комментарии к уже готовой
программе — плохой вариант.
Но лучше, чем вообще не пи-
логина.
#Про&е?^а.
1 Транслит — написание слов с помощью букв другого алфавита, сходных по зву-
чанию, к примеру, rezultat, KolichestvoDvoek, cifral.
сать их. Комментарии по ходу написания программы — вариант хо-
роший: вы как бы всё время проверяете себя, держите в голове логику
программы, да и маленькая пауза в кодировании пойдёт на пользу.
Но круче всего будет, если часть комментариев вы напишете до на-
чала кодирования: это будет означать, что вы хорошо всё обдумали,
и шансы сразу написать программу правильно будут намного выше.
Ч: А если программа всё равно не работает или работает непра-
вильно?
— Брайан, дальше вы. Отладка — это по вашей
части.
— Да, я люблю отладку. Поиск ошибок — про-
цесс увлекательный и творческий, как охота на
хитрого и осторожного зверя: догадаться, где он
может быть, идти по запутанному следу, вымани-
вать из норы... Если вы стараетесь сразу написать
программу абсолютно правильно, — видимо, вы недостаточно умны,
чтобы её отлаживать! Хэл, правда, думает иначе...
Пишите программу частями и
сразу же проверяйте. Запрограмми-
ровали ввод данных — сразу проверь-
те, убедитесь, что интерфейс понятен
пользователю. Выведите только что
Сколько syzjet 3-^5?
введённые данные, чтобы проверить, что компьютер правильно рас-
познал их типы. Рассчитали значение, нужное для дальнейших вы-
числений, — выведите его, убедитесь, что с ним всё хорошо.
Используйте отладочную печать. Получи-
ли значение — выведите его, даже если это не
конечный результат, а промежуточные данные
для дальнейших вычислений. Чтобы отладоч-
ные print не путались с настоящими, начинай-
те их с какого-то символа и номера, например
print("?1" t digiti, digit2,digit3,digit4).
Есть, конечно, специальные программы-отладчики, в том числе
встроенные в среду программирования, но их освоение потребует
времени, а вам же некогда, верно?
Если в ходе отладки вы обнаружили, что выбрали неудач-
ный путь решения задачи или вообще неправильно поняли её,
не падайте духом — это нормально. В следующий раз вы больше
времени потратите на обдумывание задачи — и на отладку его уйдёт
меньше.
— Давайте закончим на этом, Брайан. Видно, что у молодого кол-
леги уже чешутся руки применить на практике наши советы. Не бу-
дем ему мешать.
ЭКСПЕРИМЕНТ:
исправляем программу
Приведём в порядок программу Чай-
ника, с которой начинался разговор в этой
главе. Она должна проверять, идут ли циф-
ры введённого четырёхзначного числа в порядке возрастания или
в порядке убывания. Текст есть в электронном архиве (6-1.ру).
1. Введите в IDLE текст программы, сразу же избавляясь от «опти-
мизации», скрывшей структуру программы: то, что стоит по-
сле двоеточия, должно размещаться на следующей строке
с соответствующим отступом. Команды, разделённые точкой
с запятой, тоже должны быть на отдельных строчках, а лишние
знаки препинания лучше убрать. Правда, так лучше?
n = int(input(”Введите четырёхзначное число:"))
if п < 1000 or п > 9999:
print ("Это не четырёхзначное число!")
а = п // 1000
b = п % 10
с = п // 100
d = п % 10
if а < b < с < d:
print ('Цифры в порядке возрастания")
if а > Ъ > с > d:
print ("В порядке убывания")
2. Возможно, теперь вы заметили, что структура программы
не вполне соответствует алгоритму решения задачи. А какой
он, правильный алгоритм? Попробуем описать его в виде блок-
схемы. В чём отличия от программы?
3. Приведите программу в соответствие с блок-схемой: действия
по анализу четырёхзначного числа должны быть альтернативой
сообщению об ошибке.
if п < 1000 or п > 9999:
print (“Это не четырёхзначное число!11)
else:
# и вот здесь будем наковыривать цифры из п
Для сдвига большого куска программы вправо или влево можно
выделить его и воспользоваться командами Indent Region и
Deindent Region в меню Format (есть и комбинации клавиш
для этого).
4. Попытайтесь дать переменным а, b, с, d имена, отражающие
их роль в программе — 1-, 2-, 3- и 4-ая цифры числа. Если по
ходу дела вы увидите ошибки в вычислениях — постарайтесь
их исправить. С первой и последней цифрами у Чайника всё
неплохо, а вот с остальными...
5. После вычисления цифр числа выведите их на печать. Все
правильно? Если не всё, подумайте и исправьте. Вторую мож-
но найти как последнюю цифру результата деления п на 100,
(п // 100) % 10, а третью — как последнюю цифру результата
деления п на 10.
6. Видимо, вы уже догадались, что у большинства чисел циф-
ры идут и не в порядке возрастания, и не в порядке убывания
(к примеру, 1703, 5555, 9786...). Так что у условного оператора,
организующего вывод сообщения, не две, а три взаимоисклю-
чающих ветки. Программируем!
7. Программа работает? Уверены? Возьмите бумагу и ручку, на-
пишите тестовые значения — какие числа нужно ввести, что-
бы проверить, что правильно работают все веточки алгоритма
(их у нас 4). Если что-то не получилось, и вы не видите, в чём
причина, подсмотрите в ОТВЕТ>».
Практикум
ЗАДАЧА:
сколько дней в месяце
Вам предстоит сделать программу
«с нуля» и «под ключ» — удобную, на-
дёжную понятную. Вам придётся самим
определить, какие входные данные по-
требуются для того, чтобы определить количество дней в месяце,
продумать интерфейс, придумать и реализовать алгоритм, тща-
тельно отладить программу, протестировав её и при корректных
данных, и при некорректных.
Не знаете, как определить количество дней в месяце? Гугл
в помощь! Ну или родители, бабушка с дедушкой — взрослые,
знаете ли, иногда очень полезными бывают.
ПРОЕКТ:
забавная нумерология
Нумерология — псевдонаука1, которая устанавливает связь
между числами и событиями в жизни человека, чертами его харак-
тера. По мнению нумерологов, числа влияют и на исторические
события.
Разработайте программу, которая просит пользователя назвать
его любимое число (можно ограничить диапазон чисел, а можно
и не ограничивать), а затем, в зависимости от его ответа, выво-
дит прогноз на предстоящий день (неделю, год, жизнь — что вам
больше нравится).
Только, чур, не писать отдельные варианты для каждого числа!
Лучше формировать «прогноз» из нескольких строк, связанных со
свойствами числа (например, время события — в зависимости от
величины числа, с кем произойдёт событие — по остатку от де-
ления на 5, какое событие — на 7 и т. п.). Тогда и программа по-
лучится интеллектуальная (а то что-то у нас всё боты да боты...),
и пользователь не сразу догадается, в чём прикол.
Ничего, что строки будут не связаны между собой и окажутся
не имеющими отношения к жизни пользователя: если ваша бабуш-
ка в ответ на введённое любимое число 777 узнает, что ей сегодня
не следует играть в футбол во избежание красной карточки, что
завтра — благоприятный день,
чтобы сделать пирсинг, и что в
этом месяце её хомячок выиграет
в лотерею поездку в Занзибар —
она вряд ли обидится. Просто
решит, что компьютер спутал
футбол с преферансом, пирсинг
со стрижкой, а хомячка — с лю-
бимым котом Васюней.
1 «Псевдо» — греческая приставка, означающая что-то мнимое, ложное. Но,
поскольку мы сейчас живём в эпоху, когда люди, обалдевшие от потока инфор-
мации, верят в любую чушь, в том числе и в нумерологию, не будем афиширо-
вать своё недоверие к ней, лучше сделаем из нумерологии игру.
МИКРОТЕСТ:
что мы знаем о культуре
программирования
Какие из этих высказываний верны?
А. То, что программа понятна только её автору и компьютеру — это
круто!
Б. Чем больше в программе комментариев, тем лучше.
В. Не следует размещать несколько операторов на одной строке,
хотя Python и даёт такую возможность.
Г, Хорошие программисты думают на бумаге.
Д. Тестовые значения лучше заготовить до запуска программы,
а ещё лучше — до её написания.
Е. Программу невозможно отладить без специальной программы-
отладчика, позволяющей узнать промежуточные значения дан-
ных.
Ж. Имена переменных, которые означают что-то важное, не должны
быть однобуквенными.
3. Путаница между буквами кириллицы и латиницы с одинаковым
начертанием — частая причина ошибок.
И. Написать сначала комментарии к программе, а потом код — хо-
роший стиль пограммирования.
К. Отладка — это не «работа над ошибками» в наказание за небреж-
ность, а нормальный этап создания программы.
А вот бонуса-проекта тут не будет
Будем считать, что после этой важной главы надо сделать пау-
зу, чтобы все важные идеи в голове улеглись. Да и «Нумерологии»
вам надолго хватит, особенно если отнестись к ней всерьёз и на
примере этого проекта разобраться, чему вы научились.
Глава 7
Повторения
IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIHIIII1
Компьютер — машина для повторений?
— А что это у вас, коллега, за внезапная смена имиджа? Гу Щ
Почему у вас носик в зелёный цвет покрашен? Это какой-то Т
модный тренд? ^2—/
— Нет, это потому, что я самоуверенный лопух. По-
спорил со Сливочником, что решу уравнение раньше, чем
он; проигравший красит носик. Он решает на бумажке,
я — на Питоне... Питон же круче, чем бумажка, я прямо
уже предвкушал, как будет выглядеть беленький Сливоч-
ник с зелёным носиком! А в итоге оказалось, что мне всё равно перед
написанием программы пришлось на бумажке решать, а потом я в
одном месте не то деление поставил...
К: А уравнение какое было?
Ч: То, про которое спорили, вот: 77 • X + 111 = 890. Но мне по-
казалось, что неправильно писать программу, которая всего одно
уравнение решает, и написал программу, которая получает от поль-
зователя числа А, В и С и решает уравнение А X + В = С1.
К: Это же очень здорово — вы сами догадались, что программа
должна обладать универсальностью, должна уметь решать одну и ту
же задачу для разных данных. Но об этом мы в следующий раз пого-
ворим. А зелёный носик смотрится свежо и экологично.
Ч: Ага... а Сливочник злорадствует...
К: А вам много таких уравнений сейчас задают?
Ч: Сегодня 20 штук задали, потому что послезав-
тра проверочная. Ха... так ведь я теперь мало того,
1 Программа Чайника есть в электронных материалах. Но, может, сами напишете?
что домашку сделаю за пару минут, могу ещё и опять со Сливочни-
ком поспорить, что решу 20 уравнений раньше, чем он 101 И будет
Сливочник ядовито-розовым носиком сверкать!
К: А вы (ценой зелёного носика) убедились, что компьютер пре-
восходит человека именно тогда, когда одни и те же действия повто-
ряются многократно с разными данными. Его, собственно, для этого
и придумали.
Программирование повторений
Ч: И Вы мне сейчас расскажете, как объяснить Питону,
что и сколько раз надо повторять? Или придёт эксперт?
К: А кого бы вы выбрали экспертом по повто-
рениям?
Можно выбрать?! Кукушку! Только давайте не настоя-
щую, а ту, которая в часах!
К: Знакомьтесь — кукушка Катюшка.
— Ку!.. Точнее, здравствуйте. Давайте я вам
по-быстренькому расскажу, как куковать нуж-
ное количество раз, и полечу выкуковывать
7 вечера.
Вот, предположим, надо мне прокуковать
7 раз. Куковать — дело нехитрое. А вот как сде-
лать это 7 раз и не ошибиться? Элементарно! Каждый раз, как я про-
изношу «Ку-ку!», я загибаю очередной палец на лапе: «Ку-ку!» — раз,
«Ку-ку!» — два... Когда загнула 7-й палец, процесс кукования завер-
шён.
Ч: Извините, у меня вопрос. Вот у Вас две лапы. На каждой паль-
цев... раз, два, три...
— И вот четвёртый, задний... Итого на двух лапах 8. Понимаю,
что вас смутило. Да, 9,10, И, 12 часов я выкуковываю под программу.
Мне хозяин написал. Я её запускаю, ввожу нужное число кукований,
а дальше читаю то, что вывелось. Вот:
n = int(input("Сколько раз прокуковать? "))
for k in range(n):
print("Ку-ку’”)
Вся хитрость в переменной к. Это как бы число загнутых вирту-
альных пальцев. Теперь я могу и тысячу раз прокуковать, если надо!
Правда, хозяин попросил так не делать — ему непрерывное кукова-
ние мешает работы учеников проверять. Он у меня учитель, инфор-
матику преподаёт! Обещал мне в программу включить ещё генератор
случайных чисел1 от 1 до 5 — чтобы я ему подсказывала, что ставить
ученику за работу. Всё, полетела я!
Ч: Чует моё сердце, хозяина Катюшки зовут Самовар Самоваро-
вич... будем мы скоро все с накукованными оценками.
ЭКСПЕРИМЕНТ:
исследуем range ()
1. Давайте попробуем посмотреть, как меняется переменная цик-
ла в ходе его выполнения. Введите программу и запустите её:
for k in range(5):
print(к)
А что нужно указать в скобках, чтобы последним выведенным
значением было 7?
2. Изменим программу:
for k in range(2, 5):
print(к)
Что нужно указать в скобках, чтобы программа считала от 1
до 5?
3. А если так?
for k in range (5, 2) :
print(к)
Почему программа ничего не вывела?
4. Попробуем теперь так:
1 Про то, как его сделать, рассказывается в главе 11. Потерпите.
for к in range(5, 2, -1):
print(к)
Что следует указать в скобках range(), чтобы программа
считала от 10 до О?
5. Ещё один эксперимент:
for k in range(10, 100, 10):
print(к)
А как вывести все числа, которые больше 1000, меньше 2000
и оканчиваются на 13? ОТВЕТ»>
КОНСПЕКТ:
цикл for, диапазон range
Оператор цикла for по-
зволяет выполнить действия
для каждого значения пере-
менной цикла из заданного
набора.
Прочитать можно так:
«Для всех значений ... из ...
выполнить...»
Пока что мы рассмо-
трим только случай, когда
Переменная
цикла
Описание набора
значений
for k in range(1, 5)6)
Sprint(к * ”! ”)
Действия, выполняемые
для каждого значения
переменной цикла
for работает с диапазоном числовых значений.
Диапазон формируется с помощью range(). Это последова-
тельность целых чисел от начального значения до конечного (при-
/-------------\
Начальное
значение
\_____________/
range (а, Ь, с)
Конечное значение(для него
действия уже не выполняются)
чём конечное значение в по-
следовательность не входит!)
с заданным шагом.
Если шаг не задан, он ра-
вен 1.
Если не задано начальное
значение, оно равно 0.
А вот конечное значение
задать надо обязательно.
Повторения - блок-схема
Zx Ч: Вроде бы всё понятно. А на блок-схеме это можно
нарисовать? Я уже помаленьку привыкаю думать
на бумаге... л
К: Можно. Причём двумя способами. Вот первый. vy И/
Ч: О, новые фигуры... эта похожа на шоколадную конфету г? \
в обёртке из толстой бумаги...
К: Позитивный вы! Программисты старшего поколения называют
эту фигуру «гробик».
Ч: А в нём тело цикла? Нет, с конфеткой
и приятнее, и понятнее: на обёртке написано,
сколько раз и как повторять то, что внутри.
А внутри те действия, которые повторяются
много раз. Только из этой схемы не совсем по-
нятно, что происходит с ПЦ (это же перемен-
ная цикла, да?).
К: А для этого другая схема. Тут как раз все приключения пере-
менной цикла видны.
Сначала ей присваивают начальное значение.
Потом после каждой итерации (итера-
ция — одно выполнение тела цикла) к зна-
чению переменной цикла прибавляют шаг и
сравнивают результат с конечным значением:
если оно достигнуто, цикл больше не повто-
ряется.
Только обратите внимание: эта блок-
схема — для Питона. В некоторых других
языках программирования конечное значе-
ние в последовательность включается, знак в
“Тело
последнем блоке —
не «меньше», а «меньше или равно». В других языках конечное зна-
чение — это последнее значение, с которым цикл выполняется,
в Питоне — первое, при котором перестаёт выполняться. Эта осо-
бенность провоцирует множество ошибок, не забывайте о ней.
Ч: А зачем Питону такие сложности?
— Зачем-зачем... мне тан удобно. А кому не нравит-
ся, пусть идёт на Паскале программировать. Или вон на
kS/ 'С.!/ C++ - там повторения так организованы, что программист
может какие угодно условия продолжения цикла закру-
чивать, и с переменной цикла массу действий выполнять. Вот только
понять, что он там понакрутил. даже самому программисту бывает
непросто. А от непонимания - ошибки... У меня всё чётко.
Практикум
ЗАДАЧА:
генератор заклинаний
Доказано1: слова обладают силой. Разной — в зависимости от
того, какие это слова и в какой ситуации они прозвучали. Но даже
мелкие повседневные слова при многократном повторении могут
изменить реальность. Если худеющая дама тысячу раз выразитель-
но произнесёт «Я совершенно не хочу есть!», она реально слегка
похудеет (не может же она есть и говорить одновременно, вер-
но?). А если бы не звучало на стадионе тысячеголосое «Ну-жен-
гол!», футболисты вальяжно разгуливали бы по газону, провожая
мяч задумчивым взглядом...
К делу. Разработайте программу, которая спрашивает у поль-
зователя «Что нужно сказать?» и «Сколько раз?», а потом произ-
носит заданную фразу указанное число раз. А чтобы программа
не жульничала (вдруг она,
коварная, вместо миллио-
на раз выведет нужные
слова всего 999 раз?) —
пусть каждый раз выво-
дит и номер повторения
фразы. Вот пример интер-
фейса:
Что нужно вывести? Не знаю.
Сколько раз? 5
1 : Не знаю.
2 : Не знаю.
3 : Не знаю.
4 : Не знаю.
5 : Не знаю.
1 Кем доказано? К примеру, Шефнером и Гумилёвым в стихах, Ле Гуин в прозе.
Маленькие ещё, не читали? Ну, вот как почитаете, будете уже не такие уж и ма-
ленькие.
Введите число:
777 777 * 2 — 1554
777 * 3 2331
777 * 4 3108
777 * 5 3885
777 * 6 — 4662
777 * 7 5439
777 8 6216
777 * 9 — 6993
Введите число:
13
13 * 2 = 26
Верно.
13 * 3 = 36
Неверно.
ЗАДАЧА:
таблица умножения
Уровень 1. Разработайте программу,
которая просит пользователя ввести число
и выводит таблицу умножения этого числа
на числа 2, 3,..., 9 (а на 1 и 10 мы и так уме-
ем умножать). Выглядеть это должно при-
мерно так.
Уровень 2. А теперь измените програм-
му так, чтобы она не выводила результат
умножения, а ждала ввода этого результа-
та от пользователя,
а потом оценивала
бы правильность ответа. Вот пример ин-
терфейса (это только начало).
Сложно? Вот пара подсказок.
В программе уровня 1 тело цикла будет
состоять из оператора print (), а в скоб-
ках будут перечислены элементы, из кото-
рых состоит выводимая строка: введённое пользователем число,
знак умножения в кавычках, значение переменной цикла, знак
равенства в кавычках, результат умножения переменной цикла на
число пользователя1.
А вот на уровне 2 вам придётся вместо print () использовать
int(input()), и то, что введёт пользователь, сохранить — нам
же это нужно будет ещё проверить. В скобочках у input () нель-
зя, к сожалению, перечислить значения через запятую — придётся
собрать строку-запрос из кусочков, соединённых плюсиками. И не
забывайте числа, которые хотите включать в текст запроса, пре-
вращать в строки: str (п).
Всё равно сложно? В уровне 1 ничего сложного нет. А вот для
уровня 2 есть ОТВЕТ»>. Только перед этим для усвоения темы
«Повторения» придётся 10 раз повторить вслух: «Мне лениво ду-
мать, покажите код!»
1 «Нет чтобы написать по-человечески, на Питоне, а не словами...» — подума-
ли вы. Это «не баг, а фича»: во-первых, повторяете названия элементов опера-
тора for, во-вторых, учитесь читать.
МИКРОТЕСТ:
что мы знаем о повторениях
Какие из этих высказываний верны?
А, Повторение — мать ученья.
Б. Оператор for позволяет повторить действия заданное число
раз.
В. Число итераций for k in range(13) равно 13.
Г. Тело цикла — оператор Python, который нужно выполнить
многократно.
Д. Если шаг, с которым изменяется переменная цикла, равен 1, его
можно не указывать.
Е. В скобках после range должны стоять числа — от одного до трёх
целых чисел.
Ж. Для конечного значения переменной цикла тело цикла не вы-
полняется.
3. Если начальное значение переменной цикла не указано, оно
будет равно 1.
Знакомство с повторениями существенно расширило
наши возможности. Забываем про надоевших уже бо-
тов и возвращаемся к символьной графике. Повторения
позволяют сделать символьные изображения гибкими,
управляемыми: например, программа может запросить
у пользователя длину Питона из нашего первого проекта
и построить изображение нужного размера.
И теперь нам доступен новый проект — «Генератор
фенечек». В нём потребуется делать повторения повто-
рений — круто, да?
Глава 8
Классические алгоритмы
iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiniiiiiiiii
Что такое классика ,
— Ну как, наигрались с повторениями? Поднадоело уже?
— Пока не понял. Да, выводить что-то много '- 1
раз, даже со всякой там арифметикой с переменной цик-
ла, стало уже скучновато. Ведь не только оператор выво-
да можно повторять, верно? Можно, наверное, и вводить
несколько значений и что-то с ними делать — складывать,
например?
К: Похоже, доросли вы до классических алгоритмов.
Ч: Классических? Это которые старинные и занудные?
— Кабы не молодость ваша, сударь, пришлось
бы вам за слова ваши ответить! «Занудные»! Не
классика занудна, а те, кто вбивает её силой в го-
ловы, не доросшие до обобщений!
Ч: А... Александр Сергеевич?!
— Да. Но не тот, о котором вы думаете. Другой.
Не поэт, программист. Хотя хорошая программа —
как хорошие стихи: каждая строка отточена, каж-
дое слово выверено... я, впрочем, отвлёкся. Давайте с классикой раз-
бираться.
«Классический» — значит, хороший и понятный образец чего-то,
с чем встречаются многие. Почему мой тёзка — классик? Не только
потому, что у него стихи мастерски сделаны. А потому, что стихи
эти про то, с чем каждый в своё время в жизни сталкивается.
Алгоритмы тоже бывают классическими. Написаны отлично —
просто и изящно. Успешно решают типичные задачи. А использо-
вание классических алгоритмов в своих программах считается
не плагиатом, а, напротив, хорошим стилем программирования. На-
писаны они давно, некоторые — задолго до появления компьютеров.
Ч: Разве так может быть? Алгоритмы же нужны, чтобы писать
программы!..
— ...или выполнять иные целенаправлен-
ные последовательности действий. Помни-
те, как когда-то вас учили складывать числа
в столбик? Алгоритмы сложения многознач-
ных чисел придумал и описал больше тысячи
лет назад арабский математик Ал-Хорезми. А
когда о них узнали европейские учёные, они
стали любое точное описание последова-
тельности действий называть в его честь — «алгоритм» (ну, немнож-
ко звуки исказились при переводе).
Но я не об этих алгоритмах. Пример-
но два века назад в Англии была создана
программируемая счётная машина. Меха-
ническая, не электронная — круто, верно?
Она работала! Для неё были написаны про-
граммы, а про эти программы было много
научных статей. Понятие «цикл» (наши по-
вторения — это разновидность цикла) воз-
никло именно тогда. Интересно, что ввела
его в употребление дочь поэта Байрона1... я же говорю, поэзия и про-
граммирование родственны! Ой, кажется, я опять заболтался, извини-
те... «Пора, мой друг, пора...».
Ч: Ну вот, застеснялся и убежал. На самом интересном месте. Не
знаю, «доросла ли у меня голова до обобщений», или как там ска-
зал этот странный Александр Сергеевич... Может, это всё-таки тот
самый?
К: Про Александра Сергеевича не знаю, самому интересно. А го-
лова доросла. Начинаем осваивать классику.
1 Там всё очень было интересно. Погуглите про машину Чарлза Бэббиджа и Аду
Лавлейс.
Накопление
К: Давайте начнём с такой задачи: нужно написать программу, ко-
торая получает от пользователя 10 чисел и выводит их сумму.
Ч: Да, вот как раз такую программу я и пробовал написать. Но
упёрся в проблему. Если взять 10 разных переменных, непонятно, как
делать повторения. А если вводить все значения по очереди в одну
переменную, непонятно, что с чем складывать.
К: Давайте посмотрим, как подобное происходит в жизни. Пред-
положим, бабушка объявила, что ежемесячно с пенсии будет выда-
вать вам сколько-то рублей. Сколько — зависит от обстоятельств и
настроения бабушки. Узнав об этом, вы готовите... что?
Ч: Копилку! Достал с полки, стёр пыль, убедился,
что внутри пусто.
МД К: Отлично. Назовём нашу копилку 5.
Ч: Потому что она свинка?
К: Нет, потому что накапливать будем сумму.
Неписанная программистская традиция: сумма — S, произведение —
Р. А дальше каждый месяц будут повторяться две операции: Вы по-
лучаете от бабушки денежку (d = int(input ()) и прибавляете её
к тому, что уже лежит в копилке:
s = s + d
Понял! А после окончания года (цикла) отвинчиваем крышечку
на пузике копилки и вытряхиваем накопленное — print(s). Только
надо этот классический «костяк» обрастить интерфейсом!
— А можно, наоборот, сжать. Ввод и суммирование
С77 можно сделать в одном операторе:
s += int(input())
Ч: Это уже классика в кратком изложении получается — типа «Ка-
питанской дочки» в три абзаца. Так, наверное, можно писать, если
некогда, но я пока буду все действия расписывать отдельно1.
1 Программа Чайника с красивым интерфейсом, как и другие программы из этой
главы, есть в электронном архиве.
ЭКСПЕРИМЕНТ:
а теперь произведение
Предположим, теперь нам нужно вычислить не сумму, а произ-
ведение заданного количества введённых с клавиатуры чисел. Из-
мените алгоритм и программу так, чтобы они решали эту задачу.
Вам кажется, что достаточно изменить один символ? Вы почти
правы. Не один, а два. Это не считая необязательной замены буквы
S на букву Р.
Подсчёт
— А если надо не суммировать значения, а подсчи-
тывать все, которые обладают каким-то свойством, к при-
меру, нечётные?
— Это другой классический алгоритм — под-
счёт. Тоже вполне житейская ситуация. Предположим, Ваш
класс дежурит. Вас поставили перед входной дверью и веле-
ли подсчитывать тех, кто не вытер ноги.
Ч: А зачем?
К: Зачем-зачем... в нашей жизни много бессмысленных действий.
Может, учитель по ОБЖ собирает материал для урока или для дис-
сертации. Вот как бы вы действовали, чтобы не запутаться?
Ч: Можно пальцы загибать. Но пальцев, скорее всего, не хватит.
Можно в блокноте рисовать палочки по количеству не вытерших
ноги. Но тогда потом придётся их считать. Наверное, проще всего
записывать в блокноте последовательные числа: первый не вытер
ноги — пишем 1, второй — пишем 2, следующий — на 1 больше,
чем последнее число. Тогда в конце дежурства можно просто назвать
ОБЖйнику последнее записанное число.
К: А теперь то же самое — но для компьютера, который подсчи-
тывает, сколько среди заданного количества введённых чисел было
нечётных.
Ч: Один вопрос: а есть какие-то традиции насчёт названия пере-
менной, которую я буду увеличивать на 1 всякий раз, как введённое
число не вытрет ноги... тьфу, окажется нечётным?
К: Такая переменная называется счётчиком, по-английски counter.
Ч: Ясно, назову переменную С и присвою
ей до цикла 0. В цикле же после ввода числа
буду проверять его на нечётность: если нечёт-
ное — увеличу счётчик на 1. После выхода из
цикла выведу значение счётчика. Тело цик-
ла у нас будет из трёх строчек. Питон, тут-то
не получится в одну строку, да?
— Конкретно в этой задаче как раз получится:
с += int (input ()) % 2
А ещё можете погуглить про трёхместный условный
оператор.
ЭКСПЕРИМЕНТ:
а если и чётные?
Чуть изменим задачу: программа должна вывести, сколько чи-
сел из 10 введённых были нечётными, а сколько — чётными.
Если вы считаете, что потребуются два цикла — вы ну совсем
неправы: вам же так заново придётся числа вводить. Если вы пола-
гаете, что потребуется ещё один счётчик — вы близки к истине. Но
вообще задача прекрасно решается и с одним счётчиком, просто
добавлением ещё одного print().
Выбор
— Ещё один классический алгоритм, самый непростой —
это выбор. Требуется выбрать из множества объектов лучший ?
по какому-то критерию: самое длинное слово, самое малень-
кое число... Мы и в жизни постоянно выбираем — самую ап-
® петитную плюшку, самую простую задачу на олимпиаде,
самую красивую девочку в классе...
— Может, не будем про девочек? Они вообще алго-
ритмизации не поддаются!
К: Хорошо, будет суровая мужская задача. Про золотые самород-
ки. Вот мешок, в нём 10 самородков. Из них 9 вы должны отдать, один
оставить себе. Доставать самородки из мешка можно только по одно-
му. Вы должны выбрать один, самый тяжёлый. Ваши действия?
А весов нет?
К: Нет. Но можно взять в руки два самородка и определить, ко-
торый тяжелее.
Ч: Беру первый самородок, дер-
жу его в левой руке. Правой достаю
следующий. Если тяжелее тот, что в
левой — отдаю самородок из правой
(он точно не самый тяжёлый) и пра-
вую запускаю в мешок за следующим
самородком. А если правый оказался тяжелее, левый отдаю и пере-
кладываю в левую руку самородок из правой.
К: А зачем перекладывать?
Ч: Чтобы не запутаться. Так я знаю, что в левой руке у меня всег-
да самый тяжёлый из просмотренных самородков. Вы же мне сей-
час предложите эту задачку с числами решать, верно? И левая рука
станет переменной для самого большого из введённых чисел, а пра-
вая — переменной, в которую вводится число.
К: Так что, можно конспект писать про алгоритм выбора наиболь-
шего из введённых чисел?
Ч: Пожалуй, да... хотя стоп! Мне не нравится, что мы с первым
самородком работаем не так, как с остальными. Можно просто оста-
вить левую руку пустой, а потом каждый введённый сравнивать с со-
держимым левой, и если больше, сохранять его в левой.
К: С самородками — можно, с числами — нет. Вдруг все числа
окажутся отрицательными?
: Понял! Готово. Можно писать конспект, пока Пайтон не при-
полз и не ввернул опять что-то однострочное вместо половины моей
программы.
КОНСПЕКТ:
алгоритм выбора
Опишем алгоритм на примере задачи выбора наибольшего из
введённых чисел (количество чисел задано).
Введём первое число прямо в переменную для значения мак-
симума — наибольшего из уже введённых чисел (оно ведь и есть
наибольшее, других пока нет).
Затем в цикле вводим остальные числа, и если очередное
больше, чем наибольшее из введённых ранее, оно записывается
в переменную для максимума.
После завершения цикла выводим значение переменной-мак-
симума: в ней находится наибольшее из всех введённых чисел.
ЭКСПЕРИМЕНТ:
может, и минимум заодно?
Опять модифицируем задачу, чтобы убедиться, что алгоритм
усвоен: попробуем найти разность между наибольшим и наимень-
шим из... сколько их там? 10?.. из 10 введённых чисел.
Тут изменений потребуется побольше, чем раньше: ещё один
накопитель, ещё одно условие, ну и print () поменять.
Всё получилось? Давайте усложним задачу: выведем ещё и но-
мера наибольшего и наименьшего чисел среди введённых. Нам
пригодится переменная цикла (только надо помнить, что номер
обрабатываемого числа на 1 больше её значения). И запоминать
будем не только значения чисел, но и их номера.
Перебор натуральных чисел
— Надоело числа вводить... Я ведь правильно пони-
маю, что те же накопление и подсчёт можно делать просто
с последовательными числами — 1, 2, 3, ..., /V, используя
вместо введённых значений переменную цикла? К приме-
ру, расчёт суммы чисел от 1 до N можно сделать так:
n = int(input("До какого числа будем г-жиждимт*.?
s = 0
for k in range(n + 1):
s = s + к
print("Сумма: ", s)
— Можно. А можно последние 4 строчки заменить
^*7 Kvn одной:
print ( n * (n + 1) //2)
Безо всяких там for и range.
Ч: Что? Да не может быть! Запускаю свою программу, ввожу 10, вы-
водит 55. Запускаю эту, куцую, питонскую, ввожу 10... тоже 55. Магия?
К: Нет, математика. Вот представьте себе, что вас попросили сло-
жить числа от 1 до 100 (не будем мелочиться). Вы что, возьмёте каль-
кулятор и будете складывать 1 + 2, потом прибавлять 3, 4,...?
Ч: Раз вы спрашиваете, значит, есть другой способ. Предположим,
я буду складывать числа не подряд, а одно брать с начала, а другое
с конца. 1 + 100 - 101, 2 + 99 — тоже 101, и так далее. Последней
будет пара 50 + 51, и это тоже 101. Всего 50 пар, в каждой сумма 101,
итого 5050.
К: А теперь подставьте 100 в формулу из программы Питона.
Ч: 100 * 101 // 2, это будет 50 * 101, как и у меня. Круто! И это
верно для любого N?
К: Да. Это формула суммы арифметической прогрессии. Одна из
формул, которые часто применяются в программировании. Матема-
тика позволяет создавать эффективные алгоритмы и быстрые про-
граммы.
КАПЕЛЬКА ИНФОРМАЦИИ:
арифметическая прогрессия
Арифметическая прогрессия — последовательность чисел, в
которой разность между двумя соседями одинакова. Будем назы-
вать эту разность шагом.
1, 2, 3,4, 5 — арифметическая прогрессия из 5 элементов с на-
чалом 1 и шагом 1. А, к примеру, -17, -7, 3, 13 — арифметическая
прогрессия из 4 элементов с началом -17 и шагом 10.
Зная начало (обозначим его а(), количество элементов после-
довательности (л) и шаг (d)t мы можем найти любой элемент по-
следовательности или сосчитать сумму (S) её элементов.
ак = + d • (к - 1) — значение /с-го элемента
$ = (д1 + . п / 2 — сумма первых л членов арифметической
прогрессии.
— А для произведения такая формула есть?
— Нет, произведение придётся считать, ис-
пользуя алгоритм накопления. Произведение пер-
вых N натуральных1 чисел — полезнейшая вещь!
Ч: Да? А где оно может пригодиться?
К: Вот пример задачи, К вам пришли три гостя, а у вас в доме три
кресла. Сколькими способами можно рассадить гостей?
Ч: Первый гость занимает любое из трёх кресел. При каждом его
выборе второй гость может выбрать любое из двух незанятых кре-
сел, то есть у нас 3-2 = 6 способов рассадить двух гостей. Ну а у
третьего гостя выбора уже нет.
К: А если и гостей, и кресел N?
Ч: А всё так же и получится: /V • (Л/ - 1) (Л/ - 2)... 2 • 1. Ага, увидел
теперь: это то самое произведение первых Л/ натуральных чисел.
К: У этого произведения есть более короткое название —
факториал.
1 Напомним: натуральные числа — это целые положительные числа: 1, 2, 3 и так
далее. А не числа, выращенные на ферме без химических удобрений.
КАПЕЛЬКА ИНФОРМАЦИИ:
факториал
/V! (читается «эн факториал», а не «э-э-э-э-э-э-н!!!») — произве
дение первых /V натуральных чисел. К примеру,
61 = 1 2 • 3 • 4 • 5 * 6 - 720.
Для каждого значения /V можно вычислить /V!. Правда, следует
учитывать, что с ростом N числа будут получаться очень большие
(впрочем, для Python это не проблема).
Одно из применений факториала — подсчёт количества пе-
рестановок Л/ объектов. Например, количество анаграмм1 слова
ШКОЛА равняется 5! - 120.
Практикум
ЗАДАЧА:
таблица умножения (уровни 3 и 4)
Помните задачу из предыдущей главы, где пользователь вво-
дил результаты умножения выбранного им числа на 1,2,..., 10?
Уровень 3. Немного усложним задачу: теперь после окончания
ввода ответов на примеры программа должна вывести количество
правильных ответов и оценку (обычно 5 ставят за 0 ошибок, 4 —
за 1 или 2 ошибки, 3-4 ошибки — тройка, больше — двойка или
ещё что-то похуже).
Уровень 4. Ещё одно небольшое усложнение, которое позво-
лит нам познакомиться со вложенными операторами for. Пусть
пользователь введёт не одно, а два числа, например, а и Ь. А ре-
шать ему придётся не 10 примеров, а 25: первый сомножитель бу-
дет принимать значения от а до а + 4, и для каждого значения
первого второй тоже будет принимать 5 значений, от b до b + 4.
ОТВЕТ»>
1 Анаграмма — слово, полученное из исходного перестановкой букв.
ЗАДАЧА:
10 чисел
Можно написать в качестве ответа на эту задачу 5 разных про-
грамм. А можно (и это будет интереснее) написать одну програм-
му, которая получает от пользователя 10 целых чисел и затем вы-
водит следующие сведения о них:
1. Сумму квадратов (квадрат — число, умноженное само на себя)
всех отрицательных чисел.
2. Количество положительных чисел, заканчивающихся цифрой 1.
3. Сумму двух наибольших чисел из введённых.
4. Количество чисел, равных наименьшему из них.
5. Количество чисел, больших, чем предыдущее.
ПОДСКАЗ КА»>
МИКРОТЕСТ:
что мы знаем о классических алгоритмах
Какие из этих высказываний верны?
А. Классические алгоритмы давно устарели.
Б. Идея подсчёта, накопления, выбора состоит в том, чтобы анали-
зировать значения прямо по ходу ввода.
В. Значение переменной цикла можно использовать в теле цикла.
Г. Циклы for можно вкладывать друг в друга, при этом перемен-
ные циклов должны быть разными.
Д. Значения, получаемые переменной цикла в результате выпол-
нения оператора for k in range (...), образуют арифметиче-
скую прогрессию.
Е. Для любого натурального числа N значение /VI больше, чем NN.
Вы заметили, наверное, что в этой главе мы занимались
в основном численными алгоритмами. Проект, к которо-
му вам открывается доступ, связан с числами. Он совсем
не забавный, но зато реально полезный — «Делители».
Глава 9
Циклы
iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiitiiiiiiiiiiiiiiiiniiiiii
Типы циклов
— Я тут подумал, когда мы классические алгоритмы
программировали: у разных программ так много общего!
Задачки с виду разные, а решаются очень похоже. И если
у тебя уже есть похожая программа (а я все свои про-
граммы на повторения собрал в один большой текстовый файл) —
<Ctrl>+<C>, <Ctrl>+<V>, поправили, запустили — вуаля!
— Про файл с коллекцией программ — правильно сдела-
ли, будете постепенно добавлять новые программы. Но как-то Гу Mj
вы излишне самоуверенны, коллега. Питон (как и французский) ?
вы пока знаете лишь кусочками — маленькие плацдармы по- Ч.—'
знанного и освоенного в большой таинственной стране.
Ч: Да? А мне казалось, я уже так много знаю — и ветвления,
и циклы!
К: Придётся слегка уронить вашу самооценку. Повторения — это
лишь одна разновидность циклов, с заданным числом повторений.
А есть ещё с неопределённым числом повторений, есть всевозмож-
ные комбинации, когда один цикл вкладывается в другой. Есть бес-
конечные циклы и выход из цикла по специальной команде, есть ин-
тереснейшие классические алгоритмы, где всё это используют...
Ч: Хватит-хватит, самооценка уже упала ниже плинтуса! У меня
даже названия в голову не умещаются пока, а ведь надо там, в го-
лове, ещё и по полочкам всё разложить... Сейчас, по законам жанра,
придёт эксперт и всё объяснит?
К: Эксперт уже на подходе. Серьёзный человек, вузовский пре-
подаватель.
Ч: А чего это он с мячиком?
К: Так он физвоспитание преподаёт, И специализируется как раз
на циклических видах спорта. Николай Николаевич, у студентов —
НикНик.
— Привет! Кого тут циклам обучать? Этого? Ни-
чего так на вид, под средние дистанции... дыхалки
хватит, терпелки — проверить надо.
Про типы циклов. Есть циклы с заданным чис-
лом повторений — к примеру, пробежать 5 кругов
по стадиону или 7 раз подтянуться на турнике. На
Питоне это выглядит примерно так;
for i in range(7):
print("Уфф!... Это", i + 1)
А на турнике — так:
Уфф *... Это 1
Уфф! . . . Это 2
Уфф !... Это 3
Уфф! . . . Это 4
Уфф! . . . Это 5
Уфф!... Это 6
Уфф!,,. Это 7
Количество повторений может быть известно до написания про-
граммы (к примеру, когда нормы ГТО сдают), а может стать извест-
ным уже в ходе её выполнения, но до начала цикла (когда я говорю
«А тебе, Ватрушкин, и трёх подтягиваний хватит!»).
А бывают циклы, в которых число повторений заранее неизвест-
но. Их ещё называют циклы с условием. Скажем, Зайкина у меня по
такой программе бегает: Закончила круг 1. Хватит?
hvatit = с = 0 while hvatit ?= "да": нет Закончила крут 2. Хватит? беги давай Закончила круг 3. Хватит?
с = а + 1 print("Закончила круг " \ + str(с) + ". Хватит?’) hvatit = input() print("Ну наконец-то!") не сачкуй, беги Закончила круг 4. Хватит? пока нет Закончила круг 5. Хватит? да Ну наконец-то!
Зайкина бежит, пальцы загибает — круги считает. Когда вижу, что
она уже выдохлась, хвост рыжий не развевается, а обвис, разрешаю
закончить цикл.
Ч: А если вы так и не скажете «да» — получится бесконечный
цикл?
— Бесконечный получит-
ся, если убрать из програм-
мы строчку с вводом очеред-
ного значения переменной
hvatit. Попробуйте, Когда
надоест смотреть, как Зайки-
на круги наматывает — на-
жмите <Ctr I >+<£>.
Ч: Пока я включал английскую раскладку, виртуальная Зайкина
672 круга пробежала... Так что, бесконечные циклы — это ошибка в
программе?
— Если они реально бесконечные — да. Такая ситуация называ-
ется зацикливанием. Причём бывает, что при одних входных зна-
чениях программа работает, а при других зацикливается. Вот я вам
срайлик1 скинул — поэкспериментируйте потом с худеющей вирту-
альной Сарделькиной.
Но иногда программист делает цикл с виду бесконечным или
же задаёт какое-то число его повторений, а внутри цикла проверяет
условие и при его выполнении прерывает цикл. Для этого в Питоне
есть оператор break.
Вот пример. У студента Бал деева по физкультуре 10 двоек — и
больше ничего. Зачётная неделя — 7 дней. Каждый день Бал деев
приходит сдавать долги и получает оценку. Как только средний балл
станет больше 2.5 — Балдееву поставят тройку, ему больше не нужно
будет приходить. Ну а если 7 дней истекут, а нужный средний балл
достигнут не будет — Бал деев перестанет быть студентом. Вот про-
грамма, можете сами с ней поэкспериментировать:
1 В электронных материалах. Эпопею про похудание Сарделькиной можно смо-
треть бесконечно...
ocenki = 10
summa = 20
for d in range(7):
b = int(input("Оценка в день " + str(d +1) + ”: ’’))
ocenki += 1
summa += b
srball = summa / ocenki
if srball > 2.5:
break
print( 'Оценка:"r round(srball))
Ч: А Кофейник еще говорил про цикл в цикле...
— Пример. Эпидемия, преподаватели болеют, уроки в онлайне.
Объединили английский и сризкультуру. Ученику задают вопрос. Он
отвечает, а чтобы его ответ засчитали, делает 5 отжиманий перед ви-
деокамерой. Если ошибся — ещё попытка (и ещё 5 отжиманий), и так
будет повторяться, пока не ответит правильно. Вот код:
otvet = ""
otj = "Ых!"
while not otvet = "lazy":
otvet = input("What is English for \"ленивый\"? ")
print( ’Отжимаемся!")
for k in range(5):
print(otj)
otj = ’’Ы" + otj
print("Зачёт.")
Ч: Ой, а можно я это введу и запущу1, а то как-то не совсем по-
нятно, что тут с Ы и с левым делением на кавычку?... Вау! Здорово! Ой,
а можно делать наоборот — снаружи for, а внутри while?
— Можно. Но если перед тем, как задать вопрос, считать до 10,
большинство вопросов решаются сами — за это время успевают
прийти мысли. А если на каждый счет отжиматься, вопросы вообще
перестают возникать...
Ч: «Понял, уполз» — как говорит Пайтон. Спасибо, Николай Нико-
лаевич! Кстати, а чего это Пайтон сегодня не приползал ни разу?
1 Для lazy: тексты программ НикНика есть в электронном архиве.
— А вы пробовали на хвосте отжиматься?.. Давайте я
про «деление на кавычку» объясню. Когда надо написать
строку, в которую входят служебные символы ', \),
перед этими символами ставят обратный слэш - \.
Цикл с условием
— У меня уже от этого спортивного программирова-
ния все мышцы ноют. На чём бы таком опробовать опера-
тор while, чтобы шевелить только мозгами и пальцами?
— Напишите программу, которая задаёт поль-
зователю одну и ту же загадку, пока он её не отгадает. Гу W
Загадка — на ваше усмотрение, но лучше покороче. А про- V
грамма, если всё сделать правильно, получится из трёх <_
строчек.
Ч: Знаю отличную загадку... два дня над ней думал, пока не до-
гадался спросить у бабушки. Похоже, у нас тут всего одна перемен-
ная — ответ пользователя на загадку. Пока он ещё ни одного ответа
не дал, можно туда записать пустую строку. Цикл повторяется, пока
ответ не совпадает с правильным. Внутри цикла — вывод загадки
и ввод ответа. Но это 4 строки, а не 3... А, понял!
otvet =
while otvet ?= "вилка":
otvet = input ("2 удара = 8 дырок. Что это? ’’)
Так, запускаю. Сперва неправильный ответ... Теперь правиль-
ный... в смы-ы-ы-сле? Почему он мне опять задаёт загадку, я же пра-
вильно ответил — «Вилка»?
К: У вас в программе «вилка» со строчной буквы, а ввели вы
с прописной.
~ надо топько всё усложнять, расписывать все
способы написать слово «Вилка». Запишите условие в
VtCz while вот так: otvet.upper () ! = "вилка" (upper пре-
образует все буквы строки в прописные). И раз уж мы за-
ботимся о пользователе, Вы его, когда отгадает, хоть похвалите —
ему будет приятно.
Ч: Вот, смотрите:
2 удара = 8 дырок. Что это? Сейчас у бабушки спрошу.
2 удара = 8 дырок. Что это? ВилКа
Супер!
КОНСПЕКТ:
цикл с условием
Вот пример оператора while:
Оператор
цикла
Действия
до цикла
Условие
выполнения
цикла
s = О
п = -1
while п 1=0:
Все правила Python для структурных операторов работают и
для while (двоеточие, после него сдвинутое вправо тело цикла).
Обратите внимание: значение переменной, участвующей в
условии входа в цикл, должно быть задано ещё до первого входа
в него.
На блок-схеме цикл с услови-
ем обозначают просто как усло-
вие — ромбом. То, что это цикл,
видно по стрелке от окончания
тела цикла к проверке условия.
Тело цикла может содержать
вложенные алгоритмические
структуры (ветвления, циклы).
Несмотря на то, что while кажется более простым операто-
ром, чем for, ошибок в нём делают больше. Не ленитесь читать
написанную вами программу.
ЭКСПЕРИМЕНТ:
что делает программа?
Очень важное для программи-
ста умение — понять, что делает
программа, и кратко это описать
нормальным человеческим языком.
Например, программа, приведён-
ная в конспекте, суммирует вводи-
мые с клавиатуры числа, признаком
конца ввода является 0.
# 1
с = 0
while а < 3:
w = input()
if w == "STOP":
с += 1
print("OK")
# 2
а - input ()
b = input ()
while а != Ь:
а = Ь
b = input ()
Вот несколько заданий: в каждом надо понять, что делает про-
грамма, и внятно это сформулировать. Программы умышленно на-
писаны с очень плохим интерфейсом —
хороший послужил бы подсказкой. Сами
программы — от совершенно бесполез-
ных до полезнейших: последние три реа-
лизуют алгоритмы, по праву считающие-
ся классическими. ОТВЕТ>»
# 3
а = int(input())
b = int(input())
while а ’= Ь:
if а > Ь:
а = а - b
else:
Ь = Ь - а
print(а)
# 4
n = int(input())
s = 0
while n > 0:
s = s + n % 10
n = n // 10
print(s)
# 5*
n = int(input())
s = " ”
while n > 0:
s = str (n % 2) + s
n = n // 2
print(s)
Пятая задача — «на вырост». То,
что она делает, в школе изучают
в старших классах.
Гугл в помощь!
ЭКСПЕРИМЕНТ:
бесконечная «бесконечность»
Напишите программу, которая бесконечно выводит слово
«бесконечность». Как это сделать? Задать условие повторения цик-
ла, которое всегда будет истинным. Продвинутые программисты
могут ещё и нумеровать выводимые бесконечности.
Получилось? А теперь научимся корректно останавливать за-
цикленную программу нажатием <Ctrl>+<C>. Обязательно на ан-
глийской раскладке!
КОНСПЕКТ:
оператор прерывания цикла
Оператор break позволяет прервать выполнение цикла. Обыч-
но его размещают на ветке условного оператора. После break вы-
полняется первый оператор после тела цикла.
С помощью break можно превратить цикл с предусловием
(условие проверяется до входа в цикл) в цикл с постусловием (вы-
полняется итерация цикла, затем выполняется проверка условия).
К примеру, написать программу, которая вводит числа, пока
не введут 0, и вычисляет их произведение (0, естественно, в него
не включается), удобнее с постусловием:
Р = 1
while True: # бесконечный цикл
n = int(input())
if n == 0:
break # прерываем цикл
р = р * п
print(р)
Запомните конструкцию while True — именно так принято
начинать бесконечный цикл с выходом изнутри по break. True —
не забыли? — означает «истина».
Практикум
ЗАДАЧА:
распознавание объектов-2
Если писали программу «Распознавание объектов» в главе 4,
распознавать инопланетные существа вы умеете. Только тут они
немного другие, и планета другая, и задача посложнее.
Вам предстоит написать программу, помогающую астробиоло-
гам распознавать обитателей планеты Яяю. Начиная радиальный
выход, исследователь запускает программу. Увидел кого-то, посчи-
тал у него хапки, ввёл в программу — узнал, кто перед ним. Идёт
дальше, а программа работает и ждёт следующего ввода.
Все аборигены планеты обладают хап-
ками, но их количество у разных видов раз-
лично. Вот описание известных науке видов
яяйской фауны:
♦ Масик — от 1 до 4 хапок;
♦ Пятихап — 5 хапок, разумеется;
♦ Шурши к — 6-7 хапок;
♦ Хапуга — от 8 до 11 хапок.
Если у встреченного объекта вообще нет хапок, значит, астро-
биолог вернулся на базу и видит стоящую на астрокрылечке
астроповариху тётю Паню, и можно завершать работу программы.
Перед завершением программа должна вывести общее количе-
ство встреченных хапковладельцев и количество представителей
каждого вида. ПОДСКАЗКА»>
ЗАДАЧА:
решение подбором и перебором
Вот две задачи, на вид — математические.
1. Найдите наименьшее натуральное число, разность между седь-
мой и пятой степенью которого больше миллиона.
2. Сколько существует трёхзначных чисел, у которых первая циф-
ра меньше второй, но больше третьей?
Наверное, их можно решить с помощью математики (но это не
точно). Но сло-о-о-жно-о-о... А вот с помощью программирования
они решаются легко.
Первая задача решается подбором (через цикл с условием):
пробуем вычислить п ** 7 - п ** 5 для 1, 2, 3, ... — каждое сле-
дующее число на 1 больше предыдущего. Как только разность сте-
пеней перевалила миллион — выходим из цикла и выводим п.
А вторая задача сводится к классическому алгоритму подсчёта
чисел, обладающих нужным свойством, среди чисел от 100 до 999.
ПОДСКАЗКА»> ОТВЕТ»>
' я | ПРОЕКТ:
угадайка*
<__cS_>
Предположим, ваш друг задумал число. От 1 до 1024 (ну, нра-
вится ему 1024, может, он программист!). А вам надо это число
отгадать, задав не более 10 вопросов. Причём вопросы должны
быть такие, что ответы на них — ДА или НЕТ. Обдумали стратегию?
Идём дальше.
А теперь ту же задачу, отгадывание числа, решает компьютер.
Он задаёт пользователю вопросы о задуманном числе, получает от-
веты, после получения ответа на десятый вопрос выводит число.
Как он придумывает вопросы? Если хотите додуматься сами,
конспект, который дальше, пропустите. Ну да, приключился у нас
конспект в практикуме — потому что бинарный поиск, который вы
реализуете в этой задаче, тянет на высокое звание классического
алгоритма.
Почему это проект? Потому что вы можете тут помудрить с ин-
терфейсом, позаботиться и об удобстве для пользователя, сделать
компьютер приятным собеседником.
КОНСПЕКТ:
бинарный поиск*
Вы отгадываете задуманное число. Известно, что оно не мень-
ше А и не больше В. Вы вправе задавать вопросы, на которые тот,
кто это число задумал, ответит вам ДА или НЕТ.
Если спрашивать про каждое число интервала «Это задуман-
ное число?», рано или поздно вы получите ответ «ДА». Но в худ-
шем случае вам придётся задать В - А вопросов.
Попробуем действовать иначе: посчитаем, какое число нахо-
дится в середине интервала (назовём его М), и спросим: задуман-
ное число больше М? Если да — нижней границей станет М + 1.
Если нет — верхней границей станет М.
Повторяя эти действия, мы довольно быстро придём к ситуа-
ции, когда начало и конец интервала, в котором находится число,
совпадают. Это и означает, что нужное число найдено. Сколько
потребуется вопросов? Столько, сколько раз можно «пополамить»
длину интервала, получая значения больше 1. Например, на 1000
значений 10 вопросов точно хватит.
Код программы (практически без интерфейса):
Идею этого алго- ритма (многократное сокращение вдвое об- ласти поиска) исполь- зуют во множестве гораздо более серьёз- ных задач — поэтому стоит её знать. а = int(input("Начало: ")) b = int(input("Конец: " )) while b - а >= 1: m = (а + b) //2 г — input (">" + str(m) + ) if г = "ДА’1: a = m + 1 else: b = m print(a)
МИКРОТЕСТ:
что мы знаем о циклах
Какие из этих высказываний верны?
А, Циклы бывают с заданным числом повторений и с неопределён-
ным.
Б. В теле цикла while можно использовать значение его перемен-
ной цикла.
В. Цикл while True, в теле которого нет break, будет выполняться
бесконечно.
Г. Цикл for можно вложить в цикл while, а вот while внутри for
недопустим.
Д. Цикл с постусловием на Python реализуется с помощью break.
Е. Если внутри while есть ещё один while, то break во внутреннем
while прервёт сразу оба цикла.
Ж.Если в примере #3 эксперимента «Что делает программа?»
ввести 0 в качестве одного из входных значений, программа за-
циклится.
3. Любой цикл for можно запрограммировать и с помощью while,
только для изменения переменной цикла потребуются отдель-
ные операторы.
И. Любой цикл while можно запрограммировать с помощью for
и break, если взять достаточно большой интервал в range.
К. После изучения этой главы мы знаем о питоновских циклах дале-
ко не всё, у них ещё множество интересных возможностей.
Открываем доступ к новому проекту — «Решатель ку-
бических уравнений». Кубом называют число в третьей
степени, в нашем уравнении будет X3 (ужас какой!). Ре-
шать будем подбором. И если сумеете грамотно и на-
дёжно этот подбор реализовать, то и с другими подбо-
рами справитесь.
Глава 10
Списки
iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiniiiiiiiiiiiiiiiiiiiiiiii
Список - пронумерованные данные
— Задачка у меня. От Самовара Самоварыча. Надо на-
писать программу, которая по значению цифры выводит
её название. Ей «5» — она «Пять», ей «О» — она «Ноль».
— Ив чём проблема? Неужели не написали?
Ч: Написал. Но, как мне кажется, у Питона должен быть
какой-то инструмент, о котором я пока не знаю, чтобы не пи- / ” \
сать вот так по-дурацки. Вот, смотрите: у меня в программе
if с десятью веточками, на каждой вывожу название цифры, соответ-
ствующей условию. А вот если бы можно было написать эти названия
подряд, пронумеровать (элемент № 0 — «Ноль», № 1 — «Один»,..) и
обращаться к ним по номеру — тогда сразу после ввода цифры мож-
но было бы вывести элемент с таким номером, вся программа уложи-
лась бы в три строки (а у Пайтона, наверное, в одну).
можно в одну:
print ([ "Ноль" , "Один" , "Два" , "Три" ] [int (input ()) ])
V—s С/ Но не нужно, потому что строка получается длинная (если
все цисрры писать), программа нечитабельная и её трудно
изменять. Так что давайте лучше в три строки напишем.
Ч: Ого! Что-то Пайтон сегодня сам на себя не похож! Ещё и пишет
не своим шрифтом!
К: А он у нас сегодня эксперт.
— А что? Всяким там котам, кукушкам и физрукам можно, а мне
нельзя?
Набор пронумерованных значений, которого нам не хватает для
счастья, называется списком. Списки в Питоне крутые, с массой ин-
тересных возможностей.
Ч: А я сам додумался, что так можно! Я молодец?
— Ну, идея-то достаточно очевидная. Вот, скажем, строят новый
город. И вначале, пока домов немного, они все имеют названия: дво-
рец Меншикова, здание Двенадцати коллегий, Кунсткамера... Но по-
том домов становится больше, почтальоны и извозчики уже не могут
всё запомнить, и дома на улицах начинают просто нумеровать. Когда
чего-то МНОГО или ОЧЕНЬ МНОГО, номера не только избавляют
нас от мучительного сочинения имён для всех объектов, но и по-
зволяют легко описывать действия типа «покрасить в палевый цвет
все дома с 14 по 22», «установить сронари у входа во все дома по
Шпалерной улице».
Ч: Это for?
— Да. Но сначала с цифрами разберёмся, без всяких циклов. Вот
код:
# Вот список названий цифр:
digit = ["Ноль", "Один", "Два", "Три", "Четыре",
"Пять", "Шесть", "Семь", "Восемь", "Девять"]
n = int(input("Введите цифру: "))
# Выводим элемент списка digit с номером п
print(digit[n])
КОНСПЕКТ:
список и его элементы
Список — набор данных. Список имеет имя, а к его значениям
можно обращаться так: ИмяСписка[НомерЭлемента]. Элементы
в списке могут быть строками, числами, можно создать список и из
значений разных типов.
Самый простой способ создать список — инициализация. Зна-
чения списка перечисляются в квадратных скобках через запятую.
Пример:
season = ["Зима", "Весна", "Лето", "Осень"]
print(season[0], season[2])
print(season[len(season)- 1])
Зима Лето
Осень
Номера элементов начинаются с нуля. Номер последнего эле-
мента на 1 меньше длины списка.
Узнать длину списка можно так: 1еп (ИмяСписка).
Проверить, есть ли значение в списке, можно так: if Значе-
ние in ИмяСписка.
Номер элемента — целое число. Это может быть и переменная
с целым значением, и выражение. При попытке обратиться к эле-
менту с номером, которого в списке нет, возникает ошибка.
Что можно делать со списком
— Круто, да? Но обращение по номеру к элементу списка —
это самая простая операция. Ещё элементы в список мож-
У \ у но добавлять, можно их изменять. Можно упорядочивать
элементы в списке... Впрочем, давайте я лучше на при-
мерах.
Вы — бригадир... э-э-э... землекопов. Вот программа, которая по-
зволит вам ввести состав вашей бригады и отсортировать по алфавиту.
n = int(input("Количество участников бригады: "))
Ъ = [] # список бригады - пока пустой
print("Введите их имена черев Enter:")
for k in range(n):
b.append(input()) # добавляем в список введённые имена
b.sort() # упорядочиваем список
print("СОСТАВ БРИГАДЫ:")
for u in b: # для всех элементов списка
print(и)
Количество участников бригады: 5
Введите их имена через Enter:
Винни-Пух
Пятачок
Кролик
Иа-Иа
Сова
СОСТАВ БРИГАДЫ:
Винни-Пух
Иа-Иа
Кролик
Пятачок
Сова
Так, бригада есть. Теперь давайте распределим их; одни будут
копать канаву с северного конца, другие с южного. Пусть-ка они у
нас рассчитаются на первый-второй. Будем считать, что список бри-
гады у нас уже есть, он называется Ъ. И никто не мешает нам завести
второй список (со словами «Первый 1» и «Второй!»), чтобы не замо-
рачиваться со всякими там if.
Ь = ["Винни-Пух”, "Иа-Иа", "Кролик", "Пятачок”, "Сова”]
г = [ 'Первый!”, "Второй!"]
for k in range(len(b)): # цикл по всем номерам элементов
print(b[k] + , r[k % 2]) Винни-Пух: Первый!
Ч: Ух ты, как красиво — остаток от де- ления на 2 номера землекопа в большом списке даёт нам номер его выкрика в ма- леньком! А почему в прошлой программе мы делали цикл for u in b, а в этой for Иа-Иа: Второй! Кролик: Первый? Пятачок: Второй! Сова: Первый? k in range(len(b)?
Стоп, не надо, сам понял: потому что тогда нам нужны были только
значения, а сейчас ещё и номера. Только вот подозреваю, что с юж-
ного конца канава будет копаться очень медленно.
— А вот посмотрим. Давайте-ка введём, сколько метров проко-
пал за смену каждый землекоп. А потом в соответствии с этим рас-
пределим между ними честно заработанные сегодня консреты.
Ь= ["Винни-Пух”, "Иа-Иа”, "Кролик”, "Пятачок", ”Сова"]
v = [] # сюда занесём метры,
# а потом пересчитаем их в конфеты
s=0 # надо посчитать, сколько всего прокопали
print("Кто сколько накопал нынче?”)
for k in range(len(b)): # по всем в бригаде
г = int(input(Ь[к] + ”: "))
s = s + г
v. append (г) # важно: v[k] - выработка землекопа b[k]
konf = int(input("Сколько конфет заработала бригада? "))
konfm = konf // s # количество конфет за метр
for k in range(len(b)):
v[k] = v[k] * konfm # элементы списка можно изменять!
print(b[k], v[k])
Кто сколько накопал нынче?
Винни-Пух: 4
Иа-Иа: 2
Кролик: 3
Пятачок: 7
Сова: 1
Сколько конфет заработала бригада? 100
Винни-Пух - 20
Иа-Иа - 10
Кролик - 15
Пятачок - 35
Сова - 5
Ч: Здорово — реальная такая про-
грамма получилась, прямо как в жизни...
кстати, а куда делись остальные конфеты?
Тут же в сумме меньше 100 получается!
— Куда-куда... всё как в жизни. Добавьте в конец
программы вот такую строчку:
print (’’Бригадиру:" , konf - sura(v))
Ладно, пополз я есть свои 15 конфет и обдумывать
программу, вычисляющую, какое максимальное количе-
ство конфет может получить бригадир при данной вы-
работке землекопов, если повезёт с konf...
КОНСПЕКТ:
действия со списком
Предположим, у нас есть список по имени spisok.
Перебор элементов списка в цикле for
for a in spisok: # все элементы списка
print(а)
for k in range(len(spisok)): # по номерам
print(к, spisok[к])
Перебор по номеру нужен, если:
♦ номер элемента будет использоваться в теле цикла;
♦ перебираются не все элементы.
Добавление элемента в список
ИмяСписка, append (значение)
Пример: заполнение списка введёнными с клавиатуры числа-
ми, конец по числу 0.
list = []
while True:
n = int(input()) 4
if n == 0: 9
break 7
list.append(n) 0
print(list) [4, 9, 7]
Сортировка списка
ИмяСписка.sort()
Поиск элементов с заданным значением
i = ИмяСписка. index (значение)
# i - номер первого элемента списка
# с заданным значением
# (если такого нет, программа прерывается -
# стоит сперва проверить).
с = ИмяСписка.count(значение)
# с - количество элементов списка
# с заданным значением
Как это работает — ясно из примера.
w = [»ton, "be", "or", "not", "to", "be"]
print(w.index("be"))
print(w.index("be", 3)) # начиная c 3-ro
print(w.count("to ))
print (w. count (" love1’))
— У списков есть масса других возможностей! Если
интересно — погуглите по словам «списки python».
Справочные материалы по Python по традиции пи-
шут просто, без зауми, там всё понятно.
Сортировка: подробности
— Столько всего! Всё хочется попробовать!
Отличная штука — сортировка! Можно с её помощью и
максимум с минимумом искать — отсортировать, а потом
взять первый и последний элементы! А то что-то я в клас-
сическом алгоритме про поиск наибольшего всё время ошибаюсь...
Введу с клавиатуры 5 чисел, сложу в список, отсортирую, выведу
наибольшее и наименьшее... Вот:
а = []
for k in range(5):
а.append(input())
a. sort ()
print("min;", a[0], "max:”, a[4])
Запускаю! 5, 4, 3, 1, 2 — всё верно. А те-
перь с числами побольше... Что-о-о?
22
66
100
55
88
min: 100 max: 88
ЭКСПЕРИМЕНТ:
странная сортировка
Введите программу Чайника, опробуйте её с разными числами.
Найдите и устраните причину «глюка». ПОДСКАЗКА»>
— Искать максимум и минимум с помощью сортировки,
даже правильной — плохая идея. Сортировка — штука за-
тратная: данные занимают память, на сортировку тратится
время. Несмотря на то что в Питоне используются эффектив-
ные алгоритмы сортировки, упорядочение длинного списка
может занять несколько секунд. А если ещё и делать её многократно,
может вообще создаться впечатление, что программа зависла.
Чаще всего данные сортируют один раз — прежде чем их обра-
батывать: быстрые алгоритмы поиска (про бинарный поиск помни-
те?) работают только в упорядоченных списках.
Но все эти премудрости для вас пока неактуальны, задачи у нас
простые, а списки маленькие. Достаточно помнить, что данные разных
типов сортируются по-разному: числа — по возрастанию, строки — по
алфавиту, как в словаре (именно поэтому у Вас, коллега, 100 оказалось
меньше двузначных чисел, начинающихся на цифры больше 1).
КОНСПЕКТ:
сортировка списка
Простая сортировка списка
ИмяСписка,sort()
Сортировка по убыванию
ИмяСписка.sort(reverse = True)
Важно! Числовые значения сортируются по возрастанию, стро-
ковые — по алфавиту, как в словаре:
»> print(100 > 99, "ЮО" > 99 )
True False
Практикум
ЭКСПЕРИМЕНТ:
что выведет программа?
Вот текст программы:
z = ["И", "С", "В", "Л", ”Т”, "И", "1", "В"
при ’’Л11 ’’Н11 игр1* ”А” ПТ", "О”
а = int (input ("А = ’’))
b = int (input ("В = ’’))
for k in range(len(z)):
print(z[k], end = ””)
# end = ”” - чтобы не переходить на другую строку
Что выведет программа, если в качестве а и b ввести 4 и 1?
Какие из этих слов — ЛЕТО, ТЕЛО, ВЕСНА, СТЕНА, ИНТЕРНЕТ —
можно получить с помощью этой программы? Какие значения а и
b нужно для этого ввести?
Можно ввести текст программы и запускать его для разных
значений. Можно скачать его из электронного архива. А лучше
всего просто внимательно почитать программу, записать в строч-
ку элементы списка, поставив под ними номера... Всё, дальше вы
сами. ОТВЕТ»>
ЭКСПЕРИМЕНТ:
тройные скобочки*
А можно номера элементов списка брать из другого списка?
Можно. И даже номера номеров. И можно даже не из другого,
а из того же.
z — [1, 3, 2, 5, 0, 4]
for k in range(6):
print(z [z [z[kJ]])
Погодите, не вводите и не запускайте! Попробуйте определить,
что будет выведено, просто читая программу. Так у нас получится
мысленный эксперимент. Или эксперимент на бумажке, если вы на
листке нарисуете табличку с графами kr z[k], z[z[k]], z[z[z[/c]]] и за-
полните её для к от 0 до 5. А вот потом, чтобы себя проверить,
введите и запустите.
ЗАДАЧА:
сколько дней в месяце-2
Программа, определяющая, сколько дней в месяце, у нас уже
была в главе б. Но тогда мы не знали списков, а месяц вводили
не названием, а номером.
А теперь вводится не номер месяца, а его название. И в про-
грамме не должно быть развесистого условного оператора —
только проверка корректности введённого названия месяца.
ПОДСКАЗ КА>».
ПРОЕКТ:
взлом Пентагона
Нет-нет, взламывать не будем, Пентагон может расслабиться.
Просто с помощью списков, циклов и фантазии сделаем как бы
диалог между компьютером, хакером и Пентагоном (можно при
желании добавить и других персонажей — бабушку хакера, его
кота...).
Идея такая: после запуска программа сообщает, что начался
взлом базы данных Пентагона. А дальше каждую секунду выво-
дятся три (можно больше) реплики: компьютер сообщает о ходе
процесса (процент скачанных данных), хакер выдаёт радостную
реплику, Пентагон — нерадостную реплику (ненормативную лек-
сику не употреблять).
Вот начало программы (смотрите — команда time.sleep(1)
делает паузу на секунду, import time — заклинание, которое надо
поместить в начале программы, чтобы получить доступ к управле-
нию временем).
import time
input("Нажмите ENTER, чтобы начать ”)
print("Подключение к сетям Пентагона... ")
time,sleep(1)
print("Подключение успешно. Подбор данных для \
входа...”)
time.sleep(1)
print("Вход выполнен. Запущена закачка данных.., ")
for k in range(10):
То, что будет происходить на каждой итерации цикла, вы при-
думываете и реализуете сами. Вот небольшой фрагмент вывода
одной из программ — просто как пример:
Комп: выполнено 10%
Пентагон: ААА!
Хакер: Ага, процесс пошёл...
Комп: выполнено 20%
Пентагон: АААА!!
Хакер: Мир замер в ожидании...
Комп: выполнено 30%
Пентагон: ААААА!!!
Хакер: Что, бабушка? Пирожки? Здорово!
Комп: выполнено 40%
Пентагон: АААААА!!!!
Хакер: Кирдык пентагонским секретам!
ПОДСКАЗ КА»>
МИКРОТЕСТ:
что мы знаем о списках
Какие из этих высказываний верны?
А. В списке могут быть элементы разных типов.
Б. Номер элемента — целочисленное значение.
В. Длину списка нужно обязательно задать до его создания.
Г. Команда s. add (5) добавит в конец списка число 5.
Д.Если в списке строки, при сортировке они упорядочиваются
по возрастанию длины.
Е. Элементы списка можно изменять.
Ж. Перебор всех элементов списка z можно осуществить с помощью
цикла for i in range(len(z)).
3. Перебор всех значений из списка z можно осуществить с по-
мощью цикла for х in z .
И. Python выводит список в квадратных скобках.
К. Между элементами списка с номерами а и Ь, где а < Ь, находятся
b - а элементов списка.
Теперь, когда нам доступны списки, возможностей
для поектов стало намного больше. Доступный вам по-
сле этой главы проект «У-тестер» — универсальная
программа: из неё можно сделать и весёлую виктори-
ну, и программу для запоминания иностранных слов, и
тест по истории (в подарок учительнице на День про-
граммиста).
Глава 11
Случайное число,
случайное слово
iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiHiiiiiiiiiiiiiiiiiiiiiiiiiiiii
Может ли компьютер придумывать
числа? .
— Судя по выражению лица, вам опять чего-то не хватает у) W
для полного программистского счастья. Чего на этот раз? [^ \
Списки-то вы теперь знаете!
ъ — Списки — это действительно здорово. Сделал
программу-викторину: вопросы загнал в один список, от-
веты в другой, всего один цикл, всё отлично. Но програм-
ма получилась одноразовая — при каждом вызове одни
и те же вопросы, скучно.
Увеличил я число вопросов и ответов — их 100, а задавать я хочу
10. Но, чтобы при разных вызовах программы выдавать разные 10 во-
просов, надо научиться откуда-то брать этот самый номер вопроса.
А что у нас разное при разных вызовах программы? Время! Можно
как-то узнать текущее время? Мне целиком не надо, только секунды.
К: Интересная мысль. Давайте попробуем. Запустите-ка вот
такой код:
import time
print(time.time())
Ч: Это и есть время? Так.. 1623042554.2818735. Ещё раз...
1623042559.8326194. Да, похоже, это действительно секунды. Только
с какого момента? Ладно, это пусть читатели считают1. А мне про-
1 Вопрос для размышления звучит так: от какой даты ведётся отсчёт времени
в Python? Это придётся выяснить экспериментально — вы же не знаете, когда Чай-
ник запускал свою программу. А когда выясните, сможете найти и дату диалога
в этой главе.
грамму на пробу написать надо. Пусть это будет гадательная ромаш-
ка. Сделаю список из слов «Любит», «Не любит», «Плюнет», «Поцелует»,
«К сердцу прижмёт», «К чёрту пошлёт». В списке 6 элементов. Мне,
стало быть, нужно число — целое! — от 0 до 5. Как мне его добыть
из этого числища? А, есть же остаток от деления!
ЭКСПЕРИМЕНТ:
гадание на ромашке
Разработайте программу, идею которой предложил Чайник:
пользователю предлагают погадать на ромашке и просят на-
жать Enter, а затем выводят слово из списка с номером, равным
int(time.time() ) % 6.
Запустите программу несколько раз. Действительно ли выпа-
дают разные прогнозы?
Надоело запускать программу? Попробуйте ввести автомати-
зацию: уберите нажатие клавиши <Enter>, а вывод результата га-
дания поместите в цикл for — для начала раз на 20. Ну как — про-
гнозы разные?
— Ромашка — архаизм. Время в качестве источ-
ника случайных чисел — для дилетантов. Только
чайники используют самодельное в ситуациях, когда
можно применить готовый инструмент!
Случайные числа
— Чего он обзывается? Эксперт должен быть вежли-
вым! Ну и ещё знающим проблему. С большим практиче-
ским опытом. И чтобы излагал понятно и интересно!
— Ну что, яхонтовый мой? Про что тебе рассказать?
Что было, что будет, чем сердце успокоится? Приподними-ка ручку...
ага, вижу-вижу. Не успокоится сердце, пока не расскажу, как в Пито-
не программировать случайности.
Ну что ты, бриллиантовый, на меня такими
удивлёнными глазами смотришь? Люба Питон-
ка, потомственная гадалка в пятом поколении.
Предыдущие четыре поколения пользовались
воском, косрейной гущей, картами, а я вот на
Питоне гадаю. Спрос-то растёт! То школьни-
ку нужно правильный вариант в тесте выбрать,
то депутату решить, как голосовать, чтобы его
и на следующий срок избрали... Без инсрорма-
ционных технологий никак!
Гадание на Питоне — штука тонкая, надо все ритуалы соблюсти.
Сначала говорим заклинание import random, трижды плюём через
левое плечо и крестим экран мышкой. Ну, а после всё зависит от
того, как и про что гадаем.
Если, к примеру, ученику надо узнать оценку за контрольную, так
и пишем: print(random.randint(2,5))
А если гадаю для учителя, и ему нужны оценки оптом, для всего
класса — ну, ставлю эту команду внутрь цикла for.
А вот когда учитель гадает, кого из учеников спросить, я у него
требую список учеников класса. А дальше так:
import random
u = ["Букин", "Бякин", "Букин", "Хрюкин”, "Жукин"]
print("К доске пойдёт", random.choice(u))
Если же спросить надо всех...
Ч: Знаю! Ставим команду в цикл for!
— А вот нет, изумрудный ты мой! Если так сделать — вдруг Бяки-
на ни разу не спросят, а Хрюкина аж три раза за урок? Нет, тут другая
штука есть:
import random
u = ["Букин", "Бякин", "Букин", "Хрюкин", "Жукин”]
random, shuffle (u)
for uch in u:
print('К доске пойдёт", uch)
Вот вроде и всё. А дальше просто комбинируешь методы и дела-
ешь загадочный вид... то есть интерфейс.
Всё, успокоилось сердце? Ну, тогда пошла я, перламутровый
мой!
Ч: Погодите! Тётя Люба! Неудобно как без отчества... А мне пога-
даете? Стану я программистом или нет?
— Не станешь, алюминиевый мой. Будешь информатику в шко-
ле преподавать... да ладно, ладно, не закипай! Ты ж теперь и сам
можешь себе программу для гадания написать. Только умную: если
весь вечер честно кодил, отлаживал, тестил — скажет, что будешь
программистом. А вот если сачковал, играл, болтал — скажет, что
станешь несчастным банкиром, поп-звездой в мишуре или скучным
топ-менеджером...
КОНСПЕКТ:
модуль random
Модуль — файл с расширением .ру, входящий в стандартный
установочный пакет языка Python и содержащий готовые подпро-
граммы — с точки зрения программиста это такие же команды, как
print, range и т. п. Обычно в модуль объединяют подпрограммы
с общей тематикой: например, модуль random содержит инстру-
менты для работы со случайными числами и случайным выбором.
Чтобы использовать команды из модуля, его необходимо под-
ключить: import имяМодуля. К командам из модуля следует обра-
щаться так: ИмяМодуля.ИмяКоманды'.
Случайные числа в random генерируются путём выполнения
нескольких математических операций с предыдущим случайным
числом. Команда random.seed() заставляет генератор исполь-
зовать в качестве начального значения текущее время. А можно
указать в скобках конкретное число, тогда можно будет повторно
сгенерировать ту же последовательность случайных чисел, указав
в скобках то же значение.
1 Есть способы сократить текст при использовании импортированных команд —
посмотрите справочные интернет-ресурсы. Здесь мы экономить не будем.
n = random.randint(а, Ь) —переменной п присваивает-
ся случайно целое значение из интервала от а до Ь включительно
(обратите внимание: Ъ включается!).
n = random, choice (Список) — п получает значение слу-
чайного элемента из списка. Сам элемент из списка не удаляется.
random, shuffle (Список) — перемешивание элементов ука-
занного списка.
— Очень важное предупреждение! НИКОГДА не на-
зывайте свои файлы именами, совпадающими с имена*
ми стандартных модулей! Если вы это сделаете, модуль
перестанет работать. Исправить ситуацию можно, если
удалить или переименовать свой файл.
ЭКСПЕРИМЕНТ:
случайны ли случайные числа?
Давайте разработаем программу, которая генерирует очень
много случайных чисел из интервала от 0 до 9 и подсчитывает,
сколько раз встретилось каждое из чисел. Это не так сложно, как
кажется: достаточно создать список из 10 элементов и заполнить
его нулями (это можно сделать в цикле через append, а можно вот
так: с = [0 for k in range (10) ]). А затем в цикле всё мож-
но сделать в духе Пайтона, в одну строку: с [random, randint (0,
9) ] += 1. Мы увеличиваем на 1 значение счётчика с номером,
равным сгенерированному числу — красиво, да?1
Программа готова? Запустим, например, на 10 000 чисел и вы-
ведем результаты — количества выпадений каждого числа. Если
отклонения от 1000 не больше нескольких десятков — всё хоро-
шо, генератор выдаёт нам равномерно распределённые случай-
ные числа. А если больше... ну, запустите ещё раз, предварительно
перекрестив мышкой, как Люба Питонка учила.
1 Полный текст программы — в электронном архиве.
КАПЕЛЬКА ИНФОРМАЦИИ:
случайности и вероятности
Вот кубик с точками на гранях, от 1 до б —
игральная кость. Кубик нормальный, без техни-
ческих ухищрений типа свинцовой пластины под
одной из граней. Это означает, что выпадение всех
чисел равновероятно, и если бросать кубик очень много раз, то
количество выпадений каждой цифры будет составлять примерно
1/6 от общего числа бросков. На языке математики это звучит так:
вероятность выпадения конкретного числа равна 1/6.
Вероятность события — доля, которую составят случаи, когда
событие произошло, в общем числе экспериментов, если экспери-
ментов много.
Приблизительно оценить вероятность события можно на осно-
ве статистических данных (если этих данных достаточно много).
Например, если из 200 студентов, сдававших экзамен по теории
вероятностей до Вас, 150 получили двойки, а 50 тройки, можно
предположить, что вероятность двойки составляет 3/4, а трой-
ки — 1/4.
Но следует учитывать, что вероятности работают только при
большом числе повторений эксперимента. Если Вы трижды бро-
сили кубик, и трижды выпало 6, это не означает, что вероятность
выпадения шестёрки равна 1.
Числа, выпадающие на кубике или выдаваемые генератором
случайных чисел, равновероятны: все значения из интервала
встречаются с одинаковой частотой. Такие числа называются рав-
номерно распределёнными. Но многие окружающие нас в жизни
случайные величины ведут себя иначе.
К примеру, рост встреченного на улице взрослого человека
(будем учитывать только тех, чей рост от 100 до 240 см) не явля-
ется равномерно распределённой случайной величиной: людей
с ростом 170 см вы встретите намного
больше, чем людей с ростом 100 или
240 см. В жизни ситуации, когда средние
значения величины встречаются гораз-
до чаще, чем крайние, являются нормой.
В математике есть понятие «нормально
распределённая случайная величина» —
это как раз наш случай.
Как получить нормально распределённые случайные числа?
Можно влезть в дебри теории вероятностей и математики и на-
учиться пользоваться специальными инструментами из модуля
random. А можно использовать сумму или среднее арифметиче-
ское нескольких равномерно распределённых случайных чисел.
Практикум
ЗАДАЧА:
тест на устный счёт
Уровень 1 — программа генерирует два двузначных числа,
выводит пример на сложение этих чисел, получает от пользовате-
ля ответ и сообщает, правильный ли он. Выглядеть это может так:
83 + 21 = 104
Верно!
Уровень 2 — всё то же самое, но примеров 10 и в конце вы-
водится количество примеров, решённых правильно, и оценка в
5-баллъной системе (10 — 5; 9 или 8 — 4; 7, 6 или 5 — 3; меньше
5 — 2). Если вам лениво писать развесистый условный оператор,
используйте список из 11 элементов с оценками, соответствующи-
ми числу решённых примеров от 0 до 10.
Уровень 3 такой же, как уровень 2, но при этом кроме сложе-
ния есть и вычитание. Действие выбирается случайным образом.
ПОДСКАЗКА»>
_ > Задача:
?пД ДА/НЕТ-ответчик
Уровень 1 — программа предлагает пользователю задать во-
прос, предполагающий ответ ДА или НЕТ, и отвечает на него (есте-
ственно, случайным образом). При этом, если хотите, можете не
ограничиваться только этими ответами. Постарайтесь написать
программу гибко, чтобы можно было дополнять состав возмож-
ных ответов с минимальными изменениями в программе (да-да,
список!)
Уровень 2 — то же самое, но программа работает в цикле, и
пользователь может задавать вопросы, пока ему не надоест. А ког-
да надоест, пусть вместо вопроса просто нажмёт <Enter>.
Задайте вопрос, подразумевающий ответ ДА или НЕТ.
"Зенит11 выйдет из группы в Лиге Чемпионов?
Сомнительно.
Задайте вопрос, подразумевающий ответ ДА или НЕТ.
Меня сегодня спросят на истории?
Наверняка!
ЭКСПЕРИМЕНТ:
I копаем картошку
наперегонки с Пятачком
Сделаем простейшую компьютерную игру и поиграем в неё.
Сюжет такой. Вы и Пятачок — на картофельном поле. Вы сорев-
нуетесь — по очереди выкапываете кусты картошки. Победит тот,
кто первым выкопает куст, на котором больше 13 картофелин.
Теперь о картошке. На кусте — от 0 до 15 картофелин. Но
большинство кустов средненькие: штук по 5-8. Как это запрограм-
мировать? Например, так: представим себе, что на кусте 5 веточек,
и на каждой от 0 до 3 картофелин. И генерировать вы будете по
веточкам, а потом складывать. Предлагается вот такой способ «вы-
капывания» куста:
р - О
for к in range(5):
р += random.randint(0, 3)
print(р, "шт.’)
Интересно, а если вместо 5 веточек с 0-3 картофелинами сде-
лать 3 веточки с 0-5, игра будет заканчиваться быстрее?1
ЗАДАЧА:
раздача домино
Видели костяшки для игры в домино? Вот
такие: пластмассовая штучка, на двух поло-
винках которой точки, от 0 до б. Мы не будем
особо изощряться с дизайном, будем считать
костяшку строчкой типа 4-6 или 2 2. Второе число должно быть
не меньше первого (это чтобы мы не считали, что 3-1 и 1-3 — это
разные костяшки.
Целиком игру писать не будем (на самом деле все необходи-
мые для её создания инструменты у вас есть, но даже реализация
самого простого варианта займёт несколько вечеров). Решим две
небольших подзадачи.
Сначала создадим список костяшек (кстати, сколько их?).
А потом «сдадим» и выведем 7 случайных костяшек из набора.
ПОДСКАЗКА»>
ПРОЕКТ:
«однорукий бандит»
«Одноруким бандитом» называли механический игровой ав-
томат, который был очень популярен в США в начале XX века.
Представьте: шкаф с расположенным сбоку рычагом, в окошке
видны три барабана. На барабанах — цифры или картинки. Игрок
опускает в автомат 5 центов, дёргает рычаг, барабаны вращаются
1 Читающие книгу папы-программисты могут вспомнить вузовский курс теор-
вера и попробовать решить эту задачу без компьютера, на бумажке.
и останавливаются. Если выпали три
одинаковых изображения, из автомата
выпадает 50 центов, если одинаковых
две из трёх — 10 центов.
Ну а ваш «однорукий бандит» будет
программируемым. Можно поколдо-
вать с интерфейсом, детали игры — на
ваше усмотрение. И хорошо бы как-то
отразить идею, что игры с целью обо-
гащения — зло.
I ВНМГРЫШ I
I будет ПЕРЕДАЧ
I П?ин?ту Котиков;
МИКРОТЕСТ:
что мы знаем о случайных числах
Какие из этих высказываний верны?
А. Модуль random — дополнение к Python, которое надо скачать из
Интернета.
Б. Компьютер сам что-то придумать не может — он способен только
получить значение и изменить его.
В. При необходимости можно несколько раз сгенерировать одну
и ту же последовательность случайных чисел.
Г. Команда random.mix(spisok) перемешивает список, имя
которого в скобках.
Д. В результате выполнения команды n = random.гandint (10,
99) переменная п получит случайное значение от 10 до 99.
Е. Если с помощью randint сгенерировать миллион случайных
чисел 0 или 1, ровно половина из них будут ноликами.
Вот теперь-то, когда у нас есть и списки, и случай-
ные числа, мы разгуляемся! Вам предлагается проект
«Гадалка»: можно воплотить в жизнь все идеи Любы
Питонки и добавить свои.
Глава 12
Манипуляции со строками
iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiniiiiiiiii
Строка — последовательность символов
— Тут задача у меня...
— Опять Самовар Самоварыч подбросил?
Ч: Да нет... В книжном магазине увидел книжку / \
«Питон для малышей», взял полистать, открыл наугад. А там
задачка: написать программу, которая получает строку и выводит её
задом наперёд: ей ПАПА — она АПАП, ей БЯКА — она АКЯБ...
К: А решения там не было?
Ч: Было, наверное. Но я постеснялся у всех на глазах в малышо-
вой книге в ответы лезть.
Если бы это была не строка,
а список, по имени, предполо-
жим, s, я бы написал так:
г =
for k in range(len(s)):
г = s [к] + г
print(г)
Но как строку превратить в список?
К: А она и так почти список. Вот поставьте в начале программы
input (s) и запустите.
Ч: Ну хорошо, если что — это была не моя идея. Так, синтаксиче-
ских ошибок нет, запустилась. Ввожу «ПИТОН»... Ой, работает! Выве-
лось «НОТИП». Классно! Значит, строка — это тоже список?
К: Не совсем. Элементу списка с каким-то номером мы можем
присвоить значения. А вот букву внутри строки таким способом не
изменить.
Ч: «Таким способом не изменить», — значит, можно каким-то дру-
гим, да?
— Да есть стопятьсот способов поменять что-то
в строке!.. Здравствуйте. Я Женя. Можно уменьши-
тельно-ласкательно — Евгений Викторович. Учите-
ля в школе обозначают меня терминами «балабол»
и «таратор»... таратор... упаковка + бублик как гео-
метрическое тело. А балабол — английский мячик
танцевального вечера...
Про питонские строки. Вот у нас, к примеру,
строка: s = "колбаса”. Что с колбасой делают?
Ч: Едят!
— Да. Но сначала режут. Есть в Питоне инструмент такой —
срезы. Вот код:
s = "КОЛБАСА”
print(s[3:6])
print(s[: 3])
print(s[:-3:-1])
Запускаем... Вывелись слова БАС, КОЛ, АС, Эта штука с двое-
точиями называется срезом. Попробуйте-ка сами с ней разобраться
и вырезать из колбасы слова КОЛБА и БЛОК. Вы ведь range знаете?
А тут всё почти так же! А я пока следующий пример приготовлю.
ЭКСПЕРИМЕНТ:
нарезаем колбасу
Прежде чем вырезать слова БЛОК и КОЛБА, поэксперименти-
руйте (можно прямо в интерактивной среде) вот с такой строкой:
s = ”01234567".
Здесь символы строки совпадают со
своими номерами в строке. Смотрите:
А теперь посмотрите, что собой пред-
ставляют s [3 : 6], s [: 2], s [: :2], s [1: 6 :2]
»> s =
"01234567”
»> print (s [2] )
2
И s[-1:-6:-2]].
Сейчас у вас есть всё необходимое, чтобы вырезать из колбасы
блок и колбу, а также решить задачу Чайника с переворачиванием
слова. Вперёд! ОТВЕТ»>
КОНСПЕКТ:
срезы
Срез — способ извлечения набора элементов из строки или
списка.
Общий вид среза:
s [first: limit: step]
s — строка или список.
first — номер первого элемента, включаемого в срез.
limit — номер, при достижении которого формирование
среза заканчивается (элемент с этим номером в срез уже не вклю-
чается).
step — шаг, значение, прибавляемое к номеру текущего эле-
мента для получения следующего.
Команда
w = s[first:limit:step]
эквивалентна вот такому фрагменту кода:
w = ""
for k in range (first, limit, step):
w += s[k]
Если step не указан, предполагается, что он равен 1.
Если limit не указан, предполагается, что он равен длине
строки при положительном шаге и -1 при отрицательном.
Если first не указан, предполагается, что он равен 0 при по-
ложительном шаге и -1 при отрицательном. При этом s[-l] =
s[len(s) - 1] — последний элемент строки или списка.
— Вот такая вот возможность записать действия
короче и понятней называется в программировании
«синтаксический сахар». Обычно начинающих про-
граммистов морят голодом, синтаксического сахара
им не дают во избежание переполнения головы новой
информацией. Но срезы - такая удобная штука...
Строки и списки
— Значит, строка и список — одно и то же? Строка —
/ это на самом деле список символов?
У— Нет. У них есть много общего. Но устроены
они совсем по-разному. у
/ I
Ч: Но я же всё равно не знаю, как они устроены! Мне
важно, что с ними можно делать!
К: Давайте попробуем выполнить одни и те же действия со спи-
ском и со строкой.
ЭКСПЕРИМЕНТ:
строка и список
Сначала пусть s будет списком. Введите вот такую программу:
S = ['s' , ’р*, »i *, 's' , 'о' , 'к']
print(len(s))
print(s [3: ])
s[3:] = s[:3]
print(s)
Теперь закомментируйте первую строку, а вместо неё напишите
s = "stroka"
Переведите то, что вывелось красным цветом, обдумайте и за-
помните.
— А теперь тихонечко так замените первую строч-
ку на s = list('’stroka") и запустите программу.
Поняли, да?
— Ага, значит, строку можно превратить в список!
А обратно можно? Ну-ка, w = str(s) и вывести... Ой, нет:
получилось вот такое:
"['s', ’t' , ’ г' , 'o', ' к ’ , ’ а' ] "
— Вы же уже пробовали собирать строку по буквам
в цикле. Этот способ годится.
Ч: Тогда сделаем вот так.
W = " "
for b in s:
w += b
И теперь у нас есть возможность работать со строками, как со
списками. Можно, например, взять строку, превратить в список, пе-
ремешать его (random, shuffle) и вывести.
Жене Викторовичу понравилось бы.
“ Да, я такую игрушку тоже сделал.
Предложил учительнице русского для
викторины у младшеклассников, запу-
стил на переменке на своём ноуте. Русич-
ка ввела «УДАРЕНИЕ», программа вы-
дала «АДУРЕНИЕ», столько писку было:
«Нет приставки А, есть приставка О!...» Но
в итоге викторину провели, только Элла Валентиновна заранее базу
слов проверила, убрала все потенциально опасные.
Что ещё могут строки
— Но вообще строки можно изменять и без превращения в список.
Смотрите:
s = "КОЛБАСА”
print(s.replace ("БАС"г "ЮЧК"))
Эта штука, replace, заменяет в строке s все вхождения первого
слова на второе. ‘'Слово" — в смысле один или несколько символов.
Ч: Ну-ка, попробую сделать из колбасы КОЛ БОСО.
S = "КОЛБАСА”
s.replace ("А”, ”0")
print(s)
Ой, не получилось, всё равно КОЛБАСА.
Жень, чего она не хочет трансформироваться?
Ты ж вроде эксперт по колбасе...
— Я эксперт не по колбасе, а по словесным играм. Ты раскладку
клавиатуры менял? Там точно русское А, а не латинское?
А! Сейчас попробуем... всё равно КОЛБАСА! Может, это потому,
что слова КОЛ БОСО нет, и колбаса не желает превращаться во что-то
несуществующее?
К: Ну вот, доигрались. Учишь-учишь вас программированию, а вы
потом подозреваете колбасу в наличии искусственного интеллекта.
Сэр Пайтон, что скажете?
~ Дело в том' что replace не изменяет строку, а
создаёт новую, уже с заменёнными буквами. Можно эту
ПТугЩ новую вывести в print. Можно, если хочется, присвоить
той же строке сформированное значение:
s = s.replace ("А", "О").
— Точно, я и не заметил. Давайте я вам ещё одну игрушку покажу,
отгадывание слова по буквам. Это заготовка — делаю сейчас «Поле
чудес». Код пока не смотрите, а то неинтересно будет. Запускаю!
Отгадайте слово’
Это название словесной игры,
Отгадывать будем по буквам,
it * ir -fc it it
Ч: Шесть букв... шарада! Введём Ш.
К: Начните лучше с Р. Так интереснее.
Введите букву: Р
★ ★ pit it ★
Ч: Ну я же говорю — шарада!
Введите букву: Ш
Ч: В смы-ы-ы-сле? Не шарада? А что тогда? Придётся по буквам
отгадывать.
Введите букву: А
•к ~к pit it it
Введите букву: И
**ри**
А, понял!
Введите букву: Б
Б*РИ**
Введите букву: У
БУРИ**
Введите букву: М
БУРИМ*
Введите букву: Е
Вы победили?
— А вот код программы:
print("Отгадайте слово! ”)
print("Это название словесной игры.")
print("Отгадывать будем по буквам.")
s = "БУРИМЕ"
р = ”*" * len(s)
while р != s:
print(р)
b = input("Введите букву: ")
b = b.upper()
i = s.find(b)
if i >= 0:
P = p[:i] + b + p[i+l:]
print("Вы победили!")
Но это только заготовка. Надо ещё сделать список слов и их тол-
кований, случайный выбор слова. И пока ещё не решена проблема
с несколькими одинаковыми буквами в слове — приходится базу
делать из слов с неповторяющимися буквами. А так код довольно
универсальный. Благодаря upper () не важно, большую или малень-
кую букву введёт пользователь. A s.find(b) — это номер символа b
в строке з, если он там есть, а если нет, то -1. У строк ещё много дру-
гих полезных методов. Кстати, «строка» — срами л ия кубинца Фиделя
с переставленными слогами, а «метод» — единица измерения дли-
ны плюс торжественное стихотворение, оба без последних букв...
Я, пожалуй, пойду. Сейчас, как мне кажется, нам всем очень хо-
чется попрограммировать. До свидания.
КОНСПЕКТ:
функции и методы строк
Подстрока — часть строки (от одного символа до целой
строки).
len (s) — длина строки s.
»> len("очень длинная строка")
20
s .find(Ь) — номер позиции, начиная с которой в строку s входит
подстрока b (find находит первое вхождение подстроки, а есть ещё
rfind — поиск последнего вхождения,
»> ’обороноспособность" . find ( o' )
0
»> "обороноспособность" . rfind("о")
14
»> "обороноспособность" .find( ы" )
-1
s .replace(а,Ь) — строка s, в которой все вхождения под-
строки а заменены на подстроку Ь.
»> "Шла Саша по шоссе и сосала сушку".
replace( ’с", ”ш' )
'Шла Саша по шошше и шошала шушку'
s .split(г) — список подстрок строки s, если разделите-
лем считать символ г. Если разделитель не указан, им считается
пробел.
»> "Уронили мишку на пол' . split ()
[1 Уронили’, 'мишку', 'на1, ’пол’]
©.upper() , s.lower () — преобразование строки к верхне-
му (нижнему) регистру.
»> " Python" . upper ()
'PYTHON'
»> ” Python” . lower ()
'python'
Это далеко не всё, что можно делать со строками. Погуглите
про методы строк.
— Забыли один полезный оператор. С помощью if а
in ь: можно проверить, входит ли а в ь (например, сим-
вол а в строку Ь или элемент а в список Ь).
Операторы, функции и методы
— Я вот чего не понял: «методы» — это что? Вот «ме-
тод воспитания» — это как «способ воспитания». А тут
явно другой смысл. л
— Не хотел я влезать в эту терминологию, но ffl
придётся. До сих пор мы использовали понятие «команда», !
и называли этим словом и =, и if, и print (). —s
Посмотрите на текст программы про буриме. Если открыть её
в IDLE, видно, что текст программы разноцветный. К тому, что текст
в кавычках у нас зелёный, мы привыкли. А вот почему некоторые
слова выделены оранжевым, а некоторые фиолетовым?1
Оранжевые while и if — это операторы языка, составляющие
его суть, влияющие на структуру программы (не случайно после них
появляются отступы).
Фиолетовые len(), print {), input() — встроенные функции
языка. Функция — программа в программе: она выполняет запро-
граммированные действия с переданными ей данными (теми, что в
скобках): вычисляет длину, выводит, организует ввод с заданным за-
просом. Большинство функций формируют значение, и это значение
можно сохранить в переменной или использовать для дальнейшей
обработки. Некоторые функции (например, print) значение не фор-
мируют, только выполняют действия.
А ещё есть очень похожие на функции upper () и find(). Но они
чёрного цвета, и стоят после точки, а перед точкой — какое-то зна-
чение. Это и есть методы. Метод — функция, работающая с данными
конкретного типа. Читать их лучше начиная с того, для чего они вы-
полняются. Например, s.upper () — «строка s, преобразованная в
верхний регистр», s.find(b) — «позиция вхождения в строку s под-
строки ь».
1 Если вы работаете в другой среде программирования или по-своему настроили
IDLE, цвета могут быть другими.
А как понять, где — функция, а где — метод, когда программа
ещё только пишется?
К: Так же, как и раньше: смотреть справочники, книжки, примеры
программ. Общая логика такая: функции более универсальны, методы
специализированы, «заточены» под конкретный тип данных. Но луч-
ше всё же руководствоваться не логикой, а справочниками.
Практикум
ЗАДАЧА:
словесные игры со срезами
Все программы, которые вам предстоит написать, двухстроч-
ные. Причём первая строка уже написана. А во второй осталось
дописать только содержимое квадратной скобочки.
Вот пример: что следует написать в квадратных скобках, чтобы
программа вывела «ЛЕТО»?
s = "ОТЕЛЬ"
print(s[...])
Вот вместо трёх точек вам и надо что-то написать. Что? Ну,
к примеру, [-2 : : -1].
Давайте дальше мы не будем повторять «шаблон» программы
(он всегда одинаковый), а будем просто писать, из какой строки
какую надо получить. Превратите с по-
мощью среза ПАСПОРТ в СПОР, БАРКАС ч
в БРА, КОЛЛИЗИЯ в ЗЛО, а ПТЕРОДАК-
ТИЛЬ в КОТ. Ответов не будет! Сами
справитесь.
Понравилось? Можете придумать
собственные трансформации слов.
ЗАДАЧА:
словесная архитектура
Разработайте программы, которые из введённого с клавиату-
ры слова строят два «крылечка» и одну «пирамидку». Результаты
должны выглядеть примерно так. ПОДСКАЗКА»>
Слово: ПАРАД Слово: ДОКЛАД Слово: ПИРАМИДКА
П д м
ПА ===== дд АМИ
ПАР === ЛАД РАМИД
ПАРА == КЛАД ИРАМИДК
ПАРАД = ОКЛАД ПИРАМИДКА
ДОКЛАД
ЗАДАЧА:
пересечение слов
Разработайте программу, которая получает на вход два слова
и выводит все возможные их пересечения, как в кроссворде (пер-
вое слово должно выводиться по вертикали, второе по горизонта-
ли). В конце вывести количество найденных вариантов (оно может
быть и нулём). Вот пример работы программы. ПОДСКАЗКА>»
Слово 1: КЛЮЧ
Слово 2: ЧИСЛО
К
ЧИСЛО
ю
ч
к
л
ю
число
Программа непростая. Если
справитесь без подсказок — мо-
жете считать, что неплохо овла-
дели циклами и обладаете про-
странственным воображением.
Если справились с подсказками —
тоже неплохо.
ОТВЕТ»>
Найдено вариантов: 2
ПРОЕКТ:
игра в анаграммы
Как получить из слова анаграмму, Чайник с Женей вам уже
объяснили. Остаётся сделать из этого игру: программа предлагает
пользователю 10 анаграмм случайных слов из своей базы (база
слов — большой список), предлагает пользователю их отгадать и
выводит результат — количество отгаданных анаграмм. Всевоз-
можные дополнения и украшения приветствуются — это же проект.
У вас уже достаточно знаний, чтобы сделать разные уровни слож-
ности с разной длиной слов (а программа при этом почти не уве-
личится), соорудить красивый и удобный интерфейс.
МИКРОТЕСТ:
что мы знаем о строках и срезах
Какие из этих высказываний верны?
А. Для использования методов строк надо в начале программы
написать import string.
Б. ’’БАРАБУЛЬКА” [2:5] — это "АРАБ"
В. Для любой строки s запись s[-l] — это то же самое, что
s[len(s) — 1].
Г. Если в строке s нет символа "Ы" то значением s .find ("ЬГ) будет 0.
Д. Чтобы заменить 3-й символ строки з, к примеру, на следует
выполнить присваивание s [2] = "!".
Е. Учительницу Евгения Викторовича по русскому зовут Элла
Вениаминовна.
Вы уже поняли, какие прекрасные перспективы откры-
ваются тем, кто умеет работать со строками. Вам до-
ступен проект «Виселица» (не пугайтесь, нормальная
словесная игра; ваши бабушка и дедушка наверняка
в неё играли — на бумажке, разумеется).
Глава 13
Олимпиадное
программирование:
первые шаги
llllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllinillllllllllllllllll
Программирование «нормальное»
и олимпиадное
— Меня на олимпиаду посылают! jOu.
П1
— Бег на средние дистанции? Вижу, трени- 1
руетесь — аж пар идёт. Г* \
Ч:Да нет! По программированию. Иду себе
я по лестнице в школе, вдруг меня цапает за ручку Пароварка Тита-
новна, завуч, и говорит, что мне надо до понедельника пройти за-
очный тур олимпиады по программированию, и если на очный тур
не пройду... в общем, почувствовал себя паровой котлеткой. Ссылку
вот написала на бумажке. Зашёл. Создал учётку. Нашёл нужный тур-
нир. Нашёл задачу, которую могу решить. Вот: «Записали число. Спра-
ва к нему приписали то, что на 1 больше. Слева — то, что на 2 боль-
ше. К тому, что получилось, справа приписали число, которое на 3
больше начального, а слева — то, что на 4. Разработайте программу,
которая получает на вход натуральное число и выводит число, полу-
ченное в результате выполнения описанного выше алгоритма».
К: Нетипично простая для олимпиады задача. Впрочем, отбороч-
ный тур... в такие обычно включают хотя бы одну задачу, которую
могут решить все.
Но я-то не решил пока! Написал программу, скопировал в поле
для текста попытки. Выбрал нужную версию языка программирова-
ния (Python 3 с чем-то там). Отправил. А мне говорят: «Неверный от-
вет». Да как неверный, я ж всё проверил-перепроверил!
:: Пойдёмте на сайт, посмотрим... О, на этом портале я ещё не был,
что-то новенькое.
А их что, много — олимпиадных сайтов?
К: Очень много. Есть русскоязычные, есть двуязычные, есть на
английском. Одни — для мировых турниров, другие — учебные, для
отдельного вуза или хорошей школы. Открыли текст? Та-а-а-к...
n = int(input("Введите натуральное число: "))
s = str(n + 4) + str(n + 2) + str(n) + str(n + 1) + str(n + 3)
print (’Ответ:11, s)
Ч: Вот что тут может быть неверно?
К: А Вы условие до конца дочитали? Вот тут: «Входные данные»,
«Выходные данные»?
Ч: Конечно! Я же всё так и делаю!
К: Уберите текст в кавычках в input и в print.
Ч: Хорошо, но ведь тогда интерфейс будет непонятным... Ой, го-
ворит, «Accepted», принято! Но почему?
К: Проверяет программу не чело- 9 I
век, а другая программа. У неё есть
пары наборов входных и выходных
данных. Она имитирует ввод вход-
ных данных и проверяет, совпало ли ®
то, что вывела ваша программа, с образцом. Если все тесты пройде-
ны, программа принимается.
Ч: Это только на этой олимпиаде или на всех?
К: Так на всех олимпиадах по программированию. Но есть ещё
хакатоны, конкурсы проектов — вот там интерфейс должен быть по-
нятным пользователю.
Олимпиадное программирование (его ещё называют спортив-
ным) — особый вид программирования, немного искусственный, как
и любой спорт. Вот, скажем, биатлон требует вроде бы тех же навы-
ков, что зимняя охота, — но правила другие, намного жёстче. Так и
со спортивным программированием.
КОНСПЕКТ:
ввод и вывод данных в автопроверяемых
программах
На олимпиадных порталах (например, http://codeforces.com/,
https://contest.vandex.ru/edu) правильность программы проверяет
не человек, а другая программа. Следствия из этого:
♦ программа должна вводить данные именно в указанном
формате и порядке;
♦ программа не должна выводить ничего, кроме результата;
♦ ответ должен быть строго в заданном формате;
♦ как именно программа получила этот ответ, никого не вол-
нует.
— На олимпиадных порталах часто встречаются
задачи, где несколько входных значений вводятся в
одной строке (это удобно тем, кто программирует на
C++ и - пф-ш-ш-ш! - Паскале). Для меня это не очень
удобно, но вполне преодолимо. Предположим, входные данные за-
дачи - имя, рост и вес кого-то. Имя - строка без пробелов, рост -
целое число, вес - нецелое число. Делаем так:
t = input().split() # Превращаем строку в список,
# разделитель - пробел
name = t[0]
height = int(t[l])
weight = float (t [2])
Особенности олимпиадных задач
— Круто, я решил олимпиадную задачу! Давайте попро-
Решить еЩё одну, только не с олимпиады, а из сбор-
ников задач, тут такие тоже есть. Сборник «Для „
чайников» — это, видимо, как раз то, что мне надо.
Откроем наугад... Ой, а это вообще задача? V у
— А что Вас смущает? <___/
Ч: Тут какая-то история... даже с диалогом! Вот, смотрите:
— Скорей, Мария! Доставай свой и
мой паспорта и бежим в мэрию!
— Зачем, Антонио?
— Этот негодяй, мэр Себастьян, перед
выборами устроил лотерею. Если три по-
следние цифры номера паспорта образуют
число, которое можно получить, перемно-
жив три одинаковых целых числа, ты со-
вершенно бесплатно получаешь портрет
Себастьяна и ведро кваса из гуараны.
— А вдруг мы оба выиграем, Антонио? Будет нехорошо, если в го-
стиной будут висеть два одинаковых портрета. Гости могут подумать,
что у них двоится в глазах!
К: И что вас смущает? Персонажи из «Мексиканских негодяев»?
«Звёздные войны» более традиционны для олимпиад, но вообще от
персонажей мало что зависит. Про лотерею поняли. Что дальше?
Ч: Дальше? А, вот:
Известно, что номера паспортов жителей города — натураль-
ные числа из интервала от 100 000 до 999 999, а в городе Л/жителей
(Л/ < 100000). Подсчитайте, сколько вёдер гуаранного кваса должен
запасти Себастьян.
Ч: Смотрим входные данные: сначала число паспортов, потом
их номера. Счётчик, цикл. Вводим, отковыриваем от номера три по-
следних цифры. А вот как определить, что это число можно получить
как произведение трёх одинаковых цифр? Мне Бонбоньерка что-то
объясняла про квадратные и кубические корни...
К: Они вряд ли потребуются. Всё проще. Давайте немножко повоз-
водим целые числа в третью степень и позаписываем результаты.
Ч: Ладно. О • 0 0 = 0, для 1 — 1, для 2 — 8, для 3 — 27, ..., для
9 — 729, для 10... понял! Выигрышных чисел мало, всего 10, и можно
просто занести их в список, а потом проверять окончания номеров
паспортов, есть ли они в списке.
ЗАДАЧА:
лотерея
Вот «сухой остаток» приведённой выше задачи. Среди жителей
города поводится лотерея по номерам паспортов. Если последние
три цифры номера паспорта образуют число, являющееся кубом
другого натурального числа, паспорт выигрывает. Разработайте
программу, определяющую количество выигрышных номеров сре-
ди Л/ паспортов жителей города.
Вход: в первой строке значение Л/, не превышающее 100 000.
В последующих /V строках — шестизначные натуральные числа,
номера паспортов жителей.
Выход: целое число — количество выигрышных номеров
паспортов.
— С этой задачей всё понятно, запрограммирую сам.
Давайте, раз время есть, сделаем ещё одну. Вот эту, коро-
тенькую.
— Да уж, короче некуда.
Разработайте программу, находящую наименьшее нату-
ральное число с заданным произведением цифр. Если тако-
го числа нет, программа должна выводить -1.
Ч: Входные данные
мы же на Питоне, нас размеры
чисел не особо беспокоят.
К: И какие у вас идеи, кол-
лега?
Ч: Тут, наверное, можно
подбором решить. Я же писал
программу для расчёта суммы
цифр числа, а с произведением
всё похоже. Сейчас, минуточ-
ку... вот:
К: А проверить?
число W, оно не больше 1 000 000. Впрочем,
n = int(input())
х = 1
while True:
XX = X
р = 1
while хх > 0:
р = р * (хх % 10)
хх = хх // 10
if р == п:
break
х = х + 1
print(х)
Запускаю, ввожу 100.., вывелось 455. 4 • 5 • 5 = 100, всё верно’
К: Запустите ещё раз и введите 13.
Ч: Запускаю, ввожу... ничего не выводится.
Похоже, зависла. <Ctrl>+<C>... Но это просто
число нехорошее: 13 нельзя получить перемно-
жением цифр! А у меня бесконечный цикл. За-
менить конечным?
К: Да погодите вы! Вот число, которое точно можно получить как
произведение цифр, 786432 — это 18 двоек и одна тройка.
Ч: Ввожу... а вы не ошиблись? Вроде бы зависла... А, нет, вот ответ:
3888888.
К: Для олимпиадной программы несколько секунд раздумий
недопустимы — проверяющая программа выдаст сообщение о пре-
вышении лимита времени. Попробуйте найти другой путь реше-
ния. Посмотрите на числа, которые выводила ваша программа: 455,
3888888... Не замечаете каких-то общих свойств у них?
Ч: Цифры идут в порядке возрастания. И там, где можно, мы вме-
сто нескольких маленьких цифр используем одну большую: вместо
нескольких двоек — 4 или 8. Большие цифры выгодней маленьких —
с ними число получается короче.
К: Отлично, а теперь попробуйте сами встать на место компью-
тера и найти наименьшее число с произведением цифр, к приме-
ру, 108.
Ч: 108... сумма цифр делится на 9, значит, и число делится. Запи-
сали эту цифру. 108 : 9 = 12. На 9 не делится, на 8 и 7 тоже. Делится
на 6 и на 2. 269? Проверим моей медленной программой... да!
К: А теперь 104.
Ч: Так, на 9 не делится. На 8 — делится, получилось 13. И всё —
13 нельзя получить, как произведение цифр, нужно выводить -1. И
теперь я понимаю, как делать эту программу: делить число на 9, пока
делится, потом на 8, на 7 — и выписывать полученные цифры в стро-
ку, справа налево. Если число «усохло» до 1 — мы нашли решение.
А если перебрали все цифры от 9 до 2, а число всё ещё не исчерпа-
лось — выводим -1.
ЗАДАЧА:
произведение цифр
Разработайте программу, которая находит наименьшее нату-
ральное число, обладающее нужным произведением цифр. Если
такого числа нет, программа должна выводить -1.
Вход: одна строка, в ней число W < 10 000.
Выход: одно число — наименьшее натуральное число с произ-
ведением цифр N или -1, если такого числа нет.
КОНСПЕКТ:
полезные советы начинающему
«олимпийцу»
♦ Олимпиады по программированию — это спорт, поэтому
и относиться к ним надо, как к спорту: постоянно трениро-
ваться, анализировать свои ошибки, не переживать из-за
неудач, не успокаиваться, добившись успеха.
♦ Главное в спортивном программировании — умение читать
задачу, находить возможные пути решения и выбирать луч-
ший из них (при этом подразумевается, что программиро-
вать вы умеете и не будете тратить уйму времени на поиск
глупых ошибок типа «=» вместо «==»).
♦ На реальных турнирах многое зависит от выбора решаемой
задачи: на вид непросто определить, какая решается в две
строки, а какая потребует долгой кропотливой работы. От-
личное упражнение для выработки искусства оценки за-
дач — при первом чтении прикидывать, сколько времени
у вас займёт её решение, а потом проверять свои предпо-
ложения практикой.
♦ Тексты олимпиадных задач обычно многословны. Не жалей-
те времени на работу с текстом: выделяйте в условии глав-
ное, записывайте «сухой остаток».
♦ Начинать решение задачи лучше с подготовки тестовых зна-
чений. (Даже если примеры даны, стоит сделать и несколько
своих. Часто это помогает найти алгоритм.)
♦ Обращайте внимание на количество и размер входных зна-
чений. Да, для Python не опасны большие числа, но стоит
сразу задуматься: позволит ли простой алгоритм, решающий
задачу «в лоб», перебором всех возможных значений, найти
ответ в заданное время?
♦ Не забывайте про «особые случаи»: крайние значения вход-
ных данных, например. Обязательно проверяйте, как с ними
справляется программа (особенно в ситуации, когда у вас
«ну точно всё правильно», а контестер сообщает, что у вас
неверный ответ в каком-нибудь там тесте 13).
♦ Многие олимпиадные задачи похожи одна на другую. Поэто-
му чем больше ваш опыт решения олимпиадных задач, тем
больше шансов, что, столкнувшись с новой задачей, вы, как
мисс Марпл из детективов Агаты Кристи1, скажете: «Это мне
напоминает историю про торговца зеленью и два ботинка
на одну ногу», — и быстренько напишете код.
♦ Остальные полезные советы вы придумаете для себя сами
по мере накопления опыта решения олимпиадных задач.
1 Не читали? Ну вы даёте! Я ещё в пятом классе прочитал (прим. Чайника).
— А можно как-то попроверять задачи, не отсылая их
на контестер?
— Странное желание. Контестер для того и
придуман, чтобы не заморачиваться самому, со-
чиняя тестовые значения и вводя их. Он-то железный, ему
не трудно подготовить несколько тысяч входных значений,
а вот вам будет непросто...
Да я понимаю, но меня летом на три недели на дачу ссылают.
Ноут там есть. А Интернет — только рано утром, пока все спят, и ло-
вится он только на верхушке гряды в лесу. А там по утрам комары
некормленые...
К: Дача — идеальное место для реализации проектов, зачем ещё
и олимпиады... Ну ладно, выложим тесты к задачам этой главы в элек-
тронный архив: к каждой задаче будет несколько тестовых наборов
входных данных и ожидаемый вывод. Но с контестером и быстрее,
и интереснее, и, в общем-то, честнее: пары тестов могут навести
на идеи решения. Подсказки — в книге, ответы — в электронном
архиве.
Все задачи Практикума, как и приведённые выше задачи
этой главы, доступны на сайте
в отдельном сборнике задач «Из книги Питон в задачах и экс-
периментах"».
Практикум
ЗАДАЧА:
купание слона Васи
К заполненному доверху водой бас-
сейну размером 500 на 1000 см подошёл
слон Вася. Вася очень осторожно погру-
зился в бассейн с головой, затем очень
осторожно вылез. На полу вокруг бассей-
на остались лужи, а уровень воды в бас-
сейне стал ниже на S см.
Разработайте программу, которая на основе этих данных на-
ходит объём Васи в литрах.
Для справки: литр — то же самое, что кубический дециметр.
Вход: натуральное число 5, не превосходящее 100.
Выход: единственное число — объём Васи в литрах.
ПОДСКАЗ КА>»
ЗАДАЧА:
команды на Гонку Героев
Для участия в Гонке Героев 5Б класс
должен выставить как можно больше
команд. Состав команды — 2 девочки,
3 мальчика, 1 собака или кошка. После
подсчёта человеческих и нечеловече-
ских ресурсов оказалось, что в классе D
девочек, М мальчиков, S собак и К ко-
шек. Разработайте программу, опреде-
ляющую максимальное число команд от 5Б на Гонке Героев.
Входные данные: в одной строке через пробел — целые не-
отрицательные числа D, М, S и К. Каждое из них не больше 100.
Выходные данные: единственное число — количество команд.
ПОДСКАЗКА»>
ЗАДАЧА:
получить тройку
У Сидора есть опасение, что по мате-
матике ему влепят пару. Учительница
Мариванна оценки ставит просто: вы-
числяет среднее арифметическое всех
оценок за четверть и округляет до це-
лого по правилам арифметики: 2.3 —
это двойка, а вот 2.5 — уже тройка.
Разработайте программу, которая получает на вход оценки Сидо-
ра и определяет, сколько пятёрок он должен получить, чтобы из-
бежать двойки.
Входные данные: натуральное число N, не превосходящее 100, —
количество оценок Сидора. Далее — /V строк, по одной оценке
в каждой.
Выходные данные: единственное число — количество требуемых
пятёрок. ПОДСКАЗКА>»
ЗАДАЧА:
Хауко и Мурисио
— Смотри, Антонио, этот негодяй пёс
Хауко опять сидит у дверей и клянчит еду.
Он и так уже в А раз тяжелее нашего бед-
ного котика Мурисио!
— Это негодяй Мурисио бедный? Да
в него влезает в В раз больше еды, чем
в Хауко!
— Но если накормить негодяя Хауко
«под завязку», его вес увеличится на Р%!
— Подожди, Мария, вот сейчас я сосчитаю, на сколько про-
центов увеличится вес Мурисио, если его тоже накормить до от-
вала...
Разработайте программу для решения этой задачи.
Вход: на трёх разных строках вещественные числа Р, А, В, все
они не превышают 1000.
Выход: вещественное число — то, на сколько процентов уве-
личится вес Мурисио. ПОДСКАЗКА>>>
ЗАДАЧА:
нарушители самоизоляции
Однажды весной 2020 года компания
шестиклассников мирно прогуливалась
по окрестностям школы, нарушая при
этом сразу несколько правил: они были
без масок, без перчаток, не соблюдали
социальную дистанцию и громко сквер-
нословили в адрес пролетающих мимо
коронавирусов.
Наряд полиции задержал нарушителей и доставил их в отде-
ление. Они расселись (каждому выдали стул с номером). Тётенька-
инспектор прочитала им лекцию о важности самоизоляции и
сфотографировала, предупредив, что при повторном нарушении
придётся платить штраф.
Повторное нарушение малолетние балбесы совершили уже на
следующий день. Однако на стульях они расселись иначе, поэтому
тетенька-инспектор, сравнив фото, сочла их новыми нарушителя-
ми и штраф не выписала.
Сколько раз эта компашка шестиклассников может безнака-
занно попадать в отделение полиции? Компания считается новой,
если её рассадка по стульям не совпадает ни с одной из прежних
рассадок.
Вход: количество школьников, натуральное число, не превос-
ходящее 30.
Выход: максимальное число безнаказанных попаданий в поли-
цию. ПОДСКАЗКА»>
ЗАДАЧА:
Пукка Юкканен
Пукка Юкканен занимает-
ся сбором и экспортом лесных ягод. Ему
принадлежит Л/ кварталов леса. Квартал
представляет собой квадратный участок
размером 1x1 км. Кварталы нумеруются
целочисленными координатами, напри-
мер (5, -3), (0, 115). (Пукка никогда не задумывался, где располо-
жено начало координат, а лес, по его мнению, бесконечен.)
Поскольку неподалёку от владений Пукки Юкканена располо-
жена территория Бякки Хрюкконена, и этот Хрюкконен постоян-
но нанимает на сбор ягод студентов из Питера, а эти студенты так
и норовят пособирать ягоды не в чахлом захламлённом лесу Бяк-
ки, а на плодородных и ухоженных землях Пукки, Юкканен решил
огородить свои владения. Сколько километров металлической сет-
ки ему для этого понадобится? Разработайте программу, которая
сначала вводит Л/ — число принадлежащих Пукке кварталов
леса, а затем N пар значений, координаты кварталов. Вывести
программа должна длину будущего забора в километрах. Учтите:
кварталы могут быть не смежными, разбросанными по всему лесу,
а могут располагаться рядом.
Вход: в первой строке число А/, затем N строк, содержащих
координаты кварталов — два целых числа, не превышающих по
модулю 1000, разделённые пробелом.
Выход: единственное число — длина забора. 1ОДСКАЗКА>>>
ЗАДАЧА:
меньше жрать
— Мария, Мария!
— Что случилось, Антонио?
— Я сделал открытие! Я собрал дан-
ные, проанализировал их и сделал вывод:
«Чем больше человек ест, тем больше он
весит».
— Неужели, Антонио? Вот негодяй Хор-
хе ест, как стая голодных койотов, а тощий.
А я вот кушаю, как маленькая птичка, а...
Итак: имеются сведения об N знакомых Марии и Антонио: ко-
личество потребляемой в день пищи в граммах и вес в килограм-
мах. Надо определить, подтверждают эти данные закон Антонио
или опровергают его. Будем считать, что закон опровергнут, если
среди знакомых Марии и Антонио найдутся такие 2 человека, что
прожорливость первого больше прожорливости второго, а вес
меньше.
Вход: в первой строке натуральное число N, 1 < /V < 100, далее
N строк, в каждой 2 натуральных числа, разделённых пробелом,
прожорливость /-го знакомого Ри вес /-го знакомого Z, оба числа
не превышают 10 000.
Выход: слово YES (если подтверждается) или NO (если опро-
вергается). ПОДСКАЗКА»>
ЗАДАЧА:
тимуровцы
Тимуровцы — это как волонтёры, толь-
ко жили в прошлом веке и деятельность
свою, чтобы интересней было, окружали
всяческими тайнами1.
У тимуровцев есть самодельный план
деревни, на который нанесены N домов нуждающихся в помощи
бабушек. Сегодня в полночь тимуровцы встретятся у одного из
домов и тихо-тихо сделают несколько добрых дел. Утром бабушка
проснётся — а у неё забор починен, грядки прополоты, коза по-
мыта и причёсана...
Чтобы было интереснее, мальчикам сообщили только коорди-
нату X выбранного дома, а девочкам — только координату К Из-
вестно, что и те, и другие смогут точно определить нужный дом по
имеющимся данным.
А компания хулиганов во главе с Мишкой Квакиным X и Y
не знает, но копия плана у них есть. Хулиганы решили выслать до-
зорных ко всем домам, которые могут быть местом акции тимуров-
цев, и из вредности помешать ей. Сколько дозорных потребуется?
Вход: в первой строке натуральное число N, 1 < Л/ < 1000, далее
N строк, в каждой пара разделённых пробелом целых чисел, не
превышающих 1000 — координаты домов бабушек.
Выход: единственное число — количество домов, у которых
может состояться акция тимуровцев. ПОДСКАЗКА»>
ЗАДАЧА:
контрастный душ
Правильный контрастный душ (закаля-
емся!) принимают так. Начинают с какой-то
начальной температуры, а потом каждые
10 секунд температуру меняют: сначала
1 Читайте Гайдара — «Тимур и его команда».
делают на X градусов холоднее, затем на 2-Х теплее той, что течёт
из душа, на 3-Х холоднее текущей, на 4-Х теплее и т. д., пока есть
техническая возможность получать воду нужной температуры. Из-
вестны Н — температура холодной воды, поступающей в кварти-
ру, и G — температура горячей.
Разработайте программу, которая по значениям X, Н и G опре-
деляет максимальное возможное время приёма душа в секундах.
Входные данные. Натуральные числа X, Н, G, 0 < Н < G < 100,
каждое значение в отдельной строке.
Выходные данные. Натуральное число, максимальное возмож-
ное время приёма контрастного душа в секундах. ПОДСКАЗКА»>
— Проект? Вернувшись с экскурсии на олимпиад-
ный портал, вы всё равно хотите ещё и проект?
Вот Чайник уже на трёх порталах спортивного про-
граммирования учётки создал, пыхтит, читает умные книжки по
алгоритмизации и Питону... Наиграется — вернётся, но уже бы-
стрым и опытным, с засевшим в пальцах синтаксисом, с умением
видеть за словами структуры описывающих их данных. И вот тут-то
его потянет на те проекты, что в Приложении 1.
Во второй части Приложения 1 — несколько пока не реали-
зованных идей. Это проекты «на вырост»: вам придётся самостоя-
тельно искать недостающие знания на интернет-ресурсах по Пито-
ну, много думать и много кодить.
Приятного Вам программирования!
Искренне ваш,
Кофейник
ПРИЛОЖЕНИЕ 1
20+ идей проектов, которые
вы можете реализовать
iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiHiiiiiiiiiiiiiiiiiiiiiiiiiiHiiiiiiiiiiiiiiiiiiiiiii
Проекты К ГЛАВАМ КНИГИ
Вырасти своего Питона!
Проект доступен после изучения главы 1,
Вот. Это — питон. Не похож? «Глист недо-
кормленный»? Сами вы... Своего сначала вы-
растите, а потом чужих критикуйте!
ЗАДАНИЕ. Разработайте программу, кото-
рая выводит на экран портрет Питона, Вашего
собственного. Обязательно в рамочке. Какого
размера будет изображение, из чего построить
рамочку, решаете вы. Для написания про-
граммы достаточно уметь пользоваться опе-
ратором print. Можно (но не обязательно)
сохранить некоторые строки изображения в
переменных.
####
####*##
>-####
####
###
###
##
# ##
# ##
####
+==========+
IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII1IIIIIIIIIIIIIIIIIIIIIIIIIHIIIIIIIIIII1IIIIIIIII
Время: от и до
Проект доступен после изучения главы 2.
Наверняка вам доводилось бывать в ситуации, когда нужно
определить разницу между двумя моментами времени (сколько за-
нял путь от станции до дачи друга, сколько времени у бабушки сво-
бодно между двумя сериалами по телевизору...). Иногда это просто,
иногда не очень.
ЗАДАНИЕ. Разработайте программу, которая получает от пользо-
вателя начало интервала времени (часы и минуты) и конец интерва-
ла времени (часы и минуты). А потом программа выводит продолжи-
тельность этого интервала в часах и минутах. Это может выглядеть
примерно так:
==== Время: ОТ и ДО ====
НАЧАЛО
Часы: 13
Минуты: 2 7
КОНЕЦ
Часы: 15
Минуты: 4 4
Длительность интервала времени 2 час. 17 мин.
Подсказка: сохраняйте все данные — и входные, и промежу-
точные, и выходные — в отдельных переменных. Например, очень
пригодятся время начала и время конца интервала, пересчитанные
в минуты от начала суток, и длительность интервала времени в ми-
нутах. Переводить из часов с минутами в минуты помогут операции
умножения на 60 и сложения, а из минут в часы с минутами — цело-
численное деление на 60 и остаток от деления на 60.
Illllllllllllllllilllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll
Бот-психотерапевт
Проект доступен после изучения глав 1-3, может быть усовер-
шенствован после освоения главы 4, затем ещё раз после того, как
пройдены главы 9-11,
Бот — программа, разговаривающая с человеком. Боты бывают
разные, но праздных болтунов среди них немного. Они работают:
отвечают на вопросы клиентов, помогают принять решение, стано-
вятся партнёрами в компьютерных играх.
Вам предлагается создать бота-психотерапевта. Психотерапевт —
это врач, который умеет устранять проблемы с настроением, рабо-
тоспособностью, общительностью, не являющиеся болезнями. Пси-
хотерапевт не назначает лекарств, он просто разговаривает, задаёт
вопросы, получает ответы. А потом использует эти ответы в своих
рекомендациях.
Для начала можно написать самого простого бота — для этого
хватит input () и print () и сложения строк. Такой бот не анали-
зирует ответы собеседника, но использует некоторые из них, сочетая
с собственным текстом.
ЗАДАНИЕ. Разработайте программу, которая ведёт диалоге поль-
зователем, демонстрирует доброжелательное к нему отношение1 и
внимание к его ответам, пытается поднять ему настроение и помочь
решить проблемы. Вот пример работы простенького бота.
Здравствуйте! Я бот - программа, которая любит поговорить.
Меня зовут Боря. А вас?
Митрофан
Митрофан, что вам нравится из еды?
борщ
Здорово, борщ - и моё любимое блюдо. И ещё перловка.
К делу. Когда у вас чаще бывает плохое настроение - утром
или вечером?
днём в школе
Тогда всё просто, Митрофан’
Лучшее средство от хандры днём в школе - борщ.
Удачи, Митрофан!
К сожалению, придётся прервать беседу - пора обновлять
версию...
До свидания, забегайте поболтать!
IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIHIIIIIIIIIIIIIIIII
Бот-жулик
Проект доступен после изучения глав 1-4. Он очень простой и
вряд ли пригодится больше одного раза (разве что вы будете демон-
стрировать программу разным людям). Но после изучения главы 11
вы сможете сделать и вполне честный вариант.
Знаете игру «Камен ь-ножн и цы-бума га»? Нет? Ну да, откуда вам
это знать... вы ж на уроках под партой на смартфоне играете, а не в
реальные интеллектуальные игры с соседом по парте...
В некомпьютерном варианте игры по команде «РАЗ-ДВА-ТРИ!»
двое одновременно выкидывают на руке один из трёх знаков: КАМЕНЬ
1 Те, кому надоели «хорошие» боты, может, так и быть, написать «плохого» —
бота-тролля, например.
(кулак), НОЖНИЦЫ (делаются из двух пальцев), БУМАГА (прямая ла-
донь). По правилам камень побеждает ножницы, ножницы — бумагу,
бумага — камень. Если двое выкинули одинаковые знаки — ничья.
ЗАДАНИЕ. Разработайте программу, которая играет с пользова-
телем одну партию в «Камень-ножницы-бумага» и при этом всегда
в неё выигрывает ;). Интерфейс программы должен быть примерно
таким:
Сыграем в КАМЕНЬ-НОЖНИЦЫ-БУМАГА?
По команде РАЗ-ДВА-ТРИ ты должен ввести одно из слов:
КАМЕНЬ
НОЖНИЦЫ
БУМАГА
Если готов - нажми Enter.
РАЗ! ДВА! ТРИ’: НОЖНИЦЫ
У меня КАМЕНЬ
Я победил! :)))))
Если пользователь ввёл что-то не то, реакция компьютера может
быть, например, такая:
РАЗ’ ДВА’ ТРИ’: rfvtym
У меня ощущение, что ты что-то не понял
Я победил’ :)))))
Совет: вы сэкономите массу тыков в клавиши, если в начале программы
напишете вот это:
к = "КАМЕНЬ"
п = "НОЖНИЦЫ"
Ь = "БУМАГА"
III НИ III IIIIIIIII III ИIIII ПИ IIIIII LI II till IIIII Illi IUIIIIIIHIH НИ НИ II [III HI III III IIIHIIIII III
Бот-руководитель
Проект доступен после изучения глав 1-5. Программирование
тут несложное, зато масса возможных сюжетных поворотов.
Руководитель — тот, кто даёт указания, что кому делать. Если он
даёт указания тем, кого хорошо знает, всё просто: к примеру, когда
учитель физкультуры Николай Николаевич выводит десятиклассни-
ков на уборку школьной территории, он заранее знает, что двухме-
тровый Иванов будет снимать с деревьев оставшийся от Нового года
серпантин, упитанный, но прыгучий Петров будет трамбовать мусор
в контейнерах, а криворукая Сидорова, которой нельзя доверить та-
кие тонкие инструменты, как метла или грабли, будет фотографиро-
вать ударный труд одноклассников.
А как поручить работу тому, кого не знаешь? Предположим, нуж-
но распределить на позиции незнакомых волонтёров. Оценить их на
глаз удаётся не всегда, так что придётся задавать вопросы, и в зави-
симости от ответов давать дело каждому.
ЗАДАНИЕ. Разработайте программу, которая определяет, какую
работу поручить волонтёру-пользователю, задавая ему несколько
вопросов и анализируя ответы. Ситуацию придумаете сами. Связь
между данными о пользователе и назначаемой ему работой может
быть логичной (так правильнее) или наоборот (так забавнее). Чем
больше будет разных вариантов выдаваемых ботом поручений и чем
они неожиданней, тем интереснее. Вот пример работы бота, распре-
деляющего волонтёров на лыжном марафоне:
Ты мальчик или девочка? Под пуховиком не видно. (М/Д): Д
Сколько будет 7 * 11 * 13?: Чё?
Снегоход водить умеешь? (ДА/НЕТ): ДА
А бананы любишь? (ДА/НЕТ) : ДА
Красава! Будешь вдоль трассы ездить и орать что-нибудь
позитивное*
Только к пункту питания не подъезжай.
Тут, как видите, всё логично: обеспечена и профессиональная
пригодность, и сохранность бананов.
nilllllllllllllllllllllllllllllllHIlilllllllllllllllinillilllllllliniiniiniinillllllllllllllllllll
Генератор фенечек
Проект доступен после изучения глав 1-7. Помимо повторений
потребуется терпение — придумать удачные элементы и их после-
довательность. А после изучения глав 10-11 вы сможете предложить
пользователю полноценный конструктор-генератор символьных
узоров.
Фенечки — плетёные браслеты из толстых цветных ниток. Их ин-
тересно плести, а то, что получилось, можно подарить другу.
Плести фенечки компьютер не может (слабак!), а вот вывести схе-
му узора ему по силам. Предположим, мы умеем выплетать несколько
видов цветных рядов. При этом каждый ряд может либо повторяться,
либо после него должен идти ряд следующего вида. А фенечка состоит
из многократных повторений узора, собранного из этих рядов.
ЗАДАНИЕ. Разработайте программу, которая, запросив у поль-
зователя параметры узора, этот узор выводит. Количество видов
элементов, сами элементы — на ваше усмотрение. Вот пример. Если
бы сделать число повторов
больше, вышло бы красивее.
Но тогда фенечка не влезла
бы на страницу:(.
Подсказка: в вашей
программе будут вложен-
ные повторения (записыва-
ются по тем же принципам,
что вложенные условия):
внутри for, управляющего
повторением узора, будет
несколько последователь-
ных маленьких fornnKOB,
организующих повторения
Количество рядов ##.##: 2
Количество рядов +#.#+: 1
Количество рядов .+#+.: 2
Количество рядов в узоре = 5
Сколько раз повторить узор?: 2
##.##
##.##
+#.#+
.+#+.
.+#+.
##.##
##.##
+#.#+
-+#+.
.+#+.
рядов каждого вида.
nilllllllllllllllllllllllllllllllHIIllllIllllllllllllllllllllllllHlllllltlllllllllllllllllllllllllilll
Делители числа
Проект доступен после изучения глав 1-8. Работаем с повторе-
ниями, используя классические алгоритмы, экспериментируем со вло-
женными циклами.
В школе вам уже наверняка приходилось искать делители чис-
ла — числа, на которые заданное число делится нацело. В старших
классах таких ситуаций станет ещё больше, причём иногда будет
нужно найти в заданном интервале числа с определённым количе-
ством делителей, с наибольшим количеством делителей. Вот этим мы
и займёмся.
ЗАДАНИЕ. Разработайте программу, которая выводит все дели-
тели заданного числа и их количество.
В чём тут можно проявить креатив, что придумать самому? Услож-
нить программу, приспособив её для решения более широкого клас-
са задач (это называется «сделать программу более универсальной»).
Можно, например, анализировать делители не одного числа, а всех
чисел из интервала, нижнюю и верхнюю границы которого вводит
пользователь. А можно написать программу, которая выведет все
числа интервала с заданным количеством делителей — вот такую:
Введите начало интервала: 20
Введите конец интервала: 39
Введите требуемое количество делителей: 2
Выводить делители? (ДА/НЕТ): НЕТ
23
29
31
37
Чисел с числом делителей 2 : 4
Наибольшее количество делителей у числа из диапазона: 9
Вот так мы с помощью нашей программы получили список про-
стых чисел из интервала от 20 до 30 (простые — это которые делятся
только на себя и на 1). А вот что это, интересно, за число с 9 делите-
лями? Запустим-ка программу ещё раз, изменив параметры:
Введите начало интервала: 20
Введите конец интервала: 39
Введите требуемое количество делителей: 9
Выводить делители? (ДА/НЕТ): ДА
36
Делители: 1 2 3 4 6 9 12 18 36
Чисел с числом делителей 9 : 1
Наибольшее количество делителей у числа из диапазона: 9
Подсказка: вам потребуются вложенные циклы. В наружном for
перебираются числа из заданного интервала, а во внутреннем про-
веряются возможные делители каждого числа — числа от 1 до теку-
щего значения переменной наружного цикла.
iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiuiiiiiiiiiimiiiiiiiiHiiiiiniiniiiriiiiiiiiiiiiiiiniiiii
Решатель кубических уравнений
Проект доступен после изучения глав 1-9, Осваиваем решение
подбором.
ЗАДАНИЕ. Разработайте программу, которая решает подбором
кубическое уравнение с целочисленными корнями. Как это должно
выглядеть, ясно из примера.
ххххххххххххххххххххххххххххххххххххххххххххх
Решаем уравнения с целыми корнями
вида A*X**3+B*X**2+C*X+D=0
ххххххххххххххххххххххххххххххххххххххххххххх
А = 3
В = -7
С = -37
D = -4927
В каком интервале ищем X?
Начало: О
Конец: 100
X = 13
Подсказка: самый удобный путь — for + break.
IIIIIIIIIIIIIIIIIIDIIIIIIIIIIIIIIllllllllllllllllinilHIIIIIIIIIIIIIIilllillllllllllllllllllHIIIIHIII
У-тестер
Проект доступен после изучения глав 1-10. Списки открывают
массу интересных возможностей. А после следующей главы можно
будет ещё и выбирать из них случайные элементы...
Программа, которая задаёт вопросы, получает ответы и оценива-
ет их правильность — штука универсальная (отсюда и буква «У»): из
неё можно сделать и шуточную викторину, и тест, скажем, по истории
на знание дат. Причём если сделать программу правильно (хранить
вопросы и ответы в списках), можно будет превращать одно в другое
несколькими <Ctrl>+<C> — <Ctrl>+<V>.
ЗАДАНИЕ. Разработайте программу, которая задаёт пользова-
телю вопросы из списка (можно предусмотреть и выбор темы поль-
зователем и, соответственно, выбор списка), получая ответы. Мож-
но оценивать правильность по ходу ввода (и даже не переходить
к следующему вопросу, пока пользователь не даст верный ответ),
можно подводить итоги в конце и комментировать их.
Самое простое — сделать тест, где пользователь вводит ответ.
Вот такой, например, как «Шарады».
ШДРДДЫ ★ **★★*****★**★**★★*★*★★
Ответы на шарады вводите с прописной буквы. И без ошибок!
Чтобы начать, нажмите Enter.
1
Единица измерения массы между предлогом и союзом =
= Алгоритм, описанный на языке компьютера
Ответ: Протрамма
Верно.
2
Предлог + то, что в книге бывает "преди", а бывает "после’1 =
— ромб в блок-схеме
Ответ: Условие
Верно.
3
Пауза между уроками с удвоенной Н 4- личное местоимение =
= t в операторе t=int(input())
Ответ: Перименная
Нет. Верный ответ Переменная
Процент верных ответов: 67
А можно сделать столь любимый лентяями тест с выбором вари-
анта ответа, как, например, «Ерундопель» (на листинге только начало,
там ещё много всего интересного). * 1 2 3 4
================ ЕРУНДОПЕЛЬ ==================
В каждом вопросе нужно ввести
номер верного значения слова.
Чтобы начать, нажмите Enter.
1
Тетрада - это...
1: самка тетраэдра
2: четвёрка цифр
3: тетрадь по-кавказски
4: фамилия испанского инквизитора
Ответ: 2
Подсказка: используйте для вопросов с вариантами ответов вло-
женные списки: каждый вопрос — список из текста вопроса, списка
варианта ответов и номера правильного варианта. К примеру, нача-
ло списка вопросов «Ерундопеля» выглядит так:
v = [ [’’Тетрада - это . . . ” ,
[”самка тетраэдра”,
”четвёрка цифр”,
’’тетрадь по-кавказски”,
’’фамилия испанского инквизитора”] ,
1] ,
[ ’’Манишка - это . . . ” ,
HI I HI III IIIIIIIIIIИ ИIIIIIIIIIIIIIIГ1IIНПIIII III II li II I! IIIIIIИIIHIHIII ЕН Ш1IIII HI I НН IIIHII
Гадалка
Проект доступен после изучения глав 1-11. Списки + случайные
числа = масса возможностей для творчества и приколов.
О том, какие способы для гадания придумало человечество, мож-
но погуглить. А можно сразу придумать что-то своё.
ЗАДАНИЕ. Разработайте программу для гадания. Это может быть
что угодно: сюжет, интерфейс, списки для случайного выбора — на
ваше усмотрение. Сделайте так, чтобы Люба Питонка сказала «Ёшки-
матрёшки! Круто!» и попросила скинуть код. Примеров здесь не будет.
Подсказка: если совсем-совсем нет идей, а. сделать что-то этакое
хочется — загляните в электронный архив. Там есть «Гадание на хо-
мячке» и «Гадание на чайной заварке».
lllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll
Игра «Виселица»
Проект доступен после изучения глав 1-12. Списки + случайные
числа + срезы строк.
Нет-нет, ничего жестокого, никаких «18+». Просто очередная игра
наших бабушек и дедушек.
Играли в «виселицу» на бумажке. Один задумывал слово и изо-
бражал его в виде пустых мест для вписывания букв, например,
_________. Второй называл буквы. Если буква присутствует в слове —
она вписывалась (если таких букв несколько, то вписывались сразу
все1). А вот если буквы не было, то рисовался элемент картинки —
виселицы с подвешенным стилизованным человечком. Или ты успе-
вал отгадать — или не успевал.
ЗАДАНИЕ. Предлагается такой вариант игры (название для
неё можете придумать сами). Компьютер предлагает пользователю
слово-загадку и слово-обзывалку (и то и другое, естественно, выби-
раются случайным образом из списков и изображаются цепочками
подчёркиваний). Пользователь вводит букву. Если она есть в слове-
загадке — она появляется в положенном месте. Если нет — откры-
вается очередная буква слова-обзывалки. Вот как может выглядеть
очередной ход:
=== Ход 5 ===
Слово-загадка: _ И Л _ Л
Слово-обзывалка: Л О
Буква? У
IIIIIII III IIIIIIII11II11II11IIIIIIIIIIIIII [I II11111IIIIIIIIIIII I! IIНIIIIII [I IIIIII [I IIII111IIIIIIIIIIIII
...И несколько полезных проектов
Универсальный решатель уравнений
Начнём сразу со впечатляющего листинга.
хххххххххххххххххххххххххххххххххххххххх
Решаем уравнения с натуральными корнями,
с операциями, как в Python
хххххххххххххххххххххххххххххххххххххххх
Пример: X ** 2 + 2 ** X = 177
хххххххххххххххххххххххххххххххххххххххх
Введите уравнение с X и с одним =:
Х**3-7=Х* 100 - 295
В каком интервале ищем X?
Начало: 1
Конец: 2 0
X = 8
1 Да-да, «Поле чудес» — просто ремейк «Виселицы».
Как это сделать? Разбор арифметических выражений, опреде-
ление порядка операций — мозгоёмкая задача для студентов-
1Тшников...
А не надо никаких мозгоёмких разборов! Питон сам всё умеет.
Посмотрите:
»> eval('7*7-6**2")
13
Да, eval () вычисляет значение выражения, описанного в виде
строки. Внутри скобок может быть и переменная со строковым зна-
чением.
У вас в вычисляемом выражении переменная? А кто мешает её
заменить на проверяемое при подборе значение, преобразованное
в строку? Есть replace ()...
IIIIIIIIIIII III! IIIIIIIIIIIIIIIIIIII НИН IIIIIIIIIIIII Illi IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII Illi IHIIII
Тестер с чтением из файла
Тестеры мы уже делали, разные. Но вот представьте: подарили вы
свою тестирующую программу, предположим, «русичке». В програм-
ме — списки с вопросами по безударным гласным. Получили заслу-
женные 3 пятёрки... и 10 листов рукописного текста с содержимым
ещё нескольких тестов по русскому. Предложение самой изменить
программу, внеся туда нужные значения, учительница с негодовани-
ем отвергла. Отказывать учителям опасно. Делать самому — сожрёт
уйму времени. И, главное, нет гарантии, что завтра перед вами не
появится ещё страниц 50 от других учителей-
Но выход есть! Блокнотом владеет даже старенькая «химичка»,
которая, судя по её воспоминаниям, в юности химичила вместе с
Менделеевым.
Итак, файл с вопросами готовится в Блокноте в заданном форма-
те. Один вопрос — одна строка. Между вопросом и правильным отве-
том — какой-то достаточно экзотический (не встречающийся в вопро-
сах) символ, например, Остаётся научиться работать с файлами.
Вот файл с вопросами (для примера хватит трёх):
Как в химии обозначается цинк?#2п
Год первого полёта человека в космос:#1961
Фамилия автора стихотворения про брошенного зайку:#Барто
Вот текст программы:
import codecs # так надо!
filename = input("Введите имя файла: ")
f = codecs.open (filename, ”r”, ”utf_8 sig”)
test = [] # список вопросов пока пуст
n = 0 # количество прочитанных вопросов
for line in f: # для всех строк файла
test.append((line.rstrip()).split("#"))
n += 1
f. close ()
print("Прочитано вопросов:", n)
print(test)
Вот результат её работы с нашим файлом:
Введите имя файла: assorti.txt
Прочитано вопросов: 3
[['Как в химии обозначается цинк?1, ’Zn1],
['Год первого полёта человека в космос: 1 f т 196111 ] f
[1 Фамилия автора стихотворения про брошенного зайку:1f
1 Барто’]]
»>
ЗАДАНИЕ. Сделать универсальную программу для любого тести-
рования: все данные — в текстовых файлах, которые готовят авторы
тестов.
Можно увеличить интеллектуальность программы, придумав дру-
гие форматы вопросов (например, с вариантами ответов и номером
верного), предусмотрев какие-то настройки теста в начале файла,
iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiHiiHiiiiiiiiiiiiiiiiiiiiiiiiniiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiigiiiii
Шифровальная машина
Уязвимость нашего тестера — в доступности файлов с вопроса-
ми и ответами, тест легко «хакнуть». Но что нам мешает наши файлы
слегка зашифровать?
Способов сделать это много. Самый примитивный — с помощью
шифра простой замены: ищем букву в одном списке, заменяем бук-
вой с тем же номером из другого списка.
А можно чуть красивее. Вот код, который, возможно, наведёт вас
на идею. Про ord() и chr() найдите информацию сами — не ма-
ленькие!
s = input("Введите строку для зашифровки: ")
w = ""
for Ь in s:
w += chr(ord(b) + 1)
print("Зашифровали:", w)
t = ""
for b in w:
t += chr(ord(b) - 1)
print(”Расшифровали:", t)
А вот результат её работы:
Введите строку для зашифровки:
123qweQWEa6B3ioHAEB3KlH! "№; %-проба пера:)
Зашифровали: 234rxf ИХЕбвгюяёБВГЮЯа" #©<&• рспвб ! ржсб; *
Расшифровали: 12ЗдиеОИЕабвэюяАБВЭЮЯ!"№;%-проба пера:)
»>
ЗАДАНИЕ. Разработайте программу, которая зашифровывает/
расшифровывает (по выбору пользователя) текстовый файл. Потом
можете встроить расшифровку в свой Тестер.
llllllllllllllllllllllllllllllllllElinilllllllllllllllllllllllllllillllllltlllllllllllllllllllllllllllll
...И ещё несколько проектов
бесполезных, но забавных
Игра в даты
В даты можно играть на бумажке. Выбирается какая-то дата теку-
щего года (номер дня и номер месяца). Далее игроки по очереди её
изменяют, увеличивая либо номер дня, либо номер месяца на любое
число, но так, чтобы дата оставалась в пределах календаря. Победит
тот, кто достигнет 31.12.
Вот пример партии между автором (А) и котом Беней (Б), сыгран-
ной 13 июня. Именно с этой даты начали игру. Беня, как гость, ходил
первым. 13.06. - Б: 25.06 - А: 28.06 - Б: 28.09 - А: 28.11 - Б: 30.11... и тут
автору пришлось сдаться, так как Беня побеждал следующим ходом.
ЗАДАНИЕ. Разработайте программу, реализующую игру в даты
между пользователем и компьютером. Пользователь вводит на чаль-
ную дату. Компьютер... нет, не ходит первым, а выбирает, кому хо-
дить первым. А далее игра идёт по описанным выше правилам. И
компьютер всегда выигрывает. Магия? Нет, стратегия.
Тараканьи бега
Азартные игры — это ужасно. Но программировать их ужасно ин-
тересно. Заставить тараканов бегать по экрану вам пока не удастся.
А вот сделать посекундную развёртку вполне по силам, если помните,
как генерировать случайные числа и паузу. Задания не будет — будет
листинг начала забега...
Вас приветствует программа ’’Тараканьи бега”
На старт...
..,Внимание,..
. . .Марш!
Секунда О
А
В
С
Секунда 1
А
В
С
... и его конца.
Секунда 54
А
В
С
Финишировал В
Время победителя 55 сек
Разборчивая невеста
Эта игра — иллюстрация одной классической задачи теории игр (про
неё можно почитать в Википедии). Сюжет ясен из вот этого листинга:
############################################
РАЗБОРЧИВАЯ НЕВЕСТА
шшшшшшшшшттшшшш
Итак, вы - невеста (почему бы и нет?)
Сидите вы у окошка.
А мимо окошка проходят женихи - 18 шт.
Про каждого известно имя и показатель качества - число.
Вы должны выбрать самого качественного.
Enter - пропустить, любое слово - выбрать.
Если готовы - нажмите Enter.
Жених № 1: ИНЫФХЕ - 693
Жених № 2: ЮЛКОПТЕЗ - 661
Жених № 3: ПЦИЯЗ - 548
Это, как вы понимаете, только начало (там ещё 15 женихов в кусте
сирени в очереди стоят). А могло бы быть 3 или 47 — число женихов
случайно. И диапазон, из которого берутся значения «качества» же-
нихов, тоже. Да еще и имена их генерируются (если сложно, можно
обойтись номерами). И главная «фишка»: выбрать можно только один
раз, дальше придётся смотреть на проходящих женихов и причитать
внутренним голосом: «Дура я торопливая, что ж я такого крокодила-
то выбрала...». А конец вот:
Ваш жених: ЯЩЦЮЛ
Его качество: 710
Наибольшее качество в этой когорте женихов: 710
Повторить ? Y/N:
Такой вот happy end приключился1. Пишите программу и играйте.
А ещё можете реализовать режим, когда можно выбрать одного
(как бы посадить на завалинку под окном), но если подойдёт более
качественный — того погнать, этого посадить. Но это уже не теория
игр, а один классический алгоритм.
lllllllllllllllllllinillllllllllltlinillllllllllllllllllllllinillllllHIUllIIIIIIIIIIIIIIIIIIIIIIIIII
1 У автора этот самый happy end приключился только с 23-й попытки.
Архипелаг
Тут будет только идея игры — без листингов.
Имеется карта — прямоугольник из символов: море, к приме-
ру, пробел, суша — #, текущее положение корабля — %, конечная
цель — ’, можно ещё бонусные плюсики накидать, дающие допол-
нительные ходы.
Цель пользователя — привести свой корабль в целевую точку,
уложившись в лимит ходов. Но он не видит карту целиком — только
9 клеток с корабликом посередине. Возможно, в поле зрения попа-
дают части островов или берега, а может быть, кораблик в откры-
том море... Можно плыть наугад, можно по ходу плавания составлять
свою карту.
Посмотрев на очередной кусочек карты, пользователь подаёт
команду — к примеру, U, D, L, R — для смещения кораблика на
одну позицию вверх, вниз, влево, вправо. И видит очередной кусок
карты: кораблик по-прежнему в центре, но пейзаж вокруг, возможно,
изменился.
Про карту известен её размер, гарантируется, что она обрамлена
сушей, за карту не уплыть, и что любая точка моря достижима из
любой другой точки за заданное число ходов.
Сгенерировать такую карту — очень сложная задача. Можете,
конечно, попробовать... безумству храбрых поём мы песню! Но можно
сделать море и острова постоянными, а кораблик, цель и бонусы
размещать случайно. При достаточно обширной карте1 с большим
количеством островов и проливов хитрой формы запомнить её
и узнавать «знакомые места» вам удастся не скоро.
Если ваш кораблик уже уверенно плавает по карте, слушаясь
клавиш или команд, можно развивать и усложнять игру: вводить
новые типы символов-объектов (некоторые из них могут случайным
образом перемещаться), делать различные уровни с разными картами,
разным размером видимого фрагмента и разным составом объектов.
При этом желательно, чтобы за все уровни отвечал бы один кусок
кода, а все различия между ними (карта, список символов-объектов)
были бы упрятаны в данные. Тогда программа будет компактной
и гибкой.
1 Автор вот до сих пор увлечённо играет на карте 27 на 27... ну совершенно не-
когда книжку писать!
Генератор имён персонажей
Вы пишете фэнтези. У вас куча второстепенных персонажей, для
которых нужны имена, причём соответствующие типу персонажа:
например, если в книге появляются Шрумбр и Оэлеа, мы сразу
понимаем, кто из них орк, а кто эльф.
ЗАДАНИЕ. Разработайте программу для генерации имён с
заданными требованиями. Какие требования — ясно из примеров
выполнения программы. Вот имена для троллей:
Минимальная длина имени: 4
Максимальная длина имени: 8
Допустимые согласные: РРРШШХХПЦЦБДРМНК
Допустимые гласные: АОУЫЫЫ
Максимальное число согласных подряд: 3
Максимальное число гласных подряд: 1
Количество имён: 5
Имя 1: ЕЫРОДЩШ,
Имя 2: РММУ
Имя 3: РНЫМШАХ
Имя 4: ЩДХУ
Имя 5: РРШОР
А вот имена представителей изысканной, но угасающей инопла-
нетной цивилизации:
Минимальная длина имени: 6
Максимальная длина имени: 12
Допустимые согласные: ЛЛММННВТС
Допустимые гласные: АОУЕИИЭЭЮЯ
Максимальное число согласных подряд: 1
Максимальное число гласных подряд: 2
Количество имён: 5
Имя 1 ВОЭТИНУЭЛЭ
Имя 2 ЛЮМОМЮНУИ
Имя 3 ЯТАЕВАО
Имя 4 ИЛЮИЛУ
Имя 5 ЯЕЛЭМЕНЕВИМЭ
Кассир
Вы — кассир. У вас в кассовом ящике аккуратно разложены по
отделениям купюры разных достоинств. Пользователь вводит сумму,
которую вы должны ему выдать, программа выводит выдаваемые ку-
пюры или сообщение о том, что сумму выдать невозможно.
ЗАДАНИЕ. Разработайте программу, моделирующую выдачу де-
нег кассиром. Это — общая постановка задачи. Но есть несколько
уровней.
Уровень 1. Номиналы купюр заданы (5000, 2000, 1000, 500, 200,
100, 50), их количество в кассовом ящике бесконечно.
Уровень 2. Номиналы те же, но количество имеющихся купюр
вводится в начале программы.
Уровень 3. С купюрами всё как в уровне 2, а вот клиентов много,
работа программы завершается после того, как клиент введёт 0.
Уровень 4. Всё как в уровне 3, но номиналы купюр, как и количе-
ства, вводятся в начале программы.
Возможны и различные комбинации
уровней. А ещё может быть 2 типа вы-
вода выдаваемых купюр. Тот, что слева,
назовём А, справа — В.
Практическая ценность проекта невелика, но в ходе
его реализации вы повторите и арифметику, и ветвления,
и циклы всех типов, и списки, подумаете и об эффектив-
ном алгоритме, и об удобном интерфейсе. Ват, кстати,
пример интерфейса для уровня 4А.
2 по 2000
1 по 500
4 по 100
2000
2000
500
100
100
100
100
11]|1Е1111111]|111111111.11111111111111111111111111111111111111111111111[|]|1111111Е1]|1111111Л1111111111111111111111]|1Г11111[|111111111Е1111Г1111111]|111111111111111111111111Г11111[|]|1111111Ш1111]|1111]|111111111Л1111111Ш11ГН
===== ЗАПРАВКА КАССОВОГО ЯЩИКА =====
Номинал (0 для завершения ввода): 100
Количество купюр номиналом 100: 10
Номинал (0 для завершения ввода): 10
Количество купюр номиналом 10: 50
Номинал (0 для завершения ввода): 0
...........................................................
===== ОБСЛУЖИВАНИЕ КЛИЕНТОВ =====
lli IILIIIIIIIJIII III II11ПIIГ11II lllll IIIIIIIIIJIIIIIIIlllllI Illi II III II III II III IIlllllIIII]II III II III IIlllllIIIIIII[IIII III IIlilllIIIIIII III IIIIIIIlllllII III II III II III IIIGIIIIIIIIII El]IIIIIII lllil IIIIIIIИПIIIIIII Hill IIIIIII III IIIII
В кассе: 1500
Сумма к выдаче: 470
4 по 100
7 по 10
В кассе: 1030
Сумма к выдаче: 55
Выдача суммы невозможна
В кассе: 1030
Сумма к выдаче: 1200
Выдача суммы невозможна
В кассе: 1030
Сумма к выдаче: 800
6 по 100
2 0 по 10
В кассе: 230
Сумма к выдаче: 230
0 по 100
23 по 10
В кассе: 0
ОБСЛУЖИВАНИЕ КЛИЕНТОВ ЗАВЕРШЕНО
Калейдоскоп
Дети, растущие в киберпространстве, ничему не удивляются.
Крутые спецэффекты воспринимаются ими как должное. Роскошная
компьютерная графика их не впечатляет, краски реальных рассветов,
туманов и теней — тем более...
А вот у счастливых детей не компьютерной эпохи была прос-
тенькая игрушка — калейдоскоп. Картонная трубочка, внутри — си-
стема зеркал и цветные стёклышки, с одного конца матовое стекло,
с другого — пластмассовая крышечка с окуляром. В окуляр виден
разноцветный узор. Чуть встряхнёшь калейдоскоп — цветные стёк-
лышки переместятся, узор изменится.
ЗАДАНИЕ. Разработайте программу, генерирующую симметрич-
ные узоры из символов. Желательно с настраиваемыми параметрами
(размер узора, символы). Пример выполнения вот:
Размер узора (2-10): 5
Строка символов для построения узора: #$%+-
%%+%%%%+%%
%+—##—+%
+-$%##%$-+
%-%#$$#%-%
%##$$$$##%
%##$$$$##%
%-%#$$#%-%
+-$%##%$-+
%+—##—+%
%%+%%%%+%%
ПОДСКАЗКА. Сначала создайте список списков, длина и ширина
которого вдвое больше заданного размера. Пусть сначала он будет
заполнен пробелами. Тут мы будем строить узор.
Затем будем случайным образом выбирать символ и записывать
его сразу в 8 позиций: в исходную (в левой верхней четверти под
диагональю) и в 7 её отражений. Непонятно? Посмотрите на раскра-
шенный узор: синим в нём выделена исходная область, коричне-
вым — 7 отражений малинового символа.
%+%%%%+%%
%+—##—+%
+-$%##%$-+
%-%#$$#%-%
%##$$$$##%
%##$$$$##%
%-%#$$#%-%
+-$%##%$-+
%+—##—+%
%%+%%%%+%%
Предположим, отражаемый символ в строке с номером i, его но-
мер в ней j. Как выразить через i, j и размер узора «координаты»
отражений? Ответив на этот вопрос, вы решите задачу.
Оптимизатор заклинаний*
Вы — ученик Хогвартса. На уроке трансфигурации проходят за-
клинания «Дупликато!» (удваивает количество чего-либо) и «Инкре-
менто!» (увеличивает на 1 количество чего-либо). Ваша задача — пре-
вратить А предметов в В предметов, используя как можно меньше
заклинаний.
ЗАДАНИЕ. Разработайте программу, которая предлагает пользо-
вателю превратить одно количество предметов в другое. Пользова-
тель вводит заклинания, они исполняются. Если цель не достигнута
(предметов стало больше, чем нужно) или если для её осуществления
можно обойтись меньшим числом заклинаний, компьютер показывает
оптимальную последовательность заклинаний.
Кстати, игра будет забавнее, если программа будет предлагать для
трансфигурации различные предметы из своей коллекции (то шоко-
ладных лягушек, то крысиные хвосты, то двойки по математике,..).
Вот пример работы программы:
Сегодня мы будем размножать билеты на футбол.
Сейчас их 3, а нужно ровно 52.
Доступны заклинания Дупликато (d) и Инкременто (1).
Начали!
билеты на футбол: 3. Заклинание №1: d
билеты на футбол: 6. Заклинание №2: d
билеты на футбол: 12 . Заклинание №3: d
билеты на футбол: 24 . Заклинание №4: d
билеты на футбол: 48 . Заклинание №5: 1
билеты на футбол: 49 . Заклинание №6: 1
билеты на футбол: 50 . Заклинание №7: 1
билеты на футбол: 51 . Заклинание №8: 1
Вы выполнили задание . Количество заклинаний: 8
Оптимальная последовательность заклинаний:
ddidd
Её длина: 5
ПОДСКАЗКА. Как найти оптимальную цепочку? Это можно сде-
лать, перебирая все возможные по возрастанию их длины. Исполь-
зуем самый универсальный способ: создадим список «кандидатов
в оптимальные цепочки». Будем в нём хранить и цепочки, и значе-
ния, которые получаются после их применения. Например, если на-
чальное количество предметов п, то список мы инициализируем так:
[["d”, п * 2], ["i", n + 1] ]. А затем в цикле будем извле-
кать цепочку из начала списка и пробовать её нарастить каждым из
заклинаний. Если в результате получится число-цель — задача реше-
на, прерываем цикл. Если результат меньше нужного — добавляем
в конец списка изменённую цепочку и её конечное значение, если
больше нужного — забываем про эту цепочку, она не годится.
Тексты программ, реализующих проекты приложения, как
и программ к более-менее интересным заданиям, есть в элект-
ронном архиве.
«И что — можно прямо вот так скачать, открыть, запустить
и радоваться?»
Скачать и запустить можно. А вот радоваться — это вряд ли
получится.
Радость — это когда несколько вечеров маешься над програм-
мой и чувствуешь, что то, что получается, уже похоже на то, что
задумано.
Когда долго-долго ловил ошибку — и отловил-таки, и иско-
ренил.
Когда понял, что для одного куска не хватает идеи — и вот
за ней слазил в архив, а заодно увидел, как два экрана кода пре-
вратить в три строки.
Когда увидел во сне красивый алгоритм, проснулся, записал на
листке идею, а утром долго думал над каракулями, а потом вспом-
нил, сделал, и всё получилось.
Когда программа — своя, родная, выстраданная, — готова.
«Кто молодец? Я молодец!»
Программирование — это радость. А ещё — твор-
чество, азарт и труд. Если вы тоже это почувствовали —
значит, не зря книжку читали.
ПРИЛОЖЕНИЕ 2
Подсказки
IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII1IIIIIIIIIIIIIIIIIIIIIIIIIII
Глава 1
ЭКСПЕРИМЕНТ: приключения трёхзначного числа
Попробуйте перемножить числа 7, 11 и 13.
ПРОЕКТ: псевдографический конструктор
(вопрос для размышления).
Погуглите про двоичную систему счисления и запишите в ней
числа от 0 до 7.
Глава 2
ЗАДАЧИ: повседневная арифметика
Плата за воду. Формула для расчёта такая:
(ПоказанияВТекущемМесяце - ПоказанияВПрошломМесяце) Тариф.
Дурацкая подсказка, это вы и сами знаете? Вот вторая: чтобы ве-
щественные числа выводились не с множеством цифр после точки,
а всего с двумя, результат (переменную plata) можно вывести так:
print (’’Плата за воду, руб.:”, round (plata, 2))
Квасим капусту. Количество любого ингредиента надо умножить
на число, равное 1/10 от желаемого количества литров капусты. Не-
понятно? Проверим на числах: если мы хотим 20 литров, всего при-
дётся брать в 2 раза больше: 20 : 10 = 2. А если хотим всего 2 литра,
всего надо брать в 5 раз меньше, то есть 2:10 = 0.2.
Содержимое копилки. Посчитайте сумму в копейках, а потом с по-
мощью операций //100 и % 100 выделите из неё рубли и копейки.
Глава 4
ЗАДАЧА: программа по блок-схеме
На какую из блок-схем Бени похожа эта? Правильно, но ту, где
elif. Структура программы будет та же, изменятся только условия.
ЗАДАЧА: уравнивание яблок
В программе будут три ветки: яблок поровну, у Анечки больше,
у Боречки больше. А отдать тот, у кого больше, должен половину раз-
ности между количеством своихяблоки количеством яблок другого.
ЗАДАЧА: распознавание объектов
Объекты в условии задачи очень удачно расположены. Первым
if отсечём эдакера с его нечётным количеством виляек. Затем пой-
дут elif, описывающие другие виды, тут лучше прислушаться к сове-
ту Пайтона и использовать двойные неравенства. Ну а нераспознан-
ные существа — это else.
ПРОЕКТ: тестер
Для подсчёта верных ответов в начале программы подготовьте
переменную, присвоив ей значение 0 (например, с = 0). А потом вся-
кий раз, как ответ оказался верным, прибавляйте к ней 1: с = с + 1.
Значение этой переменной в конце программы и будет результа-
том.
Глава 8
ЗАДАЧА: 10 чисел
Вот пример тестовых значений. При вводе чисел 11, 0, -7, -1.13,
4, -7, 8, 1,9 результаты должны быть такие:
1.99. 2.2. 3.24. 4.2. 5.4.
И идеи решения задач.
1. До цикла заводим накопитель суммы квадратов (начальное
значение 0). В цикле после ввода числа проверяем, отрица-
тельное ли оно; если да, прибавляем г накопителю его ква-
драт.
2. Обычный алгоритм подсчёта. Проверяемое условие — число
больше нуля и его остаток от деления на 10 равен 1.
3. Давайте попробуем прямо внутри цикла по-особенному рабо-
тать с первым и вторым числами (для этого придётся прове-
рять значение переменной цикла. Пусть М1 — накопитель для
самого большого числа, М2 — для второго по величине. Пер-
вое число записываем в МТ, Второе записываем в М2, и если
М2 > Ml, поменяем их местами (М1, М2 = М2, Ml). А с осталь-
ными числами так: если введённое число больше М1, запишем
М1 в М2, а на его место новое число. Иначе если новое число
больше М2, пишем его в М2.
4. Будем сохранять в одном накопителе наименьшее число, а во
втором — количество равных ему. Каждый раз, как значение
наименьшего числа будет меняться, количество значений, рав-
ных ему, будет становиться равным 1. Если же введённое чис-
ло равно минимальному, увеличим на 1 второй накопитель.
5. Всё просто: потребуется переменная, в которую мы будем за-
писывать очередное число, прежде чем вводить следующее.
Все числа, начиная со второго, будем сравнивать с предыду-
щим, и если новое больше старого — увеличим счётчик.
Глава 9
ЗАДАЧА: распознавание объектов-2
В программе будет цикл с постусловием — while True. В цикле
мы введём количество хапок, если оно равно нулю — прервём цикл.
А ненулевые значения числа хапок проанализируем в многоветоч-
ном условном операторе.
Помимо распознавания нам придётся вести и подсчёт, точнее, не-
сколько подсчётов. Нам понадобятся счётчики для каждого вида ино-
планетных существ — 4 штуки. В каждой ветке условного оператора
будем выводить название существа и увеличивать на 1 соответствую-
щий счётчик.
ЗАДАЧА: решение подбором и перебором
В задаче потребуется находить первую, вторую и третью цифры
трёхзначного числа. Отделять цифры от числа в цикле (задача 4 из
эксперимента «Что делает программа») не стоит — число небольшое,
каждая цифра вычисляется в 1-2 действия:
zl = п // 100
z2 = (п // 10) % 10
z3 = п % 10
Глава 10
ЭКСПЕРИМЕНТ: странная сортировка
А вы уверены, что элементы в списке в программе Чайника —
это числа? Мало ли, что мы вводили именно цифры... важно, как
вводили.
ЗАДАЧА: сколько дней в месяце
Вам потребуется два списка: в одном названия месяцев (к при-
меру, month), в другом — количества дней в них (days). Вводим на-
звание месяца т, поверяем, есть ли он в списке — if m in month.
Если есть, получаем его номер: i = month. index (m). А дальше
выводим days [i]. Текст программы — в электронном архиве.
ПРОЕКТ: взлом Пентагона
Реплики хакера помещаются в список. Реплики Пентагона можно
сгенерировать, создав переменную р = "АЛА! " и на каждой итера-
ции после её вывода приклеивая к ней «А» слева и «!» справа. Ну а
процент выполнения легко сосчитать на основе переменной цикла:
(k + 1) * 10.
Глава 11
ЗАДАЧА: тест на устный счёт
Уровень 2. Убрали то, что сделали для уровня 1, в цикл
for k in range (10), до цикла подготовили счётчик верных отве-
тов verno = 0, внутри цикла в ветке условного оператора, соответ-
ствующей верному решению, сделали verno += 1. А после заверше-
ния цикла выводите значение списка оценок с номером verno.
Не поняли, хотите код? Ну, посмотрите в электронном архиве. Но
вообще стоит научиться переводить на Python фразы из нормально-
го человеческого языка. «Жизненно важным качеством программи-
ста является исключительно хорошее владение родным языком», —
сказал Эдсгер Дейкстра. Не знакомы? Погуглите.
Уровень 3. Ничего более умного, чем сгенерировать 0 или 1 и в
соответствии с этим генерировать пример на сложение и вычитание,
тут не придумать. Чтобы не делать лишней работы, лучше сначала
сгенерировать числа, а портом операцию, и на ветке условного опе-
ратора просто сохранить в строковую переменную знак, а в число-
вую — верный ответ примера. Тогда вся остальная программа уже
не будет зависеть от знака операции.
И ещё одна мелочь: чтобы юный пользователь не столкнулся с
отрицательными числами, сделайте уменьшаемым максимальное из
сгенерированных чисел, а вычитаемым — минимальное (команды
max и min вы знаете).
ЗАДАЧА: раздача домино
Всего костяшек 28. Дублей у нас 7, а костяшек с разными числами
на половинках 21 (7 6 : 2).
Генерировать их удобно через вложенные циклы:
for i in range(7):
for j in range(i, 7):
А внутри цикла добавляем к заранее созданному пустому списку
str(i) + + str(j) .
Ну а с раздачей всё просто: перемешаем костяшки с помощью
random, shuffle и выдадим пользователю первые семь.
Глава 12
ЗАДАЧИ: словесная архитектура
Во всех трёх задачах программа будет иметь такую структуру:
s = input("Слово: ")
for k in range(...):
print (...)
Переменная цикла — это как бы номер ступеньки. Можно считать
снизу, можно сверху — как удобнее. Но количество значений, при-
нимаемых переменной к, равняется len(s).
А в print () у вас наверняка будет какой-то срез строки s, и в
этом срезе наверняка будет фигурировать значение к. Например, в
первом крылечке мы будем просто выводить первые к букв строки.
Во второй и третьей программах нам придётся что-то выводить
перед срезом строки — результат умножения символа на к.
ЗАДАЧА: пересечение слов
Нам нужно проверить каждую букву первого слова — не входит
ли она во второе? Если входит, вывести два пересекающихся слова и
увеличить счётчик вариантов.
В программе будут вложенные циклы for. Делать их лучше по но-
меру, а не по значению: номера нам понадобятся, чтобы правильно
расположить слова. Итак, наружный цикл — по всем номерам симво-
лов первого слова. Проверить, входит ли i-я буква слова s в слово
w можно так: j = w.find(s[i]). Если j не меньше нуля — мы наш-
ли пересечение по букве, которая в первом слове i-ая, а во втором
j-ая. Для вывода картинки организуем цикл (к примеру, по к) по всем
номерам символов первого слова. Если это не i-й символ, выводим
j пробелов (отступ) и «[к]. А в i-й строке просто выводим второе
слово.
Глава 13
Купание слона Васи
Объём Васи равен объёму вытесненной им из бассейна воды.
А объём вытесненной воды — это объём пустого места в бассей-
не, оставшегося после того, как Вася из него вышел. А объём — это
длина на ширину на высоту... умножить, естественно, а не разделить.
Не забудьте перевести то, что получилось, из кубических сантиме-
тров (они же миллилитры) в литры: «милли» — это тысячная часть.
Команды на Гонку Героев
Если у нас 11 девочек — это на сколько команд хватит?
А если у нас девочек хватает на б команд, мальчиков на 2, а всяких
там кошек и собак на 9 — сколько команд сможет выставить класс?
Осталось вспомнить, что в Python есть // и шах().
Получить тройку
После ввода количества оценок (W) придётся организовать цикл
for для ввода оценок. Прямо по ходу ввода будем считать сумму
(классический алгоритм накопления).
Теперь посчитаем среднее арифметическое (делим сумму на ко-
личество, не забывая применить «вещественное» деление — /. Если
среднее не меньше, чем 2.5, смело выводим 0 (чего суетиться, тройка
и так обеспечена).
А вот если среднее меньше... можно, конечно, попытаться за-
действовать математику, но решение неравенств проходили не все.
Поэтому просто затеем цикл while до тех пор, пока сумма оценок,
делённая на количество оценок, не достигнет 2.5 или не перевалит
за это заветное число. А на каждой итерации цикла будем увеличи-
вать количество оценок на 1, а сумму оценок на 5. Только не забудьте
завести отдельный счётчик для добавляемых пятёрок.
Хауко и Мурисио
Процент увеличения веса из-за наполнения едой — это дробь,
в числителе — вес еды, в знаменателе — собственный вес хвостатого
«негодяя», умноженная на 100%. Если заменить Хауко на Мурисио,
числитель возрастёт в В раз, а знаменатель уменьшится в А раз. Это
во сколько раз увеличится результат?
Нарушители самоизоляции
Допустим, у нас N школьников и соответственно Л/ стульев.
У входящего первым /V различных способов выбрать себе место.
У второго — при любом выборе первого N - 1 вариант, то есть у нас
Л/ (N - 1) способ рассадить двоих. Продолжая рассуждения, мы уви-
дим старого знакомого — факториал. Его расчёт — один из класси-
ческих алгоритмов.
Пукка Юкканен
Давайте прикинем на тестовых данных. Пусть у Пукки 4 квартала
леса, их координаты (4,4), (1,1), (1, 2), (2, 2). Первый участок располо-
жен отдельно, все 4 его стороны нуждаются в заборе. А вот заборы
между смежными 2- и 3-м; 3- и 4-м не нужны.
Если все /V кварталов леса Пукки не имеют общих сторон, дли-
на сетки для их огораживания составит /V 4 км. Но каждая общая
сторона уменьшает эту величину на 2 — мы экономим по километру
забора на обоих участках.
Вводим данные, заносим в список и прямо по ходу ввода сравни-
ваем новые с уже введёнными. Участки имеют общую сторону, если
значения одной из координат совпадают, а другой отличаются на 1.
Меньше жрать
Задача похожа на предыдущую: по ходу ввода данных сравнива-
ем нового знакомого Марии и Антонио с уже введёнными. Если на-
ходится такой, с которым соотношение веса и роста нарушается (это
можно красиво проверить, перемножив разность весов и разность
ростов, — при нарушении произведение будет отрицательным), вы-
водим NO и прерываем цикл.
Тимуровцы
Мальчики безошибочно находят нужный дом по координа-
те X. Значит, есть всего один дом с таким значением X. То же верно
и для Y. Осталось выполнить подсчёт домов, у которых обе коорди-
наты уникальны.
Контрастный душ
Можно честно перебрать все возможные значения начальной
температуры (их не больше сотни, можно ни в чём себе не отказы-
вать). Для каждого смоделируем процесс принятия душа и посчитаем
длительность, максимальную длительность выведем.
Но если немного подумать на бумажке, можно вывести маленькую
изящную формулу, которая заменит и циклы, и поиск максимума.
ПРИЛОЖЕНИЕ 3
Ответы
IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII
Глава 1
Ответ Кофейника на контрольный вопрос о том,
почему языков программирования много
В разных ситуациях нам важны разные свойства языка програм-
мирования. Например, иногда надо, чтобы программа работала
очень быстро и занимала мало места в памяти. А иногда важнее, что-
бы программа легко и быстро писалась, а сколько она там работает,
одну миллисекунду или две, неважно. Некоторые языки ценят за то,
что они отлично подходят для решения задач какой-то предметной
области, а некоторые за то, что на них можно работать на чём угод-
но — на компьютере, планшете, смартфоне, часах... Ну не может один
язык удовлетворять всем требованиям сразу! Поэтому языков про-
граммирования много.
ЭКСПЕРИМЕНТ: приключения трёхзначного числа
Склеив трёхзначное число с самим собой, мы тем самым умно-
жили его на 1001 = 7 -11 • 13. А потом на эти же числа разделили, тем
самым вернувшись к исходному числу.
ПРОЕКТ: псевдографический конструктор (вопрос для
размышления)
Элементы конструктора можно получить, заменив в двоичном
представлении чисел от 0 до 7 (короткие числа дополним слева ну-
лями до трёх символов) цифру 0 на «.», а цифру 1 на «#».
МИКРОТЕСТ: что мы знаем о Питоне
Верны высказывания Б, В, Д, Е.
А. Питон придумали в Южной Америке, потому он и Питон.
Нет, его придумал голландец, живущий сейчас в Америке (Се-
верной).
Г. Максимальный размер числа в Python — 64 цифры.
Неверно, размер числа в Python не ограничен.
Ж.Файлы с текстом программы на Питоне имеют расширение .pi.
Расширение файлов с программами на Python — .ру.
Глава 2
ЭКСПЕРИМЕНТ: строки и числа
1. Результат не изменится — переменные можно называть и на
русском. Но не нужно.
2. Красивее всего так: str3 * int3 + str(int3) * (int3 + 2).
3. Строку можно преобразовать в число с помощью функции
int(). Естественно, не любую: если Питон не сможет преоб-
разовать строку в число, программа прервётся с сообщением
об ошибке.
4. Допустимы и те, и другие кавычки.
5. Чёрное str — часть имени переменной, сиреневое — на-
звание функции, то есть слово, которое Питон считает своим.
Если вы попытаетесь назвать переменную не str3, а просто
str — получите сообщение о синтаксической ошибке.
Вопрос для размышления про то, чем недоволен Пайтон
Варианты, начинающиеся с «он», откинем сразу — Пайтон не оши-
бается, не подвержен суевериям и перепадам настроения. А вот слу-
чайное использование пользователем сходной по начертанию буквы
кириллицы — одна из распространённых и трудноуловимых ошибок.
ЭКСПЕРИМЕНТ: как решать задачу, или Курить вредно!
Все предложенные изменения пойдут на пользу: и сокращение
текста программы (А, Б), и совершенствование интерфейса (В, Г).
ЭКСПЕРИМЕНТ: шесть единиц
11**1111. В этом числе 1157 цифр (а в 111**111 всего 228).
МИКРОТЕСТ: что мы знаем о данных
Верны высказывания Б, В, Г, Д, Е (да, '99' действительно больше,
чем '100', потому что это строки, а они сравниваются по первой циф-
ре: у кого она больше — тот и больший).
А. В Питоне тип данных определяется по их значению, и это на-
зывается гусиной типизацией.
Всё по сути верно, но типизация не гусиная, а утиная.
Ж. После выполнения print (20 -5*3) будет выведено число 45.
Умножение имеет более высокий приоритет, чем сложение, оно
выполнится первым, результатом будет число 5.
Глава 3
МИКРОТЕСТ: что мы знаем об интерфейсе
Верны высказывания В, Д, Е, 3, И.
А. Программа всегда начинается с input().
Вовсе нет — у нас немало примеров, когда программа начина-
лась с вывода.
Б. Для вывода с помощью print () все числа необходимо преоб-
разовать в строки.
Числа нужно преобразовывать в строки только в том случае,
если мы сцепляем их со строками операцией +. При выводе зна-
чений через запятую это не требуется,
Г. IDLE Python подчёркивает красным в выводимом тексте слова,
в которых есть грамматические ошибки.
Этой опции в Питоне, к сожалению, нет.
Ж. Выводимый на экран с помощью print () текст не может со-
держать знаков препинания.
Может, но некоторые из них (например, кавычки) требуют
предшествующего символа \.
Глава 4
ЭКСПЕРИМЕНТ: анализируем программу с ветвлениями
1. Слов может быть 8: 3 ветвления, в каждом мы можем пойти
по двум веткам, 2 2 • 2 = 8. Можно просто выписать все 8 ва-
риантов. А потом просто водить п = 0, 1,..., пока все 8 слов не
встретятся нам.
2. БУК—1. 3. ТУР — 4. 4. БОК—3.
Задачу можно было решить и в уме, если иметь представление
о двоичной системе счисления.
ЗАДАЧА: ищем ошибки «на глазок»
1. Про 33 будет два сообщения: «Это 2» и «Вы что-то напутали».
Про 99 тоже будет два сообщения, верное и неверное. Про 80
программа скажет и «Это 5», и «Это 4». Для 666 и -13 перед
верным сообщением «Вы что-то напутали» выведется оценка
(5 для ббб, 1 для -113).
2. Тройку и четвёрку программа ставит корректно, и, например,
при вводе числа 50 выведется «Это 3».
3. Сделать один условный оператор, для всех оценок чётко за-
дать условия двойными неравенствами, а в else упрятать со-
общение о некорректности введённого числа.
МИКРОТЕСТ: что мы знаем о ветвлениях
Верны высказывания Б и Е.
А. В программе может быть не более одного условного оператора.
Их может быть сколько угодно,
В. В Python числа можно сравнивать на ==, •=, >, <, >=, <=, а стро-
ки — только на == и !=.
Строки тоже можно сравнивать на все эти соотношения, про-
сто сравнение происходит по-другому.
Г. Все элементы условного оператора (if, elif, else) содержат
условие и заканчиваются двоеточием.
Нет, в else условия нет. Поэтому всё высказывание неверно.
Д. Действия при выполнении условия не могут занимать более
одной строки.
Могут -могут.
Ж. Конец ветвления в Питоне обозначается командой endif.
Нет, в Питоне просто отступ становится таким же, как у if,
но никаких особых слов писать не нужно.
Глава 5
ЗАДАЧА: партийные взносы
Задача довольно принципиальная, поэтому ответ в книге, а не
в архиве.
# Партийные взносы
d = int(input(’'Величина дохода в месяц (в дырлях) : ”))
# Без логических операций
if d < 20000:
n — 0
elif d < 100000: # 1/10000 от d меньше 10 дырлей
n = 10
elif d <= 1000000:
n = d // 10000
else:
n = 0
print ("Величина налога по алгоритму 1 , n)
# С математическими операциями
if 20000 <= d <= 1000000:
n = max(10, d // 10000)
else:
n — 0
print("Величина налога по алгоритму 2 ="f n)
МИКРОТЕСТ: что мы знаем о логических операциях
Верны высказывания А, Б, Г, Е, Ж ,К.
В. True or True and False — это будет False.
Нет, у and приоритет выше, чем у or, or будет последней опе-
рацией и даст True.
Д. Двойное неравенство 5 <= х <=13 эквивалентно х >= 5
or х <= 13.
Будь там не or, а and — было бы верно.
3. Операнды могут включать операции и операторы.
Нет, это операторы могут включать операции и операнды.
И. В математической логике 1 обозначает ИСТИНА, 2 - ЛОЖЬ,
Неверно, Ложь обозначает 0.
Глава 6
ЭКСПЕРИМЕНТ: исправляем программу
Исправленная программа Чайника про цифры числа:
n = int(input("Введите четырёхзначное число: "))
if п < 1000 or п > 9999;
print ("Это не четырёхзначное число’")
else:
dl = n // 1000 # dl. ..d4 — цифры числа слева направо
d2 = (n // 100) % 10
d3 = (n // 10) % 10
d4 = n % 10
## print(dl, d2, d3, d4) # отладочная печать цифр числа
if dl < di print elif dl > print else: > < d3 < d4: ("Цифры в порядке возрастания") d2 > d3 > d4: ("В порядке убывания")
print("Цифры не упорядочены")
МИКРОТЕСТ: что мы знаем о культуре программирования
Верны высказывания В, Г, Д, Ж, 3, И, К.
А. То, что программа понятна только её автору и компьютеру —
это круто!
Ничего крутого, элементарное неумение внятно формулиро-
вать свои мысли. И, возможно, компьютер как раз понял вас не-
правильно.
Б. Чем больше в программе комментариев, тем лучше.
«Чем больше, тем лучше» — опасная формулировка, можно пе-
реборщить. Программу, в которой на одну строку кода 5 строк
комментария, читать трудно. Особенно если комментируют-
ся очевидные вещи.
Е. Программу невозможно отладить без специальной програм-
мы-отладчика, позволяющей узнать промежуточные значения
данных.
Отладчик в стандартной IDLE Python не очень удобен, а заво-
дить «продвинутую» среду программирования, пока ты ещё
Чайник, вряд ли стоит. Вот когда начнёте писать программы
на сотни строк, из нескольких файлов — обновите среду.
Глава 7
ЭКСПЕРИМЕНТ: исследуем range()
1. (8). 2. (1, 6). 3. Потому что начальное значение сразу оказалось
больше конечного. 4. (10, -1, -1). 5. (1013, 2000, 100).
ЗАДАЧА: таблица умножения
Программа к уровню 2.
n = int(input("Введите число: ”))
for k in range(2, 10):
г = int (input (str (n) +’'*" + str (к) + " = "))
if r == n * к:
print("Верно.")
else:
print("Неверно.")
МИКРОТЕСТ: что мы знаем о повторениях
Верны высказывания А, Б, В, Д, Ж.
Г. Тело цикла — оператор Питона, который нужно выполнить
многократно.
Тело может состоять не из одного оператора, а из нескольких.
Е. В скобках после for должны стоять числа — от одного до трёх
целых чисел.
Там могут быть и переменные, и выражения, но обязательно
с целочисленным значением.
3. Если начальное значение переменной цикла не указано, оно бу-
дет равно 1.
Ло умолчанию начальное значение переменой цикла 0.
Глава 8
ЗАДАЧА: таблица умножения, уровень 4
а = int(input("Введите натуральное число: "))
Ь = int(input("Введите другое натуральное число: "))
print("А теперь будем практиковаться в умножении’")
err = 0 # счётчик ошибок
for i in range(а, a + 5):
for j in range(b, b + 5):
r = int(input(str(i) + " * " + str(j) + " = "))
if r ’= i * j: # ошибочка вышла’
err = err + 1
print("Количество ошибок: ", err)
МИКРОТЕСТ: что мы знаем о классических алгоритмах
Верны утверждения Б, В, Г, Д.
А, Классические алгоритмы давно устарели.
Классика не устаревает — потому она и классика.
Е. Для любого натурального числа N значение /V! больше, чем A/w.
Можно это опровергнуть примером: 3! - 6, З3 = 27. А можно
подумать: и в факториале, и в степени по N сомножителей,
но в степени они все равны N, а в факториале почти все мень-
ше N.
Глава 9
ЭКСПЕРИМЕНТ: что делает программа?
1. Программа вводит слова до тех пор, пока трижды (не обяза-
тельно подряд) не введут слово STOP.
2. Программа вводит слова или числа до тех пор, пока не введут
два одинаковых подряд.
3. Программа находит наибольший общий делитель двух введён-
ных чисел.
4. Программа находит сумму цифр введённого числа.
ЗАДАЧА: решение подбором и перебором
1. 8. 2. 120.
Текст программ? Да справитесь вы сами, они же простые. Не
справились? Ищите в электронном архиве.
МИКРОТЕСТ: что мы знаем о циклах
Верны утверждения А, В, Д, Ж, 3, К.
Б. В теле цикла while можно использовать значение его перемен-
ной цикла.
Переменная цикла — это в for, а не в while.
Г. Цикл for можно вложить в цикл while, а вот while внутри for
недопустим.
Допустимы любые сочетания. Пример такого — программа, ко-
торая для каждого числа из заданного интервала выводит его
сумму цифр.
Е. Если внутри while есть ещё один while, то break во внутрен-
нем while прервёт сразу оба цикла.
Это не так — break прерывает только тот цикл, в теле ко-
торого находится.
И. Любой цикл while можно запрограммировать с помощью for
и break, если взять достаточно большой интервал в range.
Нет. «Очень большой» и «бесконечный» — не одно и тоже.
Глава 10
ЭКСПЕРИМЕНТ: что выведет программа?
ЛЕТО (А—4, В=3), СТЕНА (А=3, В=1), ИНТЕРНЕТ (А-2, В=0).
МИКРОТЕСТ: что мы знаем о списках
Верны утверждения А, Б, Е, Ж, 3, И.
В. Длину списка нужно обязательно задать до его создания.
Вовсе нет. Можем добавлять элементы в список до выполнения
условия, в цикле.
Г. Команда s.add(5) добавит в конец списка число 5.
Почти верно. Только не add, а append.
Д. Если в списке строки, при сортировке они упорядочиваются по
возрастанию длины.
Нет, упорядочиваются они по алфавиту, как в словаре. Длина
играет роль, когда одно слово является началом другого: «рука»
будет раньше, чем «рукавица».
К. Между элементами списка с номерами а и Ь, где а < Ь, находят-
ся b - а элементов списка.
Нет, крайние значения в «между» не входят, так что b - а - 1.
Глава 11
МИКРОТЕСТ: что мы знаем о случайных числах
Верны утверждения Б, В, Д.
А, Модуль random — дополнение к Питону, которое надо скачать
из Интернета.
Нет, это встроенный модуль, входит в состав установочного
пакета Питона.
Г. Команда random,mix(spisok) перемешивает список, имя ко-
торого в скобках.
Да, только команда называется не mix, a shuffle.
Е. Если с помощью randint сгенерировать миллион случайных
чисел 0 или 1, ровно половина из них будут ноликами.
Вряд ли. «Примерно половина» — это не тоже самое, что «ров-
но половина», хотя на практике нас вполне устраивает «при-
мерно половина».
Глава 12
ЭКСПЕРИМЕНТ: нарезаем колбасу
КОЛБА = это ’’КОЛБАСА" [: 5], БЛОК — "КОЛБАСА" [3:: -1]. А пе-
ревернуть строку s можно так: s [:: -1].
ЗАДАЧА: пересечение слов
Вот текст программы:
s = input ("Слово 1: ’’)
w = input("Слово 2: ”)
с = О
for i in range(len(s)):
j — w, find (s [ i ] )
if j >= 0:
c = c + 1
print ()
for k in range(len(s)):
if k ?= i:
print(” " * j + s[k])
else:
print(w)
print("\пНайдено вариантов:”, с)
МИКРОТЕСТ: что мы знаем о строках и срезах
Верно только утверждение В.
А. Для использования методов строк надо в начале программы на-
писать import string.
Не надо: строки — встроенный тип данных.
Б. "БАРАБУЛЬКА" [2:5] — ЭТО "АРАБ".
Нет, "АРАБ" — это "БАРАБУЛЬКА " [1:5].
Г. Если в строке s нет символа *'Ы", то значением s.find("H") бу-
дет 0.
Нет, -1. Символ с номером 0 в строке как раз есть, так что 0 не
может быть признаком безрезультатного поиска.
Д. Чтобы заменить 3-й символ строки s, к примеру, на "Г, следует
выполнить присваивание s [2] =
Нет, символы строки нельзя изменять с помощью присваива-
ния.
Е. Учительницу Евгения Викторовича по русскому зовут Элла Ве-
ниаминовна.
Её зовут Элла Валентиновна.
ПРИЛОЖЕНИЕ 4
Состав электронного архива
111111111111111111111111111111111111111111111111111111111111111111111111111111!111]|111111Н
В архив включены:
♦ тексты программ, приведённых в книге;
♦ версии текстов программ, являющихся решениями задач и реа-
лизациями проектов;
♦ тестовые наборы значений для олимпиадных задач.
Файлы архива распределены по папкам, соответствующим гла-
вам книги. В папке находятся файлы с текстами программ из книги
(они нумеруются последовательно, например, файлы к первой гла-
ве называются 1-1.ру и 1-2.ру) и вложенная папка Ответы. Имена
файлов с ответами соответствуют названиям задач и подзадач, они
русскоязычные и вполне внятные, например, Квасим_капусту.ру).
Тестовые значения к задачам главы 13 помещены во вложенную
папку Тесты, пары тестовых значений к каждой задаче упакованы
в ZIP-архив с названием, соответствующим названию задачи.
Таблица 1. Состав электронного архива
Папка/глава Вид контента Количество файлов
1 Тексты программ из книги 2
Ответы к заданиям 1
2 Ответы к заданиям 3
3 Тексты программ из книги 2
Ответы к заданиям 1
4 Тексты программ из книги 1
Ответы к заданиям 5
5 Тексты программ из книги 2
Ответы к заданиям 3
Табл. 7 (окончание)
Папка/глава Вид контента Количество файлов
6 Тексты программ из книги 1
Ответы к заданиям 3
7 Тексты программ из книги 1
Ответы к заданиям 2
8 Тексты программ из книги 3
Ответы к заданиям 4
9 Тексты программ из книги 3
Ответы к заданиям 4
10 Тексты программ из книги 5
Ответы к заданиям 2
11 Ответы к заданиям 7
12 Тексты программ из книги 1
Ответы к заданиям 4
13 Тестовые пары к задачам главы 12
Ответы к заданиям 12
Приложение Ответы к заданиям 22