Академический Документы
Профессиональный Документы
Культура Документы
программировать
с примерами на Python
КНИrа, хоторая
учит думать ш
Как избегать проrраммист
неверных решений
и подводных
камней
Начните карьеру
программист а
прямо сейчас
Как не допускать
глупых
синтаксических
ошибок
Паrренируйте мозг
с помощью задач
� Все, что вы хотели знать
о программиро вании,
но боялись спросить
и упражнений
серия Head First
Учимся
программировать
с примерами на Python
Head First
Learn to Code
Eric Freeman
Учимся
программировать
с примерами на Python
Эрик Фримен
Москва • Санкт-Петербург
2020
ББК 32.973.26-0 18.2.75
Ф88
УДК 004.43 (075.8)
Фримен, Эрик
Ф88 Учимся программировать с примерами на Python (серия Head First).: Пер. с англ. - СПб.:
ООО "Диалектика" , 2020. - 640 с. : ил. - Парал. тит. англ.
ББК 32.973.26-018.2.75
Все названия программных продуктов являются зарегистрированными торговыми марками соответствующих
фирм.
Никакая часть настоящего издания ни в каких целях не может быть воспроизведена в какой бы то ни бьшо форме
и какими бы то ни бьшо средствами, будь то электронные или механические, включая фотокопирование и запись на
магнитный носитель, если на это нет письменного разрешения издательства O'Reilly Media, Inc.
Authorized Russian translation ofthe English edition of Head First Learn to Code (ISBN 978-1-491-95886-5) © 2018 Eric
Freeman.
This translation is puЫished and sold Ьу permission ofO'Reilly Media, Inc., which owns or controls all rights to sell the
same.
All rights reserved. No part of this book may Ье reproduced or transmitted in any fonn or Ьу any means, electronic or
mechanical, including photocopying, recording, or Ьу any information storage or retrieval system, without the prior written
permission ofthe copyright owner and the PuЫisher.
на"чно-попул..ярное издание
ЭрикФримен
ООО "Диалектика", 195027, Санкт-Петербург, Магнитог орская ул., д. 30, лит. А, пом. 848
Джин Симмонс
Об авторе
6
Содержание
Оr��ен11� �i\JD1<�)
Введение 23
1 Приступим 37
2 Сначала было значение 69
3 Принятие решений 1 09
4 Структуры данных 161
5 Функциональный код 215
4а Наведение порядка в данных 261
6 Сведем все воедино 28 1
7 Модульное программирование 327
8 И снова об индексах и циклах 377
9 Длительное хранение данных 429
10 Так хочется большего 471
11 Интерактивные возможности 503
1 2 Пуrешествие в страну объектов 559
Приложение: Десять ключевых тем
(которые не были рассмотрены) 611
�n.ф!11� (n�n.r��н�)
Введение
Настрой те с в ой мозг на изучение программирования.
Конечно, вам хочется чему-то научиться , но у мозга могут быть свои планы
на этот счет. Он контролирует, чтобы вы не забивали себе голову ненужной
информацией. Есть ведь вещи и поважнее, например какой фильм пойти
посмотреть на выходных или что надеть на вечеринку. Как же убедить мозг,
что книга по программированию содержит нужную информацию?
Для кого эта книга 24
Мы знаем, о чем вы думаете 25
Вот что можете сделать вы, чтобы настроить свой мозг на обучение 29
Это важно 30
Благодарности 35
Команда рецензентов 36
7
Содержание
Шаг за шагом 38
Как пишут программы 42
Понимают ли нас компьютеры? 43
Мир языков программирования 44
Ввод и выполнение кода Python 49
Краткая история Python 51
Тестируем среду 54
Сохранение кода 56
Первая программа готова! 57
Phrase-0-Matic 61
Запуск кода на выполнение 62
в
Содержание
2
Сначала 6ь1по значение
В реальности компьютеры умеют делать всего две вещи:
сохранять значения и вы полнять над ними операции. А как
же редактирование текста, ретуширование фотографий и онлайн-покупки, спросите
вы? Удивительно, но решение любых подобных задач в конечном счете сводится
к вы полнению п ростых операци й над не менее п росты м и знач е н и я м и . Человек,
обладающий вычислительным мышлением, понимает, что это за операции и значения
и как с их помощью создать что-то более сложное. В этой главе мы познакомимся
с типами значений, узнаем, какие операции можно выполня ть над ними и какую роль
во всем этом играют переменные.
9
Содержание
nринвrие решений
з Думаю, вы заметили, что наши предыдущие
программы были не осо бо интересными. одержащи
с йся
н
в них код представлял собой простую последователь ость инструкций ,
вы полняемых интерпретатором сверху вн з . Никаких те бе поворотов
и
Вернемся к игре 1 20
А где документация? 1 34
Завершение игры 1 36
10
Содержание
cnucкu u дuКЛь1
4
Сrрукrуръ1 данных
Ч ис ла, строки и булевы значения - не единственные
типы данных в программировании. Пока что мы использовали только
п р и м итивные ти п ы: числа с плавающей точкой, целые числа, строки и булевы значения
(например, З . 1 4, 42, "имя собаки" и True). И хотя их возможности достаточно велики,
время от времени в программах приходится иметь дело с большими наборами данных,
такими как все добавленные в корзину покупки, названия всех известных звезд или
содержимое всего каталога товаров. Для эффективной работы с подобными наборами
нужны структуры дан н ы х. В этой главе вы познакомитесь с новым типом данных -
Поможете разобраться? 1 62
Работа со списками 1 64
Составление отчета 1 84
И победителями становятся... 1 97
11
Содержание
f�нкдuu u a�CIPfaKдuu
Функционапьнь1й код
5 Вы уже многому научились. Переменные и типы данных,
условные конструкции и циклы - этих инструментов вполне достаточно,
чтобы написать почти любую программу. Но зачем останавливаться на
достигнутом? С ледующий шаг - научиться созда вать абстракц и и в коде.
Звучит пугающе, хотя ничего страшного в этом нет. Абстракции - ваш
спасательный круг. Они упрощают процесс разработки, давая возможность
создавать более эффективные и функциональные программы. Абстракции
позволяют упаковать код в небольшие блоки, удобные для повторного
использования. С ними вы перестанете концентрироваться на
низкоуровневых деталях и сможете программировать на высоком уровне.
12
Содержание
4
Наведение порядка в даннъ1х
Иногда стандартный порядок сортировки данных нас не
устраивает. Например, у вас есть список лучших результатов в аркадных
(nродопжение) играх, и вы хотите упорядочить его по названиям игр. Или же это может быть
список сотрудников, регулярно опаздывающих на работу, и вы хотите узнать,
кто из них проштрафился чаще остальных. Для решения подобных задач нужно
знать, как сортировать данные и как самостоятельно настраивать порядок
сортировки. В этой главе мы также изучим вложенные циклы и выясним, насколько
эффективен написанный нами код.
13
С одержание
6
Сведем все воедино
Вы уже многое знаете. Пора задействовать знания по
максимуму. В этой главе мы сведем все воедино и начнем писать
сложны й код. В то же время мы продолжим пополнять арсенал
Дальнейшие улучшения
14
Содержание
7
Модульно е nроrраммиро вание
Написанные вами программы становятся все более сложными.
Это заставляет тщательнее продумывать структуру и организацию программ. Вы уже
знаете, что функции позволяют группировать строки кода в компактные блоки, удобные для
повторного использования. Вы также знаете , что наборы функций и переменных можно
объединять в модули, подключаемые к программам. В этой главе мы вернемся к теме
модулей и рассмотрим, как работать с ними эффективнее (и даже делиться ими с другими
пользователями). Кроме того, вас ждет знакомство с ключевыми строительными блоками
программ - объектами. Вы увидите, что в Python они встречаются повсеместно, даже там,
где вы не ожидаете их встретить .
15
Содержание
feКНfcuff u CЛofiafU
Мемоизация 413
16
Содержание
9
Дпиrепьное хранение даннь1х
Вы умеете хранить данные в переменных, но к ак только
программа завершается - бах! они исчезают навсе гда. Вот для чего нужно
-
17
С одержание
насчет базы данных рецептов? Или вас интересуют спортивные результаты? А может,
ваш интерес - музыкальная база данных с информацией о музыкантах, альбомах
и композициях? Всю эту информацию можно получить с помощью веб-служб. Для
работы с ними нужно знать, как организуется передача данных в Интернете, а также
познакомиться с парочкой модулей Python: reque s t s и j s on. В этой главе вы изучите
возможности веб-служб и повысите свой уровень знаний Python до заоблачных высот.
Так что приготовьтесь к путешествию в космос.
Черепашка-космонавт 491
Завершение программы
18
Содержание
Интеракrивные возможности
11 Вам уже приходилось писать простые графические приложения,
но у них не было полноценного графического интерфейса. Другими
словами, приложения не позволяли пользователям взаимодействовать с экранными элементами.
Чтобы это стало возможным, необходимо применить иную модель выполнения программы,
в рамках которой приложение реаги рует на действия пользователя. Пользователь щелкнул на
кнопке? Программа должна знать, как реагировать на такое событие, и быть готовым к нему.
Процесс создания графического интерфейса сильно отличается от привычного процедурного
стиля программирования, который мы применяли до сих пор. Нам придется совершенно по
иному подойти к решению задач. В этой главе вы создадите свой первый графический интерфейс,
причем не какое-то примитивное экранное приложение, а нечто намного более интересное. Мы
напишем игровой симулятор искусственной жизни с непредсказуемым поведением.
19
Содержание
�ъекmно-оruенrr:шrованное :I1foГfaммuroвaнue
Подклассы 572
Сила наследования
Служба выгула собак
Как нанять человека для выгула собак
20
Содержание
21
Содержание
22
Как nоЛьЗоВаmьсff кнufou
Введение
23
Для кого эта книга
24
Как пользоваться книгой
{
U мы знаем, о чем gyмaem Baw моз2
"*"'
Мозг всегда ищет новизну. Он напряжен, насторожен и ждет
чег<>-'I'о необычного. Таким его создала природа, и это помогает
нам выживать.
ВведенtJе � 25
Мы считаем читателей книги учениками
)
бл иже к иллюстрациям, а н е где-то в н изу или на следующей стра н и це. Это почти
вдвое улуч шает способность уче н и к а р ешать соот в етствующие задач и .
И HW1tp"'peW1t1W1op
Разrоворный стипь и имnровизироаанные диаnоrи. Согласно Pytl-lo"'
Вам нужно научиться послед н и м и сследованиям учен и ки н а 40% лучше усва ива ют
абстрагировать код и нфо р ма ц и ю, когда а вто р обр а щ а ется напрямую к ч итател ю от пер в ого л и ца,
в виде срункций.
испол ьзуя разговорн ы й стиль вместо формальных описа н и й и рассказывая
и сто р и и вместо того, чтобы ч итать лекц и и . Язык должен быть простым, н е
()
"
стоит все воспр и н и мать сли ш ком серьезно. К кому вы бол ь ше
прислушаетесь: к другу, популярно объясняющему, как все р аботает,
или лектору, ч ит а ющему конспект перед бол ь ш о й аудиторией?
r c Y" O
ке �rio
yчuWlec"
ответы и прио б ретать новые з н а н ия. Для этого нужны
r1 06 0. Y""·
�pozpo.ммur
головоломки, уп р ажнения и каверзные вопросы - все
о. �умо.У"" 'fV\
ко.к
то, что зас та вляет работать оба полушария мозга .
oz rio. мм uc
�р r
Привnечение (и удержание) внимания читатеnя. Все
-
мы стал ки вал и с ь с ситуациеи, когда к н и гу хочется проч итать, но
после первой же стран и цы мы н а ч и наем зас ыпать от скуки. Мозг ре а ги рует
на все, что нестандарт но, н епри вычно, ст р а н н о, притягател ьно, неожид а н н о. Изучение
сложных техн и ческих тем н е обязател ьно должно быть ску ч н ы м. Мозг будет быстрее уч иться
в н етипи ч н о й обстановке.
26
Как пользоваться книгой
Введение � 27
Вот что сделали мы
Bom ч m о cgeAaAu мы
Мы задействовали множество иллюстраций, поскольку мозгу легче
воспринимать образы, чем текст. Не зря говорят, что одна картинка
стоит тысячи слов. Точнее, не 1 000, а 1024. Мы старались сочетать текст
с изображениями, так как известно, что мозг работает эффективнее, когда текст
включен в иллюстрацию, к которой относится, а не расположен отдельно от нее.
Мы нередко применяли избыточность, высказывая одну и ту же мысль по-разному
и разными способами. Это повышает шансы на то, что информация в конечном
итоге будет запечатлена в разных участках вашего мозга.
Мы старались подавать концепции и рисунки в нео:нсиданной манере , ведь
мозг восприимчив ко всему новому. Кроме того, мы стремились создавать
определенный эмоциональный фон, поскольку мозг чутко реагирует на биохимию
эмоций. Нам легче запоминать то, что вызывает сопереживание, даже если это
всего лишь юмор, удивление или заинтересованность.
Мы использовали разговорный cmwiь изложения от первого лица, так как мозг
более сосредоточен во время беседы, чем когда вы просто слушаете лекцию. Это
УЧ11-М�
происходит даже в процессе -чтения книги. 1l�R11-MIUDЬ PytЪ�n
Мы включили в книгу более 1 20 упражнений, поскольку мозгу легче обучаться
и запоминать информацию, когда вы что-то делаете, а не просто -читаете текст.
Все задачи непростые, но решаемые - такой формат наиболее привычен.
Мы применяли разные методи1СU обучения: кому-то нравятся пошаговые
инструкции, кто-то предпочитает сначала понять картину в целом, а кому-то
достаточно увидеть пример кода. Но независимо от предпочтений читатели
только выиграют, если научатся анализировать одни и те же задачи под разными
углами.
Мы постарались задействовать оба полушария вашего мозга, ведь чем большая
часть мозга вовлечена в процесс обучения, тем выше вероятность усвоения и
запоминания информации и тем дольше сохраняется концентрация внимания.
Зачастую, когда одно из полушарий работает, другое отдыхает. Это позволяет Они будум
повысить продуктивность обучения в течение более длительного времени. учиW11:>ся с нами
Мы добавили в книгу диалоги и упражнения, позволяющие взглянуть на проблему
с разных точек зрения. Наш мозг начинает глубже вникать в проблему, когда его
заставляют давать оценки и составлять суждения.
Мы предложили читателям ряд открытых задач в виде упражнений и вопросов, на
которые не всегда можно дать однозначный ответ. Наш мозг настроен на обучение
и запоминание, когда ему приходится работатъ над решением. Сами посудите: вы не
сможете стать атлетом, наблюдая за тем, как тренируются другие. Но мы постарались
сделать так, чтобы, упорно работая, вы продвигались к намеченной цели и чтобы ни
один дендрит вашего мозга не был задействован зря в процессе рассмотрения сложных
примеров или анализа насыщенного техническими терминами текста.
Мы создали персонажей. Они встретятся вам в диалогах, примерах, иллюстрациях -
в общем, по всей книге. Мозг уделяет больше внимания живым существам, чем
неодушевленным предметам или отвлеченным понятиям.
Мы придерживались принципа 80/20 (известного как принцип Парето). Мы полагаем,
что, раз уж вы решили стать программистом, то наверняка захотите прочитать и другие
книги. Так что мы не пытались рассказать вам все. Только то, что вам действителъно нужно.
28
Как пользоваться книгой
- - ---------------------------------------------------------------------- � -------
З) Не торопитесь.. Чем боль.wе вь.� поймете, тем @ Обсуждайте прочитанное. Думайте вслух.
мень.wе придется зубрить..
Речь стимулирует активность различных
Не нужно просто 'Чиmатъ. Делайте паузы участков мозга. Если вы пытаетесь понять
и анализируйте прочитанное. Если вам и запомнить прочитанное, проговаривайте
задают вопрос, не спешите подсматривать материал вслух. А еще лучше, попробуйте
ответ. Представьте, будто кто-то из друзей объяснить его кому-то другому. Это ускорит
спрашивает вашего совета. Чем глубже вы обучение, и к тому же так можно открыть для
пытаетесь вникнуть в суть вопроса, тем себя малозаметные детали, на которые вы не
выше шансы понять и запомнить ответ. обратили внимания в процессе чтения книги.
Все они важны. В данной книге это основной Мозг должен понимать, что подаваемая ему
материал! Их нельзя пропускать. информация важна для вас. Придумывайте
истории персонажей. Делайте шутливые подписи
@) Не читайте на ночь. другие книги. Не нагружайте
к иллюстрациям. Лучше поморщиться от плохой
шутки, чем не испытать никаких эмоций.
мозг.
Эmо Ва>kио
Перед вами обучающая книга, а не справочник. Мы намеренно выкинули все, что
может помешать изучению тех или иных тем. И если вы впервые взяли книгу в руки , то
рекомендуем читать с самого начала, поскольку в книге предполагается, что вы знакомы
с предыдущим материалом.
Мы даже не пытаемся этого делать, т.к. Python - слишком обширная тема. Это было
бы уместно для справочника, но наша книга - не справочник, и мы не ставим перед
собой цель рассказать все что только можно о Python. Наша настоящая цель - обучить
вас основам программирования и вычислительного мышления, чтобы в будущем, когда
вам захочется прочитать еще какую-то книгу по любому из язъtхов программирования, вы
понимали, о чем идет речь.
Вам хочется писать программы, которые будут понятны и вам, и другим людям;
программы, которые продолжат работать даже с выходом в следующем году очередной
версии Python. В книге мы научим вас, как с самого начала писать понятный, четко
структурированный код, которым можно гордиться и который не стыдно показать � Aннowiaцuu
друзьям. Единственное, что отличает его от профессионального кода, - аннотации 6t�tzлядя м wiaк
(а-ля рукописные) , поясняющие работу программ. Мы считаем, что они намного лучше
подходят для обучающей книги, чем традиционные комментарии в коде (если вы не
понимаете, о чем идет речь, то скоро все поймете, буквально через пару глав ) . Но не
переживайте: мы заодно научим вас правильно документировать код и покажем примеры
составления до кументации к программам. Как бы там ни было, важно уметь писать
программы самым простым способом, чтобы можно бьто как можно быстрее решить
поставленную задачу и заняться чем-то более приятным.
30
Как пользоваться книгой
Характерной особенностью книги является то, что мы пытаемся научить вас по
настоящему понимать пр о граммирование. Мы хотим, что бы, прочитав книгу, вы
помнили, чему научились. В большинстве справочных руководств не ставится
цель добиться запоминания и усвоения материала, но наша книга - обучающая, У нас нем горячей ЛIAHIAIA,
поэтому время от времени некоторые концеп ции будут упоминаться повторно. но 6се r1.p1AMepti1 1А рабочtАе
файл"' можно скачам11
Краткост11 - сестра таnанта. на сайме http : / /
Читатели часто пишут нам о том, как это утомительно - продираться сквозь wickedlysmart . com/
200 строк кода примера ради тех двух стр очек, которые нужно изучить. hflearntocode
Большинство примеров в книге подано максимально компактно, что бы все
было просто и понятно. Не ждите от примеров чудес - они составлены в целях
обучения и не всегда полно функциональны. Но мы постарались сделать их
забавными и необычными, чтобы их было интересно по казать друзьям или
родственникам.
Введение � 31
Необходимо установить Python
понадобится установить версию 3.6 или более позднюю. Вот как это сделать.
https://www.python. org/downloads
�
Появится страница, где содержится ссылка для загрузки Python �
в macOS. Если не видите ее, откройте меню Downloads.
!. Выберите релиз Python 3.х (где х - номер новейшей версии
языка) . Не загружайте Python 2.7.
2. После скачивания инсталлятора откройте установочный
пакет в папке загрузки и следуйте появляющимся на экране --
инструкциям.
.
.....m
• vc
,..,.,....0.uкenticl'l'll
Прцложенце IDLE находцмся 6 nal'\Kt P!;lthol'\ 3.х,
. ..-...... коморая сама находцмся 8 1'\аl'\Ке App/icationS.
-· · -"'
о мом, чмо макое IDLE, Mt>I 1'\Оzо8орцм 8 zла8е :1.
32
Как пользоваться книгой
..
.......
... OWll
5. Чтобы протестировать дистрибутив, выберите ..
, � .,.... .... �
.. �
....IЦ"----
..
пункт IDLE. На экране должно появиться окно, ..... ...... "_
( .......
Введение � 33
Как работать с исходными кодами
code
�
• • • cl-<, chz • м./. до cJ.'2
::.-=_ �
ij
--
_"_
·-...-
--.
dog.py
-:::. - -
-
-
·
-
. .......
-
pallndromt.py
j
Уч...шме, lfMO "f'V.NICP"' 8
34
Как пользоваться книгой
Бда2оgарносmu *
В первую очередь хочу сердечно
поблагодарить моих технических
рецензентов. Элизабет Робсон
внимательно просмотрела черновик
книги, и ни одна смысловая ошибка
не укрылась от ее зоркого глаза.
Джош Шарфмаи был нашим
рс
главным рецензентом, давшим массу Элuзабгм Робсон Ажощ Шарфман дгu6uд Пауэ
полезных советов и рекомендаций по
каждой главе. Дейвид Паузрс в своем привычном
стиле тщательно проверил все главы на предмет
технических ошибок. Ветеран серии Head First Пол Барри
взял на себя важную миссию по проверке листингов Python. Кроме
того, неоценимый вклад в проект внесла команда рецензентов (все они
перечислены на следующей странице), которые проверили каждую страницу книги.
Огромная благодарность моим редакторам Джеффу Блейелу, Дон Сканафелт и Мегаи Блаишетт.
Меган серьезно помогла мне на начальном этапе, Дон контролировала ход работы, а Джефф довел
проект до отправки в типографию.
Отдельное спасибо всему коллективу издательства O'Reilly, в особенности Сьюзаи Коваит, Реhел
Румелиотис и Мелани Ярбро. Благодарю Джейми Бертов из компании WickedlySmaгt за помощь
в подготовке книги, включая сбор отзывов от читателей и управление форумом рецензентов. И как
всегда, спасибо Берту Бейтсу и Кэти Сиерра за вдохновение, увлекательные дискуссии и помощь в
решении возникающих проблем. Кроме того, хочется поблагодарить Кори Доктороу за поддержку
и за то, что предоставил свою книгу в качестве материала для главы 7.
В завершение хочу упомянуть тех людей, которые, сами того не ведая,
послужили для меня источником вдохновения: это профессор Даниэль
П. Фридман, Нейтаи Бер.цжв, а также разработчики из Raspberry Pi
Foundation и Socratica.
Джгфф Блгйгл
Введение � 35
Команда рецензентов
Команgа рецензенmоВ
Рецензированием книги занималась
целая команда потрясающих людей
самой разной квалификации - от
новичков до экспертов - и самых
разных профессий, включая
архитектора, стоматолога, учител.я
младших кл.ассов, аrевта по
недвижимости и преподавателя
иифориатики в школе. Причем все
они были из разных уголков земного
шара: от Албании до Австралии, от
Кеиии до Косово, от Нидерландов и
Ниrерии до Новой Зелаидви.
36
1 �ЧUМcff )\уМаmь как IlfoГfaммucm
приступим
�:� : �:�::
е, н о сд'}" ы пач/- п исатЬ
собственный код , - научиться разбивать стоящие
перед вами задачи на небольшие действия , которые
а�
компьютер сможет въ�полнитъ за вас. Для этого вы и
компьютер должны использовать понятный друг другу
язык, но об этом мы вскоре поговорим.
Н есмотря на кажущуюся сл ожность, разбивка задачи
на последовательность простых действий - это то , чем
вы занимаетесь каждый день, иногда даже неосознанно .
Рассмотрим Простой пример. Предположим, вы
хотите описать процесс рыбной л овли в виде набора
инструкций для робота, который будет рыбачить за вас .
Вот что мы получаем в первом прибл ижении .
J
nонямнЬIХ эмаnо8
Г] fv1171 nроходцм эмап1:11 no очередц
�
® Если рыбалка окончена, отправиться домой;
иначе вернуться к п. 1 .
В IАfiсмрукццях могу м r.ринцма м11ся
реш енця , наn.р цмер о WIOM , не r.opa
{_
лц домо й цлц мож но еще r.ор1:>1 бачц м11
И нсмрукццц чаемо nобморяюмся, как
6 данном случае: еслц Mt>I не уходи.м домой,
+- nома6ок w.o 6оз6ращаемся 6 начало ц nо6моряем
U.HCMl?Ul<UU U . Ц/Мйбы l!\.OU AAOIМI> DLIP.m�iluшn 1'11>/�lm
'f.... Чер6як
38 rлава 1
Учимся думать как программист
J
рыбалка око нчена , отправиться домой " . СчимаiАме кни zу
рабочеiА мемрад11ю
Подо бные пр о стые инструкции служат основой для и не смесняuмес11
написания про граммно го кода. Любо е приложение l'\UCal't\11 1'\р ЯМ О в неiА;
и любая про грамма с одержат именно тако й ( разве М111 МОЛ11КО за
что немного больший п о размеру ) набо р инструкций
для компьютера .
Ом8емы
О В. Что, если у нас
на 1'\Одобные
закончатся черви?
Знаеме друz1Ае упражнения
У..р облемы? 11.ри8одямся
8 конце zла8ы
Приступим � 39
Шаг за ш аг о м
40 Гла в а 1
Учимся думать как программист
Ко� на маrнитиках
Давайте поупражняемся в составлении алгоритмов. У нас был отличный рецепт
приготовления омлета из трех яиц, записанный с помощью набора магнитиков на дверце
холодильника. Вот только незадача: кто-то пришел и все перемешал. Сможете расположить
магнитики в правильном порядке, чтобы восстановить алгоритм? Учтите, что наш рецепт
описывает два вида омлета: обычный и с сыром. Не 3абудьте свериться с ответом,
nрмееденным • конце rnaeы.
--с t
� с..-
lн�
. -
·
.
схо•ороду
4
Приступим • 41
Как пишут программь1
О
.------. п
Составьте аnrоритм. (!) р
Наживить че вя на крЮЧ<Ж. На эмом эмаl'\е мьс
О Наnиwите nроrрамму.
.s.r Ьoolt riab () :
print(•п-.. JU\1<1' 1 ' 1
.s.r wait():
print( 'Jtд-. . . ' )
Переведите соаавленный
на предыдущем этапе рецепт
print(•вa_.. "•ра•')
print ( · и-..... ·-·' )
-
в набор инструкций, записав
print('� �·)
их на выбранном языке
_-
whil• т..... :
программирования. Это этап rasponae • 1.npu� ( 'Do:aauoa "8Р8У•С8? ' )
-
if re•pon.ae 'аа' :
кодирования, результатом ia .ovin; • 'l'rue
которого будет программа, print('КЛDoyxo! ' )
hoolt fiab()
или просто код (формально •1••:
wait()
исходный код).
( 8 3мьнеuw
ем
tЧUl\l\41\1\b Эl\l\U
ен11емьсмu
5н3ем
1111ef7MUHЬI
6заuмозам
42 Глава 1
Учимся думать как программист
Поиuмаюm AU нас
kомn ьюmеры?
Bьm�xaJ! f
Любой язык программирования специально
разрабатывается для решения на компьютере определенного
круга задач. Языки программирования позволяют
Н е вол нуй те
преобразовать набор команд в понятные компьютеру сь,
от ва с по ка не
инструкции. требуется ни п исать,
н и а нал изи ровать
Чтобы изучить язык программирования , необходимо
п рограмм н ы й код. В переди
понять две вещи: какие конструкции в нем поддерживаются еще вся кни га, а се й ча
с мы
и что они означают. Компьютерные ученые называют л и ш ь з на коми мс
я с процессом
это синтаксисом и семантикой языка. Пока что просто п рог рамми рова ния. в
кон це
запомните оба термина; их смысл станет вам ясен позднее . конц ов, это ввод н ая глава.
:
Подобно языкам человеческого общения , существует . • • • • • •.• • •. • . • •. "
, ". · · ·.• • •..• • •..• "_.• • •.•.• .•·t �··-··•·:• � · "". • .�·· . :
• . • •.•. . •
Слева записан ряд инструкций на понятном для вас языке, а справа - они же на языке
программирования. Соедините линией каждое из п редложений с соответствующей инструкцией
программного кода. Первую линию мы нарисовали за вас. Сверьтесь с ответом в конце главы .
С п роси пол ьзователя : " Как тебя зовут? " p r i n t ( ' Прив е т ! ' )
Пр (lсmуп и м � 43
Мир языков программирования
Я работаю
в среде WordPress,
которая написана на РНР,
поэтому РНР - мой основной
язык. Некоторые называют его языком
сценариев, хотя он позволяет мне
делать все необходимое.
44 Глава 1
Учимся думать как программист
Я в основном применяю
язык С, поскольку разрабатываю
компоненты операционных систем, которые
Я веб-разработчик, и мой
основной язык - J'avaScript. Он
поддерживаетаt всеми современными
браузерами и часто применяется для создания
-
о серверных решений.
Как системный
администратор я часто пишу
скрипты на Perl. Они компактные, О о
но невероятно эсрсрективные. Всего
несколько строк кода позволяют
делать удивительные вещи.
Приступим • 45
Мир языков пр ограмм иро ва ния
Мы предпочитаем
Python. Это удобный Python считается
и понятный язык с боль шим одним из лучших языков для
количеством готовых библ иотек, новичков, но чем опытнее вы будете
что позволяет решать любые задачи. Он становиться , тем бол ее серьезные задачи
поддерживается огромным сообществом сможете решать. Парни из Google, Disney и
программистов. NASA не дадут соврать.
о
о о
о
46 Глава 1
Учимся думать как пр ограммист
€f.Joзьмume kapaнgaw
'" В ы еще толком не знаете Pythoп, но наверняка сможете понять
" _\, Насkодьkо де2kо назначение многих конструкций . П роанализируйте приведенный ниже
nucamь kog на Python код построчно и попытайтесь угадать, что делает каждая команда.
Запишите свои идеи в табли цу справа. Первый ответ мы вписали за
вас. Остальные ответы даны на следующей странице.
custoшers = [ ' д- ' , ' Хим ' , ' Джон ' , ' Стэйси ' ] Созд1:аvФ Cl'\UCOK клиенW\08.
flavor
�
Э W\ о образец рабоW\Ы ЛIACW\IAHZa вам
8 ммощь. будуW\ ли резульмамы
однцмц ц мемц же l'\pu каждом
заl'\уске 1'\роzраммы?
Приступ им � 47
Мир языков пр огра мм иро ва ния
�.Jозьмumе kapaиgaw
�).. Peweиue В ы еще толком не знаете Python, н о наверняка сможете понять
назначение многих конструкций . Проанализируйте приведенный ниже
HackoAьko Aeiko код построчно и попытайтесь угадать, что делает каждая команда.
nucamь kog н а Python Запишите свои идеи в таблицу справа. Первый ответ мы вписали
за вас.
cus�rs = [ ' Д- ' , ' КИи ' , ' д.он ' , ' Стэйси ' ] Создамь Cl'\IACOI< клuенмов.
winner = random . choice ( custOD1ers ) nроuзвольНЬIМ образом в1:11 брамь одного /АЗ КЛ/АеНl'l'\Ов.
Оболочка Python
По з дравляем , Соrэйси ' Вы выиграл и десероr ' P.S. Еслu захомuме набрамь эмом лuсмuнг, чмобьt
Xo'l'll'l'e с вишенкой сверх у? да
1'\роверuмь его рабому, мо добавьме в самом начале
Один ваНИJiь ный десероr с вишенкой сверху для Соrэй си . смроку import random. О мом, зачем эмо нужно,
З аказ приняоr . . . м1:11 мговорuм 1'\ОЗЖе. Кроме мого, мдчеркнем, чмо
На даННОМ Эl'l'\al'\e 01'1'\ вас Не мребуеМСЯ 1'\роверЯМЬ
лuсмuнгu. Но любоl'\ьtМсмво нuкогда не б1:11 в аем лuшнuм!
48 Глава 1
Учимся думать как программист
Ваш код �
"-�·
8 Выпоnнение введенноrо кода.
Запуск кода Pythoп заключается в его
передаче интерпретатору - программе,
которая берет на себя выполнение
инструкций. Вскоре мы детальнее рассмотрим
этот этап, а пока что вам достаточно знать, что
передать код Pythoп интерпретатору можно
из IDLE или из командной строки.
Е) Интерпретация кода.
Python - язык программирования, понятный
и человеку, и компьютеру. А интерпретатор - это
r
1-·-·� .
.,..
s· � �
nом�• '"'l*Y•C8?
\
И нмерr.ремамор
программа, которая считывает и выполняет
81:>1r.олняем Ваш код
программные инструкции. Он преобразует инструкции
в низкоуровневые команды, выполняемые аппаратным
обеспечением компьютера. Вам не нужно быть в курсе
того, как все это происходит, достаточно лишь знать,
что интерпретатор обрабатывает каждую инструкцию
Python.
Приступим � 49
Ввод и выполнение ко да Python
Пе �oi:i.mecь
'З ада В аmь Bo:nrocы
О:
стоит л и мне изучать его?
]j:
командного типа.
О:
языком п рогра м м и рования?
о А. Автор языка Python очень любил О В. Язык Python назван в честь британской
змей и ранее создал другой, менее комик-группы.
успешный язык СоЬга.
Г. Python - это акроним от "Pгogramming
О
Б. Автор языка Python любил число Your Things, Hosted Оп the Network".
о
"пи" и потому назвал свое детище
О Д.
"Пи-тон" .
Язык Python назван в честь среды
Anaconda, поверх которой он работает.
11:JшО1ешq:;:; oш:Jeh хпн ен ·эшанdгшни в nhшею хп qшadшow:;ou гшэжоvv ·" еношuеu пшноvv
uendэ:J-hШЭ!l:J 1J1qнl)n[Jawo>1 ыетэ ерсо:J 'euuЛdг->1nwo>1 ые>1:Jнешпd9 ошс - иочмd ЛJИOJIV 'В
·uoчJЛd эеш:ю'mgоо:; э
!ldn'n 11пmО1ешэи,.
50 Глава 1
Учимся думать как прогр а ммист
�
по-прежнему работоспособен.
Просто нужно понимать, что
будущее - за Python 3.
К.оw. оро. я Оt'\и со.н о. 6 следу ющих
м ы ожи дае м, ЧWI O н
2
о. ш
дбух о.бзо.цах
L?
леl'\� о.ющ ий абм омо бил
Pyt hol'\
O!J dtWI мд дер жиб ам L?
Пр иступим • 51
Краткая история Python
52 Глава 1
Учимся думать как программист
Приступим • 53
Тестируем среду
Тecmupyeм cpegy
Итак, Python установлен, и можно приступать к работе. Мы
начнем с элементарной тестовой программы, просто чтобы
убедиться, что все настроено и работает правильно. Но прежде
чем запустить программу, ее необходимо набрать в редакторе.
Именно здесь нам и пригодится встроенный редактор Python -
36.0Sheli•
Python 3.6.8 (с Open .• !СО 35)
[6СС 4.2.1 с..., dorwln
" 1
Open Module onv·aet.8.42.1)) on
Typt •c.opyright Recent f11es for11Юrеinforwotion.
>>> WAR"YNG: rt.
ICB �c�:�·:o��u��e�,����t\on,
Class Вrowser
Vistt �ttp;//IW!
1 Path�r
Close xw
Saw ICS
S-As..• OICS
Save СОРУ As.• 'C:ICS
54 Глава 1
Учимся думать как программист
- "���----�---...._....
·� f
Туре •Untit
.
>>>
Vlslt
Ln: 1 Co l: 1
fyp• • •Unti
•..
t
>>> W,pr l'\i( )
Vi��t
tn: 1 Col: 18
Приступим • 55
Сохранение кода
Сохраненuе koga
Завершив ввод первой строки программного кода, давайте
сохраним ее. Для этого вьmолните команду File > Save в окне
редактора IDLE.
8 Python Edil Format Run Options Window Не/р прежде чем В1�1млюrм11 код, его
XN
NewFile
необходимо сохраним11. В IDLE
Python 3.б.0 (< Open..• хо 35)
(GCC ' ") " r" Open ModuJe". """ OQQ 4 А-, 1'\,
•untk...
"" _."_.,;_
команда Save находимся В меню
Type • Recent Files "
»> W1 print( Fi/e. после В1�1з0Ва эмой командt�!
Class Browser хв
Vlsit
Pзth Browser укажиме имя, мд комор1�1м
Close xw будем сохранен файл. В случае
Save As". oxs
кода Pytf..ol'\ необходимо добаВим11
� �
Save Сору As." \:XS В конце имени расширение ".ру"
Pr1nt Window ХР
0.t•Addtd
iCloud
0..-ices
- ,;]�
'i?il�>·�
Tecm-дfi\}{:в Наступил решающий момент. После сохранения кода в отдельном
файле выполните команду Run > Run Module. Результат работы
программы должен появиться в окне оболочки Pythoп.
Python
(G(( 1
3.6.0 (default, Feb 22 2017,
? 1 rA�A• • � 1 A
Туре
Чмооо� заl'\усмимь
1'\рограмму, 8t�11'\олниме >>> W rr\nt( VoU rOC )
ViSit
команду Rul'\ > Rul'\ Modu/e.
Если 1'\рограмма не 01�1ла
сохранена, 1'\ОR8имся
соом8емсм8ующий заl'\рос
/Python 3
6.О Sh�l.py (3.6.О)•
.
•Python 3.6.0 She11.py -
/Users/ericfreemanJDeslctop
0 (defci1.1lt, Feb 2 2 2017 • 13.·46:35)
.
Pyt
h
о�.32'61' CompattЫ e Apple LL'IM
1
8.0.0 (с ang-
800 0 42 .1)] on dcirwin
• .
[GCC •
••
top/chl/rock. ру
=
-
• •••••••
ricfree111cin/Desk
RESTART: /Users/e
Ln: 9 Col: О
Приступим � 57
Первая программа г от ова!
Не секрет, что процесс написания программ чреват ошибкам и . Есл и ваша первая
поп ытка оказалась неудачной, не отчаивайтесь: все разработчики регулярно занимаются
устранением ош ибок в собственном коде. Дадим ряд советов.
При получении сообщения типа i nva l i d s yntax п роверьте правил ьность расстановки в коде знаков
препинания , например скобок. Найти подобные ошибки несложно, п роверив цветовые выделения в окне
редактора I D L E .
При поя влении сообщения вида Python NameE rror : name ' p r i n ' i s not de f i n e d проверьте наличие
опечаток в коде , в частности, в написании ключевых слов. В данном случае с ошибкой введено ключевое
слово p r i n t .
•
Сообщение вида EOL wh i l e s c anning указы вает на отсутствие одной из парных кавычек в зап исях
строковых значений, таких как ' Y ou r o c k ! . П роверьте , чтобы кавычки были с обеих сторон: ' You ro c k ! ' .
Пе t'ioumecь
за даВ аmь 13 о:rэуось1
О:
она связана с выводом на экран (в нашем случае
это окно оболочки Python), а аналогичная команда
Файлы с программным кодом Pythoп
называются модулями. Поэтому команда Ruп
input , с которой вы могли познакомиться в одном из
предыдущих примеров, служит для получения данных
Module означает "выполнить весь программный код от пользователя в окне оболочки.
D:
Pythoп, содержащийся в данном файле" . Модули
часто применяются для более удобной организации Можно ли вы вести дан н ь1е, не обращаясь
программного кода, о чем мы поговорим позже.
D:
к команде print?
Я часто сл ышу тер м и н ы " ввод " и "вы вод " . Что
это значит?
О: Конечно. Команда print обеспечивает лишь
О:
самый простой способ. Компьютеры, а потому
и языки программирования, поддерживают большое
В нашем примере все очень просто. Вывод количество всевозможных способов вывода (и ввода)
(или выходные данные) - это текст, генерируемый данных, и Python в этом смысле не исключение.
программой в окне оболочки Pythoп . А ввод (или В Python данные можно выводить на веб-страницы,
входные данные) - это текст, вводимый пользователем передавать по сети, записывать в файлы, отображать
в данном окне. В общем случае входные и выходные на графических устройствах, прослушивать с помощью
данные могут быть связаны с любыми устройствами: звуковых проигрывателей и т.п.
D:
данные можно вводить с помощью мыши или
сенсорного экрана, а выводить - в графическом Когда я ввожу команду типа print ( ' Пp118err ! ' ) ,
и звуковом виде.
D:
что на самом деле происходит?
58 Гл ава 1
Учимся думать ка к програ ммист
Py"t hon :в э фи ре
И нтерв ью н едели : " В ы серьезно?"
[Редакция Head First] До б ро пожаловать Думаю, вы согласитесь, что так намного проще
в студи ю! В сем не терп ится поскорее и понятнее. Любой человек, взглянув на эту
познакомиться с вами . строку, поймет ее назначение. И это лишь один из
примеров. Все, кто изучают Python, находят язык
[Python] С удовольствием отвечу н а ваши вопросы.
понятным, согласованным . . .
Итак, ваше ИМJI заимствовано у комик-группы,
Согласованным? Что это значит?
и вы известны как язык, с которого начинают
знакомство с программированием. Скажите Это означает, что вы навряд ли столкнетесь с
честно: вас воспринимают серьезно? неприятными сюрпризами. Другими словами,
как только вы начнете более-менее понимать
Сами посудите. Меня применяют во множестве
синтаксис языка, вы обнаружите, что большинство
промышленных систем: от производства
конструкций работает именно так, как вы
микросхем до голливудских фильмов и центров
ожидаете. Далеко не все языки программирования
управления воздушным движением. И это далеко
могут похвастаться этим.
не полный список. Достаточно серьезно?
Давайте вернемся к тем системам, которые
Хорошо, раз вы такой серьезный язык, то как
вы перечислили . Управление воздушиЬIМ
новичкам вас освоить? Системы, которые вы
движением, производство микросхем,
только что перечислили, весьма сложные.
ракетостроение и прочее - все это очень
Разве для их реализации не требуются
сложно и профессионально. Боюсь, для наших
узкоспециализированные, сложные решения?
читателей это не лучший вариант.
Одна из причин, по которой меня ценят как
Ракетостроение? Давайте не будем пугать людей,
новички, так и профессионалы , заключается
я ведь такого не говорил. Я лишь привел примеры
в простоте и понятности моего кода. Когда-нибудь
отраслей, которые вполне можно считать
видели, к примеру, код того жe Java? Боже мой, это
серьезными, раз уж вы засомневались в моей
же ужас ! Сколько усилий нужно приложить, чтобы
серьезности. Но в основном Python применяется
просто вывести " Hello World! " - а у меня это всего
для создания сайтов, разработки игр и написания
одна строка.
пользовательских приложений.
Не шутите? Все настолько просто?
Ладно, поговорим: о другом. Известно, что
Раз уж мы заговорили о Java, приведу пример. существуют аж две версии Python, причем, как
Предположим, вы хотите вывести строку бы это поМJ1гче сказать, они несовместwкы друг
" Приве т ! " . Вот как это делается нaJava. с другом. Вы называете зто согласованностью?
Что вообще все это значит? Неужели все это к концу. Спасибо за столь содержательную
настолько необходимо? А вот вам моя версия. беседу!
p r i n t ( ' Привет ! ' ) Что ж, до новых встреч !
Приступим � 59
Первая программа готова!
Воспользовавшись программой
Phrase-0-Matic, вы научитесь
придумывать классные слоганы,
как парни иэ отдела маркетинга.
в однои из •
поговорим о них noun randoin .choice(nouns)
учив
последующих глав. Пол
, как
представление о том
работает код, переход
ите
о 1 Составn111м +P•JJ, "суммируll" всетри сnова
phrase • verb + '
ице,
к следующ ей стран ' + adjective + ' ' + noun
трим
где мы все рассмо
подробнее.
:..................
............
. . . . . . . . ....
.......... .
1 Выводим rOТ08JIO tpuy
print(phraae)
60 Глава 1
Учимся думат& как пр ограммист
Ph rase-0- Matic
В общих чертах работа программы заключается в выборе
одного слова в каждом из трех списков и комбинировании их
в определенно й последовательности для получения готово й
фразы, выводимой на экран. (Чем не слоган для новой
компании? ) Не расстраивайтесь, если не понимаете всех
нюансов работы программы. Вы ведь только начали изучать
программирование, не окончив даже первую главу. На данном
этапе мы просто знакомимся с программным кодом.
Приступим � 61
Запуск кода на выполнение
XN
Open.
Python 2
O!*>Module".
хо afa7e5f, uec 10 2014, 10:10:46)
[GCC 4 . 2
Reoent F11" -1
�d 56��! (dot . � ! J .on darwi�
хв __ __ __ _ · ____ nомнuме о tv1oм, чt1110 IDLE
•
Туре -. _ _ _
1.1 " •
11е<1
_
>>>
CI� BrowМt _
,..• P9th 0row!WW 1'\Одс6ечц8агм элгменt111111 кода
с , 6 заВuсuмосмu ом uк назначенuя
J
M
l§
ictii:
Ч
. ill•••�
f
�".
ve СЮ$е xw
з.."Аs". �хз
8'м! Серу "" . "xs е
IDLE мак.же 6сма8лягм нгобходuм111
хР
ad
Print Window
кла8цшu
омсмуl'\111 меле нажамuя
nouns : ( <Eritгr>
62 Глава 1
Учимся думать как программист
•
IDU! • EOt - · - - -
°"'
�--��----���
�8'1ol
Pytllon 2.7 . 9 (v2.7.91f �-" хх 10 2014, 10110:46)
� �:��-1���· !��···§'@!
о
·•�.�!1.?� ���i�_."_.",""
�
;; • �PJ-�tь� w.�pyc:,1.a
-
'r"t renc1c84
J
ц /\ОЛ!JЧIАЛIА макце резуЛР""'4W\ЬI
>>>
Sync В-tо-в Early Adopter
>>> ••аааае===аа:а�а
�= а�:=а� RESTART ===�•zs:ccaa•z•-c=.�---=
===•iaa=:;_••
>>>
Leverage Siloed Productivity
>>> =-=•=t.=•••111Ja-:1&c·a&:••
:- -==�==--==-= RВSTART S;ill�;t=--=���
==.a=a=-=·=-
>>>
24/7 А/В тested Low-hanging Pruit
>>> ==3а====а•е=�:::=
:�� са==== RESTART
====-==z•=•
>>>
Crowd-sourced API-based Tipping Point
>>> •••••••--••••-------8-nl:--••••••• RESTART
---···--··
>>>
Sync API-baeed Low-hanging Fruit
>>>
Lл: 9 Со1: о
Приступим • 63
Самое гл а вно е
�САМОЕ fllAIHOE
64 Глава 1
Учимся думать ка к програ ммист
1 2
3
4 5
6
7
8
9
10
11
12 13 14
15
По rориэонтаnи По вертикаnи
6. Команда в коде 1. Процесс выполнения программы
7. Устройство визуального отображения 2. Окно ввода команд интерпретатора и вывода
информации результатов работы программы
1 О. Программа, которая преобразует код 3. Текст программы
Pythoп в машинны й код 4. Другое название алгоритма
1 2. Операция подключения внешнего 5. Программа, записанная в произвольной форме
модуля в коде
8. Правила написания кода
1 3. На нем пишут программы
9. Процесс создания программы
1 4. Файл, содержащий код
1 1 . Порядок выполняемых программой действий
1 5. Внешний подключаемый файл Pythoп
Приступим � 65
Упражнения: решения
�J!зьмum е kapaнg aw
В рецептах блюд содержатся не только инструкции по их приготовлению,
"� Peweнue но и перечисляются все необходимые ингредиенты (в программировании
м ы называем их объектами). Какие объекты используются в рецепте
рыбно й ловли?
ф Наживить�а §>
<!) Заки нутьfЕман�в�
{!:) Следить за� пока он не дернется.
{!) Выудит�
® Если ры балка окончена, отправиться �иначе вернуться к п. 1 .
��озьмumе kapaнgaw
,�� Peweнue
Прежде всего вы должны понять, что компьютеры выполняют в точности те команды , которые
вы им передаете, - ни больше ни меньше. Рассмотрим рецепт рыбной ловли , приведенный
в начале главы . Если робот будет следовать ему буквально, то с какими трудностями он может
столкнуться? Насколько успешной будет такая рыбалка?
if А. Если в пруду нет рыбы, if Г. Что делать с рыбой после того, как мы ее поймали?
то вы будете ее ловить
очень долго (т.е. вечно).
if Д. А что делать с удочкой?
� Б. Если червь сорвется � Е. fсм" лu F\ptt8uлo. эо.6ро.сь�8о.нuя удочкu? fcлu чер8"
с крючка, то вы не узнаете
об этом и не сможете его ММдем НА ЛUСМ 1<y8LCAUHl<U, МО НУЖНО ЛU 8се F\О8морuм"?
заменить.
)
Обь�чно, ко.к мол"ко ммо.8ок уходuм мд Воду, мь� сно.чмо.
if В. Что, если у нас
"мдсеко.ем" рь�бу. Здес" об эмом нuчего не ско.эо.но.
за'°нчатся черви К.О.к мь� узнаем, чмо рь�бмко. окончено.? по 8ременu? К.Огдо.
у но.с эо.кончо.мся чер8u? Илu еще ко.к-мо?
Похоже, F\po.8uл"ньi
�
iA ом �м: В эмом рецеr\Ме мь� сделмu цель�й ряд rо.редмложенuй.
нное Но.8ерняко. 8111 rо.рuдуммu множесм8о другuх uнсмрукцuй,
"Все 8ь�шеr\8речuсле коморь�е эдес" не уко.эо.нь�.
66 Глава 1
Учимся думать как программ ист
2· 12 · · ' ·
1. �.
2
./ О брамиме Внимание на омсмуn данного эмаnа:
Вsб�:ь кйца � мем сам111м м111 мказ1118аем, чмо дейсмВие
f
'
� Далее В111ли8аем яйца на ско8ороду...
8111млняемся, мка яйца не будум Взбим111
3 ... . ' 1 '
t
мем сам111м м111 nоказ1118аем, чмо дейсмВие
1. Переи8111ИВа�n.
2. • ' ' ' ... 8111nолняемся, nока яичница не будем zомо8а
1t
Если клие нм захомел с111р , доба8им11 его
IUDl&H'l' sакааап сыр :
;;
1 СИЯ'Мt сковороду с D.DИ'1'Jol ' далее сним аем ско8ороду с мим 171
и 8111клад1118аем яични цу на w.арелку
· . а au .и
Приступим � 67
Упражнения: ре ш ения
Слева за п исан ряд инструкци й на понятном для вас языке, а справа - они же на языке
программирования . Соедините линие й каждое из предложени й с соответствую ще й инструкцией
программного кода. Первую линию м ы нарисовали за вас.
и я й ца.
Н але й пять нап итков. g r o c e ry_l i s t [ ' хл е б ' , ' молоко ' , ' яйца ' ]
С п роси пол ьзователя : " Как тебя зовут? " / \ p r i n t ( ' Пр и в е т ! ' )
1 2
з к
•
а о
п 3 н
xr�ccn�rn.:
4 к 5 с
6 и н с т р у к ц и А о п о
к е 7 д и с п л е й
rешен11е, 8
ц
е
е
в
ь
с п 9 д
10 и н т е р п р е т а т о р
н а к 11
12 и м п о р т 13 А з ы к 14 п р о г р а м м а
а р д л
к а г
с б о
и 15 м о д у л ь р
с т и
к т
а м
68 Гла в а 1
2 11наченuн, :nereмeШIЬie u m:• даШ!ь�Х +
+ Сна чала было зна чение
о
о
/Т
Т93цк, :1-.2. лем
70 Глава 2
Значения, переменные и т ипы да нных
��ьмumе kapaнgaw
� .��
Ита к, нам предстоит написать псевдокод. Для начала подумай
те, как
бы вы описал и алгори тм, или рецепт, выч ислени я возраст
а собаки по
человеческим меркам . Далее запишите все свои соображения
в виде
простых текстов ых команд . П рограм ма должна взаимодейств
овать
с пользо вателе м, спраши вая у него имя и биологический возраст
собаки .
В конце необходимо вывести что-то осмысл енное, нап ример: "Вашей
собаке Рокки сейчас 72 по меркам людей " .
В общем , просто запиши те псевдокод на своем родном языке.
В ажно: прежде чем двигаться дальше , сравните
свое решени е
с нашим в конце главы.
Еслv. utl'\lll Mlll6aeмe замруднения,
не с мес ня й мес о мдсмомремt>
решение
За l'\ uщ v.м е
зде сь с6ой
}
1'\С е6до ко д
Оболочка Python
Как зовут в ашу с об аку? Туз к
См о.йл v. , j. г од и
Сколь к о ле т в ашей собаке ? 12
В ашей собаке Туз ик сейчас 8 4 п о
мерк ам людей
>»
Филя,
s леW\
2.
2. Спросить у пользователя возраст собаки.
3.
получить возраст по человеческим меркам.
4. Вы вести на экран:
72 Глава 2
Значения, переменные и т и пы да нных
Пе �oumecь
задаВаmь Во11rось1
О:
языке п рограм м и рования?
r-- ч
B t11 с е u а с здес ь
�
Теперь мы готовы реализовать первый этап -
1. Спросить у поnьsоват81U1 •- со6•ки.
получение от пользователя имени собаки. Согласно
2. СпрОСlllТЬ у ПОдИОВ8Т81U1 808р8СТ Co68IOI,
разработанному ранее псевдокоду сначала нужно
3. 1Т ВОSР8СТ COHIOI Н8 7, что6111
Умно11111о
попросить пользователя ввести имя, а затем это имя получить воsр•ст по чепоичкк11м мерuм.
необходимо где-то сохранить, т.к. оно понадобится в п. 4, 4. Вывести н• акр•н:
·вашей собаке'
когда мы выведем имя и возраст собаки по человеческим
меркам. Итак, нам нужно сделать две вещи: запросить
у пользователя имя собаки и сохранить имя на будущее.
11- COHКll
'сейчас•
чеповечес1111й воsр•ст со68ки
Сначала займемся запросом.
'по меркам людей'
В главе 1 вам уже встречались фрагменты кода,
,
в которых использовалась функция input ( ) ,
11
ег ляt:�н0 uмet'V\
В к ниг е М !11 б"
отвечающая за получение данных от пользователя. Это ое м f' у
С 6 f'eмене м 6 ы
u
:J
/ :J ям и , и О
дел о с 'f' 1J к
одна ИЗ МНОГОЧИСЛеННЫХ встроенных функции Python. м н ци Ч VV\ O
IO VV' о. 1'\ОКО.
� ни f' a б o VV'O.
l'\O йMerv\e , ко. к 0 кци я - эrv\O
ЧW\ 'f' у н
Сначала рассмотрим синтаксис вызова функции 0 м
HO зн о. VV'Ь ,
input ( ) , а затем разберемся, как она работает. oo c VV'O. VV\ OЧ 6ыl'\o л нuVV'ti W\O
С l'\О СОб l'\01'\f' O CU b !:1 но.с ' не бесl'\ОКО ЯС Ь
VV' р tl-l ol'\
1\::_, Синw.о.ксис оl'\реоеляеw. cl'\Oco5 зо.1'\uси ил u иное oe uc
rv\6и e 30.
инсw.рукци iА на б111 5ранном яз 111 ке
г (
1'\рогро.мми ро бо.ния
\input l Гtl�\"I<a:к з овуm вашу coбa:кy? " I L!JJ Г\l закры ваю ще й кругл о й скобко й
Закрепцм
Когда интерпретатор встречает вызов функции
i nput ( ) , он вы водит текст запроса в окне
(
Тексм Mt>I наз1:>1ваем смрокой..
Смрока - эмо ri.pocмo набор
(
Сл ева указ ы вается п еременн
ая,
� С права сто ит зна чение;
есм�, множесf'\'\во других f'\'\имв
значениi:i, наr.ример числа,
о коморt>1Х МЫ вскоре мговориМ
т. е . имя, которое м ы можем в данном случае это
мно гократно и с п ол ьзовать стро ка ' Тузик '
в п рограмме
74 Глава 2
Значения, переменные и т ипы да нных
г
это делается.
i
исмльзо8аw.ь оди н др н 111 е и 08oiiн111 e
ка61�1чки ? Вскоре Mlil 8се эмо обсуоцм
dog_name = input ( " Kax зовуоr вашу собаху? " )
\
К.оzда 1'\ОЛ11З о6аw.ель за канчи8аеw. 88одиw. ь имя,
функция input ( ) l"lepeдaew. эw.о имя н азад
8 1'\рогрдмму 8 биде 8оз8рдщо.емого значени я
Воз8рдщдем о е зндчен ие
"ри с8о.u8деw.ся мр еменн оii dog_name
[ nepexoiJuM К l'\YH KW.Y 2.
2.
Спросить у поnьаоватеnя имя со611 1111 .
Кроме имени, у пользователя нужно еще запр о сить 3. УмноJ11МТЬ воараст со611ки на 7, чтобы
поnучмть ВО3р8СТ по Ч8110ВВЧ8СIСИМ меркам.
биологический возраст собаки. Как это сделать? Точно так
4. ВЫВВСТll Н8 •кран:
же - с помощью функции i nput ( ) , только на этот раз указав
•вашей собаке'
текст "Сколько лет вашей собаке?" Полученные данные мы
11мя со6аки
сохраним в переменной dog_age . Хотя правильнее сказать не "сейчас"
"мы сохраним" , а "вы сохраните " , т.к. вас ожидает очередное чеnоввческиli воараст со611 ки
,,.
�ПРАЖНЕНИЕ
Теперь ваша очередь. Напишите код для получения биологического возраста собаки с помощью
функции input ( ) . В ыдайте пользователю запрос " Скол ь ко лет в ашей собаке ? " и сохраните
результат в переменной dog_age. Сделайте пометки, уточняющие назначение каждого элемента
кода. Сверьтесь с ответом , приведенным в кон це главы , прежде чем двигаться дальше.
Оболочка Python
Python 3 . 6 . 0 ( default , FеЬ 22 2 0 1 7 , 1 3 : 4 6 : 35 )
[GCC 4 . 2 . 1 CompatiЫe Apple LLVМ 8 . О . О] on darwin
Номе р t1 в е р сии. L! Ht\ЧtlЛt>H/:ll e
Туре " copyright" , " credits" or " license ( ) " for more information
е ия M O Z!:J WI OWIЛUЧtlWll>CЯ,
с о о бщ н
6 заВисим о сrли берсии
»>
�
O VVI �
н и
Эмо r�ри.zл ашени. е и.нмерr�рема мора дисtv1рибу ми6а и оn.ер1щи о но
команд. Он .ждем, чмо 8!:11 чмо -мо 88едем е. си смеМ t>I
Найдите в окне оболочки приглашение командной строки, которое выглядит как >>>.
Введите 1 + 1 и нажмите <Enter>. Интерпретатор Python вычислит выражение
и отобразит результат (в нашем случае 2 ) , после чего снова выведет приглашение
командной строки . Теперь вы знаете, как работать в оболочке Python ! Далее попробуем
выполнить интересующий нас фрагмент кода.
О Введите в оболоч ке код , запрашивающий имя собаки , и нажмите клави шу < Enter> .
76 Глава 2
Значения, переменные и типы данных
Как зо в ут в ашу со б аку ? Р окки t<-- в ве оиW1е имя свое й собаки 6111 ч ислениЦ, 6 оw.личие,
и но. жМиWlе клавишу <En.ter> но.n.р имер, ow. оn.еро.циц
>»
:J. + :1-. Вмесw.о эW1ozo,
как бы уже зно.еме,
Python. млучим имя собаки, сохро.ниWI его
n.роzраммо. берем
значенL.lе cn.p o. 60. ом
и n.рисвоиWI n.еременн о й dog_name. После эW1ozo
в111 уви оиW1е новое n.риzло.ш ение КО МО.Н ОНО й СW1роки
знака ::: и n.рцсваиво.еw.
ezo n.еременной,
СW\ОЯЩеU слева
Переменная dog name будет хранить значение Рокки ' или другое
'
3 а м е м ь w.е , ЧWIO
функция print ( }
6ы600L.1W1 с W1ро ковое
значение без кавычек,
� в ОW\ЛиЧие 0 1'11\
1AHW1ep n.pewн:iмo p o.,
коw.орый заключаем
сw.року 6 ко.бычки
�
Ч мобы одuнар ную ка вычку можно было
uс nользо8амь в смроке, заключuме
мексм 8 двойные ка8ычкu
78 Глава 2
Значения, переменные и т ипы да нных
Ь0 i7<:tZOJ
Tecm -n.r�в __;s
М ы е ще не закончили наш калькулятор, но уже сейчас можно
протестировать имеющийся код, чтобы убедиться в отсутствии ошибок.
После сохранения файла выполните команду Run > Run Module
nuкмоzрамма "Тесм и посмотрите, что выводится в окне оболочки Pythoп . П рограмма
драi.16" означаем, чмо должна запросить имя и биологический возраст собаки.
нужно сделамь n.аузу
u У1.роW1есмuро6ам1>
uмеющuйся на данн1>1i.1
моменм к од
nомниме: на да нно м
эW1аУ1.е У1.роzрамма лuи,н,
СУ\ращv.баем uмя u 6 о зра с м
собакu, м ел е чего 6 ы 6одu м
1'\рuzлащение командной
смрокv.
П оgро6нее о nереме н н ых
Вы уже знаете , как объявить переменную и присвоить ей значение.
Но как работают переменные и как использовать их в программе?
Давайте потратим немного времени, чтобы получше разобраться
с переменными, после чего мы наконец завершим наш калькулятор
возраста собаки. Для начала узнаем, что происходит в процессе
присваивания переменной значения.
компьютера свободную ячей ку и сохраняет в н ей заносиW\ муда ' Туз и:к '
указа нную строку. П редставим это как пустую
чашку, в которую помещается строка ' Тузик ' .
r
Дал ее созда емся мем ка
dog_name ,
интерпретатор Pythoп создает метку
dog_name, которая прикрепляется к чашке.
коw.ор ая
с6языбае W\ся с адресом
знач ения 6 1'\ам ямц
phrase
phrase = " Вашу собаку зовут "
dog_age
dog_age = 1 2
о
Теперь для получения значения, сохраненного
в памяти компьютера, достаточ но обратиться
к соответствующей переменной.
�
print (phrase )
print ( dog_name )
80 Глава 2
Значения, переменные и типы данных
До6а8дяем Вы ра>kенuя
В приведенных выше примерах переменным присваивались только простые в r.рограммu ро8анuu
значения, но так будет далеко не всегда. Во многих случаях значения переменных оr.ерацuя умноженuя
�
представляются вычисляемыми выражениями , которые напоминают самые обозначаемся сuм8олом
обыкновенные математические операции. Для записи таких операций " з8ездочка" (*)
применяются операторы + , - , * и /. Например , что если наш Тузик стал
на год старше?
ВоИА 8ь�ра.женuе
м зна к + �·
� Мtп казt>t 6ае l - 01\et:ill.Kll<M"�
�11.мu
/ \ 11. ч u с ла 12 u �
dog_age = 12 + 1 �
'-.__/ dog_age
l
1',.
/ Резул1�м11.мом будем
едuнсм6енное значение: 13
L' инсмрукцuu
В резул1�м11.ме 8ь�r.олненuя эмо й
1'1.еременной weight
будем r.puc8oeнo значение 1 7 . 252
avg = ( 12 + 5 + 1 ) / Э avg
tuzik = 12
Везде, где смоиw� мременная, avg
она заменяемся сбоим значением
philly = 5 l'l.pu 8!11числениu 8ь�ражения )
smiley = 1 .,/
avg = ( tuzik + phi l ly + smiley) / Э
зi>ai>u M
д a6a u W\e co
г не сколько
с W\ р ок
мessage
j
greeting = ' Привет , '
name = ' Тузих ! '
message = greeting + ' + name <--_
� rи соедuнuм (мочнее,
В резульмаw.е 1'\Олучаем
смроку ' Привет , Туз ик ! ',
коw.орая 1'\� uс8аu8аемся
конкаменuруем) щ<
1'\еременноц mes s age
8месме
Uзмененuе nереме н н ых
Термин "переменная" означает, что значение может со временем измениться.
Рассмотрим, к примеру, рост Тузика, который первоначально равен 22 см.
dog_height
do9_hei9ht. Такuм образом, значенuе
эw.ой 1'\еременной меняемся с 22 на 23
Впрочем, существует более удобный способ обновить рост собаки. Вот, что можно
сделать, если Тузик подрос еще на 2 см.
dog_height = dog_height + 2
везде, где
M!J 6 "'pa6ou dog_height
8 переменная доr.ускае�мся
ТТосле эмоzо но8ы м о ож ui>м мс я зна чен uе, l'\OЭ l'V\O
�
82 Глава 2
Знвчения, переменные и типы данных
поговорить о приоритете
твоих операций".
Пpuopumem onepamopoB
Выполним следующую инструкцию:
mystery numЬer = З + 4 * 5
_
HauбOAbWU:r
U Д6е з6ездочки означаюм оnграцию
6оз6tдения 6 cмentнtJ, коморая
� Если еще не забь�ли мамемамику,
мо 2**3 означаем :2.3
** имеем наибол11ший nриоримем
� Далее no смаршинсм6у идем омрицание Опtрамор % означаем деление no
(м.е. знак 'минус' nгред числом} модулю, м.е. 6зямие осмамка ом
*
+
/ %
�
деления. Наnример, 7 '- 3 = :1.,
nомому чмо целочисленное деление
7 Н" �"ем :2.' и 6 осмамке n
" "' о" оличае
::1 м :1.
H1uмeньwuii
�В А;:;,,
и в степ е н ь,
затем ум н ожен и е, де лен
и е,
"" л "' ю "' " ум"°'"""' " сл оже н и е и н а к н
о ец
деление. У нщ< равн111й V1pиopиl'\l\el'l'I, в ы чи та н и е.
21 r..o эl'\l\oMy очередносl'\l\ь мо.жеl'\I\ бы /IV\ь
1 любой (резуль11V1а11V1 один и l'\l\OllVI же)
Наименьший V1pиopи11V1el'\I\ / В ин11V1epr..p e11V1al'l'lope Pythor.. вы
k-' млучи11V1е резуль11V1а1'\1\ 2 1 . о.
имеем or.. e pal'l'lop сложения.
получаем 3 -r :1-8 = 2:1- почему 1'\1\аК, узнае/IV\е r..оз.ж е
Числовые выражения вычисляются в порядке приоритета операторов (от наиболее
к наименее приоритетному) . Для простоты в данных примерах используются только числа,
хотя в общем случае выражения могут включать как числа, так и переменные - к ним
применяются одинаковые правила приоритетности.
Но как быть, если нужно изменить заданный по умолчанию порядок выполнения
математических операций? Как заставить компьютер сначала сложить числа 1 и 2 и только
после этого приступить к умножению и делению остальных частей выражения? Конечно
же, с помощью скобок! Скобки - это оператор специального типа, позволяющий изменять
порядок выполнения операций.
�у
g �
\.___ _./
Далее необходимо вымлнимь возведение в c/IV\er..e нь
(32 = q), ""режде чем в111м лнямь умножение или деление
(1 4 - 9) * 3 2
3. 1 41 59265 * 3**2 15
Э l-1!\ о оr. е r� ация деления no модулю.
21
р
О на ши око nрименяемс я 6 42
nрогр а м миро6ании, хом ь и 2 8 . 2 7433386
ка же l-1!\СЯ смранной. Другое h' + 'е' + '1' + '1' ' '
+ о
42
'
(7 - 2) * 3 'hello'
�НИ! В игре в наперстки используются три непрозрачных стаканчика и небольшой шарик. Для
програ м м ной реализации игры нам понадобится несколько переменных и значений.
Используя все свои знания о переменных, значениях и операциях присваивания ,
попробуйте сы грать в игру. П росмотрите код и оп ределите переменную, которая после
выполнения последней операции будет содержать значение 1 . В каком стаканчи ке
окажется шарик: 1 , 2 или 3? Делайте ставки , господа!
cupl = о
cup2 = 1 nonpoбy uw.e в уме 6t>1nолни мь nри6еден нt>1й здесь код
сuрЗ = о и оnределимь nеременн11ю, коморая 6 конце б11 дем
cupl = cupl + 1 содержамь значение :1.. . Сб ерьl-1!\есь с ом6емом , nри6еденнt>1М
-
в конце главы (сам код 86одимь не обязамельно).
cup2 = cupl 1
сuрЗ = cupl
cupl = cupl * о
cup2 = сuрЗ
сuрЗ = cupl 1 з
cupl = cup2 % 1
сuрЗ = cup2
-
cup2 = сuрЗ сuрЗ
wordб
word7
'trots'
' ru n s '
�
word8 'Ыuе'
word9 'red'
wordlO = 'yellow'
passcode word8
passcode word9
.
passcode passcode + f'
print(passcode)
86 Глава 2
Значения, переменные и т ипы дан ных
True break del finally if lamЬda pass whlle И нмер "'-ремамор Pyt�o.... Выдае м
and class ellf for lmport nonlocal ralse with ощцбку илц "'-реду ....режде ние, если
8смре мцм одно из эмих слов
8 качесм8е имени "'-еременной
Пе �ofunecь
D: D:
�адаБаmь Боnrось1
super turЬo mode. Как будет показано
_ _
О:
далее, подобные соглашения существуют
znyvariaЬle и МyVariaЬle?
О:
не только в отношении имен переменных.
Это слово, которое Python Кроме того, эти соглашения специфичны
зарезервировал для собственных нужд. В Python это имена разных для Python. В других языках свои традиции.
D:
Такие слова являются частью синтаксиса переменных. Python чувствителен
языка, поэтому использовать их в качестве к регистру символов. Другими словами, Но как подобрать для переменной
имен переменных не допускается. прописная и строчная буквы считаются хорошее имя? И важно ли это?
D: О:
разными. Подобное поведение характерно
А что если кл ючевое слово для большинства современных языков
Интерпретатору Pythoп абсолютно
программирования.
D:
является лишь частью имени все равно, какое у переменной имя,
переменной? Можно ли, например, если оно соответствует требованиям
назвать переменную i f_only (имя Есть ли какие-то соглашения синтаксиса. Имена переменных важны
содержит ключевое слово if)? об именах переменн ых? Какое имя
О:
для программистов. Старайтесь выбирать
предпочтительнее использовать
простые и понятные имена, чтобы
Конечно же можно. Имя не должно для переменной: znyVar, МyVar или программный код был более читабельным.
в точности my_var?
О:
повторять ключевое слово Слишком короткие имена неудобны,
Pythoп. Желательно также не использовать равно как и чересчур длинные. В целом
имен, которые можно было бы спутать Да, такие соглашения существуют. называйте переменные так, как вам удобно.
с ключевым словом, например elz•, Имена переменных принято набирать Не обязательно называть переменную num,
напоминающее elae. символами нижнего регистра. Если если можно использовать более понятное
имя содержит несколько слов, то они _ _
имя numЬer of hotdoga.
разделяются символами подчеркивания,
например max_apeed, height или
>>> human_age
"\ В t>18едем значен ые
Псевдокод калькулятора
полуЧIАЛIА 8 4. OWIЛUЧHO, как раз WIO, ЧW\О Н!:j.ЖНО! возраста собаки
1. Сnросмть у nonьsoвilntJlll им11 со6акм.
4. Вывести на экран:
"Вашей собаке'
им11 со6акм
'сейчас"
Mt>1 сейчас здесt>
----.:r
чеnовеческий возраст собаки
'по меркам людей'
�ume kapaмgaw Вот код нашего калькулятора, написанный на данны й момент. До бавьте к нему
код вычисления возраста по человеческим меркам, используя в качестве образца
приведенный выше проверочный код.
ЗanuшuW1e эдесt>
с8ой код, а эаW1еМ
c8ep 1:>W1ec1:> с om6eW10M,
nр ежде чем д8игаW11:>ся
далt>ше.
88 Глава 2
Значения, переменные и типы да нных
Ъд&ti, ';�.
Давайте протестируем код, написанный на третьем этапе. Сохраните программу
Tecm-n.r�в в файле dogcalc.py и выполните команду Run > Run Module. После этого
перейдите в оболочку Python, введите имя и биологический возраст собаки
и убедитесь, что программа возвращает правильный результат.
Вот наш код.
Неuз 6е>k носm ь owu 6ok Термuн � " ( ом англ. " "ug " -
жучок) 6ознuк uз-за 11\1\0ZO, Чll\llO
Поиск и исправление ошибо к - это неотъемлемая часть одна uз r.ер6ых программных
программирования. Независимо от того, насколько хорош
о о щ uбок была 6t�1з6ана жучком ,
составлен алгоритм (псевдокод) , проце сс написания исход заемРяВшuм между конll\/lакмамu
ного �
J
кода программ всегда будет сопровождаться возникновением реле 6 ЬIЧUCЛUll\lleAbHOU
ошибо к. Для программиста отладка - рутинная повседневная машuнЬI. В резул"11\11 " "11\1\е
" - '
операция. Что такое отладка? Это проце сс поиск а ошибо к процесс 6 ыя6леню1
.:
.
в программе. Неформально такие ошибки называют багам r.рограММНЬIХ ошuиок
Cll\ll t:IЛ наЗЬI 6 Qll\l\bCЯ dе Ь ц99 1 r.9
и.
( 011\1\ладка) . См . https://ru.wikipedia.
В процессе написания программ вы будете сталкиваться
с ошибками трех типов.
orglwiki/npozpaммнaя_oшuбкa
01JI}!� в.Ъt1J�.ARe-Rft11
ают.' коrда Pyt
Оw иб ки вы nо
�� :'":�: :::�
пн ен ия во зн ик
си нта кс ич ес ки h on не может
ко е вы по пн ит ь
в п р о г р ам ме с а . Та ко е может п ро
мму
��:�:��� �
лу ча ы изой т и, есл и
а т ел е н и е н
мате ма ти чес кая а н ул ь ( н едоп у т
: :;
оп е р а ц ия в л юб с и мая
ом о
т и па, н ужн о отсл ис п р а вит ь ош и б ку та ко го
ед ить, ка к а я о ц
п ер а ия п ри в
д к е е в оз н и кн ов
ен и ю .
90 Глава 2
Значения, переменные и типы данных
� UA8
. -. • .
с � /Atart:AU
Наш калькулятор возраста собаки возвращает ошибочный результат -
·1юнвниошqв >109пто п >109пто хnж>вnnэ>1вшнпэ швн вwwвdгodu в ошh Лwошои '8 шввшо
Е ще немно20 omдag ku
Попробуем поэкспериментировать с отладкой и посмотрим, что происходит.
Для этого выполним несколько команд в оболочке Python.
3амемьW1е,
ЧWIO ЭW\О ---7
с мр о
ка
Почему Python воспринимает число, введенное с помощью функции input ( ) , как строку?
Ведь мы же ввели цифры, а не буквы. Причина заключается в том, что функция input ( )
всегда возвращает строковое значение. Откуда это известно? Не только из экспериментов
с командной строкой. Есть и более непосредственный способ узнать синтаксис функции.
Прежде всего, можно заглянуть в спецификацию Python, где сказано следующее:
92 Глава 2
Значения, переменные и типы данных
]j:
'За даБ аmь Б о11rось1
Любые данные в Python относятся к тому или иному Какие еще операции можно выполнять
типу. Тип данных очень важен, поскольку от него над строковыми значениями, кроме
зависит, какие операции будут выполняться с данными. конкатенации и вывода на экран?
О:
Как вы могли убедиться на примере операции
умножения, результат будет совершенно разным Не стоит недооценивать возможности
при умножении строки на число и числа на число. простых типов. Обработка строк лежит в основе
Следовательно, при написании программы необходимо современных вычислений (Google и Facebook
четко понимать, с данными какого типа вы имеете дело. не дадут соврать). По мере изучения Pythoп вы
узнаете о том, как осуществлять поиск в строках,
Некоторые типы данных вам уже знакомы. Вы менять их, форматировать и выполнять
знаете, что такое строки, представляющие собой множество других интересных операций.
')j:
последовательности символов. Нам также встречались
и числовые типы. В Python поддерживаются два При выполнении операций с числами
основных числовых типа: целые числа и числа разных типов моrут ли возникать те же
с плавающей точкой. Рассмотрим их подробнее. проблемы, как в случае чисел и строк?
]j:
1 -2 -1
о 2 .____ Множество цеnых чисеn Можно ли сначала п рисвоить
з 42 вида -3, -2, -1, 0, 1, 2, 3, ". переменной целочисленное значение,
- 4 52
а затем - строку?
О:
12 0 00 0 0
10001 999 В чисnах, превышающих 999,
В Pythoп такое вполне допускается.
не испоnьзуются раздеnитеnи
Помните: тип есть у значения, но не
rрупп разрядов
у переменной. В переменную можно записывать
любые значения, даже если при этом меняется
их тип. Впрочем, это не считается хорошей
практикой программирования, ведь программу,
Обычно тип данных f loa t
в которой переменные меняют свой тип ,
труднее понимать.
-2 . 1 5 0 . 91 91 0 3
Дробные чисnа вида
- 4 . elO з . 14 1 4, 42 . о,
1 0 . З+е4 1 . 6 6 6 7 и т.п.
Поддерживается
зксnоненциаnьная запись В Pyth o n имеются средства для
р аботы с науч н ы м и да н н ым и .
В частности, поддержива ются
В Python есть и другие типы данн ых , в частности, комплексн ы е ч исла
булевы значеНИJI, списки, словари и объекты, и экспон е н ц и ал ь н ы й способ
о которых мы поговорим в следующих главах. за п и с и ч и сла.
94 Глава 2
Значения, переменные и т ипы дан ных
UcnpaBAeнue ow u6ku
Итак, мы выяснили, что причиной ошибки является Пе �oU:mecь
неправильное предположение о типе данных результата, задаВаmь Во11rось1
")j:
возвращаемого функцией input ( ) . Мы считали, что если
в ответ на запрос мы вводили число, то функция должна Что п роизойдет, если передать
была возвращать число. Однако отладка показала, что функци и int ( ) строку, не содержащую
функция всегда возвращает строку. Впрочем, беспокоиться число, например int ( ' hi ' ) ?
О:
тут совершенно не о чем. Потому-то мы и выполняем
отладку на каждом шаге - чтобы выявлять вот такие ошибки. В подобной ситуации возникнет
К счастью, в Python строковое значение можно легко о ш ибка в ы полнения. И нтер п ретатор
преобразовать в число. сообщит о том , что значение не я вляется
числом.
]j:
Вот как это делается.
�
Будет ли функция int ( ) корректно
С начала создадим строковое п редставление числа. обрабатывать числа с плавающей
точкой, например int ( ' З . 14 ' ) ?
О:
answer = ' 42 ' переменной etl'\SWer
Функция int ( ) работает только
v ripuc6au6aewicя
cwipoкa '42.' с цел ы м и ч ислами (точнее, со строка м и ,
содержащими целы е ч и сл а ) . Есл и нужно
<t�ьмume kapaнgaw И так, мы знаем, что ошибка вызвана предположением, будто переменная
_\., dog_age содержит числовое значение, тогда как Python воспринимает данную
переменную как строку. Добавьте в приведенный ниже код функцию int ( ) ,
чтобы устранить ошибку.
Ecwiь несколько 6ариан мо6 решен ия r�роблемы ,
мэw�ому с6ер ь w.е с ь с owi6eiм oм 6 конце zла81:>1 )
doq name = input ( " :Кax зовут вашу собаху? " )
_
doq aqe = input ( " Cxonьxo пет вашей собахе ? " )
human aqe = doq_aqe * 7
_
_
print (human_aqe )
Ура, зара6оmаАо f
Наконец-то программа возвращает ожидаемый
результат - 84. Проверьте работу калькулятора,
подставив в него другие числовые значения.
Нам осталось реализовать завершающий этап
псевдокода, и программа будет готова.
- - - - - -
� - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - ·
- - - - - - - - - - - - - - - - -
- - - - - - - - - -
.••
Есn и nроrра мма так и не ааработаnа
синта ксичес кие
Как вы уже знаете , работе програ ммы моrут мешать
ия. Получив
и семан тичес кие оши бки , а таюке ошибк и вып олнен
, прове рьте
сообщение i nva l id s yntax от и нтерп ретатора Pythoп
мер,
исходный код на налич ие синта ксичес ких оши бок (напри
к). Если про блема не выявл ена, попро буйте
правильность расста новки скобо
о - или попроси те друга ,
просм отреть програм му наобо рот - из кон ца в начал
с тем , которы й приведен в
разбирающегося в програ ммиро вании , свери ть код
кни ге. Убедитесь в том , что функц ия int ( ) набра на
прави льно и вы не заб ыли
й код с сайта книги (http ://
поста вить скобки . Вы всегда можете скачать исходны
wicke dlysmart . com/h f l earnt ocode ) и сравн ить его со своим .
- - ---- - - -
-- - - - -
- - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - -
- - - -
- - - - - - - - - - - - - - - - - - - -
- - - - - -
96 Глав а 2
Значения, переменные и типы данных
..... 4.
воспользоваться функцией print ( ) и отобразить на экране
Вывести ив акрам:
текущие значения программных переменных.
"Вашей собаке"
ммя со68К111
"сейчас/J
�1
�
чеnовечес1С111 й воэрвст со6вК111
"по меркам людей"
г-
один аргуменм: смроку
или или число
print ( 42 )
г
но эмо ОЬfл одиночнt11 й арzуменм
�J \�
print ( ' Призе�:t" ! ' , 4 2 , З . 7 ,
1'\робеламtА
Во м ч мо 6QM
нужно 61'16есмц
EJii:,. .��
Фftн:�:ьн:ьrii mecm -n.r�:в
И так , мы реал изова л и последн и й эта п п севдо кода . В несите в програ м м у
нео бходи м ые и зменения , сох ран ите ее и выпол ните кома нду Run > R u n
Mod u l e . П осл е это го пере й дите в о б ол оч ку Python и проверьте ра б оту
к ал ь куля тор а .
п о лу ч е н ны е
р езу л t:>ММ'\1\ Ы
l,�
98 Гла в а 2
Значения, переменные и типы данн ых
Тренuруем моз2
Глава почти завершена - осталось только подвести итоги и решить
кроссворд. Почему бы напоследок еще немного не потренировать мозг?
И так, вот наше последнее упражнение. Предположим , имеются две
переменные: first и last. Сможете ли вы поменять местами их
значения? Напишите соответствующий код. Решение приведено
в конце главы.
Зt11'\1АШ1Ам е
�
здес11 сбой
код
Вом peЗ!JЛl1WlllW\,
коморый Вы должны
print ( first , las t )
l'\OЛ!JЧIAIN\11
doq_name = Тузик
�САМОЕfЯАIНОЕ
• Компьютеры умеют делать две вещи: • Ключевые слова зарезервированы
хранить значения и выполнять над ними в синтаксисе языка программирования.
операции .
• Строка - это тип данных Pythoп, состоящий
• Составление псевдокода - отличный из последовательности символов.
способ начать разработку программы.
• В Pythoп поддерживаются два типа
• Синтаксис задает правила написания чисел: целые и с плавающей точкой.
инструкций Pythoп, а семантика определяет Есть также ряд дополнительных типов,
назначение инструкций. предназначенных для научных расчетов.
input ( )
необходимо тестировать код.
• Функция запрашивает данные
у пользователя и возвращает их в • Существуют три основных вида ошибок:
программу в виде строкового значения. синтаксические, семантические и ошибки
выполнения.
• Функции возвращают значения в качестве
результата. • Если умножить строку на число п, то Pythoп
повторит строку п раз.
• Значение можно сохранить для будущего
использования, присвоив его переменной. • Строки можно объединять с помощью
оператора конкатенации.
• Когда значение присваивается переменной,
Pythoп сохраняет значение в памяти, • В Pythoп оператором конкатенации служит
помечая его с помощью имени переменной. знак "плюс" (+).
1 00 Глав а 2
Значения, переменные и т ипы данных
1
2
3 4
5
6
7 8 9
10 11
12
13
14
15
16
17
П о rоризонтаnи По вертикаnи
2. То, что присваивается переменной 1 . То, что передается функции
6. Один из числовых типов 3. В ней хранится з начение
1 О. Специальный символ, часто 4. П рограммный файл Python
используемый в именах переменных 5. Знак присваивания
1 2. Устанавливает правила написания 7. Утили та для ввода команд Python
инструкций
8. П рограмма, вычисляющая возраст собаки
1 4. То, ЧТО выводит функция i nput ( )
9. Операция объединения строк
1 6. Текстовый тип да н ных
1 1 . Место, где хранятся з начения перемен ных
1 7. Имя нашей собаки
1 3. Описывает назначение инструкций
1 5. Еще один наш пес
t"�озьмumе kapaнgaw
'\., Peweнue Итак, нам предстоит написать псевдокод. Для начала подумайте, как
бы вы описали ал го ритм , или рецепт, вычисления возраста собаки по
человеческим меркам . Далее запи шите все свои соображения в виде
п ростых текстовых команд. П рограмма должна взаимодействовать
с пользователем, спрашивая у не го имя и биологический возраст собаки .
В конце необходимо вывести что-то осмысленное, например: "Вашей
собаке Рокки сейчас 72 по меркам людей " .
В общем , просто запишите псевдокод на своем родном языке.
uмя собакu
Наконец, необходtАмо
"сейчас" 6ь�8есмtА резульмаmЬt
r�ол ьзо8амелю
чело8еческuй возрасм собакu
?'
Филя, 5 лем
1 02 Гла в а 2
Значения, переменные и типь1 данных
4. Вывести на экран:
ЦСl'\0ЛЬ3О8аw.ь в п. 4.
"Вашей собаке"
имя собаки 4. Сначала 81:118одцм "Вашей собаке",
"сейчас" замем - цмsr, полученное 8 п. з.,
далее - смроку "сейчас", после
человеческий возраст собаки
эмого - чцсло, полученное 8 п. 3,
"по меркам людей" ц 8 конце - "по меркам людей".
�ffi ИE
[РЕШЕНИЕ)
Теперь ваша очередь. Напишите код для получения биологического возраста собаки
с помощью функции input ( ) . В ыдайте пользователю запрос " Сколько лет в ашей
собаке ? " и сохраните результат в переменной dog_age. Сделайте пометки,
уточняющие назначение каждого элемента кода.
1
Во rи наша но8а я А дом 8111з о8 функц1.щ input ( ) , 8 коморой
мременна я dog_age м1:11 1\росuм 1'\ОЛьзо8амеля уюва rи ь 8озрас�м
собакц, "осле чего сохраняем 1'\олученное
значенце 8 1'\еременной do9'_age
Выражения Значения
'kit е' + ' ' + 'cat' 1
42 ----
-
8%3
k1t е cat'
(7 - 2) *
'hello'
�HNE [РЕШЕНИЕ)
В игре в наперстки используются три непрозрачных стаканчика и небольшой
шарик. Для программной реализации игры нам понадобится несколько переменных
и значений. Используя все свои знания о переменных, значениях и операциях
присваивания, попробуйте сыграть в игру. Просмотрите код и определите
переменную, которая после выполнения последней операции будет содержать
значение 1 . В каком стаканчике окажется шарик: 1, 2 или З? Делайте ставки, господа!
cupl " о cupl = о
cup2 "'
сuрЗ cupl О, cup2 1. сuрЗ = 1
�
сuрЗ =
cupl cupl о, cup2 1, сuрЗ о
104 Глава 2
Значения, переменные и типы данных
word4 1 s heep 1
i
wordB ' Ь lue '
word l O = • y e l l ow '
мо Во м чмо 6t11 r\Олучиме
word9 = ' The ' + word9 word9 = ' The r e d 1
сt�озьмumе kapaнgaw Вот код нашего калькулятора, написанный на данный момент. Добав ьте к нему
--�� Peweнue код вычисления возраста по человеческим мерка м , испол ьзуя в качестве образца
при веденный выше проверочный код.
�.l!зьмumе kapaиgaw
,�
И так, мы знаем, что ошибка вызвана предположением, будто переменная
Peweиue dog_age содержит числовое значение, тогда как Python воспринимает данную
переменную как строку. Добавьте в приведенный ниже код функцию int ( ) ,
чтобы устранить ошибку.
�
hшnan_aqe = int ( doq_aqe ) * 7
Функци ю int ( ) можно "'рименимь именно· w. o z 3a,
print ( hшnan_aqe )
ко z 3а нам мре буемс я це л очис л енно е значение dog_age
Воз.можно, Все эмu 8Ь1зо8Ь1 функцuй слегка сбuлu Вас с молку. 13 nоследующuх
главах .МЬI nого8орu.м о мом, как рабомамt1 с функцuя.мu. А мка досмамочно
знамt7, чмо функцuя int ( ) млучаем смроку u nреобразуем ее 8 чuсло.
1 06 Глава 2
Значения, переменные и т ипы да нных
�
13ом чмо 8е1м
Peweнue нужно 8111 8есми
'Вашей собаке'
111ма со6а11111
В ооружившись знаниями о возможностях L7J ·сейчас·
2 3 н а ч е н и е
р 3 4
г 5 п м
у р 6 ц е л о е
7 м 8 а р д 9
10 п о д ч е р к и в а н и е у к 11
б н а н м л о п
о т л о е ь 12 с и н т а к с и с
л ь н к м
о к н 13 а я
ч у п р о с т т
к л е е ь
а я 15 м н
т 16 с т р о к а а
о м н ц
р а 17 т у 3 и к
й и я
л к
и а
1 08 Гла ва 2
З �евы значенuff, HcJioBuff u цuклы
* -t-nринятие решений
*
J
побороть пресловутый бесконечный цикл. Что ж, начнем!
Ради инмереса
м� даже создадим
макой цикл
это новая глава 109
Сыграем в игру?
С ы2раем В u2py?
Игра под названием шоушилин появилась еще в эпоху древнекитайской
династии Хань. С ее помощью регулировали судебные споры, заключали
сделки, кидали жребий ...
Сегодня мы знаем эту игру как " Камень, ножницы, бумага". Именно ее нам
предстоит реализовать, что даст вам возможность сыграть против очень
серьезного противника: вашего компъютера.
lIO)I(ВlЩЬI
�1
Еслц одц н цгр ок
П РОИГРЫШ ВЫИГРЫШ r Есл и одц н цzр ок
О&ЕРТЫВАЕТ Ь"1 6"'б цра е1'\1\ бум агу ,
�
6"'бц рае1'\1\ нож. ниц"' ,
�
а другой - ка мень,
а Ор 9"й - каме но,
1'\1\О бум ага обер t"" Ь1 6ае 1'\1\
1'\1\О каме нь зal'r\yl'l.л Яe l'r\
каме нь ц 1'1.обеж.дае l'r\
нож. н1..щ"' ц мбеж.даеl'VI
3АТУМJIЕТ
1
6
� f-
@ Еслц один игрок
Если оба игрока Ь"1 РЕЖУТ 6 J 6t11 оираем бумагу ,
+ �
а другой. - н ожницЬt,
�
делаюм одинако6t11 i1.
6111 бор, w.ozoa нцчья t\1\0 НО>КНIА Ц Ь/ режум
110 Глава З
Булевы значения, усло в ия и ц и клы
: . . . . . . " . . . " . .. . . . . " . . . . . . . . . . . . . . . " .. . . . . . . . . . . . . . . . " . . " . . . . . . . . .. . . . . . . . . " . . . . . . " . . " . . . . . . . . . . . . . . . . . . . . . . . " . " " " . . . " . . . . . . . . . " . " " " . " . . . . . . . . . . . . . . . . . . . . . . . " . :
о
о Пользовател ь начинает и гру.
112 Глава 3
Булевы значения, условия и циклы
Принятие решений � 11 З
Применение случайных чисел
Пе tioumecь
�
� ]j:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - · задаваmь Bonrocь1
Проведите небольшой тест. Откройте оболочку
9ПРАЖНЕНИЕ
Как нам помоrут случайные числа?
О:
Python , импортируйте модуль random и
сгенерируйте несколько случайных чисел
с помощью вызова random . randint ( 0 , 2 ) .
Генерирование случайного числа можно
сравнить с броском и гральной кости. Разница
лишь в том , что у нас всего три возможных
В1>1зо6име функци ю
варианта (камень, ножницы и бумага), как есл и
бы у кубика было три стороны, а не шесть.
randint { } несколько Полученное случайное число сопоставляется
ро.з мсмомр и ме, с выбором компьютера: О -
ОНО. 6ti1дt1.Ci\'\
камень,
1 2
и
ЧМО - бумага и - ножницы.
О: Только не в программировании!
Программисты привыкли начинать счет с нуля,
а не с единицы . Со временем вы поймете,
почему это так, а пока просто примите как есть.
О:
Итак, м ы знаем, как сгенерировать случайное число
из набора О, 1 и 2, которое будет представлять выбор
Нет, генери руемые компьютером числа
будут псевдослучайными, т.е. не полностью
компьютера. Сразу договоримся, что число О будет
соответствовать камню, 1 - бумаге, а 2 - ножницам. случайными. Такие числа генерируются по
Запишем код генерирования случайного числа. определен ному предсказуемому шаблону,
которого не существует в случае истинно
М"1
случайных чисел . Чтобы сгенерировать
до ба вили 1".усмую с мро ку ,
Н е з а бу дьме иммрw. иробамь полностью случайное число, нам придется
им t>
чм о б111 Визу ал1:> но оw. дел использовать какое-то природное
модул1:> random
о l".ера ци ю и Мl".орм а м оду ля
t
явление, например радиоактивный распад,
ом осн одн оzо ко да. Эмо
j
что, согласитесь, не слишком удобно
� улу чш а ем но.г ляд нос w.t> с практической точки зрения. Для большинства
import random k" бо лt>ШIАХ лисм и нг ов задач программирования псевдослучайных
чисел вполне достаточно.
О:
генерируем
Сохраняем слу ча йн ое случайное число,
число б мременн о й, Разработчики Pythoп привыкли сохранять
1".редсw.адляюще е
полезный код в виде модулей. С помощью
чw.обы его мож но
инструкции import вы сможете использовать
8111 бор KOMl".t>IOW\epo.
было исl".ол1:>зо8ам1:> этот код в своих проектах. В частности ,
8мследсw�8ии модуль random содержит множество функций,
связанных с генерированием случайных чисел .
Пока что мы используем только одну из них -
&Cf. . 1�� Чтобы проверить работу программы, сохраните ее в файле rock.py и выполните
Тecm-.11.f i\iiв команду Run > Run Mod u l e .
Вот что мы имеем на данный момент.
import random
Дадьнеuwuе geucm B uя
Итак, воспользовавшись модулем random, м ы реализовали выбор
компьютером случайного варианта, но это не совсем то, что нам нужно.
Почему? Наша цель - заставить компьютер выбрать камень, ножницы или
бумагу; мы сопоставляем эти варианты с числами О, 1 и 2 . Но разве не было
бы удобнее иметь переменную, содержащую строку " камень " , " ножницы"
Комп ь ютер
или " бумага " ? Давайте поступим именно так, только для этого нам придется делает свой
вернуться немного назад и разобраться, как принимать решения в программах, М ы сейчас
здесь --7(
выбо
написанных на Python.
((�зьмum е kapaнgaw
П редполагая, что переменная random_ cho i ce равна О, 1 или 2, напишите псевдокод,
� в котором переменной compute r cho i ce присваивается значение " камень " ,
_
" ножницы" или " бумаг а " в зависимости от значения random_ cho ice.
\ч�
мр еменн1�1 е , бозбр о. що.ющuй ТПАе, еслu '"'ер61�1й
ср о.бнu бо.ю W\СЯ дбе
со де р ж о.щu е
'
о '"'ер о.нд бол"ще, чем 6W1орой, �
u Fo.lse 6 �6ном слу чае . J
J, � � р о
Вс коре мы а ссМ t"Л р « М
u друг u е о ...г р аl"Ло ры
bank balance > ferrari cos t с р аб не нu я, W\aкue как
u др.
" мен "ш. е" , "ра бно"
116 Глава З
Булевы значения, усл о в ия и циклы
БудеВ ы значенuя
Простите, нехорошо получилось: мы говорим о совершенно новом Пе
eioumecь
типе данных, но не представили его формально. Булев тип данных !Задаваmь Bonrocь1
]j:
очень прост: он поддерживает всего два возможных значения,
которыми, как вы уже поняли, являются T rue и Fa l s e. Булевы?
zt�зьмume kapaнgaw
� Пришло время взять карандаш и немного поупражняться . Вычислите значение каждого
из приведенных ниже выражений и впишите свой ответ, после чего сверьтесь с ответами,
приведенными в конце главы . Помните: булевы выражения всегда равны True либо Fal se .
,. проверяем, oyдeWI ли n.ервое значение оольще, чем вWlopoe. Можно W\акже исмльзовамь
! Ol'\epaW1op >=, ЧWIООЫ n.poвepиWlb, oy дeWI ли n.ервое значение оольще или равно вWlорому
',l/
your_level > 5 Если your_ l eve l = 2 , то чему равно выражение? ___
r
Если your_ l eve l = 7 , то чему равно выражение? ___
г· равенсw.во двух значений.
Если они равны , w.o резульW1аW1
Тrие , иначе - Fo.lse
.;
c:: o lor = " oranqe " Если переменная c o l o r содержит 11 p i nk 11 , то выражение
равно True или F a l s e?
А если переменная содержит 11 o r ange 11 ?
рамор 1 n.роверяе w.,
( оn.е
=
А,. JI�-�b�R��J
� Обратите внимани е на то, что п ров е р ка ра в енства в п ри в еде н н ы выш
п ри м е рах в ып ол ня ется с помощью оп ра е тора ==,
а н е
= , которы и
�
обо
е
знача ет
ь з е м оди н зна к ра в енства , чтоб ы
п ри сва и ва н и е . Другими словами, мы испол у
е ва знака р а в енства , чтобы п р о в е рит ь ,
п ри своить знач ен и е п е р е м н н о й , и д
ой и бол ее оп ытны е
р авны ли д в е п е р е мен н ые дру г дру гу. Новички (а пор
п рогр аммист ы) часто путают эти оп ратор . е ы
П рu н uмаем реwенuя
Теперь, когда мы познакомились с булевыми значениями и операторами
сравнения, такими как > , < и можно применить их для принятия
==,
[
решений в программе. Для этого используется ключевое слово i f (если)
совместно с булевым выражением. Рассмотрим пример.
Замем идем булево
в111р ажение, наз111 в аемое
Начинаем с ключевого слова if
н_словн111 м в111р ажением.
J
Оно равно либо Тrце,
либо False Г Далее смавим
Ч.,, 06оемоч1Ае
i f bank balance >= ferrari co s t :
print ( ' Почему бы И He'I' ? ' )
print ( ' Эх ' похупаю ! ' )
) Далее идум инсмрукции,
в111 1'\ОЛ НЯем111 е , когда
условие равно Тrие
З амемьме: все инсмрукции, комор111 е м111 хомlАМ _J / 13 Pytno"' 1'\ринямо деламь
в111 м лнимь, когда условие равно Тrие, имеюм омсмуl'\ � омсму"' шириноii 4 "'робела
prin t
(
(
' Почеиу бы и ие'I' ? ' )
' эх 'похупаю 1. ' )
с омсмумм
слово e l se
e l se : � Далее смавим д8оемочие
)�
61:711'\олняемые, когда
print ( ' Може'I' , через неделю . ' ) усло8ие равно False
118 Глава 3
Булевы значения, усл о в ия и циклы
г
если) . Рассмотрим пример.
Нач1.1наем с мрвого условия,
иС l'\О Л"3У Я ключевое слово if
if numЬer_of_scoops == О:
print ( " He жепае'J!е мороженое ? " ) 3амем идем ключевое слово
J
elifсо вморt>!М условием
print ( ' Y нас икого разнuх сор'J!ов . ' )
elif numЬer_of_scoops = 1: Далее можно добавим"
print ( ' Один шарик , сейчас еде.паем . ' )
�
r.роизвол"ное число блоков
e l i f со с8ои ми усло8иями
)
elif numЬer_of_scoops = 2:
�
�
print ( ' Прекрасно , два шарика ! ' ) n омниме, чw.о
elif numЬer_of_s coops >= Э : 8 ка ждом блоке if,
e l :i. f и e l s e можем
print ( " Oгo , ЭIJ!O много шариков ! " ) бt11 м " любое число
else : инсмрукций
nuшЬer_of_•coop• = 4
nuшЬer_of_•coop• = 1
nwaЬer_of_acoop• = 3
nuшЬer_of_•coop• • 2
nuшЬer_of_acoopa = -1
Приня ти е р е ш ен и й � 119
Вернемся к игре
Вернемся k u2pe
Мы все еще не завершили первый этап игры "Камень, ножницы,
бумага". Вспомните: перед тем как отвлечься на тему булевых
значений, мы собирались улучшить программу, чтобы компьютер м �,1 6се еще зд е с �,
мог выбрать строку " камень " , " ножницы" или " бумаг а " , а не .----...._,
Компьютер
число О, 1 или 2. Теперь, когда вы познакомились с инструкцией дел ает свой
i f, мы сможем легко это сделать. Нам нужно написать код, в ыбо
который в зависимости от значения переменной random_cho i ce
будет помещать в новую переменную compute r_ cho ice
соответствующую строку. Просим
пользовател я
м о м е н WI
сделать в ыбо
� Э W10 H(.llМ к о д Н (.1 данн ы й
i f random choice == О:
Если 1'\еременная random cho i s e
computer_choice = ' ха.мень '
_
ЪJOI: �� ..
\' Э wio наш мрбый заl'\уск. Сдем i.! м е нес колько за ....уско б
Тecrn -n.f iliiв �
1 20 Глава З
Булевы значения, усло в ия и циклы
ptntE
i
_
i nput ( ) , 8 1'\еременноu user cho i c e -J-- M t11 снова. UСl'\ОЛ1:13уем фун к ци ю
' llollПМnep вабwрае"' ' , computer_ehoice) 1� i npu t ( ) ц 1'\р о сим мл1:1з о ва.W1еля
� сдел а м t:> 6ы бор
Принятие ре шений • 1 21
Пользователь делает св о й в ы бор
1 22 Глав а 3
Булевы значения, усло в ия и циклы
Бу� е вн з нач е н и я в э фи ре
И нтервью недел и :
"Знако мств о с булевыми значениями"
Принятие р е ш ен и й � 1 23
Проверяем что
, в ыбрал п ольз ователь
выбор, нужно попросить его повторить. ввел слово, не равное " каме нь " ,
" ножницы" цлu " бумага " ; ЭMOWI
Мы пройдем все три варианта по очереди варuанм Mtil обрабомаем мз ж е
(последний из них будет рассмотрен позже) , но
сначала необходимо создать переменную, которая
будет хранить введенное значение. Мы назовем
ее winne r. Она может содержать строку ' Нич ь я ' ,
' Поль зовате л ь ' или ' Компьютер ' . Переменная
инициализируется следующим образом:
J
остается кошельком. Подобные возможности есть во а.л11мернамuвнt�1u мдход
всех языках программирования: пустые строки, пустые к Оl'\ределенuю начал11ного
списки, пустые файлы и т.п. Для нас инициализация значенuя
переменной winner пустой строкой означает, что
переменная будет содержать строку, которая пока еще
не определена.
Теперь, когда у нас есть переменная winne r, хранящая
результат игры, можно приступить к реализации
остального кода. Согласно первому варианту, если
компьютер и пользователь делают одинаковый выбор,
необходимо записать в переменную winne r значение
' Нич ь я ' . Для этого нужно написать код для сравнения
строк, выбранных пользователем и компьютером.
1 24 Глав а З
Булевы значения, услов ия и циклы
(f�озьмumе kapaнgaw
,�� Снова ваша очередь проявить себя . Завершите приведенный ниже код согласно
нашему плану. П рограмма должна определять ничью и п рисваивать переменной
winner значение ' Ничь я ' .
if
winner =
Kog оn реgеденuя н u ч ыu
Итак, у нас есть новая переменная winner и новый
код, проверяющий, не равны ли друг другу выбранные
пользователем и компьютером варианты. Если это так,
объявляется ничья. Сведем все вместе.
if random choice == О:
А .
Внесите указанные изменения в файл
rock.py. Мы все протестируем позже,
9ПРАЖНЕНИЕ после внесения дополнительных
·-----------------------------,
f Э W\у инсмрукцию
user_choice = inpu t ( ' камень , ноЖИИЦЪI ипи бумага ? ') � можно !:Jдалимt>
рж: i11t ( ' в. вмбраJ1н ' , ttseж:_chcice + JCCIN!l!llO'liep вмбраJt ' , cC1In.p1:1t:eж:_chcice)
Принятие р ешени й � 1 25
Кто в ыиграл ?
Kmo В ы u2рад?
На данный момент мы написали код, определяющий
ничью, и нас ждет самое интересное: определение
победителя. Мы располагаем всем необходимым для
этого: выбор компьютера хранится в переменной
comput e r cho i c e , а выбор пользователя -
_
Список задач:
в переменной u s e r cho i c e. Осталось определиться
_
rsi Есл и пол ьзовател ь и компьютер
с логихой принятия решения о победителе. Для этого сделали одинаковый выбор,
Tel'\ep 11 нуж но получаем ничью.
нам нужно изучить приведенную ранее блок-схему игры
взям11ся за эм о о Если пол ьзовател ь и компьютер
и попытаться разбить процесс определения победителя
на ряд простых правил. Кое-что можно сразу упростить. � сделали разный выбор, нужно
оп ределить, кто выиграл.
Дело в том, что нам не нужно применять правила о Если пользователь сделал
к обоим игрокам поочередно, ведь мы знаем: если н екорректный выбор , нужно
попрос и ть его повторить .
компьютер проиграл, значит, пользователь победил,
и наоборот. Это уменьшает объем кода, так как мы
проверяем только одного игрока.
С учетом этого рассмотрим все варианты, при котор ых
компьютер побеждает.
� �
KOMl'\11IO W1€p
ВоЖВJП{Ьl
1!
объя6ляемся нич11я
Пол ьзовател ь
1 26 Глава 3
Булевы значения, усло в ия и циклы
И менно такl
Рассмотрим это подробнее. В программу уже
добавлен код определения ничьей, так что
данный вариант больше не рассм атриваем .
Соответственно, побеждает либо ком пьютер, либо
пользователь. Победа присуждается компьютеру
в следующих ситуациях:
• компь�отер выбирает бумаrу, а попьзоватеnь - камень;
Принятие р еш ений • 1 27
Реализация логики игры
user choice ' хамеНJо ' f---. Еще одно булево выраженuе,
1'\ро8еряющи, Выбрал лu
1'\ОЛ"зоваW1ел1:> каменt>
Но как проверить сразу оба условия?
Для этого применяются булевы операторы (их также называют � с еще однuм булевым
логиче с кими операторами) , которые позволяют объединять булевы � Оl'\еро.мором Mtw
выражения. Пока что вам достаточно знать три таких оператора: and 1'\03НО.КОМUМСЯ 1'\ОЗЖе
(логическое И ) , or (логическое ИЛИ) и not (логическое НЕ) .
Для проверки того, что компьютер выбрал бумагу И пользователь выбрал
камень, необходимо воспользоваться булевым оператором and, объединив
две проверки.
uе З мо н о.щ е 8W1opoe у с
Э мо но.ще 1'\ерВое у слоВ ло8ц е
� & �
computer_choi ce == ' буиаrа ' and user choice � ' хамень ' Вся фро.за - эмо
булево выро.женые,
т
ро.Вное лцбо True,
лцбо False
Добо.6леные Оl'\ерамора and между усло6uямu оз начаем, чмо Все Выражение
рабно Тrие могда u W\OЛl:>KO могда, когда обо. усло6uя ра6н1;1 Тrие
3
i f computer_choice == ' буиаrа ' and user choice == ' хамень ' :
winner = ' Ko:иnъlO'l'ep ' �
Э м ом фрагменм ко3о. оl'\ределяеw. одно из Если Выражение равно True,
усло8цй, когда 1'\Обеждо.ем коМl'\t>юмер w.o 81;11'\олняемся эмо. uнсw.рукцuя
1 28 Гла ва 3
Булевы зна чения, усл о в ия и циклы
II�-oorшн�hfy
Операторы сравне н ия
истинны. А как работают операторы or и not? Оператор o r (>, <, и т.п .) имеют
==
t 1
денег".
J
Сначала 81:>1числяеW1СЯ булево в,,,р ажение
Омро.W1ор not CW10.8uW1cЯ � (True uлu False), а замем благодаря
"еред булевым 8ыро.же нu ем _____ v оl\ерамору not его значение меняемся
____
но. "роtv1u8омложное
if not bank balance < ferrari cos t :
print ( ' Похупаю ! ' ) "---.. В"'раженuе можно "рочutv1амь как "еслu cчeWI 8 банке
НЕ меньше, чем ctv1ouмoctv1ь Ferrari, могда мку"аем"
��ьмumе kаранgаш В озьмите карандаш и запишите, чему равно каждое из приведенных ниже
� булевых выражений.
10
age > 5 and age <
Если аgе= б , то чему равно выражение?
Если age = l l , то чему равно выражение? ___
Принятие решений • 1 29
подробнее о булев ых операторах
ко1) на маrн:ит:иках
Мы составил и код игры ·каме нь, ножни цы,
бума га " с помощью набора магн итиков,
прикрепленн ых к дверце холодильника, но
кто-то пришел и сбросил их н а пол. Сможете
расположить магнитики в правиль ном порядке,
чтобы нам удалось определ ить победителя?
Учтите, что некоторые ма гн итики могут
оказаться л и ш н ими. Не забудьте свериться
с ответом в кон це главы.
�� 1 c�ter_choice user_choice О
==
Змо пер 8ь�й случай, когда компt�юмер
u мл1:�зо8амел1:� сделали одuнако8ь�й
. 1 .
!\._ К. счасмt�ю, на дверце осмалu:"
м аzнuм uкu с ..,,ер8ой ..,,ро8еркоu,
zде мбеждае м кoMl'\t:iIO Mep ' u
само й м сле дне й, где побеждае м
..,,ол1:�зо8амел1:�
else
winner == ' ПОJ1Ъаова'1'8.JIЪ '
nомесмuме cюiJa c6ou магнuмuкu
l computer_choice
. '' \
winner = ' Ко�Р '
{winner
." . 1 1
;
== 1 R03rJDЩW r
computer_choice ==
'
ио.ницм
' = ' no.m.sosa'J!�
;;а .. цд
1 30 Глава 3
Булевы значения, усл ов ия u цикл ы
ьо :г �·.JOJ
Итак, нам удалось воссоздать логику определения победителя в игре "Камень,
ножницы, бумага". В неси те код в файл rock.py и запусти те программу пару раз. Мы
пока еще не добавили поясняющ и х сообщен и й , поэтому м ы знаем, кто побед ил , но
Te-cm -n.� �B не знаем , каки м б ыл выбор компьютера. Этим мы займемся дальше.
import random
i f random choice == О :
M t11 сей.чо.с победи тел я
e l i f random choice == 1 :
computer_choice = ' бумага '
else :
computer_choice = ' ножницы '
[
В о ""
лоzику нснмей. uzpt11 .
i f computer_choice == user_choi ce :
i38eдuW1e
winner = ' Ничья '
ezo
e l i f computer_choice == ' бумага ' and user choice ' хамень ' :
winner = ' KoмnьJ1D1J.1ep '
e l i f computer_choi ce == ' хамень ' and user choice ' ножницы ' :
winner = ' KoмnьlD'J.'ep '
e l i f computer_choice == ' ножницы ' and user choice ' бумага ' :
winner = ' KoмnьJ1D1J.1ep '
else :
winner = ' Попьзоза�епь '
Принятие решений • 1 31
Вывод имени победителя
Оболочка Python
камень , ножницы или бумага? камень
�
j ,
else :
print (winner , ' выиrрал , я выбрал ' , computer_choice +
1'
Объябляем l'lооеди. мел я ('_ А " ' ""М 'оо5що•М, "'°'
выбор сделал KOMY\t>IOWlep
1 32 Гла в а 3
Булевы значения, усл ов ия и ц и кл ы
import random
i f random choice == О :
computer_choice = ' камень '
elif random choice == 1:
computer_choice = ' бумага '
else :
computer_choice = ' ножницы '
if computer_choice == user_choice :
winner = ' Ничья '
elif computer_choice == ' бумага ' and user choice � ' камень ' :
winner = ' Коипьютер '
elif computer_choice == ' камень ' and user choice � ' ножницы ' :
winner = ' Коипьютер '
elif computer_choice == ' бумага ' and user choice � ' бумага ' :
winner = ' Коипьютер '
else :
winner = ' Попьзоватепь '
г
Уда л и м е эl'\l\O В эl'\l\oM ф рм м ен l'\l\е
pz in t ( wi1111ez , ами1•раJ1 ! · )
о бъявляемся peзyлol'\l\al'\I\
·
иz р ы
TeмptJ у н а с
11tолно ф у нк�ио н алtJная
\ "'7i
"-..___./ 1
игра !
Принятие решений • 1 33
А где документ а ц ия ?
[
мрабо1111а 1111 1:> с ней 6 будущем
Начинаем с моzо, чмо
import random
иммр мируем модул1:>
vinner = ' '
random и обl:>я8ляем
1'\еременную winner
К.ом .... 1:1юмер делаем random choice = random . randint ( O , 2 )
1'\ро 1.в8ол1:>н1:>1й 81:>1бор,
генерируя случай ное if random choice = О :
целое число 8 диаJl\азо не computer_choice = ' камень '
ом о до 2, а замем elif random choice = 1 :
СО Jl\осма6ляя ezo computer_choice = ' букаrа '
с соомбе мсм6у ющей else :
computer_choice = ' ножниц:ы '
[
с мрокой
С 1'\ОМОЩl:>Ю функции user_choice = input ( ' камень , ноЖНИЦJ.1 б укаrа ? ' )
ипи
i nput ( ) за ....раш и6аем
[
else :
vinner = ' ПОJIЬзовате.пъ '
1 34 Глав а 3
Булевы значения, усло в ия и циклы
"..,,
в конце главы. деревьев.
в в .;9 ""'""' в""°''"
G
Приня тие решен ий � 1 35
Завершение игры
Анал и з и руя и гру "Ка м е н ь, ножн и цы, бума га'� давайте п р едста ви м, ч то у пол ьзователя "х р о м а ет"
п р авописа н и е . Что п рои зо йд ет, е сл и в м е сто "бум а га" вв е сти " ба м а га"? Ка к п ов ед ет себя п р ог р ам м а
в подо бных слу ч а я х? Сч ита ете л и вы та ко е пов еде н и е допусти м ы м ?
Выбор пользователя
НЕ РАВЕН •бумаган И...
��umeb��w ------�
t
тот ж е
Заключuме 8Ь1раженце 8 скоокu,
r.режое чем рдзоuвамь его на смрокu
r
МЬI сеi!чдс здесь:
Теперь, когда программа умеет определять неправильно еслu введено. неверно.я
введенные данные, осталось понять, как выдать повторный смрокд, мвморно
запрос пользователю. Давайте немного поразмышляем, как вЬlводuм У>.рuглдшенuе
это лучше всего сделать" .
1 38 Глава 3
Булевы значения, условия и циклы
"
Однако такое поведение программы не кажется
пользователям логичным. Для нас удобнее, чтобы
слово "камень" распознавалось независимо от того,
в каком регистре оно записано.
Как этого добиться? Можно добавить дополнительные
правила для проверки всех возможных вариантов
написания букв в словах "камень", "ножницы" и
"бумага". Но это чересчур усложнит код, к тому же
есть более простые способы решения данной задачи,
о которых мы узнаем в последующих главах.
Впрочем, пока что нам лучше требовать, чтобы
пользователь вводил ответ в нижнем регистре, а
корректное решение проблемы будет предложено
позже.
�ьмumе kapaнgaw
��
Пока вы раздумывали над проблемой с верхним и нижним регистром , мы
забежали немного наперед и написали код для вывода повторного запроса.
Только в наше решение закралась ошибка. Сможете ли вы определить,
в чем ее причина? Ниже показан пример работы программы вместе
с нашими комментариям и .
Ytpoc i;M
' ) � Сн11 че1ло.
У\ОЛ t>ЗО 60.W1МЯ
user choice = input ( ' камень , ноЖНИЦЪ1 ипи буна:rr а ?
. .. 1
1\
)
каме нь , ножницы или бумага ?
Мы ду м м�;, Чl"ЛО бсе сделал�; бамага выводим
nраб ильно' мак чмо же мы каме нь , ножницы или бумага
? камин
Jt; nовморн ы й.
уn.ус мил и? зо.nрос
Поль з ов а �ель выбрал камин �
»> t Но зо.ме м снобо.
nолу чаем невер ную
Не мо!
смр оку
1 40 Глава 3
Булевы значения, условия и циклы
while juggling:
keep_balls_in_air ( )
Инсмрукция начинае
мся [ Усло8цем ццкла
я8ляеtv1ся булево
8О1раженце (как
г
while Если усло8ие цсtv1инно, tv10
с ключевого слоба 8 цнсtv1рукццц if)
�
�
8О1млняемся 8есо
Число що.рико8
scoops = 5
whi le scoops > О:
� Больше нуля?
Для нас эмо
print ( ' Еще шарик! ' ) 6171zляди l'V\ l'Vl/.IK!
scoops = scoops - 1
print (":ZИзнь без моро•еного схучна. ")
scoops 5 =
whi le scoops > О:
print ( ' Еще 111арих ! )
'
scoops scoops - 1
=
print (":ZИзнь без моро•еиоrо скучна . ")
1 42 Гла в а 3
Булевы значения, услов ия и циклы
scoops = 5 -"51
while scoops > О : /./ /
print ( Еще шарик ! )
' '
.---..
- ..-�__.,.
scoops • scoops - 1 -·--·--·-- ------- -
Е ще много осмалос"!
scoops = 5
while асоора > О :
print ( ' Еще шарик ! ' )
scoops = scoops - 1
print ( "bsНJ. CSes моро*8но:rо скучна . " )
scoops = 5
while scoops > О :
print ( ' Еще шарик ! ' )
scoops = scoops - 1
print ( "bsнъ CSaa мороаано:rо скучна . " )
Пр инятие решен и й � 1 43
Как работает ци кл while
2 шарцка уормц,
Следующая инструкция вычитает еди ницу из значения �
3 OCW\QЛOCb!
s co op s , после чего оно становится равно 3 .
scoop s = 5
while scoops > О :
print ( ' Еще шарик! ' )
scoops = scoops 1-
scoop s = 5
while scoops > О :
print ( ' Еще шарик! ' )
scoop s = scoop s - 1
print ("ZИsнь без мороженоrо скучна. ")
В окне оболочки в ыводится еще одно сообщение " Еще шарик ! " .
scoop s = 5
while scoops > О :
print ( ' Еще шарик ! ' )
scoop s = scoop s - 1
print ("ZИsнь без моро:аено:l:'о скучна. ")
1 44 Глава 3
Булевы значения, условия и циклы
3 шарика убрали,
Как видите, в цикле все время повторяется одно и то же. На 2 осW1алось! 4
каждом шаге цикла мы уменьшаем значение переменной scoops
на 1, выводим сообщение на экран и продолжаем дальше.
scoops = 5
-
while scoops > О :
print ( , _. 8арИ1t! ' )
scoops • scoops 1
print ("ZИa111t беа 11opo"нorro скучна . " )
scoops = 5
-
whil• scoops > О :
print ( ' -. шарик! ' )
scoops = scoops 1
print ( "ZИa111t CSea 11opo"нorro скучна . " )
И вот мы достигли конца. На этот раз все по-другому. s шариков убрали, о осW1алось!
Переменная scoops равна о, а значит, условное выражение
возвращает Fa l se. На этом все: больше в цикл мы не заходим,
переходя к инструкции, которая расположена сразу после него.
(. scoops = 5
-
while асоора > О :
print ( ' Еще шарик ! ' )
scoops = асоора 1
print( "ZИs111t CSes 11opo•eиorro скучна . " )
�
�
scoops = 5 � 8аряr•
-
while асоора > О : � hрнж•
print ( Z.. 8apИJt ! )
с•rчна
' '
Eltt ьрнж!
scoops = асоора 1 � 114рк•!
print (":Dca111t CSe8 110PQ*eиorro скучна . " )
.rи." бо• нороzеиоrо .
while ������
1 46 Глав а З
Булевы значения, усло в ия и циклы
i f random choice == О :
computer_choice = ' :камень '
elif random choice == 1:
computer_choice = ' бумага ' Удалиме смарую
else : IАНСw.рукццю ввода
l
computer_choice = ' ноЖНИЦЪI '
Пр инятие решений � 1 47
Итак, наша первая игра готова!
�-_Ье-чmо
�ПРАЖНЕНИЕ
___________________________________
138едиw.е здесо
с6ой код
148 Глава 3
Булевы значения, усл о в ия и циклы
Опасность:
Принятие решений • 1 49
Самое глав но е
�CAМOEFIABHOE
• Случайные числа широко • Ключевое слово e l i f представляет
применяются в программировании. собой сокращение от "else if'.
• Во всех языках программирования • Ключевое слово else позволяет
есть средства генерирования задать финальную альтернативу
случайных чисел. в инструкции i f.
• В Pythoп для работы со случайными • Булевы выражения можно объединять
числами предназначен модуль с помощью логических операторов
random. and и or.
• Чтобы подключить модуль random • Булев оператор not применяется
к программе, воспользуйтесь для отрицания исходного логического
инструкцией import . условия .
• Булев тип данных представлен всего • Блок кода, содержащийся в цикле
двумя значениями: True и Fal se . whil e , выполняется до тех пор, пока
•
истинно условие цикла.
Булевы, или условные, выражения
возвращают либо True, либо Fa lse. • Строка, не содержащая ни одного
•
символа, называется пустой.
Условные операторы, такие как ==,
> и < , позволяют сравнивать два • Оператор = означает присваивание,
значения. а оператор == - проверку на
•
равенство.
Условные операторы можно
применять как к числами, так • Комментарии в программный код
и к строкам. добавляются после символа
•
решетки (#).
Булевы выражения применяются
в инструкции i f. • Комментарии позволяют
•
документировать код, чтобы
Инструкция i f проверяет булево
впоследствии вы смогли вспомнить,
выражение, и, если оно равно True,
как была написана программа,
выполняется блок кода.
и чтобы другие программисты могли
• Блок кода - это набор инструкций, разобраться в ней .
выполняемых вместе. • Обработка неправильно введенных
• Блоки кода выделяются в программе данных - важная задача при
одинаковыми отступами. разработке пользовательских
приложений, таких как игры.
• Ключевое слово е 1 i f позволяет
проверять дополнительные условия • Причиной бесконечных циклов обычно
в инструкции i f. становятся логические ошибки.
1 50 Глава 3
Булевы значения, услов ия и циклы
1
2
3 4
5
6 7
8
9
10
11
12
13
14 15
16
П о rоризонтаnи По вертикаnи
2. Символ начала комментария 1 . Исходное название игры "Камень, ножницы ,
бумага•
3. Один из знаков в игре "Камень, ножницы,
бумага• 4. Одно из булевых значений
5. Операция подключе н ия модуля 7. Запись значения в переменную
б. Формат данных 9. Идентичность значений
8. Строка, лишенная символов
1 О. Операция сопоставления значе ни й
1 1 . Л огический тип да нн ы х
1 2. Одно из булевых значе н ий
1 3. Е ще один знак в игре "Камень, ножницы,
бумага•
1 4. Выделяет блок кода
1 5. Программная ко н струкция , обеспечивающая
многократное выполне н ие инструкций
1 б. Произвольное значение
Приня т ие ре ш ений � 1 51
Упражнения: решен ия
�ml!fРЕШЕНИЕ1
П роведите небольшой тест. Откройте оболочку Pythoп, импортируйте
модуль random и сгенерируйте несколько случайных чисел с помощью
вызова random . randint ( O , 2 ) .
••• t
(f'�озьмumе kapaнgaw
П редполагая , что перемен ная random_choice равна О, 1 или 2, напишите
,�\.,, Peweнue псевдокод, в котором переменной comput e r_ cho i c e присваивается
значение " камень " , " ножницы" или " бума г а " в зависимости от
значения random cho i c e .
1 52 Глава 3
Булевы значения, услов ия и цикл ы
w�з ьмumе
ы kapaнgaw
П ришло время взять карандаш и немного поупражняться. В ычислите значение
' . Peweнue кажд ого из приведенных ниже выражений и впишите свой ответ, после чего
сверьтесь с ответам и, приведенными в конце главы. Помните: булевы выражения
всегда равны True либо Fal s e .
rтро6еряем, будем л и n.ep6oe значение бол11ше, чем 8w.opoe. Можно w.акже исn.ол11зо8аw.11
( оn.ерамор >=, чмоб1>1 ....ро6ерим11, 5удеw. ли n.ep8oe значение 5ол11ше или ра6но 6морому
�
your_level > 5 Если your_l eve l = 2 , то чему равно выражение? Fals •
Если your_l eve l = 5 , то чему равно выражение? False
Оn.ерамор = n.ро8еряе м True
Если your_l eve l = 7 , то чему равно выражение?
ра8енсм6о 06ух значений.
Если они ра6н1>1, мо резул11w.аw.
Тr-ие, иначе - False
color - " orange " Если переменная c o l o r содержит " p ink " , то выражение
равно True или F a l s e? False
n.
( О ерамор
1 = n.ро8еря ем,
А если переменная содержит " o range " ? Tru•
! 5удуw. ли знач ения
�/ НЕ ра6н1>1 друz другу
Если переменная c o l o r содержит " p ink " , то выражение
color ! = " orange " равно True или F a l s e? True
�озьмumе kapaнgaw
'""' р8 weнu 8
�
В приведен ной ниже таблице указано несколько возможных значений
nеременнои_ numЬer_o f_s coops . Выпишите для каждого из них
соответствующее сообщение, выдаваемое программой . Первый результат
мы вписали за вас.
Приня ти е решений • 1 53
Упражнения: р ешения
�...Qозьмumе kapaнgaw
,�� Peweнue
Проч и тайте вслух Если. число шари.ко6 ра6но О, 6t11 6ecwiu.
приведенный выше ' Не желаете мороженое ? У нас иного разных
�озьмumе kapaнgaw
�� Peweнue Снова ваша очередь проявить себя . Завершите при веденный ниже
код согласно нашему плану. П рограмма должна определять ничью
и присваивать переменной winner значение ' Ничь я ' .
winner = 'Ни.чья'
aqe > 5 and aqe < 10 Если аgе = б , то чему равно выражение? Tru.e
Если age= l l , то чему равно выражение? False
Если age= S , то чему равно выражение? False
1 54 Глава 3
Булевы значения, услов ия и циклы
,
, _ __ -J -
1 � 1 coшputer_choice
el f
� = • хаиень
; . •
' 1 [)
winner ' ICollCПЪJO'l'ep '
=
'
� 1 coшputer_choice - tl user choice
·
--
.-1-----:�
..
, t1 4 я
l winner
2
= ' по.пьзоаа'8.Пlt
. д а
'1
Пр иня т ие решени й � 1 55
Упражнения: решен ия
� НИЕ
[РЕШЕНИЕ]
Добавьте в редакторе IDLE
#
#
#
#
КАМЕНЬ , НОЖВИЦЬI, БУМАГА
И:rра шоуши.пин , изобре��rеннаs1 в Хитае во времена ,цинастии
Хань , сеI'Одня извес'l'на JCaJC " I<аиень , ножницы , бумага" .
�а версия игры рассЧИ'l'ана на одноI'О ИI'pOJCa , оппоненток
# ICO'l'opor'O ВlolC'l'YD&e'l' ICOlllПW3'1'ep .
комментарии к файлу rock.
ру. Используйте пояснения # Начинаем с 'l'OI'O , Ч'l'О имnорrируем модуль random
на предыдущей странице # и о&ъяв.пяем перененнуJ) winner
в качестве образца,
irnport randorn
но можете вводить
и свои комментарии. winner = ' '
if cornputer_cho i c e == u s e r_cho i c e :
winner = ' Ничь я '
e l i f cornput e r_cho i ce == ' бумага ' and u s e r cho i c e ' камень ' :
winner = ' Компьют ер '
e l i f cornputer_choice == ' камень ' and u s e r cho i c e == ' ножницы ' :
winner = ' Компьютер '
e l i f cornputer_cho i ce == ' ножницы ' and u s e r cho i ce == ' бумага ' :
winner ' Компьютер '
else :
winner = ' Поль зователь '
1 56 Глава 3
Булевы значения, условия и циклы
�� ьмumе kapaнgaw
-� Peweнue З апишите дл я этих фраз соответствующие булевы выражения . П ервую
часть мы сделали за вас.
user choice != ' камень ' and user choice ! = ' бумаrа ' and user choice ! = ' на.ницы '
�.Q�зьмumе kapaнgaw
��
Пока вы раздумывали над проблемой с верхн и м и нижним реги стром , мы
Peweнue забежал и немного наперед и нап и сал и код для вывода повторного запроса.
Только в наше решение закралась ош и бка . Сможете л и вы определ и ть, в чем
ее п ричина? Н иже показан пример работы программы вместе с наш и ми
комментариями .
1
Если. нем, 1'\росцм
мльзовамеля м в w. орим t>
Принятие решений • 1 57
Упражнения: решен ия
� - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ·
�
9rfМe�\�,E
Напишите небольшую игру. П равила просты : вы спрашиваете
у пользователя "Какой цвет я загадал?" и считаете, за сколько
попыток он его угадает.
color = ' сииий '
gues s = ' '
guesses = О
�fJ»tJ�------------------------------------------------------------------------------1
9ПРАЖНЕНИЕ Помните игру в угадывание цвета? В ней есть ошибка. Если цвет угадан с первой попытки , ;
�
[РЕШЕНИЕ] программа сообщит: "Угадали ! Вы сделали 1 попытк!::!." · Исправьте код, чтобы при угадывании
цвета с первого раза программа выводила слово "попытка" в единственном числе.
guesses = О
1 58 Глав а 3
Булевы значения, усл ов ия и ц иклы
1
2 р е ш е т к а
3 б у м а г а 4
ш 5 и м п о р т
6 т и п 7 с
л 8 п у с т а я
9 и р и
10 с р а в н е н и е н
а с а
11 б у л е в в
е 12 л
13 н о ж н и ц ы
с
14 о т с т у п
в е
16 с л у ч а й н о е
Структуры данных *
-
в корзину покупки, названия всех известных звезд или содержимое
всего каталога товаров. Для эффективной работы с подобными
наборами нужны структуры данных. В этой главе вы познакомитесь
с новым типом данных списком, хранящим коллекцию значений.
Списки позволяют структурировать данные, вместо того чтобы
хранить каждый элемент в отдельной переменной. Вы узнаете о том,
как работать со списком в целом и как поочередно перебирать его
элементы в цикле for. Все это расширит ваши возможности по работе
с данными.
ПомоЖеmе разобраmься?
Нас ждет путешествие в офис компании "Пузырь-ОК",
которая проводит исследования пузырьковых растворов,
стремясь сделать их максимально эффективными. Сегодня
они тестируют "пузырьковую мощность" нескольких
вариантов формул своего нового раствора. Другими словами,
они оценивают, сколько пузырьков можно получить из
каждого раствора. Вот результаты тестового стенда.
с
[LJ:
1
lб
Все месмо6ые
....робuрк« �
1'\рОН!JМеро6о.нЬI о •
1 2. 5 7 8 9 Эмо счемчuк
u содержо.м "'!J3Ь1роко8
для каждого
ро.зные ро.см8оры
1
ьО
�
so
1
w
f
S8
1
S4
1
S4
1
S8
'\
so
1
52.
�
S4
� ро.см8оро.
162 Глава 4
Списки и циклы
г
Индекса цц я ведемся с нуля ,
с л едующий синмаксuс: /'\Осле имени nомнцме, м1>1
l
t'\е р е м енн ой сl'lиска указ1>1ваемся ин де кс 1'\ОЭWl о му "ер81>1й эл еменм С/'\ 1А С 1<а го8орцлц о мом,
�
цмеем индекс о, вwiopoii :z.
_
элемен ма в кбадрамн1>1х скобках ЧW\О КОМl'\l>ЮW1ерщик ц
и м.д.
л ю бяw� 8се нумеро8аw.ь
score = s cores [ З ] с нуля
О дц н из �
исследо вамелей
КОМ/'\О.Н и /А
"Пузыр11- О К."
Структур ы данных � 1 63
Работа со сп и скам и
1
Pa6oma со cnuckaмu
Похоже, нас ждет интересный проект
для компании "Пузырь-О К", но,
прежде чем начать, давайте разберемся
со списками и узнаем, как вместо числовых оценок
работать со строковыми значениями. Причем это будут названия напитков!
Как только все прояснится, мы сможем помочь руководству компании.
Итак, мы знаем, что набор значений можно представить в виде списка, сохранив
возможность доступа к отдельным его элементам. Как правило, в списках хранятся
однотипные элементы, например числовые показатели, названия продуктов,
временные ряды или результаты анкетирования с вариантами ответов "да/нет".
Рассмотрим еще раз процедуру создания списка, уделив особое внимание синтаксису.
Созgанuе cnucka
Предположим, необходимо создать список, хранящий
/<..а.ж.д01й эл ем
названия напитков. Вот как это делается:
ен м
Сl'\цс ка. О"'1 оеляем ся
)
1\ "'-
Сl'\цсок Зl!l'\uc111 6aeW1cя \._ Но. чало Cl'\ucкa Далее 1'\еречи сляюм ся
t1.6 u W1CЯ
6 "'еременную 1'\ОМечаемся элеменм111 Сl'\иско. 13 ко нце cW1
ая
smoothies 0W1кр016ающеu за кр t�16 ю.о щ
рt1. W1 Нt1. Я скоб ка
к6адрамной скобкой кб ад
Как уже говорилось, положение каждого элемента в списке задается его индексом.
В представленном выше списке элементу ' кокосовый ' соответствует индекс О ,
элементу ' клубничный ' - индекс 1 и т.д. Ниже представлена общая структура
хранения списка.
Cl'\ucoкобъеЭиняем
6се ЭW\U ЗНl!ЧеНUЯ
� У ка.ж.Эоzо элеменма /
� 1 у В каждоЦ
Cl'l.ucoк Зt1.1'\uс1.>16аемся l'\03UЦUL< Cl'\IACKI!
6 "'еременную есмt.> 11.ндекс , хранuмся значение
--
начv.нающиiiся с о
1 64 Глава 4
Списки и циклы
�
эмоt111 элеменм заl'\uс"' 8аемся 8 "'еременну ю
favori te
Ч мобtн uз8леч11 элеменм uз
Cl'\ucкa, необходuмо !:1Казам11
"'еременну ю Cl'\ucкa, а макже
переменной favori te 1'\рuс8аu8аемся
uндекс мребуемого элемента
значение smoothies [ 2 ]
favorite
о 2 э 4
smoothies [ З ] = ' шроnичесlСИЙ ' � за l'\ис "' 8ае tv1ся нобое значение: тропический '
'
о 1 2
с индексом 3 изменилос11
Структуры данных • 1 65
Работа со списками
�озьмumе kapaнgaw
� Давайте попрактикуемся в обработке элементов
списка. Внимательно изучите приведенный ниже код
и постарайтесь определить результат его выполнения
интерпретатором Pythoп.
eighties = [' ', ' duran duran ' , ' B-52s ' , ' a-ha ' ]
newwave = [ ' flock of seagulls ' , ' secret service ' ]
rememЬer = eiqhties [ l ]
band = newwave [ O ]
eighties [ 2 ] = rememЬer
print (eiqhties)
•
. .
�·l'�'i_ .
166 Глава 4
Списки и циклы
Размер cnucka
Предположим, в вашем распоряжении оказался очень длинный
список. Вы умеете извлекать данные из списка , но совершенно не
представляете , насколько он большой. К счастью , в Python есть
встроенная функция для подсчета количества элементов списка. Она
называется len ( ) и имеет следующий синтаксис.
с
)
1'\ОМОЩl:>Ю функции len ( )
мо ж но yзнawit> w�екущее
просмо 1'\ередайw�е функции len ( )
[
Сl'\исок, дли ну кowiopozo wipeбyew.cя
число элеменw�о8 Сl'\иска Оl'\ределиw�ь
о 2 з
sмootnies
пос кольку индексация Сl'\и ска Веде
4 )
мся с о .
НиЧ!J
дли на сn.и ска 8сеzда бyдe l'VI н а еди
больш е, чем 1'\Ос лед ниiА инд екс
Такая особенносмь
харакмерна для
бол1:>шинсм8а яз1:>1ко8
"рограммиро8ания
Структуры данных � 1 67
Извлечение последнего элем е нта сп иска
В о м ко.к бt>tглядям
sмoothies - 5 -4 -3 - 2 -1 омрш-10. мельн1:>1 е
1А ндекс1:>1 У1ри омсчеме
-
O W\ конца СУ\иско.
1 68 Глава 4
Списки и ц иклы
Оmрuцаmеды ые u нgekcы
Давайте проверим работу отрицательных индексов на
следующем просто м при мере. Предположим , мы хоти м
получить названия трех последних напитков из нашего списка.
Оболочка P�hon
И н3екс - j.. соомбемс м бу е м яг одный
last = amoothies [ - 1 ) � nосле 3н ему элеме нму Cl'\ucкa тр опич е ский
second_last = smoothies [ -2 ) � Ин3екс -.2 с оом6е мс м6уе м б ан ан овый
third_last = smoothies [ -3 ) nре3мсле3нему элеменму »>
print (last) R_
Ин 3екс - 3 соом6емсм8уем
print (output)
Ч&смайме комменмар&с1А
к коду в конце zла6ы
Структуры да нных • 1 69
Отрицательные индексы
Пе �oumec::ь
�адаВ аmь В о11fо<:ы
О: О:
в неограниченном количестве, то
память может просто закончиться .
Список - упорядоченный тип Тем не менее, в зависимости от типа В Python нет такого ограничения .
данных, поэтому порядок элементов значений, список может включать от Списки , содержащие элементы
в нем обычно важен, но далеко нескольких тысяч до нескольких сотен различных типов, называются
не всегда. В нашем списке для тысяч элементов. Если же задача неоднородными. Приведем пример:
[ ' Ыuе ' , True , 1 3 . 5]
компании "Пузырь-ОК" порядок играет требует включения в список более hetero9enous =
]j:
роль, поскольку и ндекс элемента миллиона значений, имеет смысл
соответствует номеру раствора поискать другие решения (например,
в пробирке . К примеру, раствор Что п роизойдет при обращении
D:
к несуществующему элементу сп иска?
О:
не менее во многих случаях порядок извлечь 99-й элемент в списке,
элементов не важен. Скажем, если состоящем из 1 О элементов, будет
составить список продуктов для Помните, мы говорили о пустых получена ошибка выполнения :
покупки , то вряд ли для вас важно, строках? Да, пустые списки вполне
допустим ы , и вы познакомитесь IndexError : list index out of ran9e
]j:
в какой последовательности их
покупать. Все зависит от того, для с примерами их использования в этой
чего создается список. Кроме того, главе. Пустой список создается так: А можно ли назначить значение
[]
в Python имеются неупорядоченные элементу списка с несуществующим
emp ty_list =
О:
Помните , что в пустой список всегда
и коллекции , о которых мы поговорим
в последующих главах. можно добавить элементы . Нет. Если элемента с таким
О:
можно хранить в них? В некоторых языках такое все же
поддерживается , но не в Pythoп.
Теоретически список может В списки можно включать любые
Сначала необходимо добавить новый
вмещать любое количество поддерживаемые в Python типы элемент в список.
элементов. На практике его длина данных (в том ч исле те , с которы м и
ограничивается объемом оперативной мы е щ е не успели познакомиться).
памяти компьютера, ведь каждый
��ьмumе kаранgаш
-� П риведен н ые н иже назван ия на питков добавлял ись
в список в порядке созда н ия. Завершите код п рограммы,
определяющей назван ие самого послед него на п итка.
smoothies = [ ' кокосоаwй ' , ' JСJiубничнwй ' , ' банановый ' , ' ананасовwй ' , ' яrоднwй ' ]
most recent =
�
������
1 70 Гла в а 4
Списки и циклы
s cores = [ 60 , 5 0 , 6 0 , 5 8 , 5 4 , 5 4 ,
5 8 , 5 0 , 52 , 5 4 , 4 8 , 69 ,
34 , 55 , 51 , 52 , 4 4 , 51 ,
69 , 64 , 6 6 , 5 5 , 52 , 61 ,
4 6 , 3 1 , 5 7 , 52 , 4 4 , 1 8 ,
4 1 , 53 , 55 , 61 , 51 , 4 4 ]
{ Но6Ь1е резул11мамЬ1
f
Ге нерал11н111й дцрекw�ор
)
КОМl'\/IНцц "Пуз111р 11-О I<."
Пузыр ь ко вых т е с т о в : 36
Наибол ь ший р е зул ь т а т : 69
Ра с т в оры с наиб ольшим р е зуль т а т ом : [11, 18]
Структуры да нных • 1 71
Продолжим подсчет мыль ных пуз ырь ко в
� Осмальн1�1е резульмам1�1" .
Да.лее нужно
6111 6есr.ли общее Пузыр ь ко вых т е с т о в : 36
число r.лесr.ло 6". � Наиболь ший р е зуль т а т : 69
1 72 Глава 4
Списки и циклы
Офuсиы ii guaA02
Структуры данны)( � 1 73
Просмотр элементов списка
scores = [ 6 0 , 5 0 , 6 0 , 5 8 , 5 4 , 5 4 , 5 8 , 5 0 , 52 , 5 4 , 4 8 , 69 ,
34 ' 55 ' 51 ' 52 ' 4 4 ' 51 ' 6 9 ' 64 ' 6 6 ' 5 5 ' 52 ' 6 1 ,
4 6 , 3 1 , 57 , 52 , 4 4 , 1 8 , 4 1 , 53 , 55 , 61 , 5 1 , 4 4 ]
i = i + 1
M1i1 исмльзуем 1'\еременную i для
указания W1екущеzо pacW18opa. Эма
1'\еременная мак.же служим индексом
8 Сl'\иске резульмо.моб
Наконец, у8еличи8аем индекс i на единицу,
1'\режде чем начинам17 но6ую имерацию
1 74 Гла ва 4
Списки и цикл ы
Б ысmрыii mecm-gpaii B
Сохраните код в файле bubbles.py и запустите его,
чтобы понять, все ли мы сделали правильно.
print (buЬЬle_s tring , ' - результат : ' , scores [ i ] ) i , а замем .,..ер едаем
� р езул1:>w.аW\ функции print ( )
.-�LIA8
�lilfl:ALI
Поначалу кажется , что простая конкатенация строки ' Пузыр ь ковый раствор # '
и переменной i позволит легко избавиться от лишнего пробела, но в реальности этот код
не работает. В чем здесь ошибка?
Структуры данн ых • 1 75
Правильный способ в ывода результ а т а
Теперь осталось включить это в нашу программу, только нужно убрать лишнюю
переменную bubЬ l e_s t r ing. Вместо этого мы сделаем код более компактным,
вызвав функцию s t r ( ) непосредственно в списке аргументов функции
print ( ) . Указанные изменения описаны во врезке "Быстрый тест-драйв".
s cores = [ 6 0 , 5 0 , 6 0 , 5 8 , 5 4 , 5 4 , 5 8 , 5 0 , 52 , 5 4 , 4 8 , 6 9 ,
3 4 ' 5 5 ' 5 1 , 52 ' 4 4 ' 5 1 , 6 9 ' 6 4 ' 6 6 ' 5 5 ' 52 ' 6 1 1
4 6 , 3 1 , 5 7 ' 52 , 4 4 , 1 8 , 4 1 , 5 3 , 55 , 6 1 , 5 1 , 4 4
i = i + 1
Пузырыовwй расТ!ор 10 - результат : 60
Пузырыовwй распор 11 - результат : 50
Пузwрыовwй расТ!ор 12 - результат : 60
� Пузwрыовwй расТ!ор
>»
f35 - результат : 44
1 76 Глава 4
Списки и циклы
1 i=i+2 t
на двер це холодил ьника, но они упали
о 0 1 -i + ,
на пол . Поста райте сь все восста нов ить.
Только буд ьте вн имательн ы : некото рые
. . . . · -"
_::.1...
- · А
i =
r--
о
магн итики л ишние. Све рьтесь с ответо м ,
пр иведенным в кон це главы .
1 хпубНИЧIОIЙ ' ,
банановый ' ,
•
1 'rрОПИЧ8СJСИЙ 1 '
1
мь� ожцдаем
Структуры данных � 1 77
Цикл for предпочтителен при р а боте со спискам и
[
ко.ждыiА элем енм Сl'\иск а в единсм8енном
цикл начи нм мся 3о.мем идеW\ Эмо Сl'\исок smooth ies, KOW\op ыii
с клю чево го ключевое слово in МЫ будем 1'\ОСЛедоваW\ еЛt>НО
сло во for ./
1'\ереби рамt>
У/ нач ало м
!(д к 8се гдо. в Pythol'\ , 1'\еред
очи е
Г бло ка. кода СW\ Оим дво еW\
for smoothie in smoothies : t-"'
output = , Б лок кодо. вы l'\ол ня е м ся
J
' Мы подаем + .
smoo thie
один pt13 для каждого
7
print ( output) элеменма Сl'\иска
о 2 3 4
-
1 78 Глава 4
Списки и циклы
о•.;'
Tenepo мдаем
-
однано6t>1й
� L� 1 � 1 1-;' 1 � 1 �1
;•�
f.,,c-o.JI'' . 0#",,�o.JI': �' �· Мъ1 подаем кл уб ничный
Мъ1 подаем бан ановый
___..
о 4
Структуры данных • 1 79
Цикл for предпочтителен при р а боте со спискам и
В пятый раз, как несложно догадаться, выбирается строка ' ягод ный ' ,
хранящаяся в пятом элементе списка smoothi e s , после чего в последний
раз выполняются инструкции тела цикла.
M0t ""Ро шлц Все
элеме нм111 Сl'\цска
I smo o thi es
-
Мы подае м кокосовый
Мы подаем мубяичный:
Мы пода ем бан ан овый
Мы пода ем 'I'роnиче сХИЙ
Мы подаем яrодный
-
Мне нравитсs�
цикл for он удобен.
Но как вывести номера
растворов, ведь у нас есть
только эначениs� самих
1 80 Глава 4
Списки и циклы
\
Диаl'\азон начина емся с о
и образуем 1'\О следоваW1ельносW11:>
из s чисел
J )
Создаем диаl'\аз он ом о до значен ия
С l'\иска smoothie s
дл инЬI
\ /' /
овый
Смузи # 3 тр пич
о еский
Смузи # 4 ЯГОДНЫЙ
На каждо й имерещ1.щ мы вы водим >»
СW1року 'Смузи #', индекс и название
сооW1вемсмвующего наl'\имкд
Структуры да нных • 1 81
Другие операции с д иапаз она ми
D:
числовые последовательности, начинающиеся
не только с нуля, но и с любого другого числа. Создает ли функция ranqe ( 5 )
Приведем ряд примеров. список [ о , 1, 2, з, 4] ?
[
\(.о Ие Ц oual'\QЗO Иa в том , что диапазон - это более
iЛ эффективная структура данных,
Начало дцаl'\азона (ие в кл юча ю щu
чем список. В определенном
� са мо ч uсло)
смысле они похожи , но диапазон
range ( S , 1 0 ) � Создаем мследо8амел11носм11, нельзя использовать там , где
начцнающуюся с 5, м.е. 5, 6, ожидается список. Если требуется
7, s, q создать приведенный выше список
на основе диапазона , задайте такую
Указание шага инструкцию:
l i s t ( r ange ( 5 ) )
D:
Можно дооа8цм11 Величину шага,
с КОW\ор ым оудум 1'\роl'\ускам11ся Счетчик цикла назывался i.
значения Далеко не самое понятное имя, не
12 ) Создаем мследовамел11носм11
так ли? Почему бы не назвать его,
J
например, index или smoothie_
range ( З , 1 0 ,
ом 3 до :z.o, но с щаzом 2, index?
О:
м.е. 3, 5, 7, q
Хорошее замечание. Вы
Отрицательный шаг правы , имя i не самое понятное,
но исторически сложилось так, что
Можно 6есми счем 8 оорамном мр ядке, указав мрвы;;. имена типа i, j и k применяются
apzyMeHW\ 0ОЛ11Ш1АМ, ЧеМ бморо!J.,
и задав 0Mp1AЦQW\eAl1HbliJ. ЩQZ для обозначения счетчиков
[l � е
� Создаем мследо8амел11носм11
O W\ :1.0 до О С щаzоМ - :1. , Wl.e.
в циклах. П рограммисты почти
автоматически следуют этой
range ( 1 0 , О , - 1 ) :1.0, q, S, 7, 6, 5, 4, 3 , 2, :1.
традиции, и более длинные имена
будут сбивать их с толку. Так
что советуем и вам использовать
короткие имена счетчиков. Вы
Как начать с отрицательного ч исла быстро к этому привыкнете.
1 82 Глава 4
Списки и циклы
• + -t +
....--- KTCI ЧТСI ДОАВОТ? -----.
range ( 8 )
- 3, - 2, - 1 , 0
range ( O , 8 )
3, 6
range ( O , 8 , 1 )
О, 1 , 2, 3 , 4, 5, 6, 7
range ( O , 8 , 2 )
О, 1 , 2 , 3 , 4, 5, 6
range ( O , 7 )
0, 2 , 4, 6
range ( -3 , 1 )
3 , 4, 5, 6, 7
range ( 3 , 8 )
3 , 5, 7
range ( 3 , 8 , 3 )
1 , 2, 3 , 4
range ( 3 , 8 , 2 )
Структуры да нных • 1 83
Составление о
тчета
Cocma6Aeнue omчema
Воспользуемся знаниями о диапазонах и цикле fо r, чтобы
отказаться от применения цикла while при выводе списка
результатов.
Вом наш сr.исок резул11W1t1мо8
46, 31 , 57 , 5 2 , 4 4 , 1 8 , 41 , 5 3 , 55 , 61 , 5 1 , 44 ]
Сначала оr.ределяем
длину сr1.иска
�
{
/1
Цикл while можно удалим
print ( ' Пyз:wpьxoвt.IЙ раствор # ' + str ( i) , ' - резупьтат : ' , scores [i] )
184 Глава 4
Списки и циклы
р
1<.ак и t\р ос ил ди р ек м о
Структуры да нных • 1 85
Составление от ч ет а
("�ьмum е kapaнgaw
-� Вам предстоит выпол н ить еще одно короткое
упражнение. П омн ите код на магн ити ках,
рассмотрен н ы й несколькими стран ицами ранее?
Обновите его, заменив цикл wh i l e циклом for.
[ ' ХОХОС081.1Й ' ,
В качестве подсказки свер ьтесь с обновлен н ы м
llDIOOthiea
кпубНИЧJD81 t
кодом п роекта для компа н и и "Пузырь-ОК".
1 ,
1 банаиоlDIЙ ' ,
i = о •
l i�7 L: t
1:�
•h i < len (has_coconut)
1 if haa_coconu [ i ] 7
i " i + 1 •
1 86 Глав а 4
Списки и циклы
Посиделки
Тема дискуссии: кахой
цик.п:, WИILE ИJ1ИFOR,
:важиее?
Структуры да нных � 1 87
Составление отчета
А с чем еще?
1 88 Глава 4
Списки и циклы
Офuсныu gu1Ao2
результаты по всем
n pogoмkaemcя •••
раствором,
осталось
о О сгенери ровать эаверwающую
часть отчета.
Структуры данных • 1 89
Составление о т че т а
��озьмumе kapaиgaw
,-�,
П о п робуйте реал изо вать псевдокод, п р и веде н н ы й на п ред ыдущей
стран и це, запол н и в пустые уч астки в коде. Вам необход и мо
о п редел ить на ибол ь ш и й из п олучен н ы х резул ьтато в тестов.
Сохран ите код в фа йл е ЬиЬЬ/еs.ру и за пустите п р о гра м му. П ро вер ьте ,
ка кие значения будут в ы в еде н ы вместо подч еркиван и й в окне
оболочки Pythoп. Ка к все гд а , свер ьтесь с ответом в конце гл а в ы,
пре жд е чем д ви гаться дал ь ше.
scores = [ 60 , 50 , 60 , 58 , 54 , 54 ,
58 , 50 , 52 , 54 , 48 , 69 ,
34 , 55 , 51 , 52 , 44 , 51 ,
69 , 64 , 66 , 55 , 52 , 61 ,
46 , 31 , 57 , 52 , 44 , 18 ,
41 , 53 , 55 , 61 , 51 , 44]
������- = scores [ i ]
Оболочка Python
ПуЗ1ь1р 101111Й pacnop 10 - резуш.,1, : 60
ПУЗllрЫоВllЙ pac'l'lop- 11 pesym.'a' : 50
ПyЗllpыoalilЙ рас'l'Зор 12 - pesym.'a' : 60
1 90 Гла в а 4
Списки и циклы
Пузырьковых тесто в : 36
Наибольший результат: 69
menu = [ ' Пицца ' , ' Паста ' , ' Суп ' , ' Са.пат ' ]
menu = []
�
элеменl'\'\ - смроку функцuu list ( ) ,
-
print (menu) чем м"' обязамельно
босмльзуемся мзже.
[ 'БУргер ' ' СуШИ •
j
А /'\О Ка У\р осмо
>»
,
У\р uмuме к сбеденuю
макую бозможнос мь
��ьмumе kapaнgaw
-� Что , по-вашему, делает приведе н н ы й н иже код? Обязательно
введите его в о болочке Python , чтобы узнать это.
1 92 Глав а 4
Списки и циклы
Уд аление элемента сп ис ка
Хотите сократить список? В Python для этого имеется встроенная
срункция del ( ) . Вот как она работает:
� -
[ ' Суши 'J
>»
2
Наш мекущий Сl'\исок, menu,
меню элемеЮ\'\АМи применительно к спискам?
Структуры да нных • 1 93
Другие операции со списка м и
Если. 8ыl'\олни.wФ
menu = menu + [ ' Бap б eJCJD ' , ' Тако ' ] эW1о м код 8месW10 ------:?
� функци.и. extend ( ) ,
рещльмаll\I\
1'\ОЛ!:JЧL!М WIOW\ же
В ста в ка элементо в в с п ис ок
Предположим, вы хотите вставить новый элемент в указанное
место списка. Для этого предназнач ена срункция insert ( ) .
r- Функци.я i n sert ( )
J
8cw.o.8u.wit> эле ме н м � !:JKi:IЗO.HHOM!:J и.ндексу,
б данном случае :J.
menu . insert ( l , ' Pary ' )
print (menu )
Пе �oumecь
'ЗаДаВаmь Во11rось1
R как добавление элементов. Функция append ( ) - пример
v: Что п роизойдет, если попытаться вставить в список
такой операции, реализуемой списком . Сейчас примите этот
элемент с несуществующим индексом?
О:
синтаксис как данность - время объектов еще не настало.
]j:
del menu ( о ] ? Разве Pythoп не поддерживает синтаксис
menu . delete ( о ) или подобный ему? Странновато для
Что означает синтаксис ной_ спжсо.к. столь последовательного языка, как Pythoп.
О:
append(э.нaveI011e)? Он напоминает синтаксис команды
random . randint ( О , 2) из предыдущей главы.
О:
Хороший вопрос! Оказывается , создатели Python
посчитали , что привычные операции , такие как len и de l ,
Да, их сходство не случайно. Вы поймете это
заслуживают особой трактовки . Кроме того, п о и х мнению,
в последующих главах, где вас ждет знакомство с объектами
синтаксис l e n (menu ) лучше воспринимается , чем menu .
и применяемыми к ним функциями (там вы узнаете и новую
l ength ( ) . Дебаты долго не утихали , и в итоге имеем
терминологию). Мы не будем слишком забегать наперед.
то, что имеем. Опять-таки , все это станет для вас более
Вам достаточно знать, что структуры данных, в частности понятны м , когда мы познакомимся с объектами.
списки , могут поддерживать собственные операции , такие
1 94 Глав а 4
Списки и циклы
���ьмumе kapaнgaw
П омогите н а п и сать ц и кл для нахожде н ия всех резул ьтатов, рав н ы х
_)..,
ма кс и мал ьному. Н а да н н ы й момент у на с е сть п р и веде н н ы й н и ж е код.
З а п ол н ите о с та в ш и е с я п рочерки и тол ь ко п о с ле этого с вер ьте сь с ответом
в кон це гла вы .
scores = [ 60 , 5 0 , 60 , 5 8 , 54 , 54 ,
5 8 , 5 0 , 52 , 54 , 48 , 6 9 ,
3 4 , 55 , 5 1 , 52 , 4 4 , 51 , Э м о на ш код
6 9 , 64 , 6 6 , 5 5 , 52 ' 6 1 , � на мекущиu
момен м
4 6 , 31 , 57 , 52 , 4 4 , 1 8 ,
4 1 , 53 , 55 , 61 , 51 , 4 4 ]
high_score = О
1 96 Глава 4
Списки и циклы
scores = [ 60 , 50 , 60 , 58 , 54 , 54 ,
58 , 50 , 52 , 54 , 48 , 69 ,
34 , 55 , 51 , 52 , 44 , 51 ,
69 , 64 , 66 , 55 , 52 , 61 ,
46 , 31 , 57 , 52 , 44 , 18 ,
41 , 53 , 55 , 61 , 51 , 44)
hiqh_score = О
-
lenqth = len (scores)
for i in ranqe ( lenqth) :
рrint ( ' ПУSRрьковый раствор # ' + str ( i ) , ' реаупьтат : ' , scores [ i ] )
if scores [ i ] > hiqh_score :
'
hiqh_score = scores [ i ]
== Если
best_solutions = [ ]
э w-. о "'' код кажеw-. ся
for i in ranqe ( lenqth) :
вам незна КОМЫ М, ЗНаЧU W\,
".
if hiqh_score scores [ i ] :
вы не tАзучи ли р ешенv. е
Ьest_solutions . append ( i )
1'\реды дущеz о уl'\раж ненv.я
" Во з ьми w.е кар а ндаш
print ( ' Pacтaopы с иаибопыаик реауJUошаток : ' , best_solutions ) Сдела iАw.е эw-.о сейча с
-
Растворы # 1 1 и # 18 показали наилучший результат: Оболочка Python
Пуз ырь к овый р аствор # 0
69 пузырьков. Они и становятся победителями!
рез ультат : 60
Пуз ырь к овый рас твор # 1 - результат : 50
Наибольший результат : 6 9
Ра с творы с наибольПIИМ результатом : [ 1 1 , 1 8 ]
Структуры данных � 1 97
И победителями стано вятся ...
8 мои же
расм8оро8. Расм8ор111 8 нем у казанtх
резул11мамо8
мследо8амелоносми, ч мо и 8 Сl'\иске
costs = [ . 25 , . 27 , . 25 ,
�
. 25 , . 25 , . 25 ,
. 33 , . 31 , . 25 , . 29 , . 27 , . 22 ,
. 31 , . 25 , . 25 , . 33 , . 21 , . 25 ,
. 25 , . 25 , . 28 , . 25 , . 24 , . 22 ,
. 20 , . 25 , . 30 , . 25 , . 24 , . 25 ,
. 25 , . 25 , . 27 , . 25 , . 26 , . 29]
scores = [ 60 , 50 , 60 , 58 , 54 , 54 , 58 , 50 , 52 , 54 , 48 , 69 , . . . ' 44 ]
1 98 Глава 4
Списки и циклы
Структуры да нных � 1 99
И победителями стано вятся...
'(=>) .онаеd иuи emqнew" oiиhedeuo еЦ1Л1:<1uоu:>и 'aodoa!:>ed хl'lнне!Щен еи �инЬ'еи:>оu н:>uиаоне.L:!
waueJ.и'dagou l'IQOJ.h 'онжЛн ии:>3 ·�deaodu ЛJ.е J.e!Щodu ен 01q,l:>QWИ0.1:> �онаеd :> doaJ.:>ed 'оннеа.1:>J.8&J.оо�
· .wah 'amqнew. ииhedeuo аh'иа а is:>J.eЛeиueed aodoa!:>ed �eJ.:>owиo.1:> еиненаеd:> et1oJto\1ae:>u а :J.e&J.O
200 Глава 4
Списки и циклы
costs = [ . 25 , . 27 , . 25 , . 25 , . 25 , . 25 ,
. 33 , . 31 , . 25 , . 29 , . 27 , . 22 ,
. 31 , . 25 , . 25 , . 33 , . 21 , . 25 , Не зо.буд"ме о нобом
. 25 , . 25 , . 28 , . 25 , . 24 , . 22 , Сl'l.цске смоцмос�меii
. 20 , . 25 , . 30 , . 25 , . 24 , . 25 ,
. 25 , . 25 , . 27 , . 25 , . 26 , . 29]
high_score = О
best_solutions = [ ]
for i in range (length) :
if high_score == scores [ i ] :
Ьest_solutions . append ( i )
cost = 1 0 0 . О
most effective = О
for i in range ( length) :
�акже добабцли
i f scores [ i ] == high_score and costs [ i ] < cost :
most_effective = i
cost = costs [ i ] инс�мрукцию 6111 бода, чмоб"'
print ( ' Рас'l'Вор ' , most_effective , сообщи�м" о мом, какой
' самый ВIП'Одный . Ero цена - ' costs [most_effective ] ) расмбор ca м "'ii выzодн"'ii
r
- -
1 1
истинного победителя, т.е. раствор, который выдает
наибольшее количество пузырьков и при этом стоит меньше
всего. Поздравляем! Вам удалось обработать большой массив
данных и предоставить компании "Пузырь-ОК" ценные
сведения, которые помогут ей с продвижением своей
продукции на рынке.
Наверняка вам, как и нам, не терпится узнать, что же
1 1
собой представляет раствор под номером 1 1 . К счастью,
директор компании "Пузырь-ОК" решил отблагодарить вас за
безвозмездный труд и поделиться коммерческим рецептом.
Рецепт раствора #11 приведен ниже. Изучите его, а затем
попробуйте приготовить раствор и выдуть несколько
пузырьков, после чего можете переходить к следующей
главе. Только не забудьте прочитать резюме главы и решить
1 1
кроссворд.
1 1
1 попытАЙТЕСЬ м8морцмь ЭМО ДОМА! 1
1 1
-
202 Глава 4
Списки и циклы
Хочу
сп рос и т ь : у нас уж е
ест ь сп и сок Ьest_solutions ,
в котором п редставлены ра створы
с наи бол ьши м резул ьтатом, так
зачем нам заново п росматриват ь
КАЖДЫЙ результат?
о
\
м ь� 1'\ереl'\исал и код
для Вь�чис ления самог о
На эl'AOl'A раз Mt>I 1'\рос маl'А риВа ем
Cl'\UC OK наиЛ !:JЧШи Х pacW\ Bopo
B,
J
Вь�годного p acl'\'\8opa а не Сl'\иС ОК резу льl'А аW\о В
К.ажд1>1й элеменl'А Сl'\иска bes t_solutions
СраВниl'Ае Эl'AO l'A код служи"" индексом В Сl'\иске costs
с 1'\ред1>1 д!:J щим Ba pu aHl'AOM cost = 100 . 0
решения . Замеl'Аu ли раэниЦ!j? most_effective = О Таким образом, значен ия f)
А 1"Аеl'\ерь 1'\редс1"АаВь1"Ае, из Сl'\иска bes t_solu tions
как оба Вари анl'Аа кода иc l'\oЛbЗ!:JIOl'ACR как индекс1:11
б!:J д!:J l'A Вь� млнЯl'\'\Ы Я index = Ьest_solutions [ i ]
коМl'\ЬЮl'Аером. Не 1'\раВда ли, i f cost > costs [ index] : Мь� nроВеряем Сl'Аоимосмь
иl'Аого Вое решение l'Apeбyel'A шost effective = index � каж дого расмВора 8 С l'\иске
намного меньше Времени cost = costs [ index] bes t_solutions и ищем
на Вь�млнени е? Разница наименым ую
� В
насl'Аолько большая, Чl'АО print ( ' Распор ' , 1110 s t_effective ,
CW\O иl'A 1'\Оl'Араченного на ее
конце В1:11Водим
' c&l&IЙ :ala'OДJIJilЙ . Ero цена - ' резулымамь�
изучение Врем ени. costs [шost_effective] )
�CAМOEFIAIHOE
• Списки - это структуры для хранения • Списки, хранящие данные разных типов,
упорядоченных данных. называются неоднородными.
• Список состоит из набора элементов, • Пустой список создается инструкцией
снабженных индексами. my_ l i s t
= [].
• И ндексация элементов списка начинается • Для добавления новых элементов в список
с нуля. Первый элемент имеет индекс О. предназначена функция append ( ).
• Количество элементов в списке (его длину) • Список можно дополнить элементами другого
можно подсчитать с помощью функции списка с помощью функции extend ( ) .
len ( ) . • Можно создать новый список путем
• К элементу списка можно обратиться по объединения двух существующих списков
индексу. К примеру, выражение my_ l i s t [ 1 ] с помощью оператора + .
возвращает второй элемент списка my_ l i s t. • Функция insert ( ) позволяет добавить
• Допускается использовать отрицательные в указанную позицию списка новый элемент.
индексы, обозначающие нумерацию с конца • Для просмотра последовательностей типа
списка.
списков обычно применяется цикл for.
• Попытка обратиться к элементу, индекс • Цикл while применяют, когда число
которого больше длины списка, приводит
итераций не известно заранее,
к ошибке выполнения.
а ограничивается определенным условием.
• Значение существующего элемента списка Цикл for, наоборот, лучше всего
можно изменить с помощью операции использовать при фиксированном количестве
присваивания. итераций.
• Попытка присвоить значение • Функция range ( ) создает диапазон целых
несуществующему элементу списка приводит чисел.
к ошибке выполнения "out of bouпds". • Для последовательного прохода по
• В списках можно хранить произвольные диапазону применяется цикл for.
значения. • Функция str ( ) преобразует число в строку.
• Список может содержать значения сразу
нескольких типов.
204 Глава 4
Списки и циклы
1
2
3 4
5
6
7
8
9
10
12 13 11
14
15
По rоризонтаnи По вертикаnи
3. Отдельный шаг цикла 1 . Последовательный числовой и нтервал
5. Один из напитков, котор ы й мы тестировали 2. Управляющая конструкция , предназначенная для
в этой главе многократного повторения блока инструкций
6. Добавление элемента в список 4. Число, с которого начинается индексация списка
9. Порядковый номер элемента списка 7. Добавление списка в другой список
1 1 . Список без элементов 8. Набор элементов, хранящихся под одним именем
1 5. Список, содержащий элементы разных типов 1 О. Подсчитываются при тестировании растворов
1 2. Составная часть списка
1 3. Текст, хранящийся в переменной
1 4. Число элементов списка
�..@!зьмumе kapaнgaw
'� Peweнue Давайте попрактикуемся в обработке элементов списка.
Внимательно изучите приведенный ниже код и постарайтесь
определить результат его выполнения интерпретатором Pythoп.
uзмененuе cr.ucкo.
nor.po6yeм омследuмь
еменнЬfХ r.pozpo.мм1i1.
eighties u другuх r.ер
Cr.ucoк ne-ave нuкоzд
о. не меняемся.
eiqhtiea • ( ' ' , 'duran duran ' , 'В-52а ' , 'a-ha ' ]
newwave = [ ' flock of aeaqulla ' , ' aecret aervice ' ]
rсмсмЬсr
11Ьe = eiqhtiea [l)
r811181r
(' ', 'dura" dural".', 'В-525', 'a-na']
eiqhtiea [ Э ] = band
[' ', 'culture сlиЬ', 'i3-S25', 'flock of sea9иlls'] 'dura"" dцra"' 'Flock of sea9ulls1
eiqhtiea[O] = eiqhtiea[2]
['B-S.2.s', 'culture сlиЬ•, 'В-525', 'ftock of sea9цlls1] 'dцral'\ dцrм' 'flock of sea9ulls1
print(eiqhtiea)
206 Глава 4
Списки и циклы
Са.мое Важное 8 ripozpa.ммe - мо, ка.к она берем rioлo8uнy r�а.линдрома. u "за.МЬ1каем"
его. nроаналuзuруем код.
characters = [ 1 t ' , 'а' , 'с' , 'о' ]
i = -2
цн6ермцруя знt.1ченце length (наr-.рцмер,
знt.1ченце 8 r1ре6рt.1w. цмся 6 - 8}
'(
'-- Ус1\1\ана6лц8t.1ем мременную i ра.6ной -2 1
while ( i >= length) :
! ..,
"th;;;:r:::�-r
:;
i = i 1
(сейча.с у6цдцw.е за.чем) почему в обра.1\1\ном мрядке? 1
output = output + characters [ i ]
- nомому Чl\l\O индекс1:>1 1\1\еr1ерt>
омрццамелt>н1:>1е 1
( j
М1:>1 r-.роходuм сr-.цсок сцм6оло6 6 обра.мном � !
мрядке, r-.роr-.уска.я са.м1:>1й мследнuй элеменl\I\, 1
чw.061:>1 он не r106w.орялся r-.осредц сw.рокц �
t
И зуча.йме r1рцмер, мка. не l'loймel\l\e, ка.к он
Apyzue r1pL1мept>1 млL1ндромо6 pa.бol\l\a.ew.! npoйдuw.e ка.ждую цмера.ци ю ццкла.
будуw. r1р1.16еденt>1 6 zла6е 8 ц зa.r-.uщuw.e зна.ченця r1еременн1:>1х, комор1:>1е
меняюw.ся
. .
:. . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
�зьмumе kapaнgaw
." Peweнue П риведенные н иже назва н ия напи тков д оба влялись
в список в поряд ке созда н ия . Заверши те код п рограммы,
определя ю щей название самого послед него напи тка.
8DIOothies = [ ' кокосоlПIЙ ' , ' :к.nylSНJIЧJlllЙ ' , ' ISaнaнolUIЙ ' , • ананасовuй ' , ' 11roДJDIЙ ' ]
:most recent = - j.
recent = smoothies [most_recent] � 13 P!Jthor. дЛJ1 оос W1у м к r.осле онеМ!J
элеменl'Vl!J cr.ucкa мо жно uсr.ол ьзо8аW1ь
oмp uцa W\tлbHЬIU uноекс - :1.
smoothies = [ • KOKOCOBllЙ . , • :к.пуСSНJIЧНllЙ . , ' ISaнaнolUIЙ ' , ' ананасоlUIЙ ' , • 11roДJDIЙ ' ]
JDOst recent = /en(sмootnies) - З..
208 Глава 4
Списки и циклы
решение
Пора выполнить небольшое упражнение. Мы написали код, чтобы
узнать, в каких напитках содержится кокос. Код был записан
с помощью набора магнитиков на дверце холодильника, но они
упали на пол . Постарайтесь все восстановить. Только будьте
внимательны: некоторые магнитики лишние. Свер ьтесь с ответом ,
приведенным в конце гл авы.
i
2
= о
$& 1
1 while i < len (has_coconut) l= J
.&
1 if has_coconut [ i ] 1 : 1
print (smoothies [ i ] , ' СОД8р1И'1' ICOICOC ' ) 1
Вом какой реэуломам
МЬI ожидаем
�
1
Рассма6оме здесь магнцмцкц
6 нужном порядке
�---
• +
КТСI ЧТСI Д8А88"?
-t- +
18CIWCIHUCI
Мы применили функцию range ( ) для получения нескольких
числовых последовательностей, но случайно перемешали все
результаты. Не могли бы вы нам помочь разобраться во всем?
Только будьте внимательны: мы не уверены, что каждому вызову
соответствует ровно одна последовательность. Один результат
мы определили самостоятельно.
range ( 8 )
- 3, - 2, - 1 , о
range ( O , 8 )
range ( O , 8 , 1 ) 3, 6
range ( O , 8 , 2 )
range ( O , 7 )
range ( - 3 , 1 )
range ( З , 8 )
3, 4, 5, 6, 7
range ( З , 8 , З )
� 3 , 5, 7
range ( З , 8 , 2 ) 1 , 2, 3, 4
21 0 Глав а 4
Списки и циклы
Wозьмumе kapaнgaw
' Peweнue Вам п редстоит выпол н ить еще одно короткое упражнение.
Помните код на магнити ках, рассмотренный несколькими
страницами ранее? Обновите его, заме н и в цикл
8lllOOthie8 = ( ' ХОХОСО8Jо!Й ' 1
wh i l e циклом for. В качестве подсказки сверьтесь
С ОбНОВЛеННЫМ КОДОМ п роекта ДЛЯ КОМПаНИИ и Пузырь-ОКп
xnytlsx.Jlldi •
•
• '
'
' бахаа08Jо!Й • ,
' 'X'p()DИ'l8CXllЙ 1
' IU'OдJDdl • ]
h&a_coconut • [True ,
l'alae ,
8сма8ьме здесь с8о й код
l'alae ,
smoothies = [ 1 ХОХОСОВЪJЙ 1
True ,
'
!'alae]
' 1СJ1уб нич!ВIЙ ' ,
' бакановый ' ,
1:'
while i < len (haa_coconut) ' троnичесхий ' ,
1 if h&a_coconut [ i ]
. - . . .. •
' яrодный ' ]
print (81110othiea [ i ] ,
' coдepal'l' хохос ' )
has coconut = [ True ,
)
False ,
i = i + l False ,
True ,
False ]
� Оr\ределяем длину
lenqth = len (has_coconut) Сr\иска
�
И мерцру ем ом о до значенц я
for i in ranqe ( lenqth) :
длин ЬI Cr\IA CKa минус :1.
i f has_coconut [ i ] :
.,;:"- print ( smoothies [ i ] , ' содер'8СИ'1' хохос ' )
Структуры да нных � 21 1
Упражнения: решения
�tii�зьмume kapaнgaw
� :--..
scores = [ 60 , 5 0 , 60 , 58 , 54 , 54 ,
58 , 50 , 52 , 54 , 48 , 69 ,
34 , 55 , 51 , 52 , 44 , 51 ,
69 , 64 , 66 , 55 , 52 , 61 ,
46, 31 , 57 , 52 , 44 , 18 ,
41 , 53 , 55 , 61 , 51 , 44 ]
�-_ n1�
g_n_ co_
__s� �e�� = scores [ i ]
Оболочка Python
Пузырь к овый раствор # 0 - рез ультат : 60
Пузырь к овый раствор # 1 - рез ультат : 50
Пузырь к ов ый раствор #2 - рез ультат : 60
21 2 Гла в а 4
Списки и ц иклы
r--.
mys tery = [ ' секре'l' ' ] * 5 Данная uнсtv1рукцuя coздael'VI Cf\t.tcoк, в коtv1ором элеменм
'ceкpeWI' мвtv1оряеtv1ся s раз: ['ceкpetv1', 'секрем', 'секрем',
'секрем', 'секреw.']. Эмо удобная особенносw." Pytnof\, коw.орую
не всмремuш" в другuх ЯЗ171 К/.tХ r.рограммuрованuя. Она чacl'Vlo
оказ171ваеw.ся млезной (м171 восмл"зуемся ею в главе з.з..)
umе kapaнgaw
lf'�з зыьм
Помогите написать цикл для нахождения всех результатов, равных
"'
. Peweнue макс имальному. На да н н ы й момен т у на с есть приведенный ниже код.
Запол н ите оставшиеся прочерки и тол ько после этого сверьтесь с от ветом
( /
в кон це главы.
==
Ьest_solutions = [ ]
На каждой utv1epaцuu цuкла дереВ"я...
for i in range ( length) : � М171 сравнuваем резул"w.аw.,
if high score scores [ i ] : � находящuйся м uндексу i,
best_solutions . append ( i ) � с мременной high_score,
u еслu онu равн171, WIO
добавляем uндекс pactv1вopa
6 cr.ucoк be s t_solutions
с ММОЩ"Ю функцuu append ( )
Структуры данных � 21 З
Упражнения: решения
д 2
3 и т е р а ц и я 4
а и н
п 5 к о к о с о в ы й
6 в с т а в к а л л
з 7 ь
о 8 п
9 и н д е к с р
п и
10 и с
12 13 11 п у с т о й
э с у о е
л 14 т з к д
15 н е о д н о р о д н ы й и
м л о р н
е и к ь е
н н а к н
т а и и
е
21 4 Глав а 4
*
-+ Функциональный код
!ff�ьмume kapaиgaw
�� П роанализируйте при веденны й ниже код. Что вы м ожете о нем сказать?
В ы б ерите л юб ое число пунктов в списке ли б о дайте свою характеристику.
Т!;J3UK
21 6 Глава 5
Функции и абстр а кции
Ч mo не mak с kogoм?
Легко заметить, что одни и те же конструкции повторяются
спова и спова. И что с того, спросите вы? Да, в общем-то, ничего.
Программа ведь работает правильно ! Давайте присмотримся
повнимательнее к ней.
218 Глава 5
Функции и абстра кции
\ ?�"""
функцию , указ1116ая смабимся комор111 е �еда ю мся
" � в ко М
�
�, 1'\Осл е ком орог о 11кюк uме
----
r�еременн111е , комор111е хро.ням
uмя фннкцuu значенuя, r�ереда80.ем111е функцuи
J ""J.. ,
�
tJ,. \( --- В конце смо.В uмся дбоем очие, комор о е
if weiqht > 2 0 :
print ( name , ' �оворит ГАВ-ГАВ ' )
Вом блок кода, комор111 й
б11де1'\1\ иСl'\ОЛРЭО8О.1'\1\DСЯ
else : мбморно
print ( name ,
В P11thol'\, ко.к u 8 дp11zux
яэ111 ках У\рогро.ммиробо.нuя,
эмом блок кода наз11180.емся
Когда uнмерУ\ремо.мор P!jthol'\ Видим эмом код, он соэдо.еW\ � ф11нкцuи
ОУ\ределение функцuи и сохраняем его для б11дущего и СУ\ОЛDЭобо.нu.я.
Тело функцuи 8 до.нн1>1й моменWI не 81>1млняемся. Код будеWI
61>1млнен молько У\ри 61>1зобе ф11нкции
Функциональный код � 21 9
Функция создана - можно uспопьз овать
[
Начи наем с фун кции prin t О '
чмоо1�1 м3г омо бим ься
220 Гла в а 5
Функции и абстракции
Нач�.таем омсюда
Оболочка Python
t
print ( name , ' rоворит raa-raв ' )
t
к объявлению функции bar k ( ) . На данном
этапе интерпретатор не выполняет код рrint ( ' Подrотовьте собах ' )
функции, а всего лишь присваивает блоку кода
def bark ( name , weiqht) :
имя bark и выполняет синтаксический анализ,
if weiqht > 2 0 :
после чего сохраняет параметры и тело print (name , ' rоаорит ГАВ-ГАВ ' )
функции для дальнейшего использования. else :
После обработки интерпретатором функцию print (name , ' rоаорит
bark ( ) можно вызвать в любом месте
программы. bark ( ' Туsих ' , 4 0 )
пора 6ыз6аw11>
нашу функццю
Мы 1'\ередаем ей
print ( ' Пoдroтo••тe собах ' )
дба арzуменма:
' Тузик ' ц 40 ... de f bark ( name , weiqht) :
if weiqht > 2 0 :
print ( name , ' rоворИ'l' ГАВ-ГАВ ' )
".коморые 1'\рцс6аи6аюмся
1'\арамемрам name ц weight
Закрепим
М ы вызы ваем фу н к ци ю.
Параметры функции, name и weight, можно
рассматривать как переменные, которые Мы п е р ед а ем ар rум енты
существуют, только пока функция выполняется. выз ов а м ф ун к ци й .
Они хранят значения аргументов, переданных
при вызове функции. Функция имеет н ул ь или б олее
пара метр о в, п ол уча ю щ и х
Далее интерпретатор загружает код функции
bark ( ) и начинает ее выполнять. зн а че н ия и з а р гуме нтов
ее выз ов а .
222 Глава 5
Функции и абстракц ии
Подготовьте соб ах
рrint ( " Отпично , все rото•о" )
Ту зих говорит ГАВ-ГАВ
l
ту1Эа , о т:ку1Эа была вызвана
после моzо как вызов функции. bark ( ) завершен,
фун:кqиJI, и интерnретат ор и.нмерl'\ремамор возвращаемся к вымлнению
на-qинаt'Т ВЫI}ОЛН_f!ТЬ мслеоующи.х и.нсмрукци.й
ЪJ51�� &;oJ Вам пришлось м ногое узнать и выучить. Сохраните приведенный ниже код
тe,cm-n.f i\11:в в файле bark.py и выполните команду Run > Run Mod u l e , чтобы убедиться в его
работоспособности.
фtiiiл
print (name , ' говорИ'l' ГАВ-ГАВ ' )
в
else :
print (name , ' говорИ'l' гав-гав ' )
Смайли г ов орит г ав -г ав
224 Глава 5
Функции и абстракци и
@t'.Qoзьмume kapaнgaw
'�� В этом у пражнении вам предстоит соединить точки . Начните
с п. 1 и нарисуйте стрелку к каждому следующему пункту в той
очередности , в которой будет выполняться программа. Можете
писать комментарии , поясняющие, что происходит в программе.
Мы уже нарисовали пару стрелок за вас.
Начинаем здесь
Btitзtit8aeм функцию
print ( )
\
с е•
и n.ерехоtшм
рrint ( ' Подготовьте собак ' )
к следующей смроке
def bark (name , weiqht) :
о if weiqht > 2 0 :
ф print (name , ' говорит ГАВ-ГАВ ' )
else :
print (name , ' говорит гав-гав ' )
��зьмumе kapaнgaw
"'� Н иже п ри веден о нескол ь ко вызовов фун кци и bark ( ) . За п и ш ите р ядом с каждым
из н их ка к и м п о ва ш ему м не н и ю будет
, , , должна будет
резул ьтат и л и же п ро грамма
выдать о ш иб ку. П режде ч ем п родолжить , сверьтесь с ответом в кон це гла в ы .
HQl'\IAШtAW\e, ЧW\О ,
Ьаrk ( ' Снуппи ' , 20) м-6ашему, будеW1
выведено на консоль
bark ( ' Вакстер ' , -1)
что мы займемся
изучением абстракций.
ТТочему же мы все время
говорим о срункциях?
226 Глава 5
Функции и абстракции
Ко� на маrнитиках
u
У нас есть код, которы й записан с помощь ю набора
магн итико в на дверц е холодиль ника. Помог ите
о а
составить п рограмму, которая выдает показа н н ы й
ниже резул ьтат. Только будьте внимательны: г.-.
� щ щ
некотор ые магни тики л и ш н ие. Сверьтес ь
с ответом, п риведе нным в кон це главы.
, .
�
.
J
1,1
�. }
· . .
.. '1 со u
·.
de f · ·
·
·
..
.
1 how_should_I_get_there (800 . З )
i! 4 2
el se :
print ( ' ПеDIКОИ ' )
miles
(
/ kil ometer 1
if miles > 120 . 0 :
print ( ' Саиопе'!'ои ' )
Оболочка Python
Самол етом
Машин ой
Пешк ом
Пе e;0fu:necь
'ЗадаВаmь Во11rось1
О:
быть другая функция . О том , зачем это
передачи аргументов функциям ,
может понадобиться , будет рассказано
Конечно, функцию нужно сначала с которыми м ы познакоми мся далее.
]j:
в приложени и .
D:
объявить, чтобы и меть возможность
вызвать ее в п рограмме. Рассмотрим
Я никак н е м о гу понять, в чем
Существуют ли какие-то правила
более сложный случай: в программе именования функций?
О:
разница между параметрами
используются две функци и , п и f 2 ,
и аргументами?
О:
причем функция f2 вызы вается Правила те же самые, что
из функции f l . В таком случае и в случае имен переменных
допускается объявить функцию f2 Не стоит ломать голову над
(см . главу 2). Имя функции должно
этим . Оба термина в сущности
после функции fl, п р и условии, начинаться со знака подчеркивания
что функция п не вызывается до
означают одно и то же. Аргументом
или буквы и содержать буквы, числа
назы вают значение, передаваемое
объявления функции f 2 . Все дело и знаки подчеркивания . Разработчики
в том , что при объявлении функции функции при ее вызове в основной
Python придерживаются соглашения
программе. А параметр является
f1 функция f2 сама по себе не записывать имена функций в н ижнем
вызывается - это происходит только частью определения функции - он
инициализируется значением регистре, разделяя слова знаками
при вызове функции f 1 в основной подчеркивания, например get -name
аргумента, передаваемого функции .
]j:
программе. Впрочем, во избежание или f i r e cannon.
]j:
путаницы рекомендуется размещать
объявления функций в начале файла. Что произойдет, если перепутать
]j:
Может ли функция вызывать
порядок аргументов, передаваемых
другие функции?
О:
функции?
О:
Какие значения можно передавать
функции?
О:
Н ичего хорошего! Либо возникнет Конечно! Это происходит регулярно.
ошибка выполнения , либо п рограмма Обратите внимание на вызов функции
В Python функциям разрешается
будет работать неправильно. print ( ) из функции bark ( ) . При
передавать данные любых уже
Внимательно изучите определение написании собственных функций вы
известных вам (а также тех, которые
функции , чтобы понимать, какие можете поступать точно так же.
только предстоит выучить) типов:
:,J
Эмо новая функцця get_Ьark ( ) , коморая возвращаем
Оl'\w санце лая 8 за8цсцмосмц ом веса соба
Но в111 м лня ем ся молоко
def get_bark (weigh t ) : � Еслц Вес болоше, чем 20, одна цз нц х , 1'\ОСКОЛоку
i f wei ght > 2 0 : af_ 8оз8ращаемся смрока "Рц заl'\у ске цнс мру кцц ц
re turn функ цwя с разу
же
' ГАВ-ГАВ '
re turn ' ГАВ - ГАВ ' аем свою рабо му
заверш
else : 13 1'\ромцвном случае 8оз8ращаемся
return ' гав - гав ' смрока ' гав -гав '
Функцця можем цмемо
ноло, одну цлц несколоко
)
цнсмрукцц й return
228 Глав а 5
Функции и а бстракции
j�
tuzik bark = get_bark ( 4 0 )
print ( " Tyaиx nae'l'" , tuzik_bark)
t��зьмumе kapaнgaw
"�� Давайте попра кт икуемся в определени и з начений, воз вращаемых
функциями . З апишите результат каждого вы зова .
" asae) :
e ti.n.,. ' n
make_g r e
de .f al low_ac ce
' + n
' '
·
+
ss (pers on) :
ame
'
de f i. .f p er so n
rn
' nрив•'l' ,
r e tu
== ' До х'l'
ор Зпо • :
def compute (х , у ) :
answer = True
total = х + у
el se :
an swer = Fa ls e
if ( total > 1 0 ) :
total = 1 0 re turn an swer
return total
Оrtределено. но. �
1'\ред,,,дущеi.i
get_bark ( 2 0 ) Н о.1'\ цшцме, чмо
смро.нице
6оз6ро.що.ем
ко.ждо.я функцця
�
make_greeting ( ' Снуnпи ' )
compute ( 2 , З )
В последнем упражнении
я эаметил , что вы объявили
несколько переменных прямо
в срункции, в частности , total
И answer.
XopowaR
набnюдатеnьность!
Действительно, в функции можно
объявлять новые переменные,
что и бьшо показано выше. В них
обычно хранятся результаты
промежугочных вычислений.
Такие переменные называются
лохалъными, поскольку они
существуют только в теле
функции. Этим они отличаются
от глобальн ых переменных ,
с которыми нам приходилось
иметь дело до сих пор: последние
существуют в течение всего времени
работы программы.
Но давайте возьмем паузу
ненадолго, так как нам поступило
предложение переписать
имеющуюся функцию. У нас
достаточно знаний о функциях,
их параметрах и способах вызова,
чтобы справиться с этим заданием,
после чего мы вернемся к разговору
о переменных (локальных ,
глобальн ых и люб ых других ) .
230 Глав а 5
Функции и абстракции
е
Проект пока находится на начальной стадии. Программа просто
�
� Q
запрашивает у пользователя предпочтения: цвет волос, цвет глаз, . . .
... .....
� �
� �
-
i • i •
... ...
Вы nодненuе koga
Давайте выполним имею щуюся программу,
чтобы лучше понять, как она работает. Только
предварительно изучите ее исходный код .
/
/
прогро. м мо. 8ыдt1еW1 30.1'\рос 1'\О
кюкоо м у о.мрибуму. Мы либо
вводи м ну жны ii о.мрибум,
~
либо 1'\рuни м о.ем значение 1'\О
у м олчанию (но.1'\р имер,
коромкие волос ы и не нос и м
очки), но.жимо.я <El'lter">
для ко.ждо го t1мри бумt1
r.p o zp t1м мo. момвержде1е м ----.____;?J
быбор 1'\ОЛ113 Овt1мелЯ, вО/воо я
ezo но. консоли
232 Гла ва 5
Функции и абстра кции
И Всякий раз у
для каждого амр иоум а МЬf вЬtво
дим на с разн �хе
�)
ум ол ча ни ю
значени я n.o
заn.рос ц ожи даем омвем ом
n.олозовамеля
def
,
М ы исn.олозуем дба n.арамемра: question
для задаваемого во n.роса наn.рцмер
"Цвем волос") 1А defaul t для значенця
n.o умолчанию, наn.рцмер "мемнЬtе"
г
Сос1Мавляем заf\рос к мл"зоваW1елю ,
def get_attribute ( query , defaul t) :
конка1Менируя f\apaMeW1p"' query
!А de faul t с нео охооим"'ми си мволами
ques tion = query + ' [ ' + default + 1]? 1
answer = input (question)
234 Глава 5
Функции и абстра кции
]
def' qet_attribute ( query , def'aul t) :
question = query + ' [ ' + def'ault + 1 ? 1
\9Jl:l- �;gJ Сохраните приведенный выше код в файле avatar.py и протестируйте его,
выполнив команду Run > Run Mod u l e .
Tecm-n.r�в
было ран1:1ще
1.1
_ i
А II�-o:ьor eJн:�l\iy
� П е р е п исы ва н ие кода п р о гр а мм ы с цел ью сделать его более
структу ри р ова н н ы м, компа кт н ы м и по н ят н ы м, - п р и вы ч н ая п р а ктика
дл я каждого програ мм иста . Э тот п р оцесс н азывается рефакторинг.
Фунхц и и :в э фи р е
И нтервью недел и :
[Редакция Head First] Доб р о пожаловать Они мне как братья! Это тоже локальные
в студию! Спасибо, что согласились прийти к нам. переменные, но особого рода: их значения
устанавливаются непосредственно при вызове
[Локальная переменная] Рада побывать у вас функции. Каждый из параметров получает свое
в гостях. значение от соответствующего аргумента. Как
В общем-то, мы мало что о вас знаем. Не могли и локальные переменные, параметры доступны
бы вы вкр атце рассказать о себе? только внутри функции и прекращают свое
существование по завершении ее работы.
Если вам приходилось объявлять переменную
внутри функции, то это была я. Не знали, что вы, оказывается, настолько
близки. Тогда нельзя не спросить о другом
Чем это отличается от объявления других известном пер сонаже: глобальной переменной.
переменных?
Если хотите знать мое мнение, банальная
Я работаю только внутри функции. Это выскочка. С ней куча проблем.
единственное место, где я доступна.
Серьезно?
Что вы имеете в виду?
Для тех, кто не в курсе: глобальная переменная
Представьте, что вы пишете функцию, в которой объявляется вне функции. У нее глобальная
промежуточные результаты вычислений нужно область видимости.
сохранить в переменной. Вы объявляете эту
Что, пр остите?
переменную внутри функции и можете свободно
использовать ее в теле данной функции. Область видимости - это та часть программы,
Переменная не существует до тех пор, пока в пределах которой можно обратиться
функция не будет вызвана, и как только функция к переменной, т.е. прочитать или изменить
завершится, переменная исчезнет. ее значение. Глобальная переменная доступна
в пределах всей программы.
А что
произойдет при следующем вызове
функции? Ау вас какая область видимости?
Будет создана новая локальная переменная с тем Как я уже говорила, она ограничена телом
же именем, которая просуществует ровно до функции, как и у параметров.
завершения работы функции, после чего тоже И что же плохого в том, что глобальная
исчезнет.
переменная видна в пределах всей пр огр аммы?
Какая от вас польза, если вы существуете только
Это считается не лучшим решением с точки зрения
короткое время и все вр емя исчезаете, как
дизайна программы.
только функция завершается.
Но почему, ведь такие переменные достаточно
Что вы, я очень полезна! С моей помощью можно удобны для хранения данных?
хранить временные результаты вычислений,
выполняемых в функции. Без меня вам не Думаю, ваши читатели вскоре об этом узнают.
обойтись. А когда функция завершается, я беру на Просто в больших программах это может вызывать
себя задачу очистки. Вам не придется беспокоиться проблемы.
об удалении переменных, ставших ненужными.
Наверное, в следующий р аз стоит пригласить
Однажды нам довелось бр ать интер вью вас обеих на посиделки.
у пар аметров функции. Какие у вас отношения?
Уж там-то мы подискутируем !
236 Глава 5
Функции и абстракции
u снова о nереме н н ых
Оказывается, при работе с переменными нужно знать не только о том, как их объявлять
и как задавать их значения. После знакомства с функциями выяснилось, что бывают
локальные и глобальные переменные. А еще у функций есть параметры, которые действуют
как локальные переменные, только инициализируются автоматически при вызове функции.
И , ко всему прочему, существует концепция области видимости переменной .
�..Qозьмumе kapaнgaw
,� Опишите, к какой из категорий относится кажд ая переменная в следующей
программе. Отметьте локальные, гл обальные переменные и параметры.
Сверьтесь с ответом в конце главы.
de f drink_me (param) :
msq = ' ВШПО1а- ' + param + ' стакан '
print (msq)
param = ' пустой '
г
вам примере.
def
= query + ' [' + 1]? '
input ( question)
if ( answer == ' ') :
Замемьме, чмо
МЬI 8оз8ращаем
answer = default значение через
print ( 'h выбрапи ' , answer) локальную
n.еременную
return answer
answer
238 Глав а 5
Функции и абстра кции
Пе t:oUm.ecь
задаВаmь Во11rось1
О: О:
нужны параметры? Почему нельзя
Возвращая локальную переменную, Да , это допускается. А произойдет ссылаться на значения rлобальных
вы возвращаете не ее саму, а ее то, что внутри функции все переменных?
значение. Тут уместна аналогия
с эстафетой : вы передаете эстафетную
палочку следующему участнику
обращения к глобальной переменной
будут заменены ссылками на
одноименную локальную переменную
О: Технически так можно делать,
но это ведет к появлению ошибок
забега , и дальше бежит он, а не (параметр) . Фактически глобальная в п рограммах. Используя параметры ,
вы. Таким образом, по завершении переменная станет невидимой можно писать универсальные
работы функции значение переменной внутри функци и . В подобных случаях функци и , не зависящие от глобальных
возвращается, но сама она удаляется. говорят о перекрытии переменной переменных. Сама программа
(параметр перекрывает глобальную определяет, какие именно аргументы
переменную) . Такие ситуации довольно следует передать в функцию.
� часто возникают даже в хорошо
Для примера возьмем созданную
Все мо же самое сn.равеолtАво структурированных программах; это
)
param = ' пусшой '
,
glass = ' по.n!ВIЙ ' �
В эмоU. tАнсмру кции, смоящей
drink_me (glass ) n.осле оn.ределе ния Ф11нкции , м"'
print ( ' Сшакан ' glass) n.рис 6аиваем n.еременноii glas s
см.рок11 ' пол!li!Й '
�
Функциональный код • 239
Вызов функции drink_me()
)
....р1.1.сва1.1.ваемс я
1'\араме1111ру param
print ( ' С'l'акан ' , glas s ) пРИ М Е ЧАНИ Е : смсоб 1'\ередачц аргумен11110 8
8 Pytkol'\ немного сложнее, чем 01'\1.1.сано здес11,
особенно когда реч11 1.1.дем об объекмах, но мка
ч11110 э 11110 хорошая рабо ч а я модело
,
glass = ' по.nный '
drink_me (glass )
print ( ' С'l'ахан ' glass )
В данный момен1111 мременная
param содержцм ' полЮIЙ ' �
раrам
240 Глава 5
Функции и абстракци и
переменная glass не
"оменялась: она "о-"режнемн
содержим ' полный '
А ме"ерt:> самое важное: Mt:>I "рисваиваем
"еременной param значение ' пустой '
�
(
\�def drink_me (param) :
msg = · �аеи ' + param + ' стакан '
glass
print (msg)
param = ' пустой '
Зal'Vlo "еременная
glass = ' по.пный '
param мемрь
drink_me ( glas s ) содержим ' пустой '
print ( ' Стакан ' , glas s )
�
def
вt:>lзов ф н нкции за.верши лся
drink_!D8 (param) :
msg = · �аеи ' + param + ' стакан '
glass
print (msg)
О � мь - маки, для мременной g l a s s
param = ' пустой '
ничего не мменялось: она "о-"режнемн
содержим значен ие ' полный '
glass = ' nо.пный '
drink_1118 (glas s )
print ( ' Стакан ' , glass )
?--
Фн н к ция print ( ) вt:>lводим
значение "еременной glas s ,
м.е. полный '
'
242 Глава 5
Функции и абстра кции
def greet (name , message ) : / ч мо с оби р аемся и.сnол1:Jз о 8ам1:J Оболочка Python
__/ zлобал1:Jную nеременную
g1 оьа1 gree t :i.ng
_, Прив ет ствуЮ , Джун ' Увидим ся '
. "'"
»>
print (greeting , name + ' ! ' , message )
J
Привет , Джун ' Увидим ся !
Меняем глобальную
def greet (name , message) :
/
nеременную на Привет ,
global greeting ' Прив ет ' »>
greeting = ' Привет , '
print (greeting , name + ' ! ' , message )
Как видите, все достаточно просто: если требуется использовать глобальную переменную
в функции, объявите ее внутри функции с ключевым словом glob a l , чтобы сообщить Pythoп
BRJi��� el0
о своих намерениях. Только будьте осторожны : многие до вас уже сталкивались с подобными
проблемами. Если не указать ключевое слово globa l , глобальная переменная по-прежнему
будет доступна в функции, но лишь для чтения. При попытке изменить ее значение произойдет одно из двух .
Если это первое обращение к переменной внутри функции, Pythoп посчитает, что имеет дело с локальной
переменной . Если же значение переменной уже считывалось, то будет выдано сообщение об ошибке
UnboundLo calError. Получив такую ошибку, проверьте, не происходит ли где-либо непреднамеренного
совмещения локальных и глобальных переменных.
Посиделки
Тема дискуссии : покапъиая
и rпобапъиая перемеииые спорят
о том, кто иа иих важиее
244 Глав а 5
Функции и абстракции
Функциональный ко д • 245
Размышления о параметрах: значения по умолчанию и ключевые слова
П а раметры no умодчан u ю
Параметры функции могут иметь значения по умолчанию.
Ниже приведена упрощенная версия функции greet ( ) ,
лишенная глобальной переменной.
А эw� ому napaмewipy не 8а жно ,
емр ,
Э м о обы чн ый nар ам
[
бу дем ре дан ар умен
ющ и u nолу чен ия м г w� ил и нeWI,
о жи да r.owioмy ЧW\ о У нег о есм ь значен ие
ар гумен м о. 1'\О умо лчан ию
def qreet (name , messaqe= ' .!се �учк�! � Змо см 1.1 ндар м н ы й мексм
print ( ' Прм.ет , ' , name + ' ! ' , messaqe ) с ообщения, 6ы6одимый, если
вызь�бающий код не nepeдaeW\
аргуменм для 1'\ар а м еW1.р 1.1 me s s age
r
Снабдив параметр значением п о умолчанию, давайте
посмотрим, как это работает.
Если мы 6ызы6аем ф у нк ц и ю gree t ( )
без арщменWlа для l'\ttpaмeW1pa
me s s age, WIO ф ун кцця исnол ьзуеWI
значение r.o умолчанию
qreet ( ' Д.он ' )
qreet ( ' Д.еннифер ' , ' Как ,iie na? ' )
J
А е сл и мы 1'\ередаем аргуменWI для
r.арамемра me s sage , мо функция
greet ( ) исnользуем значение аргуменw.а
246 Гл ав а 5
Функции и абстракции
r t
def 9reet ( name , messaqe= ' Bce пучком ! ' , emoticon ) :
Та к MCl'\'1,Ljl'laW\/;>
не сле ду ем ! Такое оl'\ределенце фннкццц
недоl'\нсмцмо. Pytkol'\ жалнемся
на мо, чмо ооязамельн111 й арщменм
(non-defaul t 6 мер мцнолоzцц Pytkol'\)
cмoцl'll\ 1'\ОСле apzнмeнl'll\a , цмеющеzо
значенце 1'\О умолчанию
подобные ситуации, вы просто должны запомнить, что все наверняка. cnpocиw.e, мчемн
обязательные параметры (non-defaul t в терминологии цнмерl'\ремаw.ор наз1:116а.ем
Python) должны указываться перед параметрами, l'\apaмew.pt>1 арщменw.амц.
снабженными значениями по умолчанию. Прислушаемся M t>1 з ада.ем мом же 601'\рос,
к этому требованию и исправим код функции. но с инмерl'\ремамором
Pytkol'\ не 1'\ОСl'\орцщь
".а за ним и иду м
Темрt> обязамельн111е н еобязамел ьные
1'\драмеW1р t>1 цднм 1'\ер 6ы мц
J
...
Функцион альный ко д • 24 7
Аргументы с ключевыми сл о в ами
greet (message= ' Гдe '1:'Ы бы.па? ' , nаmе= ' Джипn ' , еmоtiсоn= ' отпично ' )
ч"). "'"""'&.""• \)
ключевое слово' у1<1:1 .жиW1е \
И сl'\ОЛРЗ,УЯ ключевые слова, мы можем
указываw." арщменWIЫ 6 nр о и з во л Р Н ОМ мрядке
имя /'\tlp aMeW1p a, заW1еМ
и даже onycкaWIP их, если у них есмР значение
знак = и значение аргуменW1а
м умолчанщо. Главное, чW1обы арщменW1ы
�
greet ( ' Бетти ' , message= ' CaJUO'l' ! ' , emoticon= ' : ) ' )
248 Глава 5
Функции и абстракц ии
&
_....
9ПРАЖНЕНИЕ
Закрепим полученные знания об аргументах функций , изучив следующий
код. Попытайтесь предугадать возвращаемые им результаты и запишите их
в приведенном ниже окне оболочки Python .
de:f make_sundae (ice_cream= ' вaниn1oнoe ' , sаuсе= ' шоколад!GIЙ ' , nuts=True ,
banana=True , brownies=False , whipped_cream=Тrue ) :
recipe = ice_cream + ' иоро•еное и ' + sauce + ' соус , '
i:f banana :
recipe = recipe + ' с бананом , 1
if brownies :
recipe • recipe + ' с брауни , '
i:f not whipped_cream :
recipe = recipe + ' не '
recipe = recipe + ' содер.ит вабИ'nlе СJIИВJСИ . '
return recipe
sundae • make_sundae ( )
print ( ' Один десерт . Состав : ' , sundae)
Оболочка Python
� ЗаУl.uщ цмг
зде сь резуль ма мЬt
Функциональный ко д • 249
Как правильно использовать все доступные в озможности
Имеет единсrвенное
sначение None
250 Глав а 5
Функции и абстракции
Эмо сумма на
balance = 1 0 5 0 0
5анко6ском счеме
camera o n = True
return amount
camera on = True
�САМОЕ rllAIHOE
252 Глава 5
Функции и абстракции
1 2
6
7
10
11
12
13
14
15
��озьмumе kapaнgaw
,,� Peweнue П роанализируйте приведенный н иже код. Что вы можете о не м
сказать? В ы берите л юбое числ о пунктов в списке л ибо дайте свою
хара ктеристику.
�
много изменений !
пользы .
Е. Смоцло лц цсr�ользовамь однц ц
ме же мременнЬlе снова ц снова
для разн1�1х собак?
t-�озьмumе kapaнgaw
В этом упражнении вам п редстоит соединить точки . Н ачн ите
"� Peweнue с п . 1 и нарису й те стрел ку к каждому следующему пункту
в той очередн ости , в которой будет вь1полняться про грамма.
М ожете писать ком ментарии, поясняющие, что происходит
в про грамме. Мы уже нарисовал и пару стрелок за вас.
Начцнаем здесь
81�1з1�1ваем функццю
print ( )
\
с е•
ц мреходцм
рrint ( ' По�rотовьте собак ' )
к следующей смроке
def bark (name , weiqht) :
о if weiqht > 2 0 :
ф print (name , ' rоворит ГАВ-ГАВ ' )
else :
print (name , ' rоворит rав-rав ' )
254 Гла в а 5
Функции и абстракции
�
�
f,v;�Of,e
�1' v; f,o?JJ1' o;
:::;:: t'c·t
'S)Э.�-у.\.)
,_
о
ф
print ( ' Пoдroтoa•тe со б ак ' )
el•e :
print (name , ' rоаорит ГАВ-ГАВ ' )
�.Jозьмumе kapaнgaw Н иже п р и ведено нескол ько вызовов функции bark ( ) . За п и ш ите рядом
,� Peweнue с каждым из н их, каким, по вашему мнению, будет результат или же
программа должна будет выдать ошибку.
Ьаrk ( ' Лори ' , " 20 " ) ERROR, '>' мt sиpported between instances oF 'str' and 'int'
def how_should_I_qet_there
how_should_I_qet_there (2 . 0 )
how_should_I_qet_there ( . S )
Оболочка Python
Сам олетом
Машин ой
Пешком
256 Глав а 5
Функции и абстракции
�.Jозьмumе kapaнgaw
,,� Peweнue Давайте попра кт икуемся в определении значений,
возвращаемых функциями . З апишите результат каждо го вызова .
qet_bark ( 2 0 ) 'го.6-го.8'
coшpute ( 2 , 3 ) s
coшpute ( l l , 3) _з.о
__________________
��озьмumе kapaнgaw
� Peweнue
Опишите, к какой из категорий от н осится кажд ая переме нн ая в следующей
программе. Отмет ьте локаль н ые, глобаль н ые переме нн ые и параметры .
Свер ьтесь с ответом в ко н це главы.
..r-- мро.мгмр )
def drink_me (param) : i/
ло кально.я
1'\ергмгнно.я
.____ � msq = ' ВЪШИааек ' + param + ' стакан '
print (msq) �
мро.мгмр . ---3i
.... param = ' пустой ' локально.я мргмгнно.я
глобально.я nqlass =
r
• полный • гло ио.льно.я
� мргмгн но.я
мргмгнно.я
.
drink_me ( qlas s ) �
print ( ' Стакан ' , qlas s )
� НИЕ
[РЕШЕНИЕ)
Закрепим полученные знания об аргументах функций, изучив следующий код.
Попытайтесь предугадать возвращаемые им результаты и запишите их
в приведен ном ниже окне оболочки Pythoп .
def make_sundae ( ice_cream= ' вaниnьнoe ' , sаuсе= ' шокопаднмй ' , nuts=True ,
banana=True , brownies=False , whipped_cream=True ) :
recipe = ice cream + ' мороженое и ' + sauce + ' соус ,
if nuts :
recipe = recipe + ' с орехами ,
if banana :
'
recipe = recipe + ' с бананом ,
if brownies :
recipe = recipe + ' с брауни , '
if not whipped_cream :
recipe = recipe + ' не '
recipe = recipe + ' coдep:llCИ'.i' взбитые спивки . '
return recipe
sundae = make_sundae ( )
print ( ' Oдин десерт . Состав : ' , sundae)
Оболочка Python
0/!1111 Дlctpl' . COC!l!U ; 8UIUlli808 ll0p088808 11 llOIOJllДllllii СО)'С , С opuuк , С dlll&llOll , COДepllll'I'
llSdll'l'UI Clllll
l l.
О/!1111 десерl' . Coc!i!U : llOIOJllДll08 �юроnвое 11 llOIOJJIДllllii соус ' с opuuк , с dlll&llOll ' COДepllll'I
8tбlml8 ClllDlll .
О/!1111 д8ceJI" . Состu: ф11стuовое llOpODlloe 11 llOJ:OJJIДllllЙ соус, с ореzами, с бавuО11 , с dpa)'llJI ,
81 COД8PJllR' llSбimle ClllDlll .
»>
258 Глава 5
Функции и абстракции
8��1<� н� !J1ItnЬ
�JШym= С' balanc e - эмо глобал"ная nsременная."
balance = 1 0 5 0 0
feШeRJ.te.
-
caJDera on = True
� ... но она мрекр,,.8аемся данн"'м
def ateal (balance , aaount) :
n!Арамемром
gloЬal c8Jll8 r a_on
CaJDera_on = False
if ( aaount < Ьalance ) : k:"- nоэмому, когда 8t11 меняеме
balance = balance - aaount баланс 8 функции s teal ( ) , 8t11
м"' 8оз8ращаем не меняеме факмический
банко8ский баланс!
Величину � return aaount
украденного...
CaJDera_on = True
4 proceeds
... но не исl'\ол"зуем ее для
обновления реал"ного = ateal (balance ,
баланса счема. в имоге
1250 )
Мало мого, чмо 1'\ресмуl'\ник не украл ниl<fAKIAJ( денег, мак он еще и забt11л Включим" обрамно КtАМеру,
чмо немедленно на8едем млицию на след 1'\ресмумения. помниме: 1'\Осле 8t11млнения инсмрукции
return функция nsресмаем 8t11млням"ся, мэмому Все инсмруl<ЦIАи меле return игнорируюмся!
1 2
в 3 ф
4 п о з и ц и я у
з м а ч е н и е
6 в ы з о в я
р 7
8 а б с т р а к ц
т е
ф
9 л о к а л ь н а я
10 к
11 п а р а м е т р
в о 12
а р х
13 т е л о и о
а н л
р 14 а р г у м е н т
к с
15 г л о б а л ь н а я
260 Глава 5
4 (продолжение) c0.rmur0вкa u вл0женнь1е nuклы
вернемся к спискам и добавим ряд суперспособностей
*
Наведение порядка
в даннь1х
-f--
4 . Пузыр ь ковый р а с т в ор # 3 1 - р е з ул ь т а т : 50
Офuсныii gu1Ao2
[2 , з , 5 , 6, 9] Эмом же Cl'\ucoк,
омсормuро6о.ннь�й
1'\О 6озро.смо.нuю
./, \
Далее сравниваем элементы с индексами 1 и 2. Если первый из них ( 6) больше [2 , 6, 5, з, 9]
второго (5), тоже меняем их местами.
v
пересмо.6ляем j
\
Переходим к сравнению элементов с индексами 2 и 3. И здесь первый из [2 ' 5 ' 6' з' 9]
элементов ока зывается больше второго. Переставляем их.
пересмо.6ляем jv\
Теперь нужно сравнить элемент номер З с элементом номер 4. В данном [2 , 5 , з , 6, 9]
случае бол ьшим оказывается второй элемент, поэтому порядок элементов v
не меняется. -----7
J
Не меняем
Зо.мемьме, ко.к чuсло 6, коw.орое было 1'\ер6ь�м 6 Cl'\ucкe,
1'\ОСМеl'\енно 1'\еремещо.еw.ся 6 конец Cl'\ucкo.
[2 , 5 , з , 6, 9)
На этом первый проход завершен, но мы выполнили несколько перестановок,
а значит, необходим еще один проход. Переходим ко второму этапу.
Второй проход
На втором проходе список просматривается повторно с самого [2 , 5 , з , 6, 9]
начала. Вначале сравниваем элементы с индексами О и 1 . Второй
v
t
из них больше, поэтому перестановка не происходит.
Не меняем
t
элемента с индексом 4 больше, следовательно, перестановка не
происход ит. v
Не меняем
Трети й проход
Как и ранее, повторно просматриваем список. начиная с первого [2 , З , 5 , 6, 9]
элемента. Вначале сравним элементы с индексами О и 1 . Первое
значение меньше второго, поэтому элементы не переставляются. v
t
Не меняем
t
первый из них меньше второго, поэтому и тут переставлять
элементы не нужно. v
Не меняем
t
значение больше, поэтому элементы остаются на прежних местах.
v
Не меняе м
lt�ume kap1нg1w
Теперь, когда вы получ или п редставление о пузырьковом методе
сортировки , давайте применим его для выполнения п ра ктического зада н ия,
чтобы закрепить п риобретенные на выки. Отсорти руйте п р иведе н н ы й ниже
список так, как это делалось на двух п редыдущих стра н ицах. Е сли на
М171 не �ро сuм 6ас �uc aWlb код. каком-то этапе запутаетесь , свер ьтесь с ответом в конце гла вы.
М"' лuш ь �ро сuм �pu мeн uWl ti
�ыз!71рь ко6 ый меW1 од для
\
с�u ска .J..
cop W1u po6 кu эW1 ozo BoWI наш с�u сок.
�
[
Не �ыz айW1 есь сW1р ок,
' JСJiубничнъzй ' , ' банановый ' , ' ананасовый ' , 1 ЯI:'О ДНЪIЙ 1 ) �po CWIO сра 6нu 6ай W1е
IAX 6 aлфa6uWI HOM
мрядке
П ро ход 1
f
сравнение ( и, если нужно, перестановка) соседних элементов /3Cl'\OMH1AM все, ЧW\О
списка на каждом проходе. Принимая это во внимание, алгоритм МЫ уЗНt\ЛIА IАЗ главы S
пузырькового метода можно описать следующим образом. о функциях!
/ оw.слежцбанця1'\роходе.
Нам нужна мременная для
D EFI N E функцнR bubЫe_sort(list) : мресw.анобок
Мы IACl'\OЛtJзyeм на мекущем
D E CLAR E nеременнаR swapped и присвоить ей Тrие
ццкл whi le, коморыil. Изначалоно усманаблибаем
бt111'\ОЛНЯемся, 1'\ОКа ее рав ной Тrце, чw.обы
1'\еременная swapped WH I LE swapped: сделаw.о мрвыи 1'\роход
(
равна Тrце SET swopped ровно Folse с:---__
первое, Ч W\О М111 делаем
FOR nеременнаR i in range(O, len(list)-1 ) в ц ц кл е , - задаем мременную
На каждой. цмераццц
IF list[i] > list[i+1]: swapped равной. False
ццкла while выl'\Олняемся
нов111 u 1'\роход сормц ровкц DECLARE nеременнаR temp и присвоить ей /ist[i]
SЕТ list[i] ровно /ist[i+ 1]
f--- 13 ццкле for мы l'\pOXOOIAM
/} SET list[i+ 1 ] ровно tетр
каждый. элеменм Cl'\IACKa
псевдокод б111 в аем разн111м. S ET swapped ровно True (кроме 1'\Ос леднего) ц
Здес11 м111 (.( мцмцруем код,
НО ЭW\0 все равно не код,
f выl'\олняем срабненце.
Еслц он болtJще следующего
1'\О край.ней. мере не Pytnol'\ Еслц былц 1'\ересмановкц, задаем 1'\еременную
элеменма, w.o меняем цх
swapped рабноil. Тrце. Эw.о означаем, чмо
месмамц
1'\О завершенцц ццкла for будем быl'\Олнен
еще одцн 1'\роход
Офuсныii guaA02
n pogoi\Жaemcя •••
r;:r�-.i:-.:----- ---__,
1\о �а. I}оl} ь1та вш ись I}ре�уrа � ать
(
их
in ran ge '
результат ь1. 3авершив }"I}раж
4) .
нен ие, o,
i· n ran
Pr.int (.i
f r J·
ge ( o )
све рьт есь с отв ето м в :кон че rла o ·
4 :
вь1.
* j
) '
if ( letters
word)
\ i) == О:
print ( i ,
fu ll = Fa ls
Вс/'\оМни ме, чмо о/'\ерац ия деления e
do nations =
/'\О модулю оз н ачаем нахожде ние
[]
fu ll lo ad =
осмамка ом деления . На/'\ример,
4 % 2. = о , а 4 % 3 = з. _ 45
Wh il e no t fu
аопчох •1
ll :
fo r toy in
to ys :
donations . ap
pend ( toy)
s i ze = le n
(donatio ns )
i f ( s i ze >=
full lo ad) :
_
ful l = True
pr i nt ( ' Поп
ок ' , len ( do
na tions ) , ' Иztp1n1rex ,
pr i nt ( don at )
io ns )
г
аргнменмом комороiА
СЛ!:JЖ IАМ ащс ок
�
while swapped : ___..
Ццкл while бым лняемся, мка
swapped = False � У\еременндя swapped рабна Тr-це.
Вложенце ццклоб: ----7' for i in ranqe ( О , len ( scores) - 1 ) : Mti1 У\росмамрцбаем бесt> СУ\uсок, У\рц
ццкл for бнумрц if scores [ i ] > scores [ i+l ] : необходцмосмц делая У\ересманобкц
�
ццкла whi le
temp = scores [ i ]
scores [ i ] = scores [ i+l ] Именно мак мы быl\олнялц
scores [ i+l ] = temp У\ере сманобкн У\еременных
swapped = True в гл"бе
"' 2.1
Оболочка Python
scores = [ 60 , 50 , 60 , 58 , 54 , 54 ,
[ 1 8 , 31 , 34 , 4 1 , 44 , 4 4 , 44 , 4 6 , 4 8 , 50 ,
58 , 50 , 52 , 54 , 48 , 69 ,
50 ' 51 , 5 1 , 51 , 52 1 52 1 52 1 52 1 53 1 54 1
34 , 55 , 51 , 52 , 44 , 51 ,
1
54 , 54 55 55 55
1 1 1 57 1 58 1 5 8 , 60 60 1
1
69 , 64 , 66 , 55 , 52 , 61 , 61 , 61 , 64 66 69
1 1 1 69]
46, 31 , 57 , 52 , 44 , 18 , [ ' анана совый ' , ' банановый ' , ' м убничный ' ,
41 , 53 , 55 , 61 , 51 , 44]
г
' ягодный ' ]
,
Омрамор > 6 Pythot\ рабома ем »>
buЬbl е-sor t ( scores )
. (scores) ц со смр окамц чмо У\озболяем
print
омсормцро8ам1:> сr�цсок смрок
smoothies = [ ' хохосовый ' , ' JСJtубничНЪIЙ ' , ' банановый ' , ' ананасовый ] '
Щi--: ; · ·�.·� Нам необходимо отсортировать список результатов так , чтобы вначале шли растворы
Тесm-З\� �в с наилучшими результатам и . Другим и словам и , список должен быть отсортирован по
убыванию, а не по возрастанию. Для этого достаточно поменять оператор сравн е ния
в функции сортировки с > на <. Внесите изменение в файл и проверьте получаемы й
резул ьтат. Bow. резульмаw.ы: Cl'\t.1CK«
Эмо все, ЧW\О нужно цзменцмь омсор мцро6аны м убt>16анцю
def buЬЫe_sort ( scores ) :
swapped = True для сорw.цро6кц Сl'\«Ска м
�б1:>16анюс
J;
Оболочка Python
J
while swapped :
swapped = Fal se
[ 69 , 6 9 , 6 6 , 64 , 61 , 61 , 60 , 60 , 58 5 8 ,
57 55 , 55 5 5 5 4 , 54 , 5 4 5 3 52 52 ,
1
for i in ranqe ( O , len ( scores ) - 1 ) :
if scores [ i ] < scores [ i+l ] :
5 2 , 52 , 5 1 , 5 1 , 5 1 , 50 , 5 0 , 4 8 , 4 6 , 4 4 ,
1 1 1 1 1 1
temp = scores [ i ]
scores [ i ] = scores [ i+l ] 4 4 , 44 , 4 1 , 34 , 31 , 1 8 ]
scores [ i+l ] = temp [ ягодный ' , ' клубничный ' , ' банановый ' ,
'
П раВuАыое onpegeAeнue
номеров pacm BopoB
Ка кой р езул ьтат возв р ащает
Ф едор оказался прав. Мы сортируем список
результатов, но при это м теряем информацию об их п ри веден ное н иже вы р ажен ие?
i
исходных позициях, по которым мы сопоставляем Анализи ру йте его от внут р ен н их скобок
�
список номеров в той же последовательности.
Рассмотрим программный код.
Возвращаем диаn.азон
OW\ 0до 35
Теn.ерь МЬI n.ередаем функции buЬЫe s ort ( )
два сn.иска: сn.исок резульмамов и сn.исок Возвращаем сn.исок, содержащий
соомвемсмву ющих номеров расмворов чuсла ом о до 35
while swapped :
swapped = False
r Все осмальное рабомаем
мак же, как и раньше".
for i in range ( O , len ( scores ) - 1 ) :
if scores [ i ] < scores [ i+ l ] :
temp = scores [ i ]
scores [ i ] = scores [ i+l ]
scores [ i+ l ] = temp
temp = numЬers [ i ]
�исключением моzо, что n.осле
n.ересмановки значений в сn.иске
numЬers [ i ] = numЬers [ i+ l ]
резульматов МЬI макже n.ересмавляем
numЬers [ i+ l ] = temp
аналоzичнt11 е значения в cn.ucкe номеров
swapped = True
s cores = [ 6 0 , 5 0 , 60 , 5 8 , 5 4 , 5 4 ,
5 8 , 5 0 , 52 , 5 4 , 48 , 69 ,
\ Если в,,, счимаеме эмо избЬIМОЧНЬIМ кодом,
W\O вЬI n.равЬI. В следующей zлаве вЬI узнаеме,
как убрамь дублирующийся код
3 4 , 55 , 5 1 , 5 2 , 4 4 , 5 1 ,
6 9 , 64 , 6 6 , 5 5 , 52 , 6 1 ,
4 6 , 3 1 , 5 7 , 52 , 4 4 , 1 8 ,
4 1 , 53 , 5 5 , 6 1 , 5 1 , 4 4 ) Здесь МЬI создаем cn.ucoк
solution_numЬers, хранящий
numЬer_of_scores = l en ( s cores ) номера всех расмворов (они
solution_numЬers = list (range (numЬer_of...scores ) ) соомвемсмвуюм исходнt11м
индексам в сn.иске резульмамо6)
buЬЬle_sort ( s cores , solution_numЬers ) r<('
' ....... передаем оба сn.иска в функцию сормировки
ь:а;1: ;&;. Добавьте код из п редыдущего упражнения (приведен ниже) в файл sort.py,
Тесm -д-r�в заменив ненужные инструкции тестирования. Проверьте работу программы.
»>
Отnична• работа!
Это была короткая, но непростая
глава. Вам пришлось изучить
немало новых концепций, на
осмысление которых потребуется
время. А пока наслаждайтесь
заслуженным призом. Вы хорошо
потрудились и вправе немного
отдохнуть.
Глава, впрочем, еще не закончена.
Нам предстоит подвести итоги
и не только".
�само1rn11но1
• Существует много алгоритмов сортировки, • В большинстве языков программирования
обладающих разной сложностью есть встроенные функции сортировки.
и эффективностью. • Цикл, находящийся внутри другого цикла,
• Пузырьковая сортировка это простейший
- называется вложенным.
алгоритм, в котором элементы списка • Вложенные циклы усложняют структуру
сравниваются и переставляются проход за
программы и могут увеличивать время ее
проходом.
выполнения.
• Пузырьковая сортировка завершается, если • Полезно изучать алгоритмы сортировки,
на очередном проходе не было сделано ни
особенно те, которые включены в стандартную
одной перестановки.
библиотеку языка программирования. Ах да,
вы ведь еще не в курсе".
Парни , вы не поверите.
SI рассказала Григорию о том,
как мы решили эодачу. и он
долго смеs�лся. Оказывается ,
можно было вообще не писать
собственный код, так как в Python
есть встроенные q:�ункции
сортировки!
length = length * -1
i = -2
print ( output)
t
ал1:>мерна ми6н1:>1е 8ариаНW\1:>1 Смрокц СV.М8оло8:
TTol'\po69ii.м e
characters 'ама..-.ар/аl'\ас'
=
или
characters = 'wasitar'
�.Jозьмumе kapaнga w
�� Peweнu e Теперь, когда вы получил и п ред ста влен ие о п
узырьковом методе с орти ровки ,
давайте п ри меним е го для выпол нен ия практичес ко го задания
, чтоб ы
закреп ить приобретен н ые навы ки. Отсорти руйте п риведенн ый
ниже сп исок
та к, как это делало с ь на двух предыдущих стра н и цах.
�
BolN\ ндщ cn.ucoк.
Не n.уzдймесь смрок,
l'\pOCIN\O срt:1 8нu8t:1й1Ме
[ ' хnубничный ' , ' банановый ' , ' ананасовый ' , ' яrо;цный ' ]
Щ( в м ф д дuм н ом
Проход 1 1'\Оряоке
[ ' хnубничный ' , ' банановый ' , ' ананасовый ' , ' яrо;цный ' ]
� пересмавляем
[ Cpt:18нu8t:1eм кджо1:>1й
' банановый ' , ' хnубничный ' , ' ананасовый ' , ' яrо;цнlоJЙ ' ]
� nересмд8ляем "--- 1'\рохооя 1'\О Cl'\ucкy. Делдем
элеменм со слеоующuм,
[ ' банановый ' , ' ананасовый ' , ' хnубничный ' , ' Rrо;цный ' ] нужен 8морой ro.poxo o
� перес.мt:18ляем
[ ' ананасовый ' , ' банановый ' , ' хnубничный ' , ' яrо;цнlоJЙ ' ]
� Не меняем
[ ' ананасовый ' , ' банановый ' , ' хnубничный ' , ' яrо;цнlоJЙ ' ]
� Не меняем �
[ ' ананасоаый ' , ' банановый ' , ' хnубничный ' , ' яrо;цнlоJЙ ' ]
Нд 8мором ....рохоое б1:>1лu
rо.ересмано8ки, rо.оэмому
П роход З нужен мpewiuй ro.poxoo
[ ' ананасоаый ' , ' банановый ' , ' хnубничный ' , ' яrо;цный ' ]
� Н е м еняе м
J
[ ' ананасовый ' , ' банановый ' , ' хnубничный ' , ' яrо;цный ' ]
� Не меняем
�
[ ' ананасоаый ' , ' банановый ' , ' хnубничный ' , ' яrо;цный
']
� Н е меняем
[ ' ананасовый ' , • банановый • , ' хnубничный , На мремьем ....рохоое
, , Rrо;цный , ]
не б1:>1ло мре с мдн о8о к ,
IN\дl< ч мо Ml:>I закончили,
и Cl'\IACOI< омсормиро8дн
YчJt�C!I n�RJt�iUD:Ь
PemeнJte
Воз ьми тt' на Ct'611 р оль
ин тt'рIJрt' татор а PytЪ�n и
МЫ СЛt' нн о ВЫl} ОЛН ИТt' l}ри вt'�t'нн
ыt'
ниж t' фра гмt' н ты Бо�а , l}о l}ы тавши
сь
IJрt'�уг а�а ть их рt'з уль тать1. 3ав t'рш
4 ) ..
ив
УIJр ажн t'ни t', Свt' рь тt'Сь с отв ето in r anc;re
(О ,
м .
fo r J i.
f or
в Б он qt' глав ь1. nc;re ( O ,
J)
·n .
ra
i. •
*
pr in t ( i
:for word in [ ' як ' , ' JtO'l' ' , ' пума ' , ' SП'Уар ' , ' собака ' ] :
:for i in ran9e ( 2 , 7 ) :
�---'-----,
letters = len (word)
i:f ( letters % i) == О:
print ( i , word)
:ful l = Fal se
dona tio ns = [ ]
full_load = 45
• во.nчок ' ]
toys = [ ' роб о'l' ' , ' 11:y1t.J1a , ' , мяч , ,
:ful l = тru e
, 8 1t ' )
' И""У111
pri nt ( ' По.п ои ' , len (donat ion s ) -r
�.@.озьмumе kapaнgaw
--
� Peweнue Теперь в программе создаются сразу
два списка: один хранит результаты
,,._. .,._..
1 . ..
..
.-
..
.... _
- t10 - -"' "
2. •·-- ,..,..._ t12 ,.._.." 'о
исследований, упорядоченные по
э. "
.......,... J>&""""P f2 ,.._•
• " 57
&. u,...,.._.. pacnop f31 - pu.J'o.&•: !О
убыванию, а второй - соответствующие
$, �lli08.lll paC!'t8op f3
им номера растворов. Напишите код
• peaya1t&WI: 34
вывода отчета на основе этих двух
списков.
[ 81118одим заzоло8ок
хаждое предложение...
хаждое слово...
каждъtй слог...
не говоря уже о каждом символе!
282 Глава б
Текст, строки и э ври сти че ски е алгори тмы
Mt11
К.олумбuйского унuверсuмема
�
в формуле uсl'\ольэуюм ся мрu начнем с общего чuсла слов
nеременнt11е , комор111е нам в мексме (эмо число всмречаемся
"'редсмоим в,,,ч ислuмь j. � � в формуле 08аждt11)
____.
Нам макже нужно в111ч uслuмь
)
общее число слогов в мексме
(
206 ' 835 - 1 ' 01 5
•cero cno•
nреА11 ожен1111
v - 84 ' 6 ( •cero cnoro•
•cero cno•
)
Т'//
И еще необходuмо Оl'\ределuмь
общее число 1'\редложений
(
30-0 Выпускник вуза Очень тяжело читается, понятен в основном выпускникам вузов
�
и п одсчи тать их .
ffence.
��� ; ��;=�� �
Общее количест во сло гов в тексте. э о
слово нужно разби ть на отдельные с и ь
их коли чество во всем тексте .
to iпitating differences of
'-1 -...) -...../ '-'
open quaпels, and а coolness
Ьу dropping the distasteful
opinion arose. It is but one
differences, with candor and
П опро буйте составить ал го ритм подсч ета сло го в в произвол ьном слове .
Предполагается , что в ва ш ем распоряжении нет боль ш ого словаря .
Напи ш ите алгоритм в виде псевдокода.
284 Гла в а б
Текст, строки и эврист и ческие алгор итмы
06щu u nceBgokog
С начала м ы напишем максим ально общи й пс евдокод решения задачи . Детали прояснятся
позже. Здесь н ет никакой сложной пр ограммной логики . Нам просто нужно п олучить числа ,
подставляемые в формулу вычисле ния индекса удобочитаемости . Внимательно изучите
комментар ии к п с евдокоду. Как известно, пс евдокод бывает разной степени детализации .
В данно м случае ис пользован боле е форм альный подход , и поэтому пс евдокод напоминает
код реальной программы .
13 функццю r.ередаеw.ся w.eкcw. кнцгц
Начнем с w.ого, чw.о цлц cw.al'\l\tilA , ц нам нужно 1'\онямь , М111 у же знаем о нескольких
r.омесмцм эмом код \ как эмо сделаw. ь
в функццю � 6ажнt11х r.еременнЬfх, комор11е1
� Н!:JЖНЬf для форМ!:JЛ111 . Создадим
�
J_., для них локал11нt�1е мременнь�е.
DEFI N E функцня compute_readabll ity(text) : Мы макже создадим r.ереме нную
[
УСТАНОВ КА: здес11 МЬf s core для цw.ого8о zо индекса
DECLARE переменная total_words и присвоить ей О
обьявляем все локал11нt�1е
DECLARE переменная total_sentences и присвоить ей О
1'\еременнt�1е, коморt�1е
DECLARE переменная total_syllaЫes и присвоить ей О
б!:Jд!:JМ цсмльзоваw.11ся К.ажоая мременная
в функццц DECLARE переменная score и присвоить ей О вычисляемся с r.омощ ью
омдельноiА функци и
[
АНАЛИЗ: вt�1чцсляем бсе ASSI G N переменная total_words результат вызова функции count_words(text)
необходцмые значен ця ASSIGN переменная total_sentences результат вызова функции count_sentences(text)
м омдел11 носмц ASSIGN переменная total_syllaЫes результат вызова функции count_syllaЫes(text)
[
вычцслен l'll , w.er.ep11 ASS I G N переменная score значение
можно 6ос r.ол11зовам11ся 206,835 - 1 ,01 5 * (total_words / total_sentences) - 84,6 * (total_syl l aЫes / total_words)
форМ!:JЛОiА для r.олучен ця
общей оценкц
Р ЕЗУЛЬТАТЫ : вt�1чцслцв
IF score >= 90:
(7
PRI NT 'Уровень 7-го класса'
ELIF score >= 60:
Эw.о бол11шая консмрукция
Оr.ределенце уровня
PRI NT 'Уровень 8-9-го классов' if/elif/else, в комороiА
мексма 8t11глядuм ELIF score >= 50: r.ол11зо8аw.елю сообщаемся
млезнЬIМ фрагменмом PRI NT 'Уровень 1 0-1 1 -го классов' !:Jровень w.eкcw.a на основе
кода, nоэмому ELIF score >= 30:
вычи сленного индекса
nеренесем его 8 удобочцмаемосw.ц
PRINT 'Уровень студента вуза'
омдел11ную функцию,
ELSE:
чмо6t11 uм можно 6ti1лo
PRINT 'Уровень выпускни ка вуза'
мл11зо8амься м8морно
Эмом код Л!:JЧШе мренес w.ц в оw.дельн!:JЮ функцц ю
text = ' The first thing that s tands between you '
[
(r.о дой дум как одинар ны
включая сuм8о льt абзаца
д6ойн1:>1 е ка6ь� чки)
text = " " "Тhе first thinq that stands Ьetveen you and writinq your first , real ,
piece of code , is learninq the skill of breakinq proЬlems down into
achievaЫe little actions that а computer can do for you . " " "
286 Глава б
Текст, строки и эвр ист и чески е алгоритмы
�НИЕ г
Помнuме: файл
Pyt�o� назы8аемся
модулем
text = " " " The f i r s t t h i n g that s t ands between you and w r i t i n g your f i r s t ,
r ea l , p i e ce o f c o de , i s l e a r n i n g the s ki l l o f b r e a k i ng p r oЫ ems down i n t o
a c h i evaЫ e l i t t l e a c t i o n s that а c ompu t e r c a n d o f o r you . Of course ,
you and the c omp u t e r w i l l a l s o n e e d t o Ь е s p e a k i n g а c ommon l a n guage ,
but we ' l l get to that t op i c in j u s t а bit .
'\_ Не забуд11ме
print ( text) мсма8uм11
't::._ В1118едем мексw. на экран, w.ак как мрu ка8ычкu
8 конце
нужно убедuмt>ся, чмо 8се рабомаем
{
Исмльзуем инсмрукцию import
для мдключения файла ch:l.text.py
total_syllaЬles = О Выз 1:>1 6аем функцию compu te_readaЬ i l ity { ) с r�арамемром text u
score = О � и �ередаем ей смроку text из файла chl text
несколькuмu локальнt>1ми
мремеННЬIМIА
compute_read.aЬility ( chl text . text)
Мы 6ыз1:>16а ем эму функцu ю
u r�ереда ем ей �ерем енную
Для досмуr�а к �еременной text
text uз модул я chl text
необходимо указаw.ь �ер ед ней
(друzuм и. сло6амu , uз
имя модуля chl text
файла ch :i.text.py)
288 Глава б
Текст, строки и э в ристи ческие алгоритмы
ьс1: �.
Тесm-дf �в
Следует убедиться , что введенная нами import chl text
программа работает корректно. Для этого
переместите вызов функции print ( ) def compute_readaЬility ( text) :
из модуля ch 1text.py в файл analyze.py total words = О
~
и включите его в функцию compu te _ total sentences = О
readaЫ i l i ty ( ) . Результат работы total_syllaЬles = О
программы ana/yze.py должен быть таким же, score = О Доба61:>1111 е э му смроку
как и при тестовом запуске файла ch 1text.py. в сбою функцию
print ( text) � compute readaЬ1. l 1. ty ( )
1 1 1 .1 . ' 1 1
into pond" , or "pull in the f i sh . " But also notice that other
instructions are ill. Ъ i t different because they depend on ill condition, compute_readaЬility ( chltext . text)
lik.e "is the bobber !Ьоvе or Ъelov water ? " . Instruct1ons Drigbt also
direct the flow of the recipe, l1k.e "if you h&ven' t. finisbed fishing,
Or , how aЬout а condition for stoppinq, a s i n " i f you ' re donen then qo
used has Ьееn nothing мrе than а (someti.me.!I larqe) set of siaфe
instructions to the co111pu ter that tell i t what to do . НЕ ЗАl)УДЬТЕ удалцмь 8"'зо8
print ( ) /АЗ файла cn З.text.py
>»
)
Согласно псевдокоду первое, что необходимо подсчитать на слова
при вычислении индекса удобочитаемости, - общее
количество слов в тексте. Для этого нам придется немного Оболочка P�hon
расширить имеющийся инструментарий. Вы уже знаете,
как обаединятъ строки путем конкатенации, но как разбитъ [ ' I ' , ' heard ' , ' you ' , ' on ' ,
строху на слова? В Python у строк имеется встроенная ' the ' , ' wireless ' , ' back ' ,
функция s p l i t ( ) , которая разбивает их на слова,
' in ' , ' fif ty ' , ' two ' ]
сохраняемые в отдельном списке.
»>
Рассмотрим, как работает функция s p l i t ( ) .
Св е дем в се в о е д и но • 289
Подсчет числа слов в тексте
Офuсиыu guaA02
290 Глава б
Текст, строки и эвр ист иче с кие алгоритмы
Пе �oumecь
МДаБаmь БoJlfocы
О:
и запятые. Детали читайте в документации Pythoп. Для
поиска слов в тексте можно применять и более сложные
Почти . Функция sp l i t ( ) разбивает строку на инструменты , например регулярные выражения, которые
подстроки , используя пробельные символы в качестве рассматриваются в приложени и .
D:
разделителей. Другими словам и , всякий раз, когда в тексте
встречается разделитель, такой как пробел , табуляция
Вопрос по синтаксису: а что означает вызов lyrics .
или символ новой строки, функция sp l i t ( ) считает его
split ( ) ?
О:
концом подстроки . Следует учитывать, что получаемые
подстроки не всегда оказы ваются словам и : это могут быть
Пока что вам достаточно знать, что у типов данных
даты , ч исла и т.п.
D:
в Pythoп есть встроенные функции , которые можно
вызывать подобным образом. В частности , строковый тип
Что если элементы в строке разделены не пробелами, а,
данных поддерживает функцию sp l i t ( ) . Таким образом,
скажем, запятыми?
l y r i c s . s p l i t ( ) означает, что функция spl i t ( )
О:
вызов
вызывается для строки l y r i c s . Подробнее о данном
Функция s p l i t ( ) позволяет задать набор символов, синтаксисе мы поговорим в следующих главах.
используемых в качестве разделителей. Среди них может
С в еде м в се в о е д ин о � 291
Подсчет числа слов в тексте
292 Гла ва б
Текст, строки и эв ристич ес кие алгоритмы
Pythot'\".,
Приведем пример.
lyrics = 'I heard you on the wireless back in fifty two '
� и "рохо ди м м к а ждому
...
1
charза"исываемс я очередно й с и мво л
смроки
Омо оразим символ,
чмо оы t'\ОНЯМ !>, как
6се ЭW\0 раООW\аем
Све д ем все воедин о � 293
Функция count_sen tences ()
1'\ередаеl"АС Я мексм
но не содержит деталей.
Это промежуточ ны й
Эмо локальная
этап между псевд окодом
def count_sentences ( text) :
count = О � 1'\еременная count
и готовой програ ммой.
)
Создавая каркас, вы
4--- З десь мы 1'\роходим м получаете представление
каждому символу в мексме
for char in text : о том, как будет выгля деть
��ьмumе kapaнgaw
_\.,
Напишите код, который проверяет, является ли символ знаком кон ца предложения
(точка, вопросительный или восклицательный знаки), и, если это так, увеличивает
на единицу значение переменной coun t .
294 Гла в а б
Текст, строки и э вр исти ческие алгоритмы
щ1: З:оJ Настало время п роверить работу программы. Соберите весь код вместе, добавьте его
Tecm�n.rqitв в файл ana/yze.py и выпол н ите программу.
return count
J
words = text . split ( )
�
Bf'Jlзf'J/Baeм нашу новню
С. ,,.-5j
pxi11 t (•oz:ds)
print ( total words , ' с.по• )
print ( total_sentences , ' предложений ' )
Совершенно верно!
1
Вом наша мследо6амел11носм11
6 6цое Cl'\1.1.CKa
amoothies = [ ' 1to1tocoaJ.IЙ ' , ' JСJJубничИlоlЙ' , ' баиаиоаJ.IЙ ' , ' аиаиасоаJ.IЙ ' , ' •roДJllolЙ ' ]
if ' кокосовый ' in amoothies :
про6еряем, содержимся лц 8арцанм
print ( ' EC'l'lo XOJtOCOВJ.IЙ ! ' )
'кокосо6114й' 6 Cl'\IACKe. smothies
else:
print ( ' Уа11 , ие'l' ' )
Оболочка Python
Вом чмо М1:>1 1'\Олучаем
Есть кокосовый!
>»
296 Глава б
Текст, строки и эвр исти че ски е алг оритмы
nомн�.сtме r\f}ограмму
Как было показано выше, строка - разновидность последовательности, "Суr1.ержелвз11ка" 113
азнач ит, для поиска нужных символов в ней тоже можно применять глав,,, 4? 8 ней м,,, може
оператор in. Приведем пример. rt.epe5i.cpaлi.c с�.см8ол"'
смрокц 8 цикле.
Во�м наша
мсл едоба�мел1:1носм 1:1
б биде с�мроки
lyrics = ' I heard you on the wireless back in fifty two '
t-�ьмume kapaнgaw
-� Попробуйте переписать функцию count_sentences () , сделав ее проще (и понятнее)
с помощью оператора in. В приведенном ниже варианте функции мы удалили код сравнения
со знаками препинания. Вместо этого добавлена локальная переменная termina l s ,
в которой перечислены все концевые знаки препинания. Закончите инструкцию i f так, чтобы
она проверяла, является ли текущий символ концевым, используя оператор in.
if
1
count = count +
�
Добаб" ме код 1'\роберки,
включающий омра мор in
return count
щ1- &;oJ Прежде чем переходить к следующему этапу, обновите код п рограммы.
Tecm·n.r�в И зменения придется вносить только в функцию count_ s entences ( ) ,
приведенную ниже. После запуска программы вы должны получить такой же
результат, как и на предыдущем тест-драйве.
' J
смроки кода
terminals = ' ? '
for char in t :��� { И удалиме сw.ару ю инсw.рук цию срабнения
if char in terminal s : Х,
if сhаж -- · . ' cr char .., · � · о� char -- ' ! '
count = count + 1
Оболочка Python
return count
Peзyлow.ttWI r-. о - r>.режнему
�
300 слов
должен быw.и ма ким 12 предложений
»>
Во м ноrих яз111ках
проrраммирования - да.
Но не в Python. Вопрос п равильный,
поскольку в других языках
программирования символы считаются
отдельным типом данных. Однако
в Python они трактуются как строки.
Например, символ ' А ' - это строка
единичной длины, содержащая букву А.
298 Глава б
Текст, строки и эвристические алгоритмы
Нетl
Вы получаете второй шанс : предложите идеи, как можно подсч итать ч исло
слогов в произвольном слове. Попробуйте сформулировать какие-то общие
правила и запишите здесь свои соображения . Одну идею (касательно
англ ийско го языка) мы вам подскажем .
Ec11u В с1108е m pu 6уk8ы u11u меныае, m o о6ычно оне cocmoum uз оgшо c110t1. nр и. дума i:i ме еще
� н ескол11ко 1'\ра8и.л
300 Глава б
Текст, строки и эвристические алгоритмы
� Особенно е.слц
' \., учцW11�16ам" задачц кнцzц
Офuсныu gual\02
npog oA>kaemcя •••
302 Глава б
Текст, строки и э врист и ческие алгор и тмы
О Есл и слово содержит мен ее трех букв , сч итае м, что в нем оди н сл о г.
О В п роти в н о м случ ае сч итае м колич ество гл асны х и п р и ним ае м е го за ч и сл о сло го в .
t:""
for word in words :
наl'l.ишем далее; она возвращаем
word_count = count_syllaЫes_in_word (word)
чцсло сл огов в омдельном слове
count = count + word-count ""--- v v
В локальноц 1'1.ереме нноц word count хра н ц мся
� ддлее добавляем число чцсло слогов мекущего слова. м ожем б111 м ь, эмо
return count слогов 8 W1екущем слове не самое удачное назвднце, но syl l aЬl es count
!\.. к общему счемчцку слцшком наммцнмо б111 наз8анце фу н кц�ц . в макцх
месмах лучше осмавля мь комменмариц, чмоб111
l'\.yWlaHIЩЬI
Нако нец, воз8ращаем общее
Y\ O W\OM Не б111
л о
ЧUСЛО слогов во всех словдх
�<---
return count
в конце возвращаем счемчцк чцсла слогов
ЩJ: :&;оа Добавьте новый код в файл analyze.py и убедитесь в отсутствии синтаксических
Tecrn-n.r�в ошибок. П рограмма долж н а выдавать тот же результат, что и ра н ьше.
return count
return count
aA2opumм D
считаем, что в нем один слог
ЧIАСЛО :1.
304 Гла в а б
Текст, строки и э вр и ст и ч ески е алгори тмы
;-
8 коморой буоум хранимься 8се гласн 1:11 е как
return 1 8 н ю к н ем мак и 8 Верхнем регисмр е
,
U2нopupo8aнue nосдеgоВаmеды ых
2А8СНЫХ � Если слово содержит менее трех букв,
fiil
считаем, что в нем один слог
Но это еще не все, поскольку нам нужно учесть В проП1вном случае считаем количество
гласных и принимаем его за число слогов
последовательные гласные. Например, в слове "book"
необходимо считать только первую букву 'о' , игнорируя О Уточняем предыдуЩ&е правило, удаляя
поспедовательные гласные
вторую, и мы получаем один слог. Точно так же в слове О Исключаем из подсчета конечное
"roomful" учитывается только первая 'о' , а также 'u' , в непроизносимое 'е'
результате чего мы получаем два слога. О Буква 'у' в конце слова считается
гласной
Таким образом , если мы встречаем гласную, то должны
игнорировать все последующие гласные до тех пор, пока
не встретится согласная. Далее мы повторяем процесс ,
пока не достигнем конца слова.
локал11ную 1'\еременную
rтомрамьме Время на мо,
prev_char_was _vowe l и
чмобt11 разобрамься 8 нем
if len (word) <= З : 1А nонямь, l<t:ll< он рабомаем
задаем ее равной False
return 1
За ф цксцруйw.е
изучаJI nр:иве'8енную
о
вышt' фун:к-q:ию значеню1 лцбо
count s yl l aЫ e s in word ( ) , m
измененця
nре� с тавьтt', 'JTO вь;-:ин"Терnретатор , ЛОКll.ЛЬНЬ/Х
РуtЪ�т. Ф}'НJщ:и:и nt'pt'�at'тCJI аргумент мременн1>1х
u
в конце каждой
1
11 roomful 11 • 11 ыСлt'нно nр ой�:итt'
IАl'\'\ерациц
Вt'Сь -q:иii.Л, ОТСЛt'Ж:иВаJI :иЗMt'Ht'H:ИJI
локальных nt'рt'мt'нных. Выnолн:ив
За�ан:иt', СВt'}'Ьтt'Сь С OTBt'TOM,
nр:ивt'�t'нным в :lioн-qt' rлавы.
306 Гла в а б
Текст, строки и э врист и чески е алгоритмы
ьо1:,З� На данный момент в программе нужно обновить две функции : count syl l aЫes
Тееm -д� �в in_word ( ) В КОТОрую добавляется НОВЫЙ КОД, И compute_readaЬil i°t y ( ) ИЗ КОТО РОЙ
, ,
count = О
def count_syllaЫes_in_word (word) :
return count
score = О
print (total_syllaЬles ,
print ( total_sentences , ' пре�ожеиий ' )
' cno:rioa ' )
Учеm kонечноu 'е', а mak>ke &"' Если слово содержит ме- трех букв,
получаемые при разбивке исходной строки, содержат в конце знаки О Исключаем из под�та конечное
непроизносимое 'е'
препинания, которые будут мешать нахождению концевых 'е' и 'у' .
О Буква У в конце слова �итается
Поэтому сначала необходимо удалить знаки препинания. гласной
В ы чАеняем 2Аа8ное
Поскольку м ы упомянули подстроки, давайте разберемся, что же это
такое. Подстрока представляет собой строку, которая встречается
в друrой строке. Предположим, имеется следующая строка:
lyrics = ' I heard you on the wireless back in fifty two '
Ее подстроками будут ' I ' , ' I heard ' , ' on the wire ' , ' о ' и т.п.
В Python имеется удобная возможность выделять подстроки в виде
срезов с помощью специального синтаксиса.
мдсw.року
�
Зо.Вер ша. е м на.
Но.чи но.ем мдс w.ро ку
эw.. o ii 1'\ози ц иц, НЕ 8кл ючо.я
с змоu 1'\О3Ul.\и и ее
r Оболочка P�hon
l
l yri cs [ 2 �7 ] f
Здесt> сw.о.8и W\СЯ
my_suЬ s trinq = д8оеW1очие, о. не heard
print (my_suЬ s tring ) '-.../ '""'"'"'' >»
Та к и м о бразо м , мдсrАрока.
содержим символы 8 мзи ц и ях
_}
2 - 6, w..e. '1-\eo.rd'
308 Гла в а б
Текст, строки и эвр ист ич е схие алгоритмы
Оболочка P�hon
�Е сли nоследнцй индекс
: ] не указан, значц м,
Ьасk i n fi fty two
my suЬs tring = lyrics [ 2 8
берем Все до конца >»
print (my_suЬs tring )
сw.рокц
�
Можно даже использовать отрицател ьные индексы, как это
�
делалось в списках.
Эмо означаеw., ЧWIO nодсмрока за8ерщаемся
nредnоследнцм с ц мр о к ц � Оболочка �hon
Ьасk i n f i fty tw
my_suЬs tring = lyrics [ 2 8 : - 1 ]
>»
print (my_suЬs tring )
В Python срезы можно создавать не только для строк, но и для любых последовательностей, таких как списки.
�
smoothies = [ ' хохосов:wй ' , ' х.пубиич:ный ' , ' бананов:wй ' , ' ананасов:wй ' , ' яrодн:wй ' ]
{ А 8ow. несколь ко nрцмеро8 цз8леченця фрагменмо8 сnиско..
В ом но.щ сnисок
� И ндексо.цця ро.оомаем мак же, как ц 8 случае сw.рок
даем
smoothies [ 2 : 4] ,.,,----=, [ ' бананов:wй ' , ' ананасов:wй ' ]
до.ем
smoothies ( : 2 ] � [ ' хокосов:wй ' , ' х.пубиич:ный ' ]
даем
----j [ ' ананасоа:wй ' ]
smoothies [ Э : - 1 ]
s tr [ : 2 ]
'
а man а p l a n pa n a m '
' '
s tr [ 2 : ] а
'
man p l a n pa nama'
s tr [ 1 : 7 ]
а а
'an p l a n panam'
s tr [ З : - 1 ]
а
'
ma'
s tr [ - 2 : - 1 ]
а
' ma n a'
s tr [ 0 : - 1 ]
s tr [ 0 : 4 ] 'm'
r
КО.К
31 0 Гла ва б
Текст, строки и э вр ист и ч еские алгор и тмы
Осталось понять, в каких случ аях из слова нужно удалить последний символ. Это
должно происходить, когда последним символом является то чка, запятая, точ ка с
запятой, двоеточие, восклицательный или вопросительный знак. Похожую задачу
мы уже решали раньш е.
else :
proces sed_word цсходное слобо
бе3 мследнего с1..1 м бола
processed word = word В 1'\роw.1..1 6ном случае 3аrщсы6аем
�
6 1'\еременную proces sed_word
if len (proces sed-word) <= сл а бо цел1..1 ком
return 1
�
vowels = " aeiouAEIOU" Далее мы будем 1..t C l'\DЛ1:>зo6aw.1:>
prev_char_was_vowel = False / 1'\еременную proces sed_word,
return count
���зьмumе kapaнgaw
� Теперь переменная proce s s _word содержит слово, из которого удален концевой
знак препинания . Напишите код для удаления из слова конечной буквы 'е'. Это
будет буквально несколько строк кода .
ьсг �>OJ Необходимо добавить в п рограмму код обработки подстрок. Добавляемый код
тест -�r il11в выделе н серым фо н ом. Введите его и запустите программу, чтобы уз н ать, как
изме н ится число слогов.
count = О
def count_syllaЬles_in_word (word) :
из м е н е ни я ,
-7
OY1иCt1HHt:>le Ht\ if len (processed_word) <= З: после выявл ения слов,
У1р е о"1 дущеiА содер жt1щих w.pu бу к в1'1
return 1
prev_char_was_vowel = False
else :
12 предложений
4 1 0 слогов
>»
return count
Осталось всего ничего - учесть концевую 'у' при подсчете слогов. rs/ В противном случае считаем количество
гласных и принимаем его за число слогов
Вы уже знаете, как проверить последний символ слова. Если он
равен 'у' , необходимо увеличить значение локальной переменной 'f;/ Уточняем предыдущее правило, удаляя
М
последовательные гласные
count на единицу. Сведем все вместе и протестируем финальную Исключаем из подсчета конечное
версию функции count_s y l l aЫ e s_in_word ( ) , а заодно непроизносимое 'е'
31 2 Глав а б
Текст, строки и э вр и ст и ч е ские алгор и тмы
'Щt ,�.� Пора завершить функцию count_ syl laЫes _ in_word ( ) . Выделенный ниже
Тесm-дr�в код проверяет, заканчивается ли слово на букву 'у', и если да, то увеличивает
счетчик слогов. Протестируйте программу, чтобы узнать, сколько слогов
получилось.
endinqs = '
. ,. 1. ?. .·
last char = word [ - 1 ]
' 1
i f last_char i n endinqs :
if proces sed_word [ - 1 ] in
proces sed_word = proce s sed_word [ 0 : - 1 ]
' еЕ ' :
prev_char_was_vowel = False
счемчцк слогов слов, заю:1нчивающихся на 'у',
l'\OЭl'\r\OM!:J счеl'\r\чик слогов
count = count + 1
return count
Оболочка Python
J
300 сл ов
щ1->< З,� Теперь можно вычислить формулу в функции compute_ readaЬ i l i ty ( ) . Добавьте
Tecm-;11.r �в в нее выделенный ниже код, включая вызов функции print ( ) , и протестируйте
работу программы.
31 4 Гла в а б
Текст, строки и эвр истиче ски е алг оритмы
�ume kapaнgaw
--
М ы наконец получили индекс удобочитаемости, и осталось вывести результаты.
Напишите функцию output_r e s u l t s ( ) , которая получает значение индекса
и выводит на экран строку с описанием уровня текста. Повтори м фрагмент
псевдокода для удобства .
IF s c o re > = 90:
PRINT ' Уровень 5-го класса'
ELI F 60: д
Эl'V\ O 1'\С t6 до ко
s c o re > =
PRINT 'Уровень 8-9-го классов'
ELSE:
PRI N T
Здl'\цщцW1е здес1:1
' Уровень выпускника вуза'
iшport chltext
return count
count = О
def count_syllaЬles_in_word (word) :
processed_word = word
else :
vowels = "aeiouAEIOU"
prev_char_was_vowel = False
prev_char_was_vowel = 'l'rue
count = count + 1
prev_char_was_vowel = False
else :
31 6 Гла ва б
Текст, строки и э врист и ческие алгор и тмы
return count
if s core >= 9 0 :
V- новой функции
print ( ' Ypoвeнъ 5 -�о JC.Dacca ' )
output_results ( )
J
score = ( 2 0 6 . 8 3 5 - 1 . 0 1 5 * ( total words / total sentences )
- 8 4 . 6 * ( total_syllaЫes / total_words ) )
»>
output_results( score )
pzi11t: ( scoze-; ·
30-0 Выпускник вуза Очень тяжело читается, понятен в основном выпускникам вузов
31 8 Гла в а б
Текст, строки и эврист и чески е алг оритмы
уз наеWlе
• Создайте новый файл с расширением .ру. определяется с помощью функции len ( ) .
compute_readaЬili ty ( ) ,
• Строки - этонеизменяемые
• Вызовите функцию последовательности, а списки -
передав ей в качестве аргумента имя переменной изменяемые.
text, дополненное именем модуля.
• Строки нельзя редактировать в коде,
И не забывайте о том, что эвристический алгоритм а списки - можно.
можно дополнительно улучшить. Внимательно • Строковый тип данных является
изучите список words в нем еще остались проблемы,
-
неизменяемым в большинстве
например двойные кавычки, которые тоже нужно современных языков программирования.
исключить из анализа перед подсчетом слогов. Плюс
у нас была идея создать список особых слов.
• Для посимвольного просмотра строки
можно использовать цикл for.
Как видите, работа программиста никогда не
• К символам строки можно обращаться по
заканчивается. В то же время цели, поставленные
нами в начале главы, успешно достигнуты. Осталось индексу.
только подвести итоги и решить кроссворд. В любом • С помощью булевого оператора in
случае примите поздравления - это была сложная можно проверить вхождение значений
глава, с которой вы справились! в список или строку.
• Эвристический алгоритм позволяет
получить наилучшую оценку или
приемлемый ответ, но это не
обязательно будет точное решение.
• Эвристические алгоритмы применяются
в задачах , где получение точного
решения оказывается слишком
трудоемким или же способ решения
неизвестен.
• В Pythoп подцерживается синтаксис
выделения подстроки из строки. Этот же
синтаксис применим и к спискам.
• В отличие от других языков
программирования, в Python нет
отдельного символьного типа: любые
текстовые данные здесь представляются
как строки.
1 2
з 4 5
6
9
10 11
12
13
14
П о горизонтали П о вертикал и
6. Набор перечисляемых элементов 1 . Свойство текста, определяющее
9. Часть слова
320 Гл а в а б
Текст, строки и э в р и с т и ческие алг оритмы
�HNE
[РЕШЕНИЕ)
Текст, хранящийся в файле chб/text. txt, необходи мо превратить в файл
Python . Для этого создайте в I DLE пустой файл и вставьте в него
приведенный ниже код (текст, помещаемый в переменную text, берется
из файла text. txt). Назовите полученный файл ch 1 text.py.
Далее запустите файл на выпол нение, и вы должны увидеть на экране
сохраненный текст.
1 11 l ' t; 1 1 1
like "is the ЬоЬЬеr аЬоvе or Ьelow water � " . Iruitructions in.ight also
direct the flov o f the recipe, li.ke "if you haven' t finisbed fishing,
проzрамма вывела вес�, thм cycle b.11 ck to the Deqiмing and put another 1Юt111 on the hook, "
h... .
uaed has Ьееn nothing ir.ore th4n а { s01118 t i.mes l.11 rge) set of simple
,� Peweнue
Теперь, когда вам известно назначение функции spl i t ( ) , вернемся к функци и compute_
readab i l i ty ( ) . Согласно псевдокоду нам следует написать функцию count_words ( ) , но,
как выясняется, с этой задачей прекрасно справляется встроенная функция s p l i t ( ) . Таким
образом, функция count _words ( ) нам не нужна. Закончите приведенный н иже код.
,
[ ' :rh!! ' , ' firs t ' ,' thinq ' , ' t:ha t ' , ' s � d.3 · , '�t•Hn ' , ' you ' , 'ar.d ' , '•ritir.g ' , 'yo�r ' ,
def compute readaЬility ( text) : ' firs t , r' ' р�есе ' , ' o f ' , ' codt! , ' ' i s · , ' lea:ming ' , ' the ' ' sk i l l ' ,
' eal , ' bre.Uing' ,
'proЬll!IU · , i!lto' , achievU.le ' , ' littl e ' , a�ti.01111 ' , · thtt ' , ' а ' , · coмpute r ' .
total w�rds = О
' down ' ,
Ч мобь� мдсч с.�мам 11 ' c.an ' , ' do ' , ' for ' , ' you . ' , ' Of ' '
' couxse , ' , you ' a.nd ' , ' the ' , 'cщiut1i ' , ' 11 i ll ' , ' also ' ,
' :iнd ' , ' to ' , ' Ье ' ' speili�' , ' i ' , ·�n· . ' l111gu11.qв , ' ' ou t ' , " •e ' l l " , ' get ' , ' to ' ,
total sentences = О колс.�чес мво сло в, ' t:hat ' , ' topi.c ' , ' :i n ' , ' juat ' , · 1 1 , ' b�t . ' , ' !low ' . 'breUirщ ' . 'proЬl81U ' , down ' , ' in to ' ,
' � ' , ' nl!IЬer ' , ' of ' , 'step5 ' , ' lliy ' , 'sound ' , ' а ' , ' nn ' , ' sk i l l , ' ' but ' , ' J tз ' , ' 1ct�ally ' ,
' ' ' '
' s0118 th irкj' , y()U , ' сШ ' , 11V1ty , ' da y . ' , ' Let' 1 ' , " loot ' , ' н ' , ' an ' , ' u.�le , ' , ' а ' ,
total_syllaЫes = О 1'\tредайме фу нкцс.�с.�
,
say ' , ' you ' , ' 1anted ' , ' to ' , 'bre.U: ' , ' t.he ' , ' ac tivi ty '
.
' Hare ' a ' ,
' our ' , ' first ' , ' a ttelllp t ' 1 ' to ' , ' do ' , ' thit , ' ' check ' , ' i t ' , ' ou t ' ' You ' , сап · , ' think ' ,
'
' of ' , · �е•е ' , s utellle!I U ' , ' a.s , ' а ' , ' nice ' , ' rкipt ' , ' for ' . ' f i s ь.i nq '
)
' L i te ' , ' any '
' rec ipe , ' , ' this ' , ' on1 ' , 'provides ' , ' а ' , ' set ' , ' of ' , ' steps, ' , 'that ' , '11he n ' , ' fo llowd ' ,
words = text . split ( ) ' in ' , ' order , ' 1 '•i l l ' , ' produce ' , ' sOl!ll ' , ' rasult ' , ' or ' , 'outC<llll! " , in' , ' our ' , ' CAlt, '
�
'hopefu� l y , ' , ' ca.tchinq • , ' sOIDI! ' , ' fish , ' , 'lio tice ' , ' tha t ' , 'l!IDa t ' , ' s ttps ' , ' conais U ' ,
' pond" , ' ,
total words = len (vords ) ' of ' , ' 1iqй1 ' , ' i ns truction, ' ' l ikt ' , ' "cu t ' , ' l ine ' , ' into ' ,
' а.110 ' , nctie& ' , ' :hat ' , ' othtc ' , 'instructions ' , ' a re ' ,
' in ' , ' the ' , ' !is11 . '" , 'But ' ,
' o r ' , "'pul l ' ,
' il ' , ' Ьi t , 'diffнent' , 'Ьee1use ' , ' they " , ' dtpend ' , ' on ' , ' а ' , ·cond.ition , ' , ' l i.ke ' ,
'ЬоЬЬеr ' , ' аЬоvе ' . ' or ' , 'Ьвlоw' , 'vatar' '
' ''i s ' , ' the ' , ' l nstructions ' , 'aiqht ' a lao · ,
' cilcect ' , ' the ' , fl.oY' , ' of ' , ' tье ' , ' r1�pe , ' ' l Ur:e ' , "'if ' , ' you ' , ' haveD ' t ' , finlshed ' ,
print (words ) ' c:ycle ' , 'l;;icl: ' , ' to ' , ' tht ' . 'Ьeqinnirщ ' , ' i!ld '
,
Or , ' , ' for ' , ' stoppinq , ' ,
print ( total_vords , ' qoir. q ' , ' to ' , ' f i.nd'· ,
:prin t ( text:)
' as ' , ' i n " , ' " i f ' , ' you ' !t! ' , 'dooe" ' , the.n ' , ' q o ' , ' ha1111 ' ' You ' re ' ,
' these ' , ' 1illple' , ' st.i.t8мl!U ' , ' or ' , ' Uutructions' , ',не ' , ' t.he ' , ' f нa t ' ' t ey ' , ' ':о ' ,
' codinq, ' , ' in ' , ·�act ' , ' ev&ry ' , ' Арр ' , ' c r ' , ' so!tvu& ' , ' p rogru ' , ' you ' ve ' , ' evtr ' ,
' usad ' , ' hes ' , ' Ье.n ' , 'ncU.inq ' , 'JDOce ' , ' thu ' , ' а ' , ' (scaetimes ' , 'l1rqe! ' , ' se t ' , ' о( ' ,
' &illp l e ' , 'instru�ticna ' , ' to ' , ' tile ' , ' cazput11r ' , ' til�t · , ' tell ' it ' , ' 11bat ' , ' to ' , ' do . • ]
ЗIIO czoa
compute_readaЬility ( chl text . text)
� kapaиgaw
-� �
"· -
return count
Если мременная char я8ляеWIСЯ
знаком конца УLредложения,
W\O у8еличи8аем значение
мременноu count на единицу
ift".J�зьмume kapaиgaw
"'� Peweиue
Попробуйте переписать функцию count sentences ( ) , сделав ее проще
(и понятнее) с помощью оператора in. В приведенном ниже варианте функции мы
удалили код сравнения со знаками препинания. Вместо этого добавлена локальная
переменная t e rmina l s , в которой перечислены все знаки окончания предложений .
З акончите инструкцию i f так, чтобы она проверяла, является ли текущий символ
терминальным, используя оператор in.
if char in terminals :
count = count + 1
return count
322 Глава б
Текст, строки и э вр и ст и чески е ал горитмы
о True 1
решенfl_е, о True
111 False
Из учар: nр 1-1вt'�t'нную f False
выше фующ �-1ю u True 2
1 F1/se
count syl laЫ e s in word ( ) ,
nрt'�Ставьтt', Ч:;О Вы 1-1 нтерti}�ет;тор
PytЬ�n. Фун1iqю� nере�аетср: арrумент
" roomf ul " . Мысленно npo»�i-1тe весь
q й1iЛ, OTCJlt'ЖйBajJ: йЗMt'Ht'HйjJ: ЛО1iаЛьных
nеременных.
---
•
ктс:а
+ +
чтс:а делеет?
+
188W8HU8
Мы выполнили ряд операций по созданию срезов, но затем все
перемешалось. Не поможете нам расставить все по своим местам?
Одно соответствие мы нашли сами.
'
а man а p l a n pa nam'
' '
а
'
а man а p l a n panama'
s tr [ З : - 1 ]
s tr [ 0 : - 1 ] 'a ma'
s tr [ 0 : 4 ] ' ma n a'
'm'
��--!зьмumе kapaнgaw
"-� Peweнue
Теперь переменная p r o ce s s_word содержит слово, из которого удален концевой
знак препинания . Напишите код для удаления из слова конечной буквы 'е' . Это
будет буквально несколько строк кода.
if in
ра6ен лuбо 'е', лuбо 'Е', мо " .
Еслu мследнuй сuм6ол в смроке proce s s_word
���зьмumе kapaнgaw
,�� Peweнue Мы наконец получили индекс удобоч итаемости, и осталось вывести
результаты . Напишите функцию output_r e s u l t s ( ) , которая получает
значение индекса и выводит на экран строку с описанием уровня текста.
324 Гла ва б
Текст, строки и эвр ист и чес ки е алгоритмы
1 2
3 4 у р 5
6 п о с л е ь н о с т ь
у и о з е
н м б д 7 д л и н а
8 к в о е 3
э т о ч л м
9 в у л и и е
10 с т р о к а т т 11 н
л и ц а е с я
о с и л л е
г т я ь о м
и в ы
ч к а е
14 ф л е ш т р
с ь ь
к
и
й
�
К.орu Докмороу
г Тексм uз ио кнut.u
L.ittfe 8rotJ..er
�;;�:;:.��;;�..::::::���li!�d ;
·
� o o
here's
..::·:� � �=�� ��:�:. :�=�T
uter . it does exactly what you tell it to do. It's like
-: . < -co mp . des·igning
.
any mach likе а car, like а faucet,
ш�, like а
·
� am-=Ыne -
ingers some more. "It's just -- You know. gas-hinge for а doo� - usmg math �d instroctions. It's awesome
·an·s the smart one. Darryl was . . Не was your sense: 1t сап fdl you w1th awe.
; in tЬе trUest
.
.,. .
а11
Being the programmer, that was ту thing. 11 А computer is the most complicated machine you'll ever use.
�
1ying you didn't need me."
.J-:
It's made of billions of micro-miniaturized transistors that can Ье i�:
configured to run any program you can imagine. But when you sit ;;'
. ;. .
�
Stop. Fine. 1 Ьelieve you. We're all really �;
&
Most of us will never build а car. Pretty much none of us will
\ \:
·.
.....
t:
w. So yeah, of course you can help. Wecan "�-'evercreate an aviation system. Design а building. Lay out а city.
t'· ·- --• ... 1 :....1 ... L•• .J-.-• J:" •• - · ··"'·•• ••
�.
328 Глава 7
Классы, 06ьекть1, методы и модули
Офuсныu guaA02
3наkомсm8о с моgудямu
Как вы уже знаете, для импорта модуля применяется инструкция
import:
(
num = random . randint ( O , 9 )
~
•• Зt.1 1\'\еМ указt>1 8t.1еМ и м�
.t.1
Нt.1чинt.1ем ф у нк1.1ии или 1'\ер еменн ои
с имени
м о дул
мо дуля" .
".t\Осле коl\'\орогоя сw.t.18им
омрt.1w.ор- w.очку".
К.t.1к будеw. l'\OKt.13t.IHO
Мы уже не раз испол ьзовали в книге оператор-точку. В данном случае
он означает "поискать функцию randint ( ) в модул е random" .
� дt.1Лее, oмpt.1w.op-w.oчкt.1
1'\рuменяеw.ся w.t.1кже 1'\ри
pt.1бow.e с обьекw.t.1ми
Пе �oumecь
ЗадаВаmь Во�ось1
]j: Откуда Pythoп знает, где искать ]j: Мне встречался термин библиотека
модуль random? Не возникнет ли
конфликт?
О:
импортируемый модуль? Python. Имеет ли он отношение
О:
к модулям?
О:
Нет, Python отслеживает
Хороший вопрос, ведь в операции
подключаемые модули , чтобы не
импорта указы вается только имя Библиотека - это более общий
приходилось импортировать их снова
модуля, но не путь к нему. Как же термин, под которым чаще всего
и снова. Кроме того, допускается,
Python находит модули? Сначала он понимают модули , выложенные
чтобы п рограмма и внешний модуль
п росматривает собственный список в открытый доступ . Есть еще
импортировали один и тот же модуль.
встроенных модулей ( random как раз термин пакет, означающий набор
один из них) и, если не находит нужны й модулей , которые предназначены для
модуль, т о просматривает локальную совместного использования.
')j:
папку, из которой запускалась
программа. В случае необходимости Что произойдет, если я, к примеру,
можно настраи вать поиск и в других импортирую модуль random и другой
папках. модуль, который тоже импортирует
330 Глава 7
Классы, объекты, методы и модули
о
()
66±- &3CF1 Давайте проверим, как работает переменная name Ниже приведены два
_ _.
Tecm -дf qitв файла Pythoп . Введите оба файла в IDLE, сохраните их в одной и той же папке,
запустите по очереди и сравните результаты .
»>
332 Гла в а 7
Классы, объекты, методы и модули
Федор. Согласен!
{
ch:i.text.py цэ r.Аr.кц ch�
06но8денuе фаiiда апа/уzв.ру 6 r.ar.кy ch7
return count
total sentences = О
total syll&Ьles = О
s core-= О
t
Не забудоWlе сделаW10 OWICWl!:)Y\ 8 чеW1ыре ""робело. 1'\роzрамм111 !
У\еред 81:11зо8ом функцмм compute_readaЬi l i ty ( )
EJOt: &::gJ В несите указанные выше изменения в файл ana/yze.py и запустите его для п роверки .
Tecm -�rqjiв Поскольку он запускается как основная программа, вы должны получить тот же
результат, что и в главе 6 . Не забудьте скопировать файл ch 1text.py в ту же папку.
334 Глав а 7
Классы, объекты, методы и модули
г
И MYIOpvv. МОд!:JЛЯ
2117 �. В ведите файл согу_апа/уzв . ру и проверьте его работу. Поскольку файл analyze.py
Tecm -n.� �в запускается в качестве модуля , тестовый код в нем не выполняется. Соответственно,
результаты работы программы будут другими.
/7
B6oдuvv." vv.eкcvv. uз
KHIAZIA К.ор1А со 6сеМ
не обязаvv.ел"но. 8111 Тексw. К.орu cooм6evv. cw.6yevv.
найдеvv.е ezo 6 файле уро 6ню 7 - го класса. Эvv.o ____-"'
ck7/cory.txt uдеал"н о для книги, коvv.ора я
ориенvv.u ро6ана на У1Одросvv.ко6!
336 Глава 7
Классы, объ екты, м етоды и модул и
" " " В кодупе analyze аычиспяе'l'ся ииде:кс удобоЧИ'l'аекос'l'и Фпеша-I<ии:кейда дпя
sадаииоrо 'l'e:кc'l'a и на основе попучеииой оценки опредепяе'l'ся уровень
удобОЧИ'1'&8КОС'l'И '1'8:КС'l'а .
" .. "
объя6ленцем функццц
return count
count = count + 1
до куменwщру ю щих cwipoк
return count
"""
coo'l'вe'l'C'l'BYJDЩИЙ ему уровеиъ удобоЧИ'l'аенос'l'И 'l'&:КC'l'a .
if score >= 90 :
print ( ' Уровеиъ 5 - ro :кпасса ' )
J_ 1
elif s core >= 8 0 :
print ( ' Уровеиъ 6 - ro :кпасса ' )
elif s core >= 7 0 :
prin t ( ' Уровеиъ 7 -ro :кпасса ' )
elif s core >= 60 :
print ( ' Уровеиъ 8 - 9-ro :кпассов ' )
elif s core >= 50 :
print ( ' Ypoвeиъ 1 0 - 1 1 -ro :кпассов ' )
e l i f s core >= 30 :
print ( ' Ypoвeиъ студен'l'а вуsа ' )
else :
print ( ' Ypoвeиъ в:ыnускника вуsа ' )
output_results ( score )
нужнЬlм. Pytl-.on
8 данном слу чае не
if name = " main "· накладЬ18аем никаки х
-importchl text о граничений. 13 других
print ( ' Те:кс'l' rпавы 1 : ' )
compute_readaЬil i ty ( chl text . text )
яз Ь1ках nрограммиро8ания
к до кумен w�ирую щи м
смрокам 8Ь1д8ига юмся
оnределеннЬ1е
w�ребо8а ния, мз8оляющие
смандармизиро8ам" их
форма м
338 Гла в а 7
Классы, объекты, методы и модули
�.c ·J:oJ Добавьте документирующие строки в файл analyze.py. При желании можете
Тесm-дr�в дополнить их, как посчитаете нужны м . После этого необходимо выполнить
определенные действия . Помните, мы говорили о том, что Python из соображений
эффективности не позволяет повторно импортировать од ин и тот же модуль?
Вместо этого он постоянно хранит в памяти его кешированную версию . И менно
поэтому, несмотря на внесенные в модуль analyze.py изменения, Python
Все за8цсцм ом /'1 будет продолжать работать с его старой , кешированной версией (лишенной
омрац1.1оннои� документирующих строк). Чтобы обойти это огран ичение, нужно выйти из IDLE.
сцсмемы Полностью завершите работу в редакторе кода , после чего снова запустите
и 8ерс1.1ц Pyth.OY\ IDLE, откройте файл cory_analyze.py и выполните его , чтобы уд остовериться
в отсутствии ошибок в документирующем коде. Теперь перейдите в окно консоли
и следуйте приведенным ниже инструкциям для просмотра документации.
fj Не У\ренебреzt1.йме Зt1.У\уском
� фt1.йлt1. cory_t1.мly:ze.py, Wltl.K
кt1.к он цммр м1.1руем модул"
t1.Y\t1.ly:ze.py, t1. эW\о У\ОЗ8оляеW1
убедщvФСЯ в Y\pt1.81AЛ"HOCW\U
рt1.смложени я модуля
:�U.:�лu · ·
�'':., Раз уж вы задумались над тем, как работают с модулем analyze.py другие
1
программисты, то, может быть, имеет смысл перестроить его? Что, :�-=
если программист захочет, к примеру, узнать индекс удобочитаемости ':,
в числовом виде? Подумайте о том, что нужно изменить в коде модуля. ':,'
:.
340 Глава 7
Классы, объекты, методы и модули
в логистической
компании, поэтому постоянно
применяю модуль datetillle:
он содержит все необходимое для
работы со значениями даты
о приложение основано
о
на модуле Тkinter,
который содержит
/ все необходимые
t&
Чемрашка можеWI
д6цгаW1ься 6nеред,
i
назад цлц в--
кон кремную �
WIOЧK!:J CeWIKLI
� Черемшка можеWI
м6ернуW1tо 6npa6o
Есл ц nepo черемщкц цлц Влево, ЧWIO меняем
оnу щено , мо она наnраВленце ее 06uженця
осм а6ляем сле д
nрц 06ц же нц ц
342 rлава 7
Классы, объекты, методы и модули
)
НдЗндчuм но6ой черемшке
1'
Тдк со3оаемся
1'\еременную slowpoke новая череl'\ашка
\ [
Заставим черепашку сделать что-нибудь.
Ol'\tpaмop-
Одно 1.13 м6еденuй
/ А
мочка
1/
чep tl'\l!ЩK«
рzуменм,
sl owpoke . forwa rd ( 1 0 0 )
как
в об1:�1чной
!а (
ф!:JHKЦULI •
'--7/
344 Глава 7
Классы, обьекть1, методы и модули
Uзученuе чepenawek
Настало время и вам попроб овать свои силы. Давайте заставим черепашку
выполнить какие-то действия, написав соответствующий код . Сохраните его
в файле turtle_ test. py.
turtle . mainloop ( )
V- она мзболяем модулю turtle конмролt.1ро8амь 8се соб111 м t.1я,
"'роисхооящие 8 ezo окне, Включая закрымие t\pozpaMMЬI 1'\ри
щелчке на кноме Close. Эма смрока должна 01>1мь мследней
Не наа wвайте
- - - -
,
�
��с� ----"�- Если 8111 не би диме СВО Й файn
8 • Python Turtl• _ -
ЭW\0 ОКНО 1А 8 turtle.py
[� - - обол очке нем ВнJtЬiiU!Jte!
!
1 След ите за
HIAK tl.KUX ош щ5ок , 1
1 тем , чтобы и мя
1
м о "'оищцме ezo 1
1 тестово го файла не совп ало
1'\Озадц окон Pytho r.. 1 ад
\
1 с имен ем модуля , иначе
1
8 неком орых 1
1 у вас возн икнут се рьезн ые
1
сисмемах окно 1 про бле мы : пр и каждом
\
модуля не r.оя8ляемся об ра щени и к модул ю tu r t l e
о
а8мо мам ичес ки будет за гружаться ваш
nоберх осмальн11х1 файл . Это ка сается л юбых
око н создавае мых вам и файлов : не
давай те и м и м ена стандартных
модулей , особенно тех ,
которы е импо рти руете
в собственны е про грам ы .
м
- - - - -
- - - - - - - - - - - - - - - - -
- - - - - - - - - - - - �
Пе �oumec:ь
:задаDаmь Do:riroc:ь1
D: Угол поворота черепашки D: Что означает арrумент 100 D: Почему черепашка обретает
задается в градусах? п р и перемещении вперед? нужную форму только по
Q: О:
команде? Я думал, она уже
Да . В частности, для полного Сто единиц. В данном является черепашкой!
оборота по часовой стрелке
нужно повернуть черепашку на
случае единицы соответствуют
экранным пикселям. Таким О: По историческим причинам
360 градусов. Поворот на 90 образом, команда turtle . черепашка изначально имеет
градусов соответствует четверти forward ( S O ) дает указание треугольную форму. Она
оборота и т.д. черепашке переместиться также может выглядеть как
вперед 50 пикселей. квадратик, кружок, стрелка;
разрешается даже назначать ей
произвольную картин ку. Но что
может быть забавнее настоящей
черепашки?
�А!!зьмumе kapaнgaw Позади уже почти семь гла в книги, поэтому вам долж но быть вполне по
�� силам следующее уп раж нен ие. П реобразуйте при веденны й выше код
рисова н ия квадрата в отдел ьную фун кцию, которая назы вается make_
square ( ) и имеет еди н ствен н ый а р гумент: черепа ш ку. Постарайтесь
та кже удалить весь повторяющийся код. Сверьтесь с нашим решением,
t Обязt1и11
которое п ри ведено в кон це главы.
е л1:>но изучиме
нt�шу Версию, мскол1:>ку
именно с ней мы будем
pt1бoмt1W11:> дмее
346 Гл а в а 7
Классы, объекты, методы и модули
Е ще оgна чepenawka
Как насчет друга для нашей черепашки? Давайте
напишем код с оздания второй черепашки.
В эмом коде череl'\ащка s lowpoke
pиcyerv1 кбадрам, как u ран1:1ше,
__,,,.,--... Эмо нo6ti1i:i код, комор 1:11 й а череl'\ашка pokey рисуем
� МЬI обобщuлu 6 1'\редЬ1 дущем м6ернумЬ1i:i краснЬli'i к6адрам
import turtle у l'\ражненuu
for i in range ( O ,
the_turtle . forward ( l O O )
4) :
the_turtle . right ( 9 0 )
make_square ( s lowpoke )
pokey . right ( 4S ) � Раз6ора чuбаем бморую
шake_square (pokey) � череl'\ашку на 45° 61'\рабо
turtle . mainloop ( )
передаем черемшку pokey
6 функцию make_square ( ) Еслu функция make square ( ) кажемся
_
import turtle
шak
e_s
q ua
re(
s low
poke) Удаляем эмu обращенuя
polce7.ri9ht(45) � к функцuu inake_square ()
_sqaare(pokeJ)
lllake
Теl'\ерь МЬI будем Oбpal'VIUl'Ae внuманuе
aake_spiral(alowpoke)
в1:11зь�ва""ь функцuю на l'VIO, Чr.\О !:/ каждой
make_spiral () вмeCl'VIO череN'.шкu с8оя 1'\ОЗuцuя,
pokey.riqht (S)
make_square () с8ое на....
равленuе, свой
Jll&ke_apiral (pokey)
ц8ем u r.\.n.
Черемшка pokey м8ернем
turtle .шainloop ( ) на 5• 81'\fa8o, /'\реж.де чем
начамь рuсо8амь Сl'\цраль
/1
Вом чмо !:J нас 1'\Одучuлось -
наммuнаем иzрушку-с...uроzраф
nоэксr.ерименtоЛируй""е С ....apaMel'V!paмu
u амрuб!J.....аМи ф!JНКЦUй, ч....обь�
. 1'\ОНЯМЬ,
как онu 8лuяю...., на конечн1:11й реЗ!JА"""а"".
А мь� ...родолжuм экс....ерuмен"""' на
след!Jющей с....,ранице
348 Глава 7
Классы, объекты, методы и модули
r - - - - "
)-11)71,111� f)lll1l'l,l1I С� 'll�Pl�ll1llllКllllll
Мы подrотоамnм дnJI аас еще нескоnько •кспермментоа с черепаwкамм. Внмматеnьно маучмте
1 1
каждый 111• них, подумайте, что будет деnать черепашка, а sатем sапустмте код, чтобы проаермть
саом предпоnоженмя. Попробуйте поменять арrументы функций. Как прм •том м:1менмтСJ1
реsуnьтат на •кране?
1 1
for i in ranqe (S) :
кроме 1'\ер6111х мрех
�
alowpoke . forward (lOO)
смрок (и 1'\оследнеzо
alowpoke. riqht (144)
"'\ 8111зо6а mainloop () ),
/'\Осле чего 6сма611ме
Чмо 1'\роuзойдем, если
1'\оменямо эмо число? эмом код 1'\ОСредине
Или эмо?
�
1 1
Нарисуйме здесо
эксперимеит #2 резуломам
• P)'i"*'Т.1118 Crapllo
�
slowpoke .pencolor ( ' Ьlu• ' ) М111 иСl'\ОЛоЗуем
alowpoke .penup ( ) несколоко но6111х
slowpoke .aetpoaition (-120, 0) функций: задаем
ц8ем l'\tpa,
1
slowpoke . pendown ( )
1
1'\одн1.1маем 1'\еро)
slowpoke . circle (SO)
1'\еремещаем его
8 но8ую l'\03иц1.1ю
alowpoke . pencolor ( ' red ' )
(.( 01'\!:JСКаем, 1'\ОСЛе
slowpoke . penup ( )
чего рисуем
slowpoke . aetpoaition (120, О) окружносмо
slowpoke .pendown ( ) • """'°"fllf'lGr
lct aphiн
1 1
slowpoke . circle (SO)
'-- Чмо 1'\роизойдем,
если удалим11
Эксперимеит #3 8111зо6111 функц1.11.1
penup ( ) ?
def шake_ahape (t, sides) :
anql• • 360/aides
for i in ranqe ( O , sides) :
1 �1
t . forward(100)
t. riqht(anqle)
L
1'\рu6еден114 6
шake_shape (slowpoke , 10)
конце zла6111
1
Модульное программирование • 349
Кто вы, черепашки ?
l /
s l owpoke = turt l e . Turt l e ( )
� Мы r.о казали
W\OЛl:>KO ОСНО8ное ,
чW1оО1:>1 сберечt>
t\apy дере81:>еб
350 Глава 7
Классы, объекты, методы и модули
н еобходимо, что бы вс е он и имел и один аковое поведе ни е. Н икому ведь н е хочется в сякии
раз заново п исать фун кции перемещения. В то же время каждая черепашка должна иметь
с вое уникальн ое с остояни е : местоположени е, направлен ие движен ия, цвет и т.п. Класс -
это шабло н или стандарт, по которому создаются одн отипные о бъекты.
Э w.о н ообн Ьiй. с мс об сосw.t16ления
( ои агра ММЬI кл ас с/.\
iJ
КАасс - эmо не o6ьekm,
Н а ос нове о оноzо КМI СС/.\
Turtle можно coздt1w.l7 м но жес1'111 6о
color а cneцuфukaцuя.
xcor
рt1зли ч ных о бъекм об,
� СосW1оянuе у каждого uз кol'lll o pыx
ycor Кп асс представляет собой шаблон,
heading бндеl'\ll сбое сосw. оянuе
по которому создаются обьекты. Он
forward()
backward() -.? по6еденuе �J сообщает Python, как следует создавать
объекты данного типа. Каждый объект,
turn()
созданный на основе класса, будет обладать
penup()
собственными значениями внутреннего
pendown()
состояния. Например, с помощью класса
Turtle можно создать дюжину черепашек,
shape() и у каждой будет свой цвет, своя форма,
свои координаты, свои установки nepa
(оnущено или поднято) и т.п.
При этом все черепашки одного класса
будут иметь одинаковое поведение: они
будут одинаково перемещаться вперед и
назад, nоворачивать и управлять пером.
}j:
основе классов?
]} :
и определения функций). Каким
базовых типов данных: чисел ,
образом обычная переменная может
строк, списков и т . п . В объектно Можно пи создавать собственные хранить целый объект?
О:
ориентированном программировании классы?
О:
мы имеем дело высокоуровневы ми
типами данных, которые лучше Помните, мы говорили о том ,
Конечно! Это одно из преимуществ как в переменной можно сохранить
соответствуют специфике решаемой
объектно-ориентированного целый список? Переменная
задачи. Например, в симуляторе
программирования: любой язык в действительности хранит ссылку на
рыбалки намного п роще оперировать
программирования (не только Pythoп) область памяти, в которой находится
объектами рыб и объектом пруда ,
можно расширять собственными список, т.е. переменная представляет
ч е м управлять огромным набором
классами. Можно даже расширять собой указатель на список. То же
переменных и функций .
функциональность классов, созданных самое происходит и в случае объектов.
други ми п рограммиста м и . В этой Переменная хранит ссылку на объект,
главе мы будем работать только находящийся в памяти, а не сам объект.
352 Гла ва 7
Классы, объекты, методы и модул и
Turtle
color е--- Знач ения , издес мны е
xcor
ycor
об1'екму тurtle
headlng (сосм ояние)
forward()
!::_-- Аейсмдця, 6ь�млняемt71е
backward() объекмом Turtle
tumO (м6еденце)
penup() �...@озьмumе kapaнgaw
pendownO
shape()
,� Заполн ите диа грамму
класса Radio, указав,
какие атрибуты и методы
ему могут понадобиться.
Значения , отслеживаемые о бъектом, известны как
• атрибуть1 .
l / if
turtle Turtle
� �
Эмо в"'зов вн1:1 мреннего мемооо.
s l owpoke = turt l e Turt l e < >
цнцццо.лцзаццц класса. Turtle,
·
комор171ii создаем нов"'ц объекм
(
ц но.смрацва.ем его сосмоянце
354 Глав а 7
Классы, объ екты, методы и модули
� 8нумр ен ний аW\рибум shape, сделав чере l'\а ШК!:J кру глои
u
�
в нем повсюду. Судите сами.
В Pytho/'\
З десо м ы Вызываем консw�ру кW1 ор
�
С/'\ ис ка для со да
С/'\иСОК - з ни.я н о во го , 1'1.!:JCWloгo
C/'\IACKa
эl'\'\о кла сс
v
my_l i s t . append ( ' пep вый ' )
вызов одно го из
сW1р окобых меW1 о до б
� 8Ь1з1:118ам1:> консмрукw.ор
класса, как 8 данном случае.
pi = f l oat ( З . 1 4 1 5 ) Python обрабамЬ18аем w.акие
i s_int = p i . i s_in t e g er ( ) значения самосмояw.ел1:1но
p r i nt ( p i , i s_int ) � 1
\_,_ ".ц еще один меW1од
356 Глава 7
Классы, 06ьекть1, методы и модули
о
о
Чepenawьu 6е2а
Как вы уже знаете, основным преимуществом объектов является
то, что каждый из них хранит собственное состояние, притом
что все объекты одного класса имеют одинаковое поведение
(методы).
Лuнuя смарма
будем у ле8оzо
Ч•р•мщкц бу/ум """"'"'' • •р•lому \)
краю окна. победим ма из нuх, коморая
края окна
1'1tрвой ""ересечем фuнuшную черw.у
358 Глава 7
Классы, объекты, методы и модули
о
можем эмо сделамь!
Начать и гру.
Создать несколько черепашек,
каждую со своим цветом и Гонка будем 1'\родолжамься до мех 1'\Ор, 1'\ОКа одна из череl'\ашек
пози цией на стартовом поле. не мбедим, досмигнув финишноu чермt11. Но нужен алгоримм
оl'\ределения мбедимеля. Создадим 1'\еременную winner и
1'1.ервоначально усмановим ее равноu Fal se, 1'\рисвоив ей значение
Начать гон ку . тrue, молько когда череl'l.ашка досмигнем финишной чермt11
Задать переменную winner равной False.
о Задать переменную
winner равной True. 1'\роверямь, не 1'\ересекла ли череl'\ашка
финишную черму. Если эмо 1'\роизошло,
И гра эавер шаетсs� .
задаем мременную winner равной True
Объявляем победителя!
forward()
ЬackwantO
tum()
penup()
pendown()
ahape()
Красная Коричневая
Пурпурная
Эмо обьекмы,
1'\Орож.денные ом
класса Turtle
r
у каждой
Синяя
360 Глава 7
Классы, объекты, м етоды и модули
l!�;Начать
Kog нacmpouku u2ры
l
Теперь напишем код создания и инициализации
объектов черепашек. На предыдущей странице были игру.
"""'"' �--· 1
перечислены атрибуты черепашек - всех их нужно где-то
каждую со своим цветом и
хранить , чтоб ы можно было выполнить инициализацию nозицие!4 на стартовом поле.
черепашек. Для этого нам понадобятся два списка v ----·------ -----
"""К4}
О t'\ределим фынкцию setup ( ) cw.pyкw.ypy данн 111х, коw.орая
import turtle
для создания и мзиционирования лучше У1одходиw. для хранения
import random
черемшек """" '"""'"""' чем ав.
turtles = list ( )
f
л
Эмо нача л1:1н111 е значе ния
d.ef' setup ( ) :
переменная s tartline храним
координаw.у х линии с w.арма для амри быw.08 каждой
global turtles череУ1ашки , хран им111 е
s tartline = - 4 8 0 в двух мраллел1:1н111х
turtle_ycor = [ - 4 0 , - 2 0 , 20 , 40]
С/'\иСКа){
turtle_color = [ ' Ьlue ' , ' red ' , ' purple ' , ' brown ' , ' green ' ]
О,
f'or i in range ( 0 , len ( turtle_ycor ) ) : � Создаем цикл t'\O всем чере/'\О.Ш КО.М
new_turtle = turtle . Turtle ( )
new_turtle . shape ( ' turtle ' )
Для каждой череt'\ашки создаем нов111 й
\
координаw.1:>1 (х, у)
Не зебуд1:1ме в1:>1зв череl'\ашки. 8 данном
функцию setup 0 , rтомниме меw.од append О из гла61:>1 4? Он случае Ml:>I 1'\еремещаем
а меле нее _ функцию добавляем элеменw. в сущесw.вующий Cl'\ucoк, черемшку на смармо8ое
turtle . mainloop ( ) 8 данном случае эмо Сl'\исок turtles. Тол1:1ко мле
8 главе 4 Ml:>I не исt'\ОЛl:>ЗО8али мерМин 'Мемод'
Cnewka н u k чему !
как кажется
Приведенный на предыдущей странице код не настолъко прост,
.
Мы , конечно , могли бы проанализировать его
строка за строкой , но ведь это уже глава 7, и вас наверняка
и нтересуют вещи посерьезнее. В люб ом случае не торопитесь ,
внимательно изучите код и уб едитесь , что по нимаете каждую
его строку, прежде чем двигаться дальше.
[
В башей сцсмеме смандармное окно
можем оказам11ся мен11шего размера,
чем "'оказано здес11. Еслц чере...а ш кц
6111 ..а. даюм за леб111 й краiА окна,
Ш аг б r.рабцл11ном наr.рабленцц, расмянцме его, мка не у8цдцме цх
но бсе б111глядцм немного смранно.
Ч мо 1'\роцзошло?
. --
----
... - -
;Q;: _
:----
• - �
31!r
Все чере...а ш кц r.рабцл11ного цбема �
ц находямся б "рабцл11н111х мзцццях.
Но бсммнцме, чмо цх ж.цзн11 начцнаемся
8 мочке с коордцнамамц (о, о) 8 ценW\ре
окна, ц 8 "'роцессе цх мремещенця
к смармоб111м 1'\озцццям они нарцсо8алц
л1.�нцц, чмо собсем не нужно. Н еобходцмо
362 Глава 7
Классы, объекты, методы и модули
t±p1t>� Придется вносить изменения в код. В начальной позиции перо черепашки должно
Tectn-д.fiuiв быть поднято, чтобы она не оставляла след при перемещении к стартовому полю.
Кроме того, мы увеличиваем окно и добавляем в него фоновое изображение. Обновите
программу и протестируйте ее снова. Файл pavement.gif следует скопировать из папки
материалов к главе 7 и поместить в ту же папку, что и файл гасе.ру.
iJDport turtl•
iJDport rand.om
Не Y"'YcW1uW1e эwio uзмененце. Необходuмо cмecWluwiи чере"'ашек далише
turtles = list О блебо. rтомнuW1е: ценмр окна uмeeWI коордцнамЬI (О, о), 1'\ОЭW1ому
коордuнаw�а х, ра6наJ1 -620, находuмся блцже к левому краю окна
def setup ( ) :
J
51!
qlobal turtle
8 13 ЭМUХ мрех смроках кода IACl'\OЛbЗflet\l\CЯ
startline '"' - 620
screen = turtle. screen ()
( не рассмамрцбавшuйся ранее обьекWI Screen.
screen. setup(1290, 720) С ezo 1'\ОМощью можно сделаw�ь окно болише
screen . Ьgpic ( 'paV81118nt . 9if ' ) u мменямь его фон
V
winмr равна false:
Задать переменную wfNwr раоной false.
nока nеременН<UI
Пора начинать забег. Все необходимые инструкции
приведены в псевдокоде, осталось реализовать их. Q Дл• каждой черепаwки: ,
о Вwбрать случай
ную величину !!
продви•енио вперед, ска..ем ,
Сначаnа создаем nеремен ную winner. Мы сделаем от О до 2 пикс �ей.
А
W
ТТровери ть, не nepeceкna л и
winner должна быть булевой и инициализироваться
значением Fa l s e . В функции race ( ) также будет
череnоwка сриниwную черту.
L
Если да, то:
def race ( ) :
qlobal turtles
winner = Fal se
finishline • 590
~
Нужно сдеnать так, чтобы эа6еr nродоnжаnсн
до вынвnенин nо6едитеnн. Для этого создаем цикл
wh i l e , который будет выполняться, пока переменная
winner не станет равна T rue.
def race ( ) :
qlobal turtles
Цикл бЬl l'\ОЛНЯеl'\l\СЯ
winner = Fal se до 1'\1\еХ n.op ' r\OKa
finishline = 590 r\еременная winner не
cW1aнeW1 рабна True
while n o t winner :
о
Даnее нужно реаnиэовать nеремещение
череnаwек. Сначала создаем цикл for / i n для
перебора глобального списка tu r t l e s .
def race ( ) :
qlobal turtles
winner = False
finishline = 590
364 Гл а в а 7
Классы, объекты, методы и модул и
о
Сrенерируем сnучайные чисnа, аадающие
расстонн ин, на которые доnжны nереместитьсн
череnаwки. Каждое случайное число выб ирается из
диапазона от до 2 именно на такое количество пикселей
О -
смещается черепашка.
def race ( ) :
qlobal turtles Сгенерируем слыча.йное число OW\
о до 2. и мремесмим череn.а.шку
finishline = 5 90
winner = False
на. соом8е мсм8ующее число
�"""''�
while n o t winner :
for current turtle in turtles :
• random . randint ( 0 , 2 )
111.0Ve
current_turtle . forward (aove)
def race ( ) :
global turtles
winner = False
finishline = 5 9 0
Оr�ределяем координа.му х череl'\.D.шки,
while not winner :
чмобы l'lонямь, n.ересекла. лц она финишную
i
for current turtle in turtles :
move = random . randint ( 0 , 2 ) черrи.у. Для ЭWIOZO иСl'\.ОЛЬЗ!:JеМ Меrи.од xcor ( ) ,
current_turtle . forward (mov• > 8оз8ро.ща.ющий координо.мы х объекмо.
�
Зада.ем winner = 'l'rue �
� winner_color = current_turtle . color ( ) иольше, У но.с есW1ь
n.еременную __/ print ( ' Пoбe�&JJlo ' , winner_color [ O ] )
-- n.обедцrи.ель
:r
winner ра.8ной
True
г------ ----- -l
Исмлt>зуем меrи.од color ( ) ,
Учмиме, чмо мемод color
8оз8ро.що.ем два. значения:
)
чrи.обы оn.ределимь ц8еrи.
череl'\.D.ШК1А-n.обедиW1елЯ
ц8ем n.epo. и ц8еW1 зо.ли8ки.
Но.с uнwiepecyewi n.ep8oe,
i
n.оэrи.ому цсn.олt>зуем
индекс о
1е Игра завершается.
Обывляем победителя/
1
!� ---�-------------·-- -
Щt- -&� Игра готова - можно провести тестовый забег. Внесите описанные
тecm -n.rqjfв выше изменения в файл race.py, код которого приведен ниже,
и запустите программу, чтобы определить победителя.
i.Jllport turtle
i.Jllport random
turtles = list ()
def setup () :
global turtles Не заоtJ1вайме, чмо
startline = - 620 величина каждого
screen turtle .Screen ( )
=
мремещения оnределяемся
screen . setup(1290, 720)
случаuнtJ/М образом,
screen . Ьgpic ( 'pavement. gif' )
У\ОЭМОМ!:/ резул11мамtJ1
turtle_ycor = [-40, -20, О , 20, 40] всегда Оудум pa3HtJ/Mи
turtle_color = [ ' Ыuе ' , ' red' , 'purple ' , 'brown ' , ' green ' ]
def race ( ) :
gloЬal turtles
winner = False
finishline = 590
setup () V-
Не заоуд11ме начамtJ гонку!
race ()
turtle.mainloop ( )
366 Глава 7
Классы, объекты, мет оды и модули
:..............................................................................................................................................:
......--- •ктСI
+
ЧТСl .QОАВОТ?
-t +
-------.
Создается по шаблону
и� �qд:ьmес:ь' т�м.�
��ъе1<m�в 11� �ч1<�.нчен�
Все верно, это бьmа лишь вершина
айсберга. Объектно-ориентированное
программирование - гигантская тема,
достойная отдельной книги, и данная глава
служит лишь введением в тему. В следующий
раз, столкнувшись с классом в модуле, вы
объект с помощью
1'\ОМОЩt>Ю/
сможете создать его
nомнцме о мом, чмо 8 Pythol'\ можно конструктора. Вы будете знать, что у объекта
есть атрибуты и методы, доступные для
млучцмt> Сl'\ра.8ку 1'\О кла.ссу С
кома.нд1>1 на.мдобце help (ТUrtle).
В случа.е кома.ндt>1 Mt.el'\O. help (turtle)
использования в коде. Причем у каждого
81>1да.емся Сl'\ра.Вка. 1'\О ука.за.нному экземпляра объекта имеется собственный
модулю. Только не за.будt>ме сна.ча.ла. набор атрибутов.
иммрмиро8а.мь модуль! Mt>1
1".Родолжим изуча.мь кла.ссt>1 и объекмt>1 Из главы вы узнали, что все типы данных
8 мследующих гла.Ва.х в Python в действительности являются
классами. В дальнейшем нам предстоит много
работать с классами и объектами. В главе 12
будет показано, как создавать собственные
классы. Встретимся там!
368 Глава 7
Классы, объекты, м етоды и модули
illlport turtl•
illlport randam
turtles • list О
daf ••tup ( ) :
Ого! К.ак.ая шусW1рая 9loЬal turtl••
зеленая череl'\ашка! startline • -620
•creen • turtl•. Screen ()
8cre8n . 88tup (l290,720)
acreen .Ьgpic( 'pav..nt .gif ' )
daf race() :
gloЬal turtl••
winner • l'al••
finishline • 590
current_turtle. forward(lllOV8)
Внимате.льно изучите код.
xcor = current turtle .xcor()
Что в нем изменwюсь? if (xcor >= finishline) :
winner = True
Что делает новый код?
winner color current turtle .color ( )
=
СR\М( SC�E DO NOT ENTER CRIМE SCENE DO NOT ENTER CRIМESCENE DO NOf fNТER
�САМОЕ rnABHOE
370 Глав а 7
Классы, объекты, м е т оды и модул t1
1 2
4 5 3
6 7
8
10
11
12
13
lf'.Qoзьмume kapaнgaw Позади уже поч т и семь глав кн и ги, поэтому вам должно быть впол не
�� Peweнue по силам следующее упражнен ие. П реобразуйте при веден ны й выше
код рисован ия квадрата в отдельную фун кци ю, которая называется
make_ square ( ) и имеет единст вен н ы й аргумент-черепа ш ку.
Постарайтесь та кже удал ить весь повторяющийся код.
() /
W\ОЛЬКО slowpoke
:= : : .:.
import turtle • t1
372 Глава 7
Классы, объекты, методы и модут.1
1 1
Мы подrотовмnм дпя вас еще нескоnько акспермментов с черепаwкамм. Внмматеnьно пучите
каждый м:s них, подумайте, что будет деnать черепаwка, а :sатем :sапустмте код, чтобы проверить
свом предпоnоженмя. Попробуйте поменять арrументы функций. Как при атом nменмтся реауnьтат
на зкране7
-�
.� ,...,
�lta'W- � --
Вом наш ргзул11w.ам.
Эксперкмеит #1 ,,
1 1
А !J вас 1'\ОЛ!JЧЦЛОС11
нарцсо8ам11 чмо-
for i in ran9e (S) :
11
*
нцбуд11 нгоб111чног,
slowpoke . forward (lOO)
мдбцрая значгнця
alowpoke . riqht (l44)
аргумгнw.08?
j
эксперимеит #8
1 о о 1
slowpoke . pencolor ( ' red' )
slowpoke . penup ()
slowpoke . setposition(l20, О)
slowpoke . pendown ()
slowpoke . circle (SO)
1 Эксперкмеит #3
def make_shape (t, sides) :
anqle = 360/aides
• vtl*\ .nc
f Ch!Yw
t.
1
(�
\: }
for i in ranqe ( O , side•) :
t . forward (lOO)
1 �1
t . riqht(anqle) \
make_ahape(slowpoke, З) /
make_ahape(alowpoke , 5)
make_shape ( slowpoke, В)
make_shape (slowpoke , 10)
L
Модульное программирование � 373
Упражнения: решения
�..Qозьмumе kapaнgaw
Запол н ите диаграмму класса Radio, указав, какие
,�� Peweнue атрибуты и методы ему могут понадобиться.
Radlo
hquency
атрибуты vol111111
powar
'
tum_onO
методы tum_otr()
tune()
set_voluml{)
1!18W8HLl8
В объектно- ориентированном программировании свой жаргон. В этом упражнении вам
нужно сопоставить приведенные ниже термины с их определениями .
Создается по шаблону
374 Глав а 7
Классы, объекты, ме тоды и модул и
1 2
г 3
4 р 5 3 к л а с с
м а в 6 з 7
е д п 8 д о к у м е н т а ц и я
т у е о м н
9 к о н с т р у к т о р п и
д е и л ц
д ч я и
н р а
10 е л
ч в и
11 з е л е н ы й з
р й а
12 о б ъ е к т ц
п и
13 а т р и б у т я
ш
к
а
-t-
U иou сm uдь
n ро2раммu р0Ваи uя
Нам придется поменять способ мышления, так как
мы слишком зациклились на итеративном стиле
программирования. Нужно освоить совершенно иной подход
к решению задач.
Но сначала давайте возьмем простую задачу и попробуем
решить ее так, как это делалось в предьщущих главах.
Предположим, имеется список чисел, которые нужно
просуммировать. Числа моrуг означать что угодно, например
количество шариков в карманах у вас и ваших друзей.
В Python для вычисления суммы значений, хранящихся
в списке, применяется функция sum ( ) .
� /
»>
378 Глав а В
Рекурсия и словарll
•
Это простейший из всех возможных сценариев. Что может
быть проще, чем подсчет элементов пустого спис ка? Ч ему будет
равна сумма в этом случае? Конечно же нулю!
TT!jCW\OU Cl'\IACOK
{ ЭW\о 1'\росW1ейw.цй случай: еслц
compute_sum ( [ ] ) � цмееl'V\СЯ l'\YCl'VIOй Cl'\UCOK, l'VIO мы
заранее знаем, чмо сумма равна о
•
решаем упрощенную версию той же самой задачи. Вот как это
раб отает: мы б ерем первый элемент списка и приб авляем к нему
сумму остальных элементов .
з;j
8ЫЧUСЛIАW\11 сумму Cl'\IACKa, 6 KOWIOpOM
[ 10 , 13 , 39 , 14 , 4 1 , 9 , на один элемен1М меньше
L
10 + compute_sum ( [ 1 3 , 3 9 ' 1 4 ' 4 1 , 9 , 3 ] )
� '\
Мы немного yl'\pocwiuлц задачу: чмоды 6ычислимь сумму
Cl'\IACкa, мы сложим j.0 с суммой меньшего Cl'\ucкa
•
В простейшем случае задача проста: проверяем, является ли список
пустым; если да, возвращаем значение О .
def recursive_compute_sum ( li s t ) :
if len ( li s t ) == О: Здесь МЬI ""Роверяем, являеl\<\СЯ лц Cl'\IACOK
return О ""Y Cl\<\ЬIM (другuмu словамu, равна лu его
длuна нулю); еслu да, возвращаем о
•
шаг за шагом. Мы знаем, что нужно извлечь первый элемент списка
и сложить его с суммой всех последующих элементов. Для наглядности
создадим две переменные: в одной будет храниться первый элемент,
в другой - оставшаяся часть списка (без первого элемента) .
def recursive_compute_sum ( i s t )/ �
if len ( li s t ) == О :
npoc l\<\eiiшuii случай
�
return О . ,,,,-- за ...цшем в одну ...еременн ую ...ер вый
l.k:.
else : элемен l\<\ C l'\IACKa, а в другу ю
first = list [ O ] ...ер еменну ю - осмал ьноii Cf'\IACOK
rest = list [ l : ]
Э мо 6Ь1раженuе 6оз6ращаем �
А чмо еслu с ...uсок
Cl'\ucoк, начцнающuiiся с элеменма содержuм лuшь одцн
с uндексо м :i u з аканчи6аю щц йся элеменм? буде/\<\
1'\осл еднuм элем енмо м
млучен ...ycмoii с ...uсок
if len ( li s t ) == О :
def recursive_compute_sum ( li s t ) :
return О
else : Необходuмо ...росуммuро6амь
first = l i s t [ O ] осмамок с ... цска, но разве эмо
res t = l i s t [ l : ] к-- не мо же самое, чмо мы сейчас
sum = first + сумма осмальной часм&с crucc/C4 кодuруем? Суммuро6амь Cl'\IACOK
""Pu суммцро6анuц Сl'\цска?
СуммцруеW�ся ...e p6ыii j? Ну ц задачка!
элеменWI u сумма
Но как эмо закодцро6амь?
осмальноii часмц Сl'\цска
380 Гл ав а В
Рекурсия и сл о вари
if len (list) == О :
def recursive_compute_sum ( list) :
return О
else :
first = list [ O ]
rest = list [ l : ]
swn = first + recurs ive_compute_swn ( rest )
return swn
�l: з�--- Сохраните код функции recurs i ve compute sum ( ) вместе с кодом тестирования
в файле sum.py и запустите програм му, выпоЛ нив команду Run > Run Module.
Tecm -.n.r�:в
Убедитесь в том , что программа правильно вычисляет сумму списка.
Настоящая магия!
marЫes = [ 10 , 13 , 3 9 , 1 4 , 4 1 , 9 , 3 )
�
else :
peзyлt>W10.w. , ч w. о
firs t = list [ O ]
и 6 ци кле
res t = l i s t [ l : ]
sum = first + recursive_compute_sum ( rest)
return sum
А разве мы
только что не нарушили правило .
запрещающее вызывать срункцию
до ее объявления? Ведь срункция
recursi ve_compute_sum ( ) вызывается
из своего собственного определения!
382 Глава В
Рекvосия и СЛОАЭОIJ
€t�ьмume kapaнgaw
""·�� Отвлекитесь от рекурсии и представьте, что вам нужно написать функцию,
которая п роверяет, является ли слово палиндромом . Для этого можно
использовать любые инструменты Python , изученные в главах 1 -7 . Чтобы
описать ход ваших мыслей , составьте псевдокод решения.
•
Простейший случай самый очевидный. В действительности их
nу смая смрока
{ ЗW10 У\росW1ейшиu случай:
i s_p al indrome ( ' ' ) � если У\олучена У\у смая смрока,
мо у нас У\адиндром
•
нам нужно каким-то образом упростить задачу перед рекурсивным
вызовом функции i s _pal indrome ( ) . Что , если сначала сравнить
два крайних символа строки , и, если они равны , вызвать функцию
для оставшейся (более короткой) средней части строки?
Проверяем, совУ\адаЮW\
ли крайние символы
�
' tacocat '
�
' асоса '
А далее вызы6аем
r
фу нкцию is _pal indrome ( J ,
ЧWlобы Y\po6epиtv11:>, являемся ли средняя чае м /:>
смроки млиндромом
384 Глава В
Рекурсия и сло вари
•
Тут все просто: проверяем , получена ли пустая строка или строка,
содержащая одиночный символ.
• задачу, срав нив два крайних символа строки. Если они равны , то для
получения палиндрома все оставшиеся символы должны быть попарно
равны. Если любая из пар не совпадает, возвращаем Fa l s e .
elae :
) � Рекурсц 6ный 81>1зо6 бу дем
return Falae бымлн ен на сл едую щем
[
проверила равенство двух внешних символо в , а значит, мы имеем
палиндром, если оставшаяся -частъ страхи является п алиндромом.
�t:Z'V��
�,,.
�
Tectn -Д.� �B
Сохра ните код фун к ц и и i s palindrome ( ) в м е сте с показан н ы м н иже код о м
тестир о в ан и я в ф а й л е palindrome.py и в ы полн ите команду Run > Run Module. П р о ве р ьте
п р а в и л ьность р а б оты функци и , п ро следив за в ы вод и м ы м и в о к н е консол и р езультата м и .
Попробуйте также задать собствен н ы е слова-кандидат ы .
words = [ ' tacocat ' , ' radar ' , ' yak ' , ' rader ' , ' kayj ak ' ]
for word in words :
print (word , i s_yalindrome (word) )
\:!адаваmь Бо11rось1
]j: Как узнать, завершится ли коrда-нибудь рекурсивная ]j: Я понимаю, как вызвать функцию из самой себя (так же,
функция? как и любую друrую функцию), но как при этом не запутаться
О:
в ее арrументах? При каждом следующем рекурсивном
Другими словами, если функция все время вызывает вызове функция получает новый набор арrументов?
О:
саму себя , то как она остановится? Для этого и нужно
условие простейшего случая . Есл и оно вы полняется , значит, Хорош ий вопрос. Вы правы : при каждом вызове функция
задачу можно решить напря мую, не прибегая к рекурсивному заново получает аргументы , а поскольку мы рекурсивно
вызову. Это конечная точка , по достижении которой вызываем ту же самую функцию, ее параметры все
рекурсия прекращается . время переназначаются согласно новым аргументам. Но
]j:
не нужно думать, что при таком переназначен и и работа
Хорошо, но как узнать, будет ли коrда-нибудь достиrнут функции будет нарушена. Этого не произойдет. А все
простейший случай? потому, что Pythoп, как и большинство современных
О:
языков программирования, отслеживает все вызовы
Помните: при каждом следующем рекурсивном вызове функции , запоминая соответствующие значения параметров
наша задача немного упрощается . Если п рограмма (локальных переменных) . Сейчас мы рассмотрим этот
к простейшему случаю.
386 Гла в а В
Рекурсия и сло вари
first z word [ O ] О
else :
last = word [ - 1 )
Ка к и нтер п ретатор Python у п ра вляет рекурсией ,
middle = word [ l : - 1 )
las t : О
отслежи вая вложенные вызо вы одной и той же
return i s_palindrome (middle) О
i f first =
[ Рассмомрцм, как эмо рабомаеrv1 � 13оl'Л наш код. Чмобь� сделамь его
мнямнее, мь� добабцлц 6 него несколько
локал1>н1>1х мременнь�х. Онц 1'\ОМогум нам
""роследцмь за мем, Чl'ЛО ""роцсходцм ""Рц
i s_palindrome ( ' radar ' )
бь�""олненцц кода
О Стол кнувшись с вызовом фун кци и , Python (ка к
и любой другой язык п рограммирования ) первым Кад р 1
делом создает структуру да н н ых для хра нен ия word = ' radar '
ее п араметро в и локал ьных п еремен н ых. Это ____::::51
называется кадром. В на шем случае в кадр
заносится значение па раметра word.
О Далее п роверяем дл и ну строки word. В да н ном
случае она больше 1 . Кадр 1
� Согласно кадру
вызываем фун кци ю is _pa l i ndrome ( ) .
::!.
return is_palindrome (middle) ""еременная middle
содержцм смроку ' ada '
\
word = ' radar '
return is_J)alindrome (middle)
first = 'r'
last = 'r'
Соzласно кадру 2.
1'\еременная middle middle = ' ada'
содержим смроку ' d '
О
Ко,1\рJ
word. • 'd'
М ы перешли к очередному вызову функции, V""
поэтому создается новый кадр со значениями ее К.огда функция
параметров и локальных переменных. На этот раз за6ерщаемся,
Ко,1\р1
параметр word содержит строку ' d ' . word • ' ada '
ее кадр
О
• .•. 6ымалки6аемся
Длина параметра word наконец-то не превышает 1 ,
fi.rat
laat • . • .
из смека
поэтому функция сразу же возвращает True. Когда a.1.ddl• - 'd'
КААР 1
функция завершается, ее кадр удаляется, или
word • 'radar'
выталкивается, из стека. f1rat • •r•
' '
laat • :r
aJ.d41.• - 'ad&'
V""
wor:d • '&eLa'
функции is _palindrome ( ) , который равен True. firat • 1а1
V- Возвращаем True
is_yalindrome ( ) 1'\УСМ
388 Глава 8
Рекурсия и сло вари
� Уже
if len ( l ist) == о:
def recursive COlllpute вwn ( list) :
знакомь�й
return О вам код
elaa :
firat • liat [ O ]
rest = lia t [ l : ]
awn � firвt + recuraive_c0111pute_вwn ( reat)
return 8WD
Вь�зов р екур сивной
recurвive_c01u
11p te_вwn ( [ l , 2 , 3 ) ) � функции
first = 1
res t = [2, 3) вь�числень� локал"нь�е
"ер еменн ь�е first и re s t
Вь�"олниw.е осw.ал"нь�е
recuraive_c0111pute_8WD ( [ 2 , 3 ] ) Кадр 2
61:11ч исления u заl'\олнuw.е
list =
first =
кадр ЬI сw.ека
res t =
Кадр 1
list = [1, 2, 3)
first = 1
res t = [2, 3]
recuraive_c0111pute_вwn ( [ Э ] )
Кадр 3
list =
first =
res t =
Кадр 2
list =
first =
rest =
Кадр 1
list = [1, 2, 3]
first = 1
rest = [2, 3)
Кадр4
list "'
Кадр 3
list =
first •
reat •
Кадр2
list =
first =
rest "
Кадр 1
list = [\ 2, 3)
first = 1
rest " [2, 3)
:first •
rest =
sum Е
Кадр2
list =
first =
rest :
Кадр1
list = [\ 1, 3)
:first = 1
rest = [2, 3)
rest =
SUID =
Кадр 1
list = [\ 2, 3]
first • 1
rest = [2, 3]
390 Глава 8
Рекурсия и сл о вари
Посиделки
Тема дискуссии : ЦJDCJt ИJD1
рекурсия - что .nучше?
Цих.п Ре курсия
Ну конечно я, разве непонятно? Программисты
во мно го раз чаще используют циклы, чем
рекурсию.
Цикл Р екурсия
Но ведь так работают вс е я Зыки
программирования , даже старые , не только
Python. Описанный проц есс происходит при
любом вызове функции.
392 Глава 8
Рекурсия и словари
r "
·- - -
Jl1'.1Jf)l•1'.'l1f)JlllJI
1 1
I•J�J{Yl•f�ll ll
Сейчас мы протестируем код рекурсивной
функции, вычисляющей числа Фибоначчи. Эти
числа образуют последовательность, в которой
каждое число равно сумме двух предыдущих
чисел.
1 1
Вычисляется она следующим образом.
fiЬoNcd(O) =О
fiЬonacd(1) = 1
� Если. 8111з8амо функцию с арzуменмом о,
мо она дернем о, а если. с арzуменмом :1.,
мо она вернем :1.
t Числа Фи.боначчи. и.меюм
омношени.е к золомому сечению,
коморое чаемо 8смречаемся
fiЬonacd(n) =fiЬonacd(n-1) + fiЬonacd(n-2)
1 1
6 1'\рu.роде и. счи.маемся
1 1
fibonacci(O) =
�
fibonacci(1) = 1
fibonacci(2) = 1
fibonacci(З) = 2
fibonacci(4) = з Любое число мследо8амелоносми.
fibonacci(S) = 5 8ычи.сляемся l'\!JMeM сложения iJ6yx
fibonaccl(б) = 8 1'\ред111дущи.х чисел Фи.боначчи.
Она продолжается числами 13, 21, 34, 55, 89, 144, 233,
1 1
377, 610, 987, 1597, 2584, 4181 и т.д.
В лаборатории был разработан алгоритм вычисления Исмльзуем ...ри.6еденное.
чисел Фибоначчи. Вот его код.
Г
� 6t11ше Оl'\ределени.е
1 Обрами.мв 6ни.мани.е:
функция fibonacci ( )
рекурси.6но 8t11зt118аемся
д6аждtl/!
1
�
L -
1
time, позволяющий фиксировать время выполнения программы.
� Mti1 цсnользуем модуль time
i.lllport tiJDe дЛJ1 хрономемрцро8анця кода
1 1
elif n - 1 :
return 1
•l••:
return fibonacci (n-1) + fibonacci(n-2)
В качесм8е месма 8ычцслцм чцсла фцбоначчц
"':J.,
тимо8ый код
___.-- с номерамц ом 20 до so с шаzом s. Еслц 8се
for i in ran9e (20, 55, 5) :�
1 1
nройдем усnешно, мы 8t�1чцслцм :i.oo чцсел
atart • tiJD8. tiJDe () � Время начала
�
reault • fiЬonacci (1) � Вt�1чцсляем чцсло фцбоначчц""\ Mti1 буЭем замерямь длцмельносмь
end • tiJD8. tiJD8 ( ) � Время конца 8t�1чцсленця каждоzо чцсла фцбоначчц.
duration • end - start � Оnределяем длцмельносмь Для эмоzо нам nонадобцмся модуль
print (i, reault, duration) н-. подробнее о модуЛJ1х дЛJI рабомы
м
r.- ,;- l3t�18одц резуль
мамЬI
V\......--' со значtнцямц 3амЬI ц 8ременц 6уЭем
1
рассказано 8 nрцложенцц А
Ваша задача - ввести код и выполнить тест. Полученные
/ Еслц 8ычцсленця дЛJ1мся слцшком долzо,
� мо nроzрамму можно османо8цмь,
данные занесите в приведенную ниже таблицу, указав
номер п, число Фибоначчи и длительность его вычисления
в секундах. Чтобы программу можно было использовать закрь�8 окно оболочкц Python
в производственных целях, она должна вычислить первые
100 чисел Фибоначчи менее чем за S секунд. Соответствует ли 13ом чмо МЬI nолучцлц
для nep8ozo месма, zде
V::-
программа этому критерию по результатам теста?
1 1
n=W. Резульмаtv1Ь1 будум
за8цсеtv1ь Ot\'\ скоросtv1ц
Тестировавие чнсеп ��ЧЧН .. .
__ _
1 1
пока чмо
8се nроходцм
Эосмамочно
- - • +
бысмро
�an1t!twe реауn�татw на сnедую1Ц8i_ .
странице; Ср188Н111'8 11Х со С80МММ
L -
394 Глава В
Рекурсия и словари
- - -
r ,
..
1 1
программа должна успеть вычислить 100 чисел Фибоначчи за 5
секунд. И как прошел тест? Что? Успели пообедать, а программа все
еще работает? Не переживайте, мы все заранее посчитали. Результаты
приведены ниже, и они, мягко говоря, не впечатляют.
� К.од paool'\l\aeм
r.радцльно 8 1'\1\ОМ
1 1
Иомер r.олучаем r.ра8цльн1>1е
20 6765 0,002 ".," резулt>1'\1\ам1>1
25 7S02S 0,04 мkyl...
30 832040 о,4 мkyls111
35 9227465 4,8 "....
40 102334155 S6,7 мkyls111
45 1134903170 10,5 мtу11111
so 12S86t6902S 1,8s-�•
1 1
/Защц r.оказамелц
моzум Ot>ll'\l\t> друzцмц,
8 за8цсцмос1'\1\ц ol'\I\
скоросмц комr.ьюl'\l\ера
L
.и.:�. M«H!:Jl'\I\ на 61�1чцсленце чцсла фцбоначчц!
Анmuсоцuадыая сеm ь
Вы уже знаете достаточно много , чтобы заняться действительно серьезными
вещами. Вам вполне по силам приступить к своему первому коммерческому
проекту. Как вам идея для стартапа:новая социалъная сетъ? Что? Всем
хватаетFacebook и его конкурентов? Не волнуйтесь, у нас кое-что другое:
антисоци алъная сетъ! Здесь вы сможете делать публикации типа "оставь улыбку
всяк сюда входящий" или "счастливым вход запрещен". У антисоциальной сети
есть также уникальная особенность: возможность в любой момент определить
самого антисоциального пользователя. В общем , идея на миллион долларов ,
осталось только написать код.
ЗнаеW1е еще
D
ЧW\0 - 1'11\ О ?
396 Глав а В
Рекурсия и словари
3наkомсm8о со сдоВарем
Встречайте новый тип данных Python: словаръ. Его еще называют ассоциативным
массивом. Это очень удобная и ги бкая структура данных, которую мы будем
применять для решения самых разных задач , включая создание нашей
антисоциальной сети ( в частности, она поможет нам хранить данные
о пользователях) . Но сначала познакомимся с концепцией словаря и принципами
его работы.
Первое, что отличает словари от других структур данных, таких как списки, - это
их неупорядО'Ченностъ. В списках все значения упорядочены согласно индексам.
Например , для получения третьего значения нужно обратиться к элементу
с индексом 3. В словарях доступ к значениям осуществляется не по индексам, а по
связанным с ними ключам. Каждому значению словаря соответствует свой ключ.
Созgанuе сАоВаря
Исnользуйме ф игурные скобки. для
my_dictionary = { } � с оздани.Я l'\!jC WIOгO СЛО6аря, 6 KOWIOpO M
можно хранимt> ключи. и. значения nомни.ме: ф игурные скобки.
у сло6арей, к6адрамные -
!:J Сl'\иСко6
398 Гла в а В
Рекурсия и сл овари
print ( ' Hyжнo достать ее телефон ' ) if ' Дейаид ' in aay_dictionary :
Пе �ofunecь
9адаваII1Ь Bonrocьi
]j: Что будет, если попытаться О: Да. Каждый ключ словаря уникален. О: Помните, в начале главы было
удалить несуществующий ключ? Например, в словаре my_dictionary сказано о том , что нам п ридется
О: может быть только один кл ю ч ' Ким ' . поменять способ мышления? Так вот,
Будет сгенерировано исключение Если записать в него другое значение, как ни странно, словари оказываются
KeyError. Об обработке исключений эффективнее списков во многих
то оно замен ит предыдущее.
]j:
мы поговорим позже, но лучше задачах. Вскоре вы узнаете, почему.
]j:
отсутствие индексации делает их менее встроенный оператор del, то как
Я правильно понимаю,
насчет оператора len?
О:
эффективными. Насколько быстро
что в словаре не может быть обрабатываются данные в больших
Он тоже поддерживается .
повторяющихся ключей? словарях?
Оператор len вернет общее
количество ключей в словаре.
П росмоmр сдоВаря
Помните о том, что словарь хранит неупорядоченные данные.
Это означает, что, просматривая его элементы, нельзя
надеяться на то, что они следуют в определенном порядке.
К.ак и 6 случае Сl'\искоб и с мр о к ,
1 �
в ы ведем ключ ... . . . о. замем - ezo значение
Не nолаrайтес ь
на nорндок
С одержимое словаря можно вывести на экран. следовании
элементов
словари
print (my_dictionary)
Да же если кл ючи слов я
ар
постоя нно сл едуют в
одном
Оболочка Python и том же порядке, вы н
е дол жны
рассчитывать на то, что он
{ ' Джеини ' : ' 8 67 - 5309 ' , ' Пол ' : ' 44 3 - будет
сохраняться при выполнении
0000 ' , ' Джейми ' : ' 7 7 1 - 0 0 9 1 ' , ' Возраст ' : про граммы в дру их сист
г ема х или
27 , 42 : ' ответ ' , ' Баллы ' : [ 92 , реализация х Pythoп . Пола гая ь
с
87 ' 9 9 ] } на порядок хранения н
з ачений
в словаре, вы ра но или позд
»>
но
столкнетесь с проблемами.
- - - - - - - - -
· - - - - - - - - - - -
- - - - - - - - - - - - ·
- -
400 Гла в а 8
Рекурсия и словари
�umebp1нg1w
Получив базовые знания о словарях,
давайте применим их на практике.
П роанализируйте приведенный
ниже код и постарайтесь
предугадать результаты его работы,
' Cl'\IACOK
шovies • [ ] __,.,-- Сло6t1.р1:1
,
шovie = { } "С
шoviea. append { { ' Hasaaниe ' : 'Viking W01118n and the Sea Serpent ' ,
'Год ' : 1957,
'Ре� ' : ' ** ' } )
users [ ' Анна ' ] = ' anna@gmail . com • /:: Аоба6ляем К.ак 8идим е , Все l'\pocw.o:
del users [ ' Д.он ' ] +-.._ Удаляем � не нужно беСl'\ОКОи W.l:>СЯ о
синхрон изации д6ух С1'1.иско8
Как узнать адрес одного из пользователей?
Предположим, нам нужно получить адрес Джоша.
402 Глав а В
Рекурсия и сл о вари
0О
списки с s�вной индексацией?
�
индексу соответствует сразу несколько значений
(словарь з н ает, как поступать в подоб н ых случаях) , н о
такое случается нечасто. В итоге среднее время поиска
значений в словаре по ключу является хонстантн·ым
(т.е. н е зависящим от размера словаря) . Таким образом,
поиск по ключу оказывается намного эффективнее
поиска по и ндексу.
Эмо комr1.ьюl\'\ернt11 й
мермuн
404 Глав а В
Рекурсия и словари
�ume kapaн91w
Словарь в словаре - это популярное
решение. Рассмотрим, насколько оно
эффективно в нашем кинематографическом
примере. П остарайтесь предугадать
результаты работы приведенного ниже кода.
movies = {}
movie • {}
1110vies [ 'Viking Woman and t:he Sea Serpent ' ] = { 'Rаааание ' : 'Vikin9 W01118n and the Sea Serpent' ,
'Год ' : 1957,
' Р8Й'l'Иlа' ' : ' ** ' }
1110vie• [ ' Vertiqo ' ] • { 'ваааание ' : 'Verti90 ' ,
'Год ' : 1958,
·�· : '***** ' }
Зt11'\1.н.ии ме з дес v
� с бо ю ф у нкци ю
average_age ( )
�
инвесторов к проекту. В антисоциальной сети можно в любой
момент определить самого антисоциального пользователя,
К.мо из них? • •
у которого меньше всего друзей. Осталось написать
соответствующий код.
Итак, у нас есть словарь с данными о пользователях, каждый
элемент которого состоит из ключа, представленного именем
пользователя, и значения - вложенного словаря, хранящего
все атрибуты пользователя. Одним из атрибутов является
список друзей пользователя. Нам нужно просмотреть
атрибуты всех пользователей и определить, у кого из них
меньше всего друзей. Приступим!
406 Гла ва 8
Рекурсия и сл овари
А
9ПРАЖНЕНИЕ
Onpege"8нue само20 анmuсоцuаАьно20 nоАьзоВаmеАя
�
Код поиска пол ьзователя с наим еньшим числ ом друзеи будет не таким уж сл ожным, н о
вс е равн о давайте снач ал а состав им пс евдокод, чтобы получить обще е представл е ни е
об ал горитм е реше ния задачи .
А �
�
получ ить с пи сок друзей
И смл11зуем кл юч ' friends ' для млучен 1.1 я Cl'\IACKa друзей.
из словаря атри бутов;
ф
равно й. 1.1 мен1.1 мльзовамеля
задать переменную max
равной чи слу друзей . � Задаем мременную max равной.
новому ч1.1слу друзей.
Вывес ти и мя п ол ь зо вателя
с ключом mo s t_ant i_s o c i a l . � nро й. дя 1'\О всем 1.1 менам в словаре users, наход1.1 м с амого
QHW\IACOЦIAMbHO ZO 1'\ОЛl:>ЗОвамеля /А вывод1.1м его IАМЯ
max = 1000
for n ame i n
user =
---
&01+ .· :.:)0J Что-то мы давно ничего не тестировали! Введите приведенный ниже код,
Twm -n.y�в сохраните его в файле antisocial.py и проверьте результат работы программы.
users = {}
users [ ' КИИ ' ] = { ' Э.n . попа ' : ' kim@oreilly . com ' , ' Поп ' : '
•
' , ' Возраст ' : 2 7 , ' Друзъя ' : [ ' Д.ои ' , ' Д.ош ' ] }
users [ ' Д.оя ' ] = { ' э.n . почта ' ' j ohn@aЬc . com ' , ' Поп ' : 1 11 1 , ' Возраст ' : 24 , ' Друзъя ' : [ ' Хим ' , ' Д.ош ' ] }
users [ ' Д.ош ' ] = { ' Э.n . почта ' ' j osh@wickedlysmart . com ' , ' Поп ' :
'м' , ' Возраст ' : 32 , ' Друзъя ' : [ КИИ ] }
' '
max = 1000
Эмо Джош1
'-..___Л
СдоВо за Вамu 1
Это все, о чем мы собирались рассказать вам в рамках проекта
антисоциальной сети. Дальнейшую работу вам предстоит выполнить
самостоятельно. Идею вы поняли; берите имеющийся код - и вперед
к богатству и славе! Пришлете нам открытку, когда разбогатеете
(хотя мы не обидимся, если вы этого не сделаете, ведь у основателя
антисоциальной сети наверняка будет не слишком много друзей ) .
Впрочем, тема словарей еще н е закончена, так как нам предстоит
завершить другой важный проект.
408 Гла в а 8
Рекурсия и слов ари
- -
А mем Временем ...
•JI1lllC)P1l'l,C)PllJI Pl�J{)rpc�II 11
В прошл ы й раз, когда мы поки нул и лаборатори ю рекурсии, ее
сотрудники пребывали в расстроенных чувствах. Поп ытавш ись
оп редел ить первые 1 00 ч исел Фибоначчи за 5 секунд, м ы потерпели
фиаско. На вычисление всего л и ш ь 50 ч исел ушло бол ьше часа. Неужел и
все та к безнадежно? Вовсе нет!
\
Н о длs1 млучения числа
fibonacci ( 4 9 ) може нужно
t
в1�1числим11 f iЬonacci ( 4 8 )
� (46)
filxnloci (49)
�.@�зьмumе ka paнgaw
� Нарисуйте граф вызовов при получен и и числа fibonacci ( 7 ) . В конце подсч ита йте,
скол ько повторных вызовов приходится на каждое из значений от О до 7.
fiЬonacci ( 7 )
� �
fiЬonacci ( б) fiЬonacci ( S )
/ \ / �
r оW\6ем
__ __
<�U:�лu -------..,
41 0 Глав а 8
Рекурсин и словари
о
нн ж но n. о л у чам� б1:11 c W1p 1:11 u дocW1yr.
Создать словарь и назвать его c a che.
41 2 Глава 8
Рекурсия и сло вари
М емоuзацuя
Если вы думаете, будто мы только что изобрели гениальный способ ,
позволяющий сохранять результаты работы функции, то ошибаетесь. Это
широко известная и достаточно эффективная методика, которая называется
мемоизация. Ее применяют для оптимизации программ, содержащих
затратные вызовы функций. Насколько затратные? У вас все равно нет
столько денег. Шугка!
iшport ti.me �
�
оО1мt> чмо угодно, даже целое число
�
for i in ranqe ( O , 1 0 1 ) - -· · · · - ..
resul t = fiЬonacci ( i )
о ...р еоелцмолцмел"носм" в,,,ч и сления
всего Ct\UCKa 1.(3 ;J..00 чисел Фибоно.ччи
print ( i , resul t)
�
fini sh = time . ti.me ( ) г
duration • finish - start
print ( ' ВIAИcnиnи все 100 чисе.n за ' , duration , ' секуИДltl ' )
r - .. - - � ,
)1(�lll�lllllltlH ()Jlltl,I, (� I•J�J{)1(•(�Jll�ll
Все еще не верите, что несколько строк кода позволяют сократить
1 1
длительность вычислений до 5 секунд? Внесите изменения в код
и проверьте сами!
1 1
1 о
о
1
1 1
�
1 01'\мuмизация кода
можеWI оказамt>
КОЛОССАЛЬНОЕ
8лuяние на CKOpOCW\t>
1
�
81:>1числений
L - - - .1
414 Глава 8
Рекурсия и сло вар и
import turtle
И снова череl'\аШКи
def setup (pencil ) :
pencil . color ( ' Ыuе ' ) Задача функции setup ( ) - задами цвем
pencil . penup ( ) черемшки
� (здеси она наз f:Jlваемся penci l)
pencil . goto ( - 2 0 0 , 100) и 1'\ереме см1.1ми е е в мз1.1ци ю, в комор ой
pencil . pendown ( ) рисова ние будем 5олее ценмриро6аннtJ1м
� Эмо
def koch (pencil , size , order) :
if order == О:
рекурс1.1вная функция,
pencil . forward ( size)
к комороЦ вернемся 1'\ОЗЖе
Mf:JI
else :
for angle in [ 60 , - 1 2 0 , 60 , О] :
koch (pencil , size/ 3 , order- 1 )
pencil . left ( angl e )
if naJDe =• -
main -
' . MtJ1 6ыз111 ваем функцию main О и "роверяем,
main ( ) чмоо111 01�1ла Заl'\ущена функция mainloop ( )
turtle . tracer ( l O O ) модуля turtle. К.роме WIOZO, Mlil IACl'\OЛu3yeм
turtle . mainloop ( ) не рассмамриваВшуюся ранее функцию
tracer ( ) , коморая у8еличи8аем скоросми
черемшкц
j
создает черепашку, окрашивает ее в заданный цвет и изменяет WIOЛ l:>KO фун кци я koc h ( ) .
программа. целиком была
ее положение. Остальные действия сводятся к вызову функции
koch ( ) . Но что она делает? Давайте разбираться ... Уtриведена на Уtред1:>1дущ ей
г
с w.ран ице
Функци я koch ( ) Уtолу чаем
apzyMe HWIЬI penc i l , s i z e и order
def koch (pencil , size , orde � просмейший с луча й : если аргуменм orde r
А
равен о, рисуем Уtрямую длиной s i z e
if order = О :
8
else :
м реда во. я ей аргуменм s i z e,
for anqle in [ 60 , - 12 0 , 60 , О ] : деленны й на 3, и умен1:>ш о.я
арzуме нм order на единицу
;v
koch (pencil , s i ze / З , order- 1 )
pencil . left ( anqle ) после ко.ждого в1:>1зова функцц ц koch ( )
1
меняем угол двцженц я череУtащк ц
r:w щ8еi)скuм
Нuл11с фАбuан )(е
v
л11ге фон ,...ох о ... л
cм
мо 111 ы Ввмр 8t11е 0ruc
v
H!J
мамемамuко м , ко р ю " снежинкой
.i.. АЛ11Н!J Ю кр ы8!JЮ, НАЗ AH
.,, р АКМ жно �uзнам11 no aд
pet!J Лучшv.й смсоо мням11 эмо - увидем1:>
\(.ОХА" де мАЛIА мо
i
\(.оха
u8aя_ нескол1:>ко Ytpv.мepo8
a.or9/wiki/ !(.p
https: / ru.wikipedi
Итак, мы получили общее представление о том, как работает
функция, но непонятно, что именно она делает. Мы лишь знаем,
что работа функции сильно зависит от параметра order. Для
начала присвоим ему значение О и посмотрим, что нарисует
функция. Поскольку значение О соответствует простейшему
q $:: �.-
случаю, должна быть нарисована прямая.
ГГ. "
:
Введите код и запустите программу. Вот что мы получаем.
1 ecm -n.r &ftв
r.длиной
Уtросме йшем случо.е рv.суем ся омрезок
Уtикселей (У\ОСКОЛl:>КУ
Уtрv.свое но значени е 4 0 0)
400
Уtеремен ной size
41 6 Глава В
Рекурсия и сло вари
��ьмumе kapaнgaw
� Есл и вы понял и, что н а р и сует фун к ц ия koch ( ) , когда а р гумент order ра
вен О и 1, то
поп робуйте п редугадать, ка ким будет резул ьтат, когда а р гумент orde
r ра вен 2 и З .
Помн ите: п р и ка ждом зн а чен и и мас штаба ф ра ктал вы глядит оди н а ково.
Это неп ростое
уп ра ж н ен ие, которое ка к н ел ьзя луч ше разви вает в ы ч и сл ител ьное мы шлен
и е.
Order = О:
а..,
,во.
подсказка.: взгл.яниме
но. мо, чмо 1'\роизощло
Order = 2: но. 1'\редыдущем уровне.
Ч мо, если 1'\овморимь
весь 1'\роцесс для каждого
омрезко. 1'\редыдущего
уровня?
Ф pakmaA Коха
Ъii i*1ФE�jjfja
Надеемся, последнее упражнение помогло вам понять, что такое
рекурсия и фракталы. Давайте для закрепления материала
выполним программу, присвоив переменной o rde r значения 4 и 5.
Tecm-n.r�в
� Order = 4
К- Order = 5
uнке 1'-оха
nо ор обнее о сне�
но 6 8 1.1К1.11'\е о� 1.1:
kiped1 a . org /
https : / / ru wi
р ассказа
а
·
\§ijt;.-.).;ea
Это ваше последнее задание: измените функцию main ( ) так, чтобы
функция koch ( ) вызывалась в ней трижды, каждый раз с поворотом
на 1 20 градусов .
Tecm -n.r �в
def main ( ) : Неl'\ло хо оля �
оu
pencil = turtle . Turtle ( ) р е кур сu6н
setup (pencil ) ф у нкцu OK!
u 1.13
щ eC W\IA CW\f'
turtle . tracer ( l O O )
order = 5
size = 4 0 0
kcch (pencil , size , czdez )
41 8 Глава В
Рекурсия и словарt1
�САМОЕ rllAIHOE
2 3
4
5
6
7 8
9
10
11
12
13
14
П о горизонтали П о вертикал и
4. Характеристика словаря как массива 1 . Последовательность чисел , названная
420 Глав а 8
Рекурсия и сло вари
("'.Jозьмumе kapaнgaw
--� Peweнue Отвпекитесь от рекурсии и представьте, что вам нужно написать функцию,
которая проверяет, явпяется ли слово палиндромом. Для этого можно
использовать любые инструменты Pythoп, изученные в главах 1 - 7 .
Ч тобы описать ход ваших мыслей, составьте псевдокод решения .
а макже индекс j ,
на чина ющийс
...
Можно создам " индекс i,
начинаю щийся с r.озици и О... я с конца
� taco cat �
�
Начинаем с обоих концов сло8о.
и сра8ни8аем бук8ь� r.or.apнo,
is"afindroмe(слово}: r.род8игаяс" снаружи 8нумр"
задамь i = о
3а()амЬ j : дЛUНа Слова (MuHyC j.) � Если i >= j, ЗНО.ЧUМ, МЬI досмигли
.,,ока ; < j: серединь� смроки и все сравнили
�
i:f len ( l ist) == о:
de:f recuraive COD1pute SШll (liat) :
Уже энаком111 й
return О бам код
elae :
:firat = liat [ O ]
r••t '"' lia t [ l : ]
aum • :fir•t + recuraive_cOD1pute_aШD ( reat)
return sum
В111э об рекырсuбной
recursive_coшpute_sшn ( [ l , 2 , З ] ) tP!JHKЦIAIA
recuraive_cOD1pute_aшn ( [ 2 , З ] ) Кадр 2
\
list [2 ' З]
=
� Tel'\tpo рекурсuбно б111э 111баем фынкцuю
firзt = 2 recurзive_compute_зum ( ) , чмoб1i1
rest [З] добабuмо б смек но6ый кадр ц ноб111 й
'"" ' ° � Н • ''"'"' раз '""'°к р•В.н ! 2 , З ]
=
Кадр 1
list = [1 , 2 , З]
first = 1
res t = [2 , З] Как ц 1'\режое, необходи.мо 8О1чцслцмь
1'\tременнО1е firзt ц rest
\
1::- 01'\ЯМо рекурсuб но 6О1зО18аем фынкццю
recuraive_coiapute_•um ( [ З ) )
Кадр З
list = [3] recurз ive compute зum ( ) , чмоб111
first З доба6uм о i смек мремцй кадр ц но8111 й
Cl'\IACOK. На эмом раз Cl'\IACOK ра8ен [ З ]
=
rest = []
Кадр 2
list = [2 , З]
К.ак ц nрежде, необходи.мо 8111ч uслцмь
first = 2
rest = [З] nеременн111е firзt ц rest
Кадр 1
list = [1 , 2 , З]
first = 1
rest = [2 , З]
422 Глава В
Рекурсия и словари
recuraive_c0111pUte_aua ( [ ] )
Кцр4
11at
Кцр3
=
11at • [3]
f1r•t • 3
[]
�
� Змо nоследний 8О1зо8 фуlаiцuи
recursive compute_sua().
_
•ОЛУ•ОА• "''"""'"'""
енарий, мскольку сnисок
еnерь nycw.
r••t • []
к.дРZ
Функция сразу же за&ршаеw.ся,
11•t - [ 2 , 3]
f1r•t = 2 мэw.ому мременн111е first
re•t • [3] и rest не 6111числяюw.ся
Кцр1
11•t • [ 1 , 2 , 3 ]
f1rat = 1
1
re•t • [2, 3]
recuraive_c0111t
1pu e_aua( [З] ) Кадр3
\
,-
11•t • [3 ] На f\реЭО/оущем эw.ам функцuя
f1r•t = 3 за6ершилась, 6ерну8 О, мэмому
reat • [] 6111малки6аем кадр из сw.ека
·- . 3 _.
)
f1r•t • l
reat • [2, 3]
recuraive_c0111ute
1p _aua( (2, З]) КцрZ
l1•t " [ 2 , 3]
fir•t • 2
t Н• •р""'<!ущем ,..,... фующ•• Вернула >.
Змо значение nриба6ляеw.ся к мременной
first, коw.орая ра6на 2., и резульw.ам
re•t • [3] v
_
recuraive_coaipute aua( ( 1 , 2 , З ) )
Кцр1
11•t - [ l , 2 , 3 ]
полученное значение s nриба8ляемся
�&lозьмumе kapaнgaw
,� Peweнue
Получив базовые знания о словарях,
давайте применим их на практике.
Проанализируйте приведенный
ниже код и постарайтесь
предугадать результаты его работы.
�..Q!зьмumе kapaнgaw
,� Peweнue
Словарь в словаре - это
популярное решение. Рассмотрим,
насколько оно эффективно в нашем
кинематографическом примере.
Постарайтесь предугадать результаты
работы приведенного ниже кода.
Обоnочка Python
Ре�оме11Дац;�и фильмов
С д8умя сло8а.рями
о
"' лучаеtv1ся сложнее? ForЫdden Planet (•••tt) 1956
Vert190 t••tt•) 1958
8116ор редакции
424 Глава 8
Рекурсия и сло вари
users = {1
users [ ' Кии ' ] = { ' Эп . поч'l'а ' : ' kim@oreilly . com ' , ' Поп ' :
'
•
'
, ' Воsраст ' : 2 7 , ' Друsъ11 1 : [ ' Д.оя ' , ' Д.Olll ' ] }
users [ ' д.он ' ] = { ' Эп . попа ' ' j ohn@aЬc . со111 1 , ' Поп ' : '
к
'
, ' BospaC'l' ' : 2 4 , ' Друsъ• ' : [ ' Кии ' , ' Д.Olll ' ] }
users [ ' Д.О111 1 ] = { ' Эп . почта ' ' j osh@wickedlyS111art . com 1 , ' Поп ' : '
и
'
, ' Воsраст ' : 32 , ' Друsъя ' : [ ' Кии ' ] }
б"'м" резул"ма1N1
ЗIМо наш w.ecW108"'й код рабо1N1"' 1\рограмм"'
�зьмumе kapaнgaw
� Peweнue И мея перед глазами псевдокод, используйте свои знания о словарях,
чтобы заполнить пропуски в приведенном ниже коде.
шах = 1 0 0 0
рrint ( ' Менъше всеrо друзей имеет ' , most anti social
�..Qозьмumе kapaнgaw
�� Peweнue Нарисуйте граф выз о в о в при п олучен и и ч исла f ibonac c i ( 7 ) . В ко н це п одсч ита йте,
скол ько п о вто рных выз о в о в п риходится на кажд о е из значений от О д о 7 .
fiЬonacci. ( 7 )
� �
fiЬanacci (6) fiЬanacci (5)
fi.Ьanaoci (S)
/ \
fiЬanaoci. (4) L�iЬanaoci (З)
�
f
�l
fiЬanacci. (4) fiЬanacci. (3)
/f:iЬcnacc:i
fiЬanaoci (З)
'\ (2) / �
fiЬorlaoci (З) fiЬanaoci (2) fiЬorlaoci (2) fiЬanaoci ( 1)
� "'""':�'
: " /" �'" _", ,_", ,_",
f1lxln8aD. (2) f1lxln8aD. (1) f1lxln8aD. (1) f1lxln8aD. (0)
\ fiЬci>oaoi (l) fihon8cc1 (0) :Ш>an8cci (l) f11xin8aD. (O)
/ '-----1
fi.Ьonacc:i (1) fi.Ьonacc:i (О) fi.Ьonacc:i (1) fi.Ьcmacci (0)
И угадайте, скоnько раз в функции fibonacci ( 5 0 ) nридета. вычиспить fibonacci ( З ) l 4 807 S::Z.'- '17'- раз
426 Глава 8
Рекурсия и слов ари
ttt�oзьмume kapaнgaw
' Peweнue Если вы поняли, что нарисует функция koch ( ) , когда аргумент orde r равен
О и 1, то попробуйте предугадать, каким будет резул ьтат, когда аргумент
o rde r равен 2 и З . Помните: при каждом значении масштаба фрактал
вы глядит одинаково. Это неп ростое упражнен ие, которое как нельзя лучше
развивает вычисл ительное мышление.
Order = О:
Order =
на каждом оw�резке
З.:
(он был молоко одцн)
То же самое: для
каждого оw�резка
Order
1'\редыдущего эмаl'\а
= 2.:
рцсуем фцгуру 6цда
_л_
Оw�резкц сманобямся
Все меноще, но мы
1'\родолжаем pцco8awio".
Order = 3:
".уменощая масщма5
•
1
ф
и
l\r(2)ccв(2)r�:
б
2 3 о
remeнrre-
4 а с с о ц и а т и в н ы й
т т а 5
6 е е ч п
7 ф р а к т а л р ч а 8
е 9 п а л и н д р о м
10 к л ю ч ц а е
у и м
р и 11
12 м а с ш т а б
и
я 13 у н и к й
ц
и
14 а н т и с о ц и а л ь н а я
428 Глав а 8
-t
9 Чmенuе u �anucь fаЩrоВ
*
Дпиrепьное х анение р данных
* Он стоАЛ
прямо эа мной, а
потом бах! и пропал.
- -
U2p a В сдо Оа
бственную версию
Нет, это не каламбур. Нам предстоит создать со
популярной игры Mad Libs, которую мы назов ем Смехослов. Если вы
ее прави ла.
никогда не играли в подо бную игру, то вот
озда мь Для с оз да н и я "Смехосло8а" удал иw.е
"смехо сл о6 '' мож но с из Wleкcw.a У�роиз8ольнь�е сло ва
;
на осно6е лю бог о
ме ксма
и заме ниме их У�рочеркам и
мы Взя ли zoм o6ы
i:i W\е кс м
с обозн ачениями часrм
ей р ечи
и з книги
(сущесrмби w.елонЬtе, zло.z оль� и Yip.)
CMEXDCllDB
Первое, что необходимо сделать, чтобы ____ писать
П ра вила и г р ы ГМГОА
TeкcWI мр6о zо
абзаца zла.8ы :L
430 Глав а 9
Чтение и запись файлов
Ну допустим, а выбираю
глагол •уйтин, существительное
·конспектн, глагол ·крошить", прилагательное
"сумасшедшие", существительное •обезьанан, глагол
"съесть• и существительное •помидор".
Лo2u ka u2ры
Для создания компьютерной игры "Смехослов" нужно написать код, � под w�екс111108ым nонцмаемся файл,
который будет извлекать историю из текстового файла, запрашивать содержащцй. MeKCl'\I\ IACMoprщ ц
у пользователя недостающие слова и заполнять ими пропуски хранящцйся на коМl'\trюмере
в тексте, создавая новый текстовый файл с получившейся историей.
Рассмотрим алгоритм игры подробнее.
О Составnение wабnон а.
Для начала нужно создать шаблон
Код цzрь� �
истории с заполнителями для слов,
подставляем ых пользователем. Нам
потребуется как-то обозначить
� . ". ... .,,._.,
часть речи каждого запол нителя. �·-· "
Для этого мы вставим прямо в
текст слова в верхнем регистре,
например исУЩЕСТВИТЕЛЬНОЕ�
и П РИЛАГАТЕЛ ЬНОЕ" и и ГЛАГОЛ ':
�
п о н я т ный друг другу СУЩЕСТВИТЕЛЬНОЕ , НО
об э т ом мы в с коре п о г о в орим .
Може'"" Взяw.
собсм8енн1:r1й. 111\е ксм
l i Ь.txt ц создамь сбой шаблон
432 Глав а 9
Чтение и запись файлов
f) Чтение wабnона.
При запуске игры программа должна
загрузить шаблон с диска и найти в нем все
заполнители, т.е. слова в верхнем регистре ·--- -·� \
__••.--,.,.,"оо1 '
::: . •
"
� _, 1
. ..."
,
. "---·-·"""l'o.
�
. .o'I ·
1- �1
ДllJt �'tOl'IO М1 М 1to.am•eн,p АОЛ*16' ru.ro.t
шаблона, программа должна запросить
у пользователя соответствующее слово. - �· OOl:IA'ftlldl: .QYt' Щ)У1'У �' llfO
вместо заполнителя.
:= =:-= l�.tilt
� r».roa :
liIOR ".
получ1.1в д11нн111е
ОМ 1'\ОЛЬЗО8дмеля,
r.роzрамма создаем
;
1
1
I1
Пе вое, что необходимо сделать, чтобы
yii'1'и
р писать собственный хонспехт, - .
!
f
·1
Эмо заl'\олненныi:i
l
1.�'
научиться xpolllll'Rt стоящие перед вами задачи
"Смехослов", в комором
кажд111й ЗQМЛН!АмtЛЬ иа с,.....
. ...,. действия, кото ые
з11менен д11нным1.1 ом р
об•••1111а сможет выполнить за вас.
� 1 ::.:::0.::ги;:::·:::::�: 1
l� -= -���---!
.,..._
о о
Чмобы 1'\ОЛуч1.1мь 1.1мя р р
выходного фдi:iлд, Mlll
-
-��
б .�
�О�
М�
МЫ-=�
:� :� :.
до611в1.1м "'реф1.1кс "cr1Uy_"
crazy_liЬ.txt
к 1.1мен1.1 1.1сходного ф11i:iл11 ----7
�ume kap1н91w
У нас нет ни малейш их сомне н и й в том, что, добрав шись до
главы 9 ,
вы сможете самостоятельно написат ь псевдокод и гры, план
которой
п р и веден на п редыду щих стра н и цах. Соста вление псевдокода
даст вам
ясное пон има ние того, как должна работать п рограмм а. Не пренебр
ега йте
этим этапом! Нашу версию псевдокода вы найдете в кон це гла
вы.
�
в новом файле
�
P.S. Bt11 еще не
знаеме, как рабомам
с файламц , 1'\.ОЭМОМУ
сконценмрuруймес о на
01'\.IA CaHIAIA общей ЛOZIAKIA
uzpt>1, не забомясо
о демалях (для эмоzо
u нужен 1'\.Се8докод!)
434 Глава 9
Чтение и запись фа йло в
1 О
1
Никто не запрещает использовать в игре собственные истории, но для Пonpoamo nonьl08CIТuui
• ф
целей тестирования лучше пока придерживаться шаблона lib. txt. 11&СТИ fQIC'ffO чает" рс�м.
Подстuить 1м.uнмое
С11О1О llМСТО llU10JИ4.TCNI.
fЭ ОСТQ&Та
В Прсm41НОМ еnуча& Cl'IOIO
1
1 тексте.
t е
-
Первое , что необходимо сдела т ь , чт обы
Co>CJICIНИTb J>UYЛbTQT....
rnAI'OII писать собственный СVllЕСтвитвnьвов , 1 Эаписсm о6ра6от- Т&IССТ
с подстаалснными :юnо.nните.nами
1 1
Наш месмо6ый файл
научит ь с я rnAI'OII с т о ящие перед вами задачи • срай.п, им. которого содержит
СЗal'l.OЛHl.IMMЯMl.I 1 nресрикс Qcrar'(_•.
1
----- ----- ·____J
на ПPИJIAI'A'l'&JlldlOB действия , которые
L
СУЩВС'1'ВИТZJIЬВОВ сможе т выполнить за в а с . 11
l
Для э т о г о вы и компьютер должны rJIAI'OJI
li Ь.txt
J
open
l f
фо.й л а
П уm ь k фaiiAy
Вызвав функцию open ( ) на предыдущей странице, my_file = open ( ' liЬ . txt ' , ' r ' )
мы передали ей только имя файла ' l ib . txt ' ,
полагая, что он находится в текущем каталоге. Но
j
.Если указано 1'\1\Ол"ко
что, если требуемый файл хранится в другом месте?
Как его открыть? В подобных случаях к имени
\ г имя файла, ожидаеl'\l\СЯ,
чl'\l\o файл находиl'\l\С Я
�·
файла нужно добавить путъ, сообщающий, где
6 1'\1\ОМ же каl'\l\алоге,
искать файл. Существуют два способа указания
пути: относителънъ�й и абсолютный. В первом случае
crazy.py
�
lib.txt Чl'\l\O и Уtроzрамм а .
В данном случае
расположение файла задается относительно текущего
Уtредмлагаеl'\l\СЯ
каталога - того, из которого запускался код Python.
Tol'\I\ же каl'\l\алог Kal'\l\aЛOZ chq
�
программы. Предположим, файл liЬ. tхt находится
в подкаталоге libs. Тогда функции open ( ) нужно
01'\1\носul'\l\ел "но нашего
\(
передать аргумент ' l ib s \ l ib . txt ' .
� Гп:1
Относительный путь может включать произвольное Ytepexoдul'\l\e 6 мдкаl'\l\алоz
количество вложенных папок, разделяемых символом libs, а 6 нем уже ищеме
обратной косой черты ( \ ) . crazy.py файл fib.txt
�
� llb.txt
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
В Мае (и Lin ux) имена папок разделя ются косой чертой (/),
а в Windows для этих же целей испол ьзуется обратная косая
черта ( \ ) . В Python подцержи вается первый вариант, поэтом у
в Windows н ужно будет переписать п уть вида
C : \Users\eric\code\hfcode\ch9\liЬ . txt
в формате
C : /Users/eric/code/hfcode/ch9/liЬ . txt
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
436 Гл а в а 9
Чтение и запись файлов
�
уровня? Все очень просто ! Чтобы подняться на один
уровень выше относительно текущего каталога,
следует предварить путь двумя точками. Таким
образом, если программа запускается из каталога ch9
и требуется открыть в ней файл lib. txt, находящийся в
R �
Т\
соседнем каталоге libs, необходимо передать функции
open ( ) аргумент ' . . / l ib s / l ib . txt ' . Он означает,
что нужно подняться в родительский каталог, а затем
�
перейти в подкаталог libs , в котором находится �
��
. ' ·[!1
111.txt
файл lib. txt.
/
Если же файл lib. txt находится в каталоге oldlibs более
высокого уровня, то необходимо задать аргумент
ClllJ.PY
� 111.txt
' . . / . . / o l dl ib s / l ib . txt ' .
шу file = open ( ' . . / . . /oldliЬs/liЬ . txt ' ,
�
'r' )
/uar/hlar:y/code/find.py
. . /inventory/map. pdf
. . / . . /heпnione/spells/leviosa .txt
find.py
data/students.txt
�
oculus.txt ltvtos1.txt
8 -
,.
horcrux.dЬ students.txt
my_file . close ( )
438 Глава 9
Чтение и з а пись файлов
\nн а ч ит ься :
венн ы й СУЩЕСТВИТЕЛ ЬНО Е, - у "
б ы\n ГЛ АГОЛ п и сать собст
'П е рво е, что необходимо сделать, что
Г Эмо но.щ
,,У мексмо8ый фо.йл
r
мы
(ib.txt об э т ом .в с к о р е поговорИ14 .
J
мy_text
my_file = open ( ' l ib . txt ' , 'r' Далее 8ы8одuм ........__ "
смроку но. экро.н, �
Лервое , что необх:одино сделат
ь , что б:1.1
Ко� на маrнити:nах
Не поможете найти и голку в стоге сена? В рабочем каталоге находятся 1 ООО текстовых файлов
с последовательными именами от 0.txt до 999. txt, и тол ько в одном из них содержится слово
' needle ' (игол ка}. На магнити ках, прикрепленных к дверце холодил ь н и ка, был зап исан код
поиска та кого файла, но вот незадача: кто-то случайно все перемешал. Сумеете восста новить
код в п режнем виде? Учтите, что некоторые магнитики могут оказаться л и шними. Сверьтесь
'·· :.. . - с ответом, приведенн ы м в конце главы.
1 00 0 ) :
i in range ( O ,
file . close ( )
text :
if • needle ' in
t Рас"'оложи/'11\е маzнu/'11\и ки
6нужном "'°рядке
1 filename = str ( i ) + ' . txt '
1 . 1111 1 11 �
for i in range
( O , 999) :
�
1:
t xt = file . read ( ) 1
' r' )
file = open ( fil
ename ,
440 Гла в а 9
Чтение и з а пись файлов
ТТросматривая
код предыдущего
упражнения, я обратил внимание на
то, что программа продолжает читать
оставшиеся q:юйлы даже после нахождения
слова "needle•. Это имело бы смысл , если
бы мы хотели проверить каждый q:юйл , но
в условии сказано, что слово находится
П ора n pekpamu m ь . • •
Цu kA wh i le
что дальше продолжать нет смысла. Поиск слова
'needle" в папке с файлами - как раз такой случай.
Как только мы нашли его в одном из файлов,
становится незачем открывать оставшиеся файлы.
Для прекращения цикла предназначена инструкция
break. Она инициирует немедленный выход из
цикла for, как показано ниже.
V- Э мо нащ код
for i in range ( O , 1 0 0 0 ) :
К.ак W\ОЛЬКО filename = str ( i ) + ' . txt ' nоиска иголки
r-.роz рамма file = open ( filename , ' r ' )
доходи м до text = file . read ( )
и н смр ую.{ии
break, цикл � if ' needle ' in text :
с р азу ж е � print ( ' Haшen иrопху в файле ' + str ( i ) + ' . txt ' )
�
К.а к l'Vlол ько иголка н а йден а ,
break
G le . close ( )
зо.6е р щаемся
442 Глав а 9
Чтение и з а пись файлов
Вернемся k u2pe
Изучать возможности языка программирования всегда интересно, но нам
нужно завершить реализацию игры. В последний раз мы занимались тем, что
читали содержимое текстового файла целиком. Это несложно сделать, однако
есть один недостаток: в случае больших файлов программе потребуются nредсмо.6ьме, чмо 81:11
серьезные ресурсы. Представим файл, в котором сотни тысяч строк. Навряд но.бираеw.е мексм но.
ли стоит загружать в память такой объем данных, если вы не хотите, чтобы У1.ечо.мной машинке.
программа столкнулась с нехваткой памяти. Всяк�Ай ро.з r1ри
Но что в этом случае считается строкой? Весь текст вплоть до символа 8оз8ро.мо. каремкu 81:11
переходиW1е на но8ую
н овой строки. Если вы откроете файл lib. txt в текстовом редакторе , где
можно включить режим отображения скрытых символов, то вам откроется смрокн
следующая картина.
�С'rВИТIUIЬВОЕ,
чтобы\n f<
""'"__::· К.аждая смрока v-- В1:11 не у8идиме симболоб
нобой смрокu б об1:11 ч ном
<;--
ГJIAI'OJI писать собстве нный -\ п
с нобой смрок/.1.
- ---
об этом мы в скоре п о г о в орим .
!
. -· - ------------- -�-- -----·--·· ·· - - ····-- -· -·-···· - -�------J
l i b.txt
my_file = open ( ' lib . txt ' , •r• ) На эмом раз м1�1 /.1.СУ\ОЛРЗ!JеМ мемод readl ine ( )
)
linel = my_file . readline ( )
�
� u сч1Ам1�160.ем пер6ые д6е смрок/.1. б переменнtlfе
L
l inel " line2 "'"'8'"''"'8'""'
print (line l )
line2 = my_file . readlin• ( )
print (line2 ) Оболочка Python
Пер в ое , ч то не о б о
х димо сделать , ч то бы
Видиw.е доl'\Олнимелt>ную
У\усму ю сw.року?
Минуточку!
На предыдущей страни це
вы упоw�нули про некую
·управля ющую последовательность" .
Может, все-таки объясните,
что это?
444 Глава 9
Чтение и запись файлов
1
Учмиме, ЧWIO t\ус мая
смрока, в омличие ом
Вtlfражение whi le True смроки нулевой длинtlf,
m y_file = open ( ' lib . txt ' , 'r' )
/ означаеW1, ЧWIO цикл будем содержам ь
while True : � вtlfмлняемся В Е Ч НО символ новой с мроки
nocдegoBameдыocmeu Python
Очень хорошо, что в ы так быстро освоили инструкцию Вся кий р аз, испол ьзуя цикл for
break, но есть более простой и эффективный способ с кл ючевым словом in п о отношен и ю
просмотра текстовых файлов в Python. Помните, к списку, ст р оке, ф айлу ил и слова р ю, м ы
как мы использовали цикл for для просмотра задействуем специал ь н ы й механ изм: так
последовательностей (списков и строк)? Аналогичным назы ваемый итератор.
образом можно поступать и с файлами, представив их В сл учае итерато р а п редпола гается,
в виде последовательности текстовых строк. Вот как
что соответствующий ти п да н ных
будет выглядеть цикл for. п оддержи вает ста нда ртн ы й способ
пе р ебо р а последовател ьности
my_file = open ( ' lib . txt ' , 'r' ) значе н и й . Не важно, как именно это
446 Глава 9
Чтение и запись файло в
строке. К счастью , мы уже делали это в главе 6, когда разрабатывали ТТопросмть nольJоютм.
е
sви.ти такую час� речи.
программу, вычислявшую индекс удобочитае м ости. В данном случае ТТодстааить аи.денНОf.
слоео .место IOMOЛHlll TCJUI.
мы воспользуем ся аналогичной м етодикой . В от черновой вариант
функции proces s_l ine ( ) . О В противном спучос слоао
е
остаета а тексте.
i
Функцuя proces sed_l ine ( )
Сохранить результаты.
Записать обработажы>I текст
1'\олучаеw� cwipoкy wieкcwia с nодстааnа.iНЬIМИ юnО11НИТМJtМИ
в qюйл, имя которого содержит
) : . �
Нам мнаоо бu w�ся оругая смрока
пресрикс "crazy_".
.
process ;d_lin e = , , IL
def process 1 ine ( l ine
' v
ьс1�2 ·�::оа Пора протестировать игру в слова. М ы реализовали почти весь план ,
Te.cm -;&.� �B осталось л и ш ь сохранить обработанный текст в файле. Внесите изменения
в файл crazy.py (ниже приведена его полная версия), выполните команду
Run > Run Module и проверьте полученный результат.
file . close ( )
return text
placeholders = [ ' СУЩЕСТВИТЕЛЬНОЕ ' , ' ПРИЛАГАТЕЛЬНОЕ ' , ' rЛАГОЛ ' ]
Еще ро.з nроанализируем
def process_line ( line ) : код. В цикле for nроzрамма
global placeholders ""роходц м 1'\О каждому с ло ву
processed_line = ' ' 6 с мроке, nроверяя, являемся
лц оно заnолнцw�елем. Еслц до.,
words = line . split ( ) V\pOCIAЛ.� 1'\ОЛЬ3оваw�еля вбесмц
замещающее слобо
for word in words :
if word in placeholders :
+
answer = input ( ' Введи'l'е ' word + " : " )
processed_line = processed_line + answer + ' '
�)
else :
proces sed_line = processed_line + word + 1 1
Оболочка Python
return processed_line + ' \n ' Ваеди'l'е ГЛАГОЛ : уЙ'1'и
Ваеди'l'е ГЛАГОЛ : конспект
def main ( ) :
lib = make crazy lib ( ' lib . txt ' )
:
Введи'l'е ПРКЛАГАТЕЛЬНОЕ !СрОШИ'l'
Ь
Ваеди'l'е СУЩЕСТВИТЕЛЬНОЕ : обезь
яна
Введи'l'е ГЛАГОЛ : С'ЪеС'l'Ь
print ( lib) - -
Вом ч�мо м ы v�олучилц. Первое , что необходимо сдел
' ·
уЙ'1'и ПИСа'!'Ь собственный СУЩЕС
а'!'Ь , чтобы
if name main Смранно 1 похоже, ТВИТЕЛЬНОЕ 1 _
main ( ) несколt�ко заnолнu l'!l\елеЦ научиться хоаспект стоящие перед
на JCPOIDИ'l'Ь действия , которые
вами задачи
были nроl'\ущены
обезьяна сможет ВЫПОJIНИ'l'Ь
за вас .
-------;; Для ЭТОl'О вы и ХОНПЬlр lТе дomuw съес'!'Ь
понятный дРУI' дРУI'У СУЩЕСТВИТЕЛЬ
НОЕ , но
об этом мы вскоре по!'овор11М
>»
.
448 Глава 9
Чтение и запись файл ов
l{f'�ьмume kapaнgaw Почему программа вдруг п ропусти ла нескол ько существител ьных? В чем
�� п роблема: в словах или логике п рограммы ? Поп робуйте выясн ить это,
сопоставив входные и выходные дан н ы е, и за п и ш ите свои соображения
на этот счет.
450 Глав а 9
Чтение и запись файл ов
ьот- . �)OJ
В несите описанные на предыдущей странице изменения в файл crazy.py и
выполните команду Run > Run Module, чтобы проверить получаемый результат.
Tecm -.n.y �в
�
Воз"м и ме сбой мекс �м
и 1'\роберьw.е на нем
ра бому 1'\роzрам м ы _
""""
�5J"
_
__
Помогли ли последние
Оболочка Python исправления избавиться от всех
Traceback (most recent call last) : ошибок, связанных с обработкой
File " crazy . py " , line 45 , in <module> знаков п репинания? Моrут
main ( ) ли возникать ситуации , при
"
File " crazy . ру , line 41 , i n main которых программа по-прежнему
crazy_lib = make_crazy_liЬ ( filename ) работает неправильно?
File " crazy . py " , line 2 , in make_crazy_liЬ
1,A>lgnmo
01Л>lвш qшnвedu:m J/8)1 1, веми:J wош& в
file = open ( filename , ' r ' )
FileNotFoundError : [Errno 2 ] No such file or directory : ' liЬ2 . txt ' нэшввш:ю воJ1вне х1qнquвшвnпшэов
»> oJ1quoJ1Q · , i i i IfOJWJ , овои:J ноиgвт в
qшnввшэрои вшаЛgоdиои :eJ1eeJ1эpou
ОбоЛQllЗ Pylhon
V'
УЧft-14.СЯ 1l'1J1lft.14.�b
За"'и ш t.1 ме
з десь c8ot.1
РуtЬ�11 резульма м ь�
Оболочка Python
452 Глава 9
Чтение и запись файлов
06pa6om ka uckAючeнu u
Ранее мы уже обсуждали ошибки: синтаксические
(чаще всего опечатки) , семантические (логические
упущения) или выполнения (возникают на этапе запуска
кода) . Ошибки выполнения мы никак не обрабатывали:
интерпретатор Python выдавал соответствующее
сообщение, и программа просто прекращала свою работу.
Но так не должно быть, особенно если ошибки возникают
по естественным причинам, например, при попытке
открыть несуществующий файл. Сейчас мы узнаем, как
правильно обрабатывать такие ошибки.
Но сначала давайте разберемся, что собой представляет
ошибка выполнения, или исключение. Это событие,
возникающее во время работы программы и означающее
ситуацию, с которой не может справиться интерпретатор
Python. Столкнувшись с ошибками такого типа, интерпретатор
прекращает выполнение программы и создает объект
исключения, содержащий сведения о возникшей ошибке.
По умолчанию сведения об ошибках выводятся в виде
трассировочных сообщений, которые вы уже наблюдали
в оболочке Python.
Такие ошибки вполне можно обрабатывать вручную, избавляя
интерпретатор от необходимости останавливать работу
программы. Фактически вы сообщаете интерпретатору о том,
что берете на себя обработку исключений определенного
типа. В Python обработка исключений выполняется в блоке
инструкций try / except.
/
filename = ' notthere . txt ' сло8о except ".
file = open ( filename , 'r' ) ".и введи ме блок
except : кода , коrлорый
print ( ' BosниJCJia ошибка при 0'1'хр1пии ' , filename ) О!:Jдеrл 81�11'\олнен
в сл!:J чае о шибки
else :
print ( ' Ура , файп уда.nось 0'1'хр1пь ! ' ) (.__ Д а л ее доба 611ме
у слобн ы й блок
file . close ( ) else, к омор ый
(
выl'\олн яем ся,
мо лико есл и
Можно еще oooa6цvv.11 необязамел11н171 й бло к не было ош и бок
finally, КОW10р171й в1711'\ОЛН ЯеW\СЯ независимо
ом моzо, возникло исключение или нем
я вн ая обрабоmkа uckдючeнu ii
Если после ключевого слова except задан блок кода, то это означает
универсальную обработку. Другими словами, блок кода будет выполнен для
любого исключения, которое может возникнуть в блоке try. Но ничто не
мешает указать конкретное обрабатываемое исключение, как показано ниже.
Пе
tioiimecь
�адаВаmь Bo:IJfoCьx
D: Существует ли ограничение на D: Где можно просмотреть список
руководства можно найти в Интернете
и на сайте python . o rg.
О: D:
количество открываемых файлов существующих исключений?
О:
в программе?
Такой список доступен по адресу Можно ли обрабатывать в одном
В Pythoп нет такого ограничения, https : / / doc s . python . o rg/ 3 / блоке инструкций сразу несколько
но оно устанавливается операционной
О:
l ibrary/ excep t i ons . html. исключений?
D:
системой . Это еще одна причина
своевременно закрывать любые Можно ли создавать собственные
После ключевого слова e x c ep t
файл ы , больше не используемые допускается указывать несколько
О:
типы исключений?
программой . Конечно, лимит всегда исключени й . Они должны быть взяты
можно увеличить, изменив системные Да. Исключения п редставляют в скобки и разделены запятым и :
настройки , но у вас должны быть на то собой обычные объекты , поэтому except (FileNotFoundError , IOError) :
веские причины . можно расширять возможности Pythoп ,
создавая собственные объекты Можно вообще не указывать имена
454 Глав а 9
Чтение и з а пись файлов
rtt�ьмume kapaнgaw
�"'
Три жды п р о следите за в ы п ол не н ием п р и веден н о го н иже кода .
В перв ом случае введите л юбое ч исл о, не равн ое н ул ю, в о вто р ом -
числ о О, а в третьем - строку " нол ь " . Ука ж ите, како й резул ьтат вы
ож идаете п олуч ить в кажд о м случае.
try :
num = inрut ( ' Введите чиспо : ' )
resul t = 4 2 / int (num)
except ZeroDivisionError :
print ( " Henьзя делить ка копь ! " )
except ValueError :
рrint ( " Простите , ко кужио ввести чиспо . " )
else :
print ( ' Ваш ответ : ' , resul t)
finally :
print ( ' Спасибо , что б�.ши с ками ! ' )
Введите О
Оболочка Pyttюn
456 Глав а 9
Чтение и з а пись файлов
Чтобы сохранить результаты игры или любой другой текст е Обработать текст.
в файле, достаточно вызвать метод wri te ( ) файлового объекта. Для каждого слова в тексте:
А Если слою - юrюлните.пtt
Предварительно файл должен быть открыт в режиме записи. W (ГЛАГОЛ, 11РИЛАГА1ёЛЬНОЕ
или СУЩЕСТВИ1ёЛЬНОЕ):
Давайте напишем функцию s ave_ crazy_ l ib ( ) , получающую О Поnросмт�. nол�.юаатм•
ф
нести то.кую чсст�. рачм.
в качестве аргументов имя файла и строку. Функция должна
ТТодстаеит" ••ед�
будет создать новый файл с указанным именем, сохранить в нем C.l'IOIO IМССТО JOMOЛНИTCJUt.
переданную строку и закрыть файл. Код функции показан ниже. ф В Проn11НОМ спуча.е cnoao
OCTOCTCJI • тексте.
�е Сохранить результаты.
�
пресри кс Ncrazy_11.
( Н.ко"'ц,
закр1;11 6аем (f\"
объекма , r.ереда6ая ему сW1року l'l'leKcl'\'\a,
коW1орая заl'\цс1;11 6 аемся 6 файл
- - - - - - - - - - - - - - - - - - - - - 1
&уд11те
def :шain ( ) :
filename = ' lib . txt '
r
Сохранцм цмя файла
ь
Еслц nрц омкр111 м цц илц
Чl'И.енцц файла возникаем
цсключенце, 1'\еременная l ib
1 (liЬ)
pж:i1t
будем содержамь значенце
f
save_crazy_l iЬ ( )
орцzv. нальному цменц файла добавляемся
1<.
nрефцкс "crtU.y_". Эмо будем цмя но8ого
файла , в комором сохраняеl'И.ся мексм
placeholders = [ ' СУЩЕСТВИТЕЛЬНОЕ ' , ' ПРИЛАГАТЕЛЬНОЕ ' , ' ГЛАГОЛ ' ]
def proce s s line ( l ine ) :
global placeholders
proces sed line = ' '
. _____,,?)
file . close ( )
def main ( ) :
filename = ' lib . txt '
l ib = make-crazy-lib ( filename )
pж:i11t (lib)
if ( liЬ ! = None ) :
s ave_crazy_lib ( ' crazy_ ' + filename , lib )
if n ame__ -
main ' ·
ma in ( )
458 Глава 9
Чтение и запись файлов
о
о
Или в Windows:
python crazy.py
EJii1: �/jJ О б н о в и м в послед н и й раз код и гр ы , чтобы и м ет ь возм ож ность указы вать и м я ф а й л а
ш а бл о н а в ком а ндной строк е . Дл я этого п ридется в нести два п р о стых и з м е н е н и я ,
Twn-дr�в котор ы е о п и с а н ы н и ж е . О б н о в ите соответствующ и м образом ф а й л crazy.py
и п р оведите ф и н ал ь н ы й тест-дра й в и гр ы .
о В н ач а л е и м портируйте м одул ь
и н струкци ю import s y s .
sys , добав и в в н а ч а л о п рогра м м ы
Аоба6ьW1е эW10
кол1цндно1А смроки.
13 '1Ji.,.. dows щел книw.е
; щ '< Но"'ке Пуск, 86едю'М
В �\О/\С �"\ D Vl t K O. .- r cr-лd"
ц �Чf?� K H LHV1. e Hl.{
Jl\ро<'рмл.мы
460 Гпава 9
Чтение и з а пись файл ов
� САМОI r1111но1
2 3
4
5
6 7
8
9
10
11
12
13
14
462 Глава 9
Чтение и запись файлов
@t..@озьмumе kapaнgaw
" Peweнue У нас нет ни малей ш их сомнений в том, что, добравшись до главы 9,
вы сможете самостоятел ьно написать псевдокод и гры, пла н которой
при веден на п редыдущих стра н и цах. Составление псевдокода даст
вам ясное понимание того, ка к должна работать программа.
�
о
Необхооцмо какцм-W10 образом
Загрузить текст истории загр!:JЗIАW\17 сооержцмое в Pyt/r.ol'\
из срай ла.
� после эW1ozo начцнаем oбpaбaWl1716awio
WleKCWI, ...роберяя кажоое слобо
Об работать текст.
Для каждого слова в тексте: К-- Еслц найоено сло60-за ...олнцW1ело,
А Если слово - заполнитель необхооцмо Ml'\pocцW10 млозоваl\'\еля
�
W (ГЛАГОЛ , ПРИЛА ГАТЕЛ ЬНОЕ ввесl\'\IА слово оля замены
или СУЩЕСТВИТЕЛ ЬНОЕ):
о Попросить пользователя
ввести такую часть речи.
� Далее необхооцмо l'\oocwiaвцwio
е Подставить введенное
слово вместо заполнителя.
ЭW\О слова 6MeCl\'\O Зal'\OЛHLIW\eAЯ
в l\'\eKCW\e
�
с подставленными заполнителями
в срайл , имя которого содержит
пресрикс 11crazy_" .
Наконец, когоа 6се слоба обрабоман!71,
заl'\LСС!71ваем мексl\'\ 6 нобый файл
"�озьмumе kapaнgaw
Отследите, какому файлу соответствует кажды й из п р и веде н н ы х н иже
'"' Peweнue путей. В случае относител ь н ого пути н а ч и н айте с каталога code. Первое
зада н ие мы вы пол н ил и за вас.
/usr/harry/coda/find . py
. . /inventory/map . pdf
. . / . . /hermione/spells/leviosa . txt
find . py
usr
data/students . txt
horcrux.db students.txt
464 Глава 9
Чтение и з а пись фа йлов
i
Расl'\ОЛОЖ(Аме маzнщ,11 (А К(А
в нужном мрядке
f i l = open ( f en 'r'
..,
)t
ОмкрЬ16аем файл для чменця
1 .111111
... •
---111ll!l1111l!l
i· 111ll !lll!
1 • ame
-1111
,!1811- �
$$
1 �
• СЧ(А МЬ/6аем вectJ файл, млучая
print ( ' Наше.п иrо.пху а файле ' + str ( i ) + ' . txt ' ) 1
l • ile . сlо
и �) t \'----._ И "'
за 5уЭ....е э• кр • •
f',__ Есл(А слово найдено,
сообщаем имя файла
m
каждЬlй файл
(f�зьмumе kapaиgaw
"'"' Peweиue Почему п рограмма вдруг пропустила нескол ько существител ьных? В чем
п роблема : в словах ил и логике программы? Поп робуйте выяснить это,
сопоставив входные и выходные да н н ые, и зап и ш ите свои соображения
на этот счет.
�
Дл я э т о го
научиться конспект стоящие перед вами задачи
п о н я тный др у г др у г у но на крошить действия , которые
об э том мы в с ко р е п о г о в ор им . обезьяна сможет выполнить за вас .
Дл я этого вы и компьlD'l'ер доЛЖНЪI съесть
понятный друг другу СУЩЕСТВИТFJIЪНО () но
об этом мы вскоре поговорим .
>»
Если. "'-рисМоW1реW11:>ся к
"'-РО"'-!JЩеННЫМ Заl'\ОЛНиWlеЛЯМ,
W\O МОЖНО ЗaMeWlи Wll:> ключевое
0W1личи.е: в конце каждого и.з
ни.х CW\OиWI заn.ЯW\t\Я Ну надо же! Эwio wia же самая ошибка,
с каморой мы сw�олкнулись в zлабе 1О
�
-�
/
"'-РИ анали.зе мексw�а. Необходимо
учиw�ы б амь нали.чие за .... ямоu
(t�ли мо ч ки ) "'-P U. с равне н и и с л о ба
с заn.олни мелем
466 Гла в а 9
Чтение и запись ф айло в
list • [ 1 , 2 , З , 4 ]
item = list [ S ]
Оболочка Python
У1lJ!"!viC$
TraceЬack (most recent call last) :
File " / Users / eric / code / ch8 / errors / list . py " , line 2 , in <module>
11�RJ!"!vl�ь РуtЬ�11
item = list [ S ]
»>
Оболочка Python
TraceЬack (most recent call last) :
File " / Users / eric / code / ch8 / errors / filename . py" , line 1, in <module>
»>
Оболочка P'jthon
int ( ' 1 ' )
int ( ' 2 ' )
TraceЬack (most recent cal l last) :
pri.nt (msg)
i.nt ( ' 6 ' )
ValueError : invalid l i teral for int ( ) with base 10 : ' Е '
>»
msq = ' C&JDD'l' ! '
hi. ( ) firstname =
print ( ' Имя : ' + name )
' Ветхоаен '
Оболочка Python
TraceЬack (most recent call last) :
!u ( )
File " /Users/eric/Documents/code/chB/errors/function . ру" , l ine 4 , in hi
print (msq)
»>
��зьмumе ka paнgaw
,� Peweнue Трижды пр о следите з а вып ол н ен ием п ри веде н но го н иже кода. В перв о м
случае в в едите л юб о е числ о , н е рав но е н ул ю, в о вто р о м - ч ис ло О,
а в третьем - стр о ку " н оль " . Укажите, како й резул ьтат вы ожидаете
п ол у ч ить в кажд о м случае.
try :
num = input ( ' Введите чиспо : ' )
result = 4 2 / int ( num)
except ZeroDivi sionError :
рrint ( " Нельзя делить на ноль ! " )
except ValueError :
рrint ( " Простите , но нужно ввести чиспо . " )
else :
print ( ' Ваш ответ : ' , resul t)
finally :
prin t ( ' Спасибо , что бы.пи с нами ! ' )
Введите О
468 Глава 9
Чтение и за пись файл ов
2 п 3
п у и
4 е с т
5 3 а к р ы т и е
6 б е а р 7
8 р в ж и м с х я а с
с о в т 9 п
к л а 10 о т к р ы т и е
л ю т р а с
ю т 11 3 о
12 ч т е н и в п д к
е ы а е
н й 13 с м е х о с л о в
и я и
в 14 о т н о с и т е л ь н ы й
ь в
472 Гла ва 1 0
Ве�служ6ь1
Веб-сnужба ожидает
nоnучения ааnросов
Веб-служба - это сервер, возвращающий
данные, а не веб-страницы. При использовании
веб-службы программа посылает иnрос
к серверу. В свою очередь, сервер генерирует
ответ и возвращает его программе.
•
.. . ..
· .. . . .
"... .
. · ·о'
.
". . .
�аС\9
..
.
···
"
." .
"
"
·
" .·
()
· "" ""
..
"
о .
.
·
··
J 1 "".':"·/"
·
··
мее�
г ·"
··
·· · Т3еб-сер6ер,
".
"· • ожцдающцi.1
\ �· · · · · · · · · · . . . . . · · · u.
· ·" "
АР/-Здl'\рОСЬI
, ·�
�:'..:-·:·
" �
� .---- ·
A gpec 8е6-сАуЖ 6ы
Для о бращения к веб-службе необходи мо указать ее адрес,
подо бный вводим ому в браузере. Он состоит из им ени
сервера и о писания ресурса. В случае браузера ресурсом
о бычно служит веб-страница. Н о при работе с веб-службой
целевым ресурсом будут данные сам ого разного вида. Сп особ
задания ресурса также различается в зависимости от веб
службы. Для наглядности расс мотрим несколько п римеров.
Ука.зь�ваем им я
гс�.u.-. 0c
/
Эмо URL-aдpec
служ0Ь1 rtрогноза веб-службь� 13 данном случае Ol'\ucaнue
) сер в ра заr.раши8аемоzо pecupca
;J �
-. -.
0.1
мгоды 8t>1ZЛЯОЦМ со8сеМ l'\O-Op!:JZOMy • •-.
� � .10
v �
http : / /api . openweatheЖJDap . org/data/2 . 5/weather?q=London
474 Глава 10
Ве 6-служ6ы
(Се
даннЬlе о
здect>
Ml>I исnолt>зуем
� 1
Заnрашиваем Эмо иденмифико.W1ор
M!J3f:>IKO.HW\e M!JЗЬIKQHWIQ
версию :i серверного АР/
конкремном нужного нам
� 1
http : / /api . spotify . com/vl /artists / 4 Э ZHCT0cAZBIS j 08DG9PnE/related-artists
i
К.о.к всегда, сначала Догад1>1ваемесо, кмо
t МЬI XOWIUM t\OЛ!JЧUW\f:>
данн1>1е о связанн1>1х
указf:>lваем имя сервера ЭWIOWI M!J31>1KQHWI?
С HUM M!JЗl>IKQHWIO.X
подсказка: его
наз1>1вали "королем
рок-н-ролла"
Изучите документацию к AP I .
Мы не шутим. Это не настолько страшно, как кажется. Все
веб-службы придерживаются стандартного синтаксиса
URL-aдpecoв (вы сможете узнать его самостоятельно) , но
предоставляют разные программные интерфейсы для
разных типов данных. Поэтому способ обращения к данным
в каждом случае будет разным. Достаточно взглянуть на
приведенные выше примеры: запрос к серверу Open Notify
очень простой, чего не скажешь о запросе к серверу Spotify.
Вы увидите, что большинство веб-служб снабжено вполне
адекватной документацией, в которой детально расписаны
форматы запросов для всех поддерживаемых типов данных.
Нам предстоит поближе познакомиться с веб-службой Open
Notify.
Не удмвитеn"но.
nor-.poбyйt'lle 88ecW1u заr1рос несколько раз. MoжeWle макже задамь w.upot'Ay и дoлzot'll!J
8 Чооg/е Maps, наr1ример " - 0 . 2 6 0 9 , 1 1 8 . 8 9 8 2 " (r-.ер8ой указ1118аеW1ся w.upot'Aa)
476 Глава 10
Ве6-служ6ы
/
от "Pip Installs Packages". С ее помощью в системе
устанавливаются и удаляются различные пакеты.
3мо ренурсиlн•й
акроним! Нам понадобится пакет requests, позволяющий
отправлять запросы к веб-службам. Из всего пакета
1<.уоа можно сламь АР/- нам нужен одноименный модуль requests (трудно
заl'\росы? Да куоа угооно: � запутаться). Следует отметить, что в Python имеется
Twitttr, Spotify, Microsoft, � встроенный модуль создания веб-запросов, но
AмtUol'\, Bc.w.Fttd, Rtddit и др. большинство программистов считают модуль requests
более функциональным и простым. Кроме того,
благодаря ему мы получим опыт работы с утилитой pip.
-- ---
----
naкtMЬI, Hal'\IACaHHЬlt
оруzими ро.зра5омчиками 1А
орzан1АЗаЦ1АЯМIА (нt 8ход.11щими Stay Informed
а.еоrМа�•--•tdeМC8
8 рабочую zpyl'\l'\y Pytl-lol'\), ... ....
-.......
назь�8аюмся ---
CMOP,OHHIAMIA (')-
CJit1 =' .
s.y'!W'lbl
Пе �оiiз11есь
YcmaнoBka о6но8деиuя ЗаДаБаmь Бо:nrось1
Утилита pip встроена в Python, поэтому ее можно ]j: Чем модуль requests лучwе
встроенных инструментов Python?
вызвать из командной строки для установки пакета
requests.
Неужели встроенного модуля
[
недостаточно для работы
с веб-заnросами?
Исмл"зуuме командную смроку
омраццонноu сцсмем1>1, как эмо
делалОС!) в главе q
О: Разработчики пакета requests
создали библиотеку для работы с веб
запросами, которая намного проще и
п функциональнее, чем встроенный модуль
nол"зо8амелц Pythoп, причем настолько, что именно
WiNi.ows должн1>1 она применяется в большинстве веб
наоцрам!) "pythol'\", служб. Впрочем, никто не запрещает
а не "pythol'\3" вам использовать встроенный модуль,
если возникает такая необходимость (он
t
В6еоцме 1"\ОКазанную выше КОМанду, Чl\l\001>1 HaЧttW\!) усманобку. называется urllib или urllib2).
Необходимо цмемь nодключенце к Инмернему, чмобt�t умцлцма Что хорошо в возможности расширения
pip смогла скачамь nакем111. Учмцме, чмо усмано8ка 6t�tnолм.емся Python: разработчики создают
6 камало� бцблцомекц Pytl-lon, а не 6 баш мекущцй камало�. Еслц собственные пакеты и делятся ими со
8ознцкнум ошцбкц досмуnа, nро8ерьме, есмь лц у 8ас nолномочця всеми желающими.
для усмано8кц nакемо8
Консоль
]j: Это xopowo, что в Python можно
добавлять новые пакеты, но rде их
$ pythonЗ -11 pip install requests
искать?
Collecting requestз
О:
Downloadinq r ests-2 .18.1- . yЗ-none-any.vhl (88kВ)
100\ 1 1 92kВ 1. 4МВ/s Новые пакеты можно искать
Collecting idna<2. 6,>=2.5 (from requests)
Downloadinq idм-2.5- 2. 3-none-an y.whl (SSkВ) непосредственно в командной строке,
100\ 1 1 бlkВ 2.SМВ/s например:
Collectinq urlliЬЗ<l.22,>=1.21. l (fr011 requests)
Downloadinq urlliЬЗ-1. 21.1-ру2.pyЗ-none-any.whl (ШkВ) pythonЗ -m pip search hue
100\ 1 1 lЗЗkВ 2. 5МВ/s
7.
7-p
Collectinq certifi>=20l 4 .17 (froв requests)
y2.
В данном случае мы ищем пакеты
Dovnloading certifi-2017 .4. l py З-none-any.whl (37SkВ)
100% 1 1 378kВ 2.2МВ/s
по ключевому слову 'hue ' . Другой
Collecting chardet<З .1. О,>=З. О. 2 (from requests) вариант - выполнить поиск в Google,
Downloadinq chardet-3.0.4-y2.py3-none-any.whl (lЗЗkВ)
например "руthопЗ гequests module" или
100% 1 1 14ЗkВ 4.1.МВ/s
Installing collected packages: idna, .urlliЬЗ, certifi, chardet, requests "pythonЗ hue lightiпg•. Также проверьте
$ репозиторий программного обеспечения
для Pythoп по адресу http : //pypi .
org.
в масОS, мэмому 6 башей сцсмеме окно будем другим найти утилиту pip.
478 Глава 10
Веб-службы
г
Notify досмуl'\на на
open-notify. org. Рассмотрим его возможности.
сайме open-notify. org.
Здес11 мы рассмомрцм
мол11ко самое осно6ное
• • < Q\Ж\-notlfy.org
OJ)en Not.ify
Open Notify i�
�ij
�
· ..;.u.' fr
дРI 0ocs Sourcecooe AЬout
Projects
APls:
l
Международной космцческоiА
сманццц (МКС)
lnternational Space Station Current Location
-
{
А эмо "рцмер ом8ема
r-' ом 6е6-служ6t11
"message'': "success" 1
The data payload has а timesta� and an i.ss_posit\on object with the latitude алd longltude.
lnmpks
t
�.,..; .... -ty....." - -·)
...�...>
"""'" ""1l�ltf.,...·•4··
.,...(
...,."
. .....н."t
...".,, __ ,
Веб-службы Оре" Notify на"цсань� ...... el>t(·...._,._.)( ...LA'1, •J('•-.. ]{ .._.,..н...., )[ ••-)
ц соl'\робождаюмся НеiАманом
Берджц, 1.тженером цз nормленоа,
DmS-rct
шмам Ореzон �a-�..,_....-,. . ...,..ICAIO..,.�.......-.
.. .-.._.
. ...,..,._,_.....,.
_...._,,.
480 Глава 10
Веб-службы
r::r " city " : " London " , В качесм8е значений доl'l.ускаемся
1
Все ключи - эмо " country" : " UК " ис1'1.ользо8дмь 8ложеннwе l'l.t.lptx
смро ки JSON } "ключ/значение"
}
и
коморwе здесь на.з w8аюмся
мдссц8ами
6 качесW16е 0W18ема
" """...". •�
���\)ос.
.
."".. ".".. ""
".
.. "
·
�
�, /
/
- • .""."" "
.
" "". ��
"
�
� получение омбема
/ / 8 ф ормаме JSON
Пе <?:oumecь
задаваmь Bonrocь1
D: Получается, что JSON и словари D: Если данные JSON поступают D: И все же мне непонятно: как узнать,
Pythoп - это одно и то же? в текстовом формате, то как их какие есть веб-службы и как с ними
О:
обрабатывать в программе? работать?
Эти структуры данных настолько
похожи, что их легко перепутать. Но О: Мы как раз собираемся О: Сведения о доступных веб-службах
между ними есть и принципиальная рассмотреть этот вопрос. можно найти на различных сайтах,
D:
разница. Повстречав код объявления таких как www . p rogrammaЫ eweb .
словаря , интерпретатор Python Почему формат называется JSON? с от. Большинство популярных служб
О:
преобразует его во внутреннюю снабжается документацией , например
структуру данных, с которой далее dev . twi t ter . сот И deve l ope r .
работает программа. В случае JSON
Несмотря на то что JSON
разрабаты вался как формат,
spot i fy . с от.
пары "ключ/значение" пересылаются
независимый от языка
по сети в текстовом виде. Так что
программирования, он произошел
JSON и словарь Pythoп - не одно
от JavaScript, а его название
и то же. JSON - универсальный
расшифровы вается как "JavaScript
формат, предназначенный для чтения Object Notation" (объектная нотация
и и нтерпретации любы м языком.
JavaScгipt) .
�ьмumе kapaнgaw П реобразуйте данные JSON, приведен ные на п редыдущей стра н и це,
-� в словарь Python и заверш ите при веден н ы й ниже фра гмент программы,
за пол нив п рочерки. В качестве подсказки сверя йтесь с резул ьтатами
работы п рограммы.
current =
loc =
482 Гла в а 1 0
В еб-службы
url =
, http : / / api. . open-notify
. . orq/iss-now
. -� Эмо енмации
. J SOn
aдpe комор"'й МЬI бзялц
Opel'\ Notify
URL - c,
6 докум
ta tt� ·'":I
�· · · · · · ·
'
••
".o..u
... ·
· .
.
..
.
.
• '
. .
.
..
..
.
.
··
.
·· .
·
··· .
. .
.
. .
" ··
.
.
.·
. .
ft Сербер ope" - мtify .org
L 1'\олучаем Заl'\рос и
. ..
""".е. е '\
.
.. . '
"
:
.
. .. -----
_,
.
...
"
···.
...
u. \ ,..L___
6оз6ра.ща.ем 01У.6ем
'-..,
__. --;о,
·· --
с .-:.......,,,."
.
• • 6 формаме JSON
• • • • • • • •
, .�....'-�··
\·��' ......
\ � ----_ __. ----
--��
.. ...""........
диаrностмческий код, присnанный
.
в ответе. Код 200 означает, что
запрос обработан без оwибсж
······ ·
·· . ....".. Атрибуr headers испоnьзуется дn11
передачи друrой информации об
ответе, такой как тип содержимоrо.
К примеру, кодировка JSON называется
Объект application/ j son
response
resp onse
�
УбедlА МСЯ, ЧМО код СОСМОЯНt.IЯ
\ Ис/\0Л1:>зуем объекм
млученнь� й 8 " О·
response,
/
ра 8ен 200 (з@рос бь�млнен
ус"ешно)
484 Глав а 1 0
Веб-службы
г
Сначмо. L1МмрмL1руем
мод!:JЛЬ reques ts
За м щем в 1'\ер ем енн
ую url
ИRL -,Орг< 8.0- <лу ж5•
import requests
url = ' http : / / api . open-notify . org/ iss -now . j son '
�/
print ( response . text)
else :
рrint ( "Хьюстои , у нас пробпеиа : " , response . s tatus_code )
J
EcЛLI код СОСМОЯНLIЯ не равен 200, вь�водLIМ мексм омбема.
3HO.ЧLIWI, 8о3НLIКЛО. KO.KO.Я-Wt.O ощцбко., ПоМнL1ме: 8 амрL1буме text
мэмому вь�8одцм ее код. Полный объекма response хро.нямся
Cl'\UCOK кодов COCWIOЯHLISI дoCWl!JMH 1'\О до.ннь�е, 1'\олученнь�е ом
адрес!:J h.ttps://rL1.w ikipedio. . or9/wiki! веб-службы
Сl'\uсок_кодо8_сосW\оЯния_НТТР
- - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - -
- - - - - - -
- - - - - - - - - - - -
- - - - -
�[
(·
чем nродоnжата.
Пров ерьте достуnность, nрежде �
на моме нт написания кни ги служба ISS Curгent
полно стью работоспособна, но на будущее никто
Location б�1ла
гаран тии i
t:
J
функ циони роват ь, у нас есть запас ной план : посет t
:
1
http : ; /wick edl ysrnar t .
меня
corn/h
ть в
f l
описа
earnt
нном
ocode ,
далее
чтобы
коде .
узнат ь,
Скоре е f,
нужно ли будет что-то
!
1 всего , ничего делать не п ридется , но лучш е перес
траховаться .
i
1
- - ..., -- -.'"'"!''-� •."!"' �."
- " �, - -.,- - 8'0-"-"'l' --�,��-.,.,-_-Jl!f: ...,..".... .,,"--�-'!'1" ....,.• � !!'!'· ....----"""
----�. � - --�
ЩSЕ ,�� ..
: �::::'
Tecm�в.ъrji 11�,Ает Сохраните приведенный выше код в файле iss.py и выполните
команду Run > Run Module, чтобы проверить работу программ ы .
- - - ;;.;:.:::���=:;· - ---\ BoWI ЧW\О МЬI Для эW1ozo w.ес м - драй6а w.pe бyeWICЯ
мдключение к И н w.ернеW1у
1'\олучцли
�
• Уб те ь, что в о бо nочк е не в ы
Е с м 1:>
' беди с Если возникает подозрение йте
� н:�:::�=:: службой Open No�ify, прочита цдеи , чмо
:
нице. \ эмо за месмо?
врезку "Внимание!" на предыдущеи стра ... _ _ _ _ __ _ _ _ _
:
- --
�--- ---- ---- -- - - - - - -
Сначала необходимо
и м мр м цр о 6а м 1:>
м оду Лt> j s on
г С мрока, содержащ ая данные 6 формаw.е
JSON. Учw1t.Н'И е , ЧW\О дл я Pythм ЭW\О
import j son обычная W\ексмо6ая смрока
j son_s tring = ' { " firs t" : " Eппne tt " , " last" : " Brown " , "prefix " : "Dr . " } '
print (name [ ' prefix ' ] , name [ ' first ' ] , name [ ' last ' ) )
486 Глав а 1 0
Веб-службы
ьs1� �;ga
тесm�вьrj 1l�i\etn Внесите изменения в файл iss.py и протестируйте полученный результат.
"Увижу
П pegcma8uм резуАьmаm
еще ОДНО
8 2рафuчесkом Buge
Отобра жение координат МКС
консольное
в текстовом виде - не лучшее
решение. В конце концов, это приложение
уже глава 10, хочется отобразить
положение МКС на карте или что Python -
то в таком духе. К тому же у нас есть
готовая технология - пора вспомнить
про черепашек и заставить их побегать
увол ю ! "
вокруг земного шара. Это не шутха!
488 Глава 10
Веб-службы
%
Добабляем модуль turtle
turtle . mainloop ( )
\ Сманоармная n.роцедура
заn.уска окна, как б zла бе 7
-500,250 j 500,250
Как вы уже wm, черепаwки сущювуют на сетке,
цмр котором совмещен с Нil'lilllOM коорд11нат (О, О).
Таким обрi13ом,у сетки размером 1000х500 коорд11наты 0, 0
изменя�отСJ1 в дм�паэоне от (-500, -250) вnевом
нижнем уrлудо (500, 250) в правом верхнем уrлу.
Нуле&й мерuдuан
-180,90 j 180,90
Сетка n!ОгрilфмЧЮ(ИХ КOOpдllHilТ СОСТОИТ 113
nараллепей (11мн11й, проходящих с JilПilДil на
восток) 11 меридианов (nинмй, прохоД11щих с севера
на ior). На координатной сетке мермд11аны (дonrora)
0, 0
рисуюта1 от точки -180 до точки 180 градусов
(через точку О проходмт нупевой меридиан),
-
а парамеn11 (широта) отточкм 90 rрадус:ов
(северным non10C) до точки-90 градусов (1ОЖНыii
-180, -90 180, -90 non10C). Нулевая парамеnь назыВilеТОI экватором.
-180,90 180, 90
Можноnerкoсовместмть обе смстемы координат,
воспоnьзовавw11сь следующей 11нструкц11ей:
(�
КOOpдllНilТilM.
С t\ОМОЩ"Ю мемода setworldcoordinates { )
Эмо означаем, чмо дм� nоз1,щиониро6ания координамная семка череt\ащек наклад/716аемся
череt\ашек на экране можно uсt\ол"зо6ам" на сuсмему координам Земли
t\рu6111чн111е щцрому и долгому
490 Глава 10
Веб-службы
Чepenawka- kocмoиaBm
Еще не догадались, как мы собираемся использовать черепашек для отслеживания
положения МКС на карте? Сейчас вы все поймете. С оздайте черепашку и внесите
показанные ниже изменения в файл iss.py.
if ( response . s tatus_code == 2 0 0 ) :
response_dictionary = j son . loads ( response . text)
position = response_dictionary [ ' iss_position ' ]
print ( ' Koopдинa'l'lil МКС : ' +
posi tion [ ' la ti tude ' ] + ' , ' + posi tion [ ' lonqi tude ' ] )
else :
print ( "Xlolocтoн , у нас проб.пека : " , response . s tatus_code )
\3ij:&Г· : . �;;;cp
... Прежде чем продолжить, протестируйте имеющийся код. В несите
Tecm�в.ьrjt n�i\em все необходимые изменения и убедитесь в том , что файл earth.gif
находится в каталоге программы (вы найдете его в папке ch 1 0
примеров книги). Запустите программу и проверьте результат.
Еслц ув1Ао1АW1е макое 1Азооражен1Ае,
значцw�, бсе 6 мрядке. На. данн111 ii
И э мо МоМеНМ Mlil всего лцшt? 1'\ОМенялц
вс е? ра.зрешен 1Ае окна, задал/А фоновое
у цзоораже н1Ае, 1Азменцл1А форМ!:J ----)
ц цбем черемшК IА ц мменял1А
сцсмему коорд1.1нам
/3t11 должн111 у бцдеw�" красн111 ii кружок ,
�no l!lC 47 8'77, ·lП Щ�
,"
1
screen . setup ( l O O O , 5 0 0 ) c� :z.. o кдмалоzа 1'\рuмеров
screen . Ьgpic ( ' earth . qif ' )
s creen . setworldcoordinate s ( - 1 8 0 , - 90 ' 1 8 0 ' 90 )
Необходимосм11
turtle
регисмрuроваw.11
i s s = turtle . Turtle ( ) r- Сообщаем модулю
turtle . reqis ter_shape ( " is s . qi f " ) о 111\ О М, чмо 6 качесмве формы форму являемся
i s s . shape ( " iss . qi f " ) цсмл11з9емся цзображ.енuе особенносм1:>ю
iss . shape ( ' circle ) ·
модуля turtle,
iss . color ( ' :red ' )
Формой черемщкц коморую следуем
� с�мановul'\!\ся фаuл iss.gif 1'\рuням1:> как факw..
url = ' http : / / api . open-notify . orq/ i s s -nov . j son ' Такое мребуемся
далеко не во всех
response = requests . qet (url ) графuческuх
библuомеках
if ( response . s tatus_code == 2 0 0 ) :
response_dictionary = j son . loads ( response . text)
posi tion = response_dictionary [ ' iss_yosition ' ]
рrint ( ' Коордииаты МКС : ' +
position [ ' latitude ' ] + ' , ' + position [ ' lonqitude ' ] )
else :
print ( " XьJOCтoн , у нас проблема : " , response . s tatus_code )
turtle . mainloop ( )
�
J.)op.-..al'>L IШ ·t1 1m, ·l11 6Щ
>»
492 Глав а 1 0
Веб-службы
[
Эмо лцщь фро.zменм кода, в комором
1'\роверяемся омвем ом сервера и
Оl'\ределяюмся щцрома и долzомо.
if ( response . s tatus_code ==
response_dictionary = j son . loads ( response . text)
200) :
i s s . penup ( )
оl'\уско.мь 1'\еро обро.мно,
3aBepweнue nро2раммы
Добавим в программу функцию rnove_ i s s ( ) , вставим инструкции для
извлечения широты и долготы из словаря po s i t i on и, наконец, вызовем
функцию rnove_ i s s ( ) , передав ей полученные координаты.
/
response_dictionary = j son . loads (response . text)
position = response_dictionary [ ' iss_position ' ]
pжint ( 1 Иоординажы мие . 1
1
posi tio11 [ ' lati tude ' ] + · , ' + position [ ' longi tude ' ] )
lat = float (position [ ' latitude ' ] ) ( преобразуем смроки lati tude и longi tude
lonq = float (position [ ' lonqitude ' ] ) 6 значения миl'\а float и 1'\ередаем их
move_iss ( lat , lonq) � 6 функцию move_i s s ( )
else :
рrint ( "Хъвк:тон , у нас проСSпема : " , response . status_code )
turtle . mainloop ( )
494 Глав а 1 0
Веб-службы
[ М К.С д61Ажемся со
скоросмью 7.� кмJс
МК.С облемаем Землю каждые q;z. М1Анум1�1,
r.оэмому за"'усмrАме "'роzрамму несколько раз, �
чмобь� у61Адемь, как меняемся мложенrАе МК.С
Поэдравnнем!
Миссия выnоnнена!
Тренuруем моз2
П росто невероятно: с помощью столь простого кода нам удалось определить положение М КС
и отобразить его на карте мира. Чтобы сделать приложение еще более впечатляющим, нужно
модифицировать программу так, чтобы положение отслеживалось постоянно, а не разово. Этим мы
сейчас и займемся, но сначала немного подчистим имеющийся код, упаковав его в удобные функции .
Зря, что л и , м ы и х т а к долго изучали? Вот переработанный вариант программ ы , который стал намного
более понятным.
def main ( ) :
qlobal iss
screen = turtle . Screen ( )
setup ( screen) Н 1:1конец, n.равилом хоро ш его
track_iss ( ) мона являемся созданuе
= "
if name main ".
функции main ( )
ma in ( _
)
_
turtle . :шainloop ( )
496 Глав а 10
Веб-службы
И так, ниже приведен код отслеживания положения МКС в режиме реального времени . Запустив
программу, вы сможете получать координаты Международной космической станции кажд ые 5 секунд.
В этом упражнении вашей задачей будет понять, как работает данный код. В нимательно изучите его
и постарайтесь догадаться , как все происходит. Объяснения будут даны в следующей главе .
window . setup ( l O O O , 5 0 0 )
window . bqpic ( ' earth . gif ' )
window . setworldcoordinates ( - 1 8 0 , - 90 , 1 8 0 , 90 )
turtle . regi s ter shape ( " is s . gi f " )
i s s . shape ( " i s s . gif " )
def track i s s ( ) :
url =- ' http : / / api . open-noti fy . org/ i s s - now . j son '
response = requests . get (url )
if ( response . s tatus code == 2 0 0 ) :
response dictionary = j son . loads ( response . text )
pos i tion-= response_dictionary [ ' i s s_position ' ]
lat = float (posi tion [ ' lati tude ' ] ) с t'\ОМОЩ11Ю эмоzо кода можно
long = float (posi tion [ ' longi tude ' ] )
move_iss ( lat , long)
6цдеw.11, как меняемся t'\Оложение
М К.С кажд,,,е s секунд
else :
print ( " XъJOC'l'oи , у нас пробпеиа : " , response . s tatus_code )
widqet = turtle . getcanvas ( )
widqet . after ( 5000 , track iss )
.
_
def main ( ) :
global i s s
screen = turtle . Screen ( )
setup ( s creen)
track_i s s ( )
�САМОЕ fllABHOE
498 Гла в а 1 0
Веб-службы
2
3
4
5 6 7
8
9
10
11
12
13
14
15
,..
9ПРАЖНЕНИЕ
(РЕШЕНИЕ]
Введите следующий URL-aдpec в браузере. Что вы пол уч ите?
{
[ М К.С. Слобо.рь содержим несколько ключей, r.ричем ключ i s s_y o s i tion
содержим сбой но.бор r1.o.p "ключ/зно.чение" (щироме1 и долzомо.)
о. 6 м
"me s s age " : " succes s " , Ф о р м о.м1.1 р о 60. н 1.1 е з 1.1 с1.1
з р о.. Неком орь� е
" time s tamp " : 1 5 0 0 6 6 4 7 9 5 , ом бро. у е
б ро. у зе рь� м ozyWI дюк е
Во м чм о Mt>I
" i s s_pos i tion " : е де
зazpyЖ.a W\ti оа ннь� 6 61.1
t'\OЛ!:jЧIAЛIA ---='; { ф й
м е ксW106оzо а л а
" longi tude " : " -110 . 6066 " ,
" latitude " : " - 5 0 . 4 1 8 5 " �
}
}
r Учl'Vlиме, чмо щ upDWIO. и долzоме1 rtредсмо.блены
6 смроко6ом 61.1 де. Их нужно бyдel'VI r1.реобразо61.1мь
6 значения миnо. float nеред 1.1сnользо60.нием
��зьмumе kapaнgaw
,,� Peweнue П реобразуйте да нные JSON, при веденные на п редыдущей стра н и це,
в словарь Pythoп и заверш ите приведе н н ы й н иже фра гмент п рограммы,
запол нив прочерки. В качестве подсказки сверя йтесь с резул ьтатами
работы п рограммы .
}
loc = current [ ' location ' ]
500 Глава 10
Веб-службы
•
ш
и 2
3 р д
xr�oon�rn. :
д 4 и з о б р а ж е н и е
о т е
5
�e,R}ie,
к л ю ч а 6 й 7
г 8 п с м
о 9 у с т а н о в к а
т 10 п к н с
11 з а п р о с а е
т к т
в 12 о
13 т е к с т о в ы й
т л к
у 14 а в т о р и з а ц и я
ж
б
15 р е ф а к т о р и н г
_._ *
Инrеракrивные возможносrи
*
+ ·1
СIАЛОНЬIХ
Эмо tла8а для
yru>pньi
духом. &удt�ме
6Ь1,
1А мр!Jдолю61А
н1Ае
r\ро1161Аме мер�
мо
1А насмоuч1А8ос
�
504 Глава 11
Виджеты, события и непредсказуемое поведение
Я когда-то похожим
образом разводил морских
обеэы1нок. Неплохой бизнес
может получиться!
J
CЧUl"\дtM ЧЦtЛО te сосеоеЦ
других ....рuмеро8
чuсло соседеiА = о чuсло соседеiА = З. чuсло соседеiА = :i чuсло соседеiА = 3 чuсло соседей = 4 чuсло соседеiА = 3
:-:
• • •
• •• •
• •
'\!, J J �
-.ь J!:J
/.\, nрц двух при м.рех Еслu у клемкц 13 ....
усмой клемке,
К.лемка, у к.лемк соседях клемкд 4 (s, 6, 7...) рядом с коморой
одuн соседях клемка
комороii неw. кow.opoiA соседей, онд мри жи61�1е клемки,
/.\еМ ""Родолждем ""родолждем
соседей, умирае м сосед, умuр умuрдем ом здрожддемся жизнь!
rА6/.\ жuмь жr.смь
01111 одuночес11611 /.\ orA одuночес
J 1
1'\tрендселеннос/"Ац
J J • •
l J•
•
Интерактивные возможности 505
Правила игры "Жизнь"
с. Усмоilчи8ые фигуры,
коморь�е осмаюмся
неизменными, если
.....
'"1'
." ·.-
1�· ·
·::· ..· . ··:
"
.::1:. 1 ••:.:·
: �·
-·
·
·
с.,
t.•· " ·=·
= Хаомично
·::. = � меняющиеся
. n
а смрукмуры
1
:�1
= =
:- ;:..
."
�··
.r
-...:
! �
. .
!
'Г:.r
·=:i!-·J =
а
.:: .:::• !.· r:
-::·
=
,"·.
D
R
". �" J.• Чем 8се закончимся?
-· 1 .".-··
•L
.
".
И закончимся ли Вообще?
.
�
"-.
Еоцнсм8енныil смсоб
n !J3HaWlt> - Эal'\!JCWIЦW\t>
= u 1 .,
модtлиро8анце
506 Глава 11
Виджеть1, события и непредсказуемое поведение
(
поколении.
. . . . , " . " . . .., • • 11 11 1111 • • " • 111 • • • 111 11 ' • • " " 111
• 11 11 • 18 1 11 " • • 11/ 1111 11 11 11 111 1 111 11 11 1111 111 " • 11 • 111 1 111 111 • • 111
:: !:
;:
-
·. . . - = ::_;
;ъ-
.- .z: :a-·1.. ::: -· :! с:: ···
:··-.···1-·· .· ·. .. -·
• n ::.
• • :- •
1 .1 .
••
-· . ..." ..1.... -1 1
·-· -· :1.
••
':':!
:_
; ..=_ -: • .. •
= " .
··:: •• rAi.t
·. • 1 .
·l.1;!" 8 эмоu o6мc
":.. ·
:··· ."
. ·=··:- .ёJ·:: . мо)!{но 6!JOtrA
;· ... . i
·.;:
·1: . ·
·1�-. •; ' ·· ·· щелкамь оля
• · 1= ·i 6кмочен1.1я 1.1
.··1 • ·!! ..
:. ..·1 : .1.
·==· • ..1:1· 6171ключения
ВнlАЗ!J .Эолжн1�1
находцмься --7'
( Start/Paцse
J (Сhооя А РАШm v) \Ctи!J
мрц K.HOl'\KIA
' \
К.но"ка Start за"ускаеw� Эмо не KHOl'\Ka, а набор 8арцанмо8 К.Ноl'\ка Clear
моделцро8анце, 1'\ре8ращая 8Ьtбора. nрц щелчке мя8ляемся османа8лц8аем
сь
8 кно"ку Рацsе. К.но"ка Рац
sе Cl'\IACOK zoмo81i1x щаблоно8, моделцро8ан1.1е.
османа8лц8аем моделцро8ан с комор1�1мц можно заzрузцмь 6ь�ключая Все
це,
снова смано8ясь КНОl'\КОй цzp!J. Еслц б1�1л за"ущен "роцесс
Start клемкц
моделцро8анця, он "рекращаемся
508 Глава 11
Виджеты, события и непредсказуемое поведение
г
тесrt1цро8анце удо5см8а
Дu 3 а ii и 8 ре ku 8 ре w 8 и U Я t.1Сl'\ОЛ113О8анцЯ 1'\реОl'\ОЛаzаем
"рц8леченце конечн1�1х
Отдельным этапом создания симулятора будет проектирование и l'\OЛti308art1eлei.I 8 качесм8е
тестирование графического интерфейса. На практике этим занимаютс мгсмцро8щцко8
профессиональные дизайнеры, которые берут деньги за свою работу.
Но даже если в нашем распоряжении нет многотысячного бюджета Сценарцц цсмле�зо8анця -
эмо на5ор оl'\ераццiА цлц
J
на тестирование удобства использования, существуют простые и
эффективные методики, которые помогут нам улучшить создаваемый деiАсм8цй, 81�1млняем1�1х
интерфейс. Одна из таких методик - бумажное nрототиnирование, мцl'\цчн1�1м мле�зо8амелем
которое заключается в рисовании макета графического интерфейса
на бумаге (уже сделано!) с последующим моделированием сцmариев rro мненцю сl'\tццалцсмо8, эма
исnолъзования, когда тестовая группа пользователей пытается работать с 1::- мемодцка мз8оляем 81�1я8цме�
макетом так, как если бы это был полноценный графический интерфейс. до 8 � ошц5ок 8 ра5оме
Применение такой методики позволяет понаблюдать за тем, как zрафцческоzо цнмерфеiАса
работают реальные пользователи и какие ошибки они допускают.
�
� - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ---
НПРАЖНЕНИЕ
страницу и обрежьте рисунки по обозначенным границам. Пригласите нескольких
друзей, положите перед ними прототип и попросите ответить на несколько вопросов
(их список будет приведен далее).
1
1
Можеме 81�1резаме�
эмом ша5лон 8
качесм8е о5ра3ца
цнмерфейса '-Pf
( Start
J (Choou а Patttrn v) \Cle�
Осно•ноi 11нт•Р+еiс
· - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -----------------------------------------------------------------�- � --------·
1 -;=.:
1
_
L С·:• : 1
r
-:;;·!.:··-: � -
• ==· .::!·· • -: =·• :· - 1 "."·!::--·. .
• • 1
1
•
•
:••
] . Р-
•, .:;·! •
. ·:
.
: •
1
...
·=· 1 .:" ··. =
.r··· -
·-·
· • •• • •,:·-· •· ·.=.
=-
•
1 • •1 • L. 1 i . •••
:
. ••
i
•
. . =q;·
..
• •• :;• •
••· .=! 1
· · s:c
·•••.• - ··•=
i·· :, ··· : · =- - :.
1
i ·i·i·
i · :.
: - ·:· .::: • - • .: • :- • • ::·. 1 . : =·- .=!_
.
J- · •-••J-
1
• ·
: .
1 C -
• ·
! :. :. -: · :.:.:: ..;:.
.
: ·:i::- i:·i. " -..=:=:s• :::
1 · ••· .. r
:.: :.:
•. . .!...... . =• 1: r·u --·- • = . . =·· -:.�. ·;:;•. .. i• ·=· •1 1•.•
1: i • -: "
·r:··.• · •
. = .
.••- • • .1 •·.·• -=
- · 1 · • :.• ·:а:.: 1
1.• •• ·-
"
81
• 1: s..C
...· j .
·":.:=···
:
..
.· r·=··
·. . . . ".... ..
• •
•••
"•:::.: -. _: --i: : :Г. 1L11 : •1•1 ц·i ··:::··•Li.· • �:.· ::
·=:! =
...
·
i Ч.
"
•
• .
• •
·- "
r •· -:.: : · J.:
•
"··=...
.
· ·,:.
- .:1 .1 •. •.
• • u·•=l1 i .
·= =·� � ъ
= ....
1jl1.
·: . .::.
·
•
:3.Р
r .:;.:
•
·
••. • ·• ··1.: . ; • •. : .
•
·=:. •• .::• i
·... " ....
-::
·.� ·U
• •-.•
· ..••• •r ".
• ••
•• •
.". • ·
•
• ···
" . . •• ·: .·· а ;·. :; :.
. : . ··.·· =- ·. "= "=:.··· = · == ·.:·· : • · · -· ··== .·· ·-
...!
.-1
• •
. •
:;::-
:• : · ·· - · ··· • 1 • :·· ·· ::
.1 • " ·1 •· ·В.:
• .·:�: i :·:1:.:.:.;·:- 11 ":
� � "�:;. • ! L;�··- .� { i
:1 .: : . ·"ш-·
·==· •..
....
• ..1 . •. 1 . ••• ··1J •••-
·.: - • ··- ; а r"·· : ·:•81
•
... •
··-· .:
·:!· •
.. . : • ····F ··I=
а :
••. • •
•• ••... ::.-··.-: .• •" ·:· 1 •• •
: • 1:3· ::.·. =:.: :1=,·1
= • • • i 1 • =-·-=·= •.,:.::.• ".!.: .:
1 • ••
·• -1 •
•• • :•. .
•
-·
1 .: ·=·=..· 11
г
.
1·1
. 12
1:
1: .=:· 11 •:.
j
r
:.
li- =!'•:. 1 •
• "
.
"
:..
·,i
:r
..,.
:r
,_ -
Choose а Pattem
-
Rando� 13tJ1реж1:1ме кaжotJ1iA злеменм м
( Pause
] Чlider oмoeлt:iHOCl'V\U. Bcezo !J бас будем
'. КноnuРаuи Чlider цщ, шесмt:� злеменмо6 (ceмt:i с yчel'\l\oM
'.. .-.редtJ1оущей С1'\1\ранмц1:>1}
.''
Сnмсок "Р••нтоа
'
�-----------------------------------------------------------------------------------------------------------------------------------�
'
510 Глава 11
Виджеты, события и непредсказуемое поведение
�НИ!
Н иже описан сценари й , которого должен придерживаться кажды й пользователь-тестировщик.
Попросите друзей комментировать вслух все свои действия по мере в ыполнения уп ражнения .
Фиксируйте все совершаемые и м и ошибки и случаи неправильного использования элементов
интерфейса . Можно, конечно, отмечать и те блоки , которые работают правильно.
Если далее пользователь скажет, что нужно щелкнуть на варианте Random (Произвольный
шаблон) , уберите прототип "Список вариантов" и поместите на игровое поле прототип
"Конфиrурация Raпdom".
Скажите пользователю, что он только что загрузил шаблон с произвольным расположением клеток.
4. Спросите у тестировщика, понимает ли он, как начать моделировать следующие поколения клеток.
Дождитесь, пока пользователь выберет кнопку Start (Начать). Если этого не произошло, дайте
пользователю несколько подсказок. После выбора кнопки Start положите на игровое поле прототип
"Конфиrурация Raпdom в движении". Также поместите прототип " Кнопка Pause" поверх кнопки
Start. Объясните пользователю, что он сейчас наблюдает процесс генерации новых и гибели
существующих клеток.
5. Попросите тестировщика очистить игровое поле. Если он не может найти кнопку Clear (Очистить),
дайте ему несколько подсказок. После выбора кнопки Cfear уберите прототипы " Конфиrурация
Random в движении" и "Кнопка Pause".
9. Попросите тестировщика загрузить фигуру Glider Gun (Планерное ружье). Когда он выберет кнопку
Choose а Pattem, поместите поверх нее прототип " С п и сок вариантов". Как только пользователь
выберет вариант Gfider Gun, уберите прототип "Список вариантов" и поместите на игровое поле
прототип "Фиrура Glider Guп".
1 О. Попросите тестировщика начать моделирование. Как только он выберет кнопку Start, поместите
прототип "Фиrура Glider Guп в движении" поверх игрового поля и прототип "Кнопка Pause" -
поверх кнопки Start. Объясните пользователю, что он сейчас наблюдает генерацию бесконечного
потока фигур в виде планеров, перемещающихся по решетке.
11. Сообщите пользователю о том , что этап тестирования завершен, и поблагодарите его за участие.
Cyщecw.6yew. целое
Код предсrавления Контроллер Код модели за н имается
у п ра вляет элементами п олуча ет за просы только вы чи сл е н ием на.-�ра6ление разрабоw.ки
и нтер фейса . О н не от п ользователя данных для и грового .-�рограммноzо обесмчения -
свя за н с пр оцессом ( н а пр имер, начать п оля и кл еток. а та кже шаблон"' .-�роекw.иро6ания,
модели рова н ия , и г ру) и п р еоб разует расчетом сл едующих
коw.ор"'е обобщаюw. o.-ii,iw.
за н имаясь лишь их в за просы к п околен и й . Он не свя зан
отображе н ием да н ных предста влению или с п редставлени ем
создания .-�риложениi:i
в иг ровом п оле модел и
51 2 Глава 11
Виджеты, события и непредска зуемое поведение
ФормuроВа н u е pewemku
Для построение решетки мы будем хранить массив целых чисел, в котором
значение О обозначает мертвую клетку, а значение 1 живую. -
Вы уже знаете, как в Python создаются линейные списки, но сейчас нам нужно
получить двухмерную структуру, характеризующуюся шириной и высотой.
Как создать двухмерный список? Вложив один список в другой . Предположим,
необходимо получить решетку размером четыре элемента в ширину и три
элемента в высоту. Это можно сделать следующим образом.
my_qrid = [ [ О , 1 , 2 , З ] ,
к--....
[4 , s , 6 , 7] ,
Смоделиро6ам11 д6ухмерную
[8 , 10 , 1 1 ] ]
решемку можно с помощ11ю
9, сr.цска. Сl'\иско6
�
�
value my_qrid [ 2 ] [ 3 ]
� nомниме: индексы
OW\ О!
print (value )
=
счимаюмся
nолучим11 значение 6 ячейке на 1'\ересечении
сW1роки с номером 2. и смолбца с номером 3
Итак, давайте создадим список для хранения клеток на Изучuмг эмом код u убедuмесь,
решетке. чмо он дейсмВuмельно создаем
сrшсок Cl'\ucкoB размером З.ООх З.00
heiqht = 10 0 t(---- 13 эмих д6ух глобальн1:>1х 1'\еременн111х
width = 100 хра.нямся ширина. и 6111с ома. семки Можно б111л о б111 1'\редl'\Оложим11,
чмо значения Cl'\IACKa должн111
qrid_model = [ О ] * heiqht
nомниме 1'\рс.6ила умножения Сl'\иско6
� /АЗ главы 4? Здес/1 созда.емся Сl'\иСОК, � б1:>1мь булевыми (м.к. клемка.
либо жива, либо мермва).
for i in ranqe (heiqht)
число нулей 8 комором равно height
� проходим 1'\О каждому элеменму
Такой 6ыбор был бы 01'\ра.вдан,
qrid_model [ i ] = [ О ] * width
:
однако исl'\ол11зование цел1:>1х
Cl'\IACKO. grid_model и заменяем его
чисел снижаем сложносм11
Сl'\иском, число нулей в комором
кода, уl'\рощая подсчем жив111х
равно width
соседей клемки
def next_gen ( ) :
global grid_model
j
тrрохо.Эим 1'\О каж.Эой ячейке
.Э8ухмерного Сl'\иска ...
for i in range ( O ,
for j in range ( O , width) :
Эw.о 8ложеннt>1й Сl'\исок:
".и оl'\ре.Эеляем, бу.Эеw. ли .Эля каждого значения i
Расчеw.ЬI 1'\ро8о.Эяw.ся
клеw.ка grid_model [ i ] [ j ] МЬI r..рохо.Эим 1'\О каждому
.Эля каж.Эой клеw.ки
жиw.ь, умираw.ь или значению j
рож.Эаw.ься 8 следующем
раун.Эе
51 4 Гла в а 11
Виджеты, события и непредс казуемое поведение
[
решеw.ку, а макже номер сw.роки
и смолбца и 8оз8ращаеW\ число жи81�1х
соседей для заданной ячейки
count = О
Здесь приведен готовый код. В ам нужно
if row- 1 >а О :
просто ввести его (ил и скопировать из
папки с исходными файлами). Наверняка
count = count + qrid [ row- 1 ] [ co l ]
вы легко поймете, как он работает (в нем
i f col - 1 >= О :
живых соседних клеток, а учесть, что
клетки, находящиеся у края решетки , имеют
count = count + qrid [ row] [ col - 1 )
меньше соседей , чем внутренние клетки.
return count
r � ""'"' " " "
Факмцческц эw.а функцця grld_modol[row-1J[coQ
�--·-"� 7:
• 111 . 11/ 111 111 .
клемок к счемчцку соседей grld_modo�row-1J(col+1J
заданной клемки
)�
К.од усложняемся, l'\OWloMy grld_modol(row][col-1) � !lll �
,..,..._
.. ,_"
чмо необходцмо учцмы8амь
1'\оложенце клемок на краях
цгро8ого мля
grld_modol[row+1J[col-1J
r- grld_modol(row+1J(col+1J
orld_model[row+ 1 ][col]
п
t\рд61.1лд 1.1гр111
�
1 def next_qen ( ) : t мь�
фрагменм м111
1
. . . . . Q
1
собрали Зд 8ас
qlobal qrid_model
.! .·
1 ce l l = О
1
д
1 8 l t
:���llе:' t
if count or count З:
2
== ==
-
cell =
;
. 6
if count elif qrid_model [ i ] [ j ] == 1:
l cell = 1
"11111
11 -
1!18 111281-·
if qrid_ ��de 1 [ i ] [ j J =.= O = •t coun t
2
< :
i f count >
1
.
cell = О
; . 8 count = count_neiqhЬors
( qri d_mode l ' i
• , J" )
51 6 Глава 11
Виджеты, события и непредс ка.зуемое поведение
•ь;1:-г�� Прежде чем двигаться дальше, давайте упорядочим имеющийся код и протестируем
Tecm-.n.r ЧJ!в его, чтобы потом не было неприятных сюрпризов. Скопируйте приведенный ниже
код в файл model.py и не забудьте включить в него функцию, оп исанную в разделе
"Готовый рецепт". Пока что программа не делает ничего особенного, но проверить ее
работоспособность не помешает.
height =
width =
100 Соед1АН1АМ код, 1'\рu6еденныii
100 на 1'\редыдущцх смраницах
grid_model [ i ] = [ О ] width
Вом мы 1'\О Л!:JЧ1А лц.
* Не СЛIА ШКО М Мн ого,
def next_gen ( ) :
но ЭWI O WIOЛl:ll<O нача
ло
global grid_model
if grid model [ i] [ j ] == О :
смроку, ко м ор а я
if ёount = З :
бсмабл ена для целеu
cell = 1
месW1ир о6ания
elif grid_model [ i ] [ j ] = 1 :
if count = 2 or count == З :
cell = 1
-
def count neighЬors (grid , row , col ) :
& romo&ыo
'\. Bcмaбiiw.e целиком \!!1 reцen m
функци ю из раздела
_}
if narne main-
" ГОW\Обыii рецеl'\IМ11
==
next_gen ( )
' ·
-
Интерактивные в озможнщ;·ти • 51 7
Завершение кода м о дели
]j:
for i in ranqe ( O , heiqht) :
for j in range ( O , width) :
next_grid_model
Зачем менять местами
cell = О
и gri d_model? Почему нельзя
решетки
print ( ' Проверяем JCJieтxy ' , i , j )
count = count_nei9hЬors (9rid_model , i , j )
просто присвоить переменной
if qrid model [ i ] [ j ] == О : grid_model значение next_
if count == 3 : qrid_model?
О:
cell = 1
elif qrid model [ i ] [ j ] == 1 : Такой вариант подходит,
if count == 2 or count == 3 :
cell = 1
next_qrid_model [ i ) [ j ] = cell
только если вычисляется одно
единственное поколение. Но
temp = grid_model
если вычисления продолжатся ,
-
после 61:>1чцсленця клеw.кц сохраняем next_grid_mode l и grid_
- ее в coow.6ew.cw.6yющeii мзцццц mode l, ссылающиеся на оди н и
решеw.кц next gr i d_model
_
тот же список , и воспроизведете
указанную выше проблему.
К.огда рещеw.ка next_grid_model
Чтобы избежать этого, мы перед
1'\ОЛносw.1:>ю 61:>1ч1.1слена, необходцмо
вычислением каждого следующего
l'\pe6paw.1.1w.1:> ее 6 рещеw.ку grid_model.
поколения меняем переменные
Для эw.ого меняем цх мecl'llla MIA
местами. В результате
переменная grid_mode l будет
хранить текущее поколение, а
в перемен ную next grid
mode l будут записьlВаться
значения следующего поколения.
51 8 Гла в а 1 1
Виджеты, события и непредсказуем о е поведение
import random
ьо�: ·З• Выполним еще один тест. У нас пока нет возможности визуализировать модель (для этого
Тест -дr�в придется создавать пользовательский и нтерфейс), поэтому все приходится тщательно
тестировать. Приведем имеющийся код целиком.
height = 1 0 0
width = 1 0 0
Продол жение
randomize (grid_model , width , height)
создания решемки
следуем."
'--"
if qrid_model [ i ] [ j ] - О :
Новое значение : 1
Проверяем кпетху 99 91
if count =
Новое значение : о
cell =
З: Проверяем кпетху 99 92
elif qrid_model [ i ] [ j ] ==
1 Новое значение : о
Проверяем кпетху 99 93
if count == or count ==
1:
Новое значение : о
cell =
2 З:
Проверяем кпетху 99 94
next_qrid_model [ i ] [ j ] = cell
1 Ново е значение : 1
qrid_model � next_qrid_model
Проверяем кпетху 99 96
Л--
next_qrid_model = temp
Новое значение : О
( • Гоmо&ь�О
l'щаtт
print ( } для
месмирован1Ая
Новое знаvение : 1
Проверяем кпетху 99 99
Новое значение : 1
if name - main
>»
next_qen ( )
·
'
�НИ!
Ч mо gадьwе?
Мы проделали большую работу, почти завершив
создание модели данных для нашего симулятора.
И хотя он е ще н е ум еет отображать р е шетку с живыми
Прежде чем двигаться
и м ертвыми Юiетками, он расс читывает и сохраня ет их
дальше, удалите из функции
для каждого следующего поколе ния.
next_gen ( ) оба вызова
Как бы там ни бьто, файл model.py уже можно функции print ( ) - ОН
рассматривать как готовый модуль, а значит, пор а больше не понадобятся .
п ер еходить к разработке пользовательского интер фе йса,
с помощью которого мы буде м визуализировать модель
данных и управлять ею.
\ Не забудьме
об эмом!
Нас ждут новые задачи !
520 Глава 11
Виджеты, события и непредсказуемое поведение
Эkранное npegcmaBAeнue
Готовы наблюдать эволюцию на экране? Пора увидеть все своими глазами.
В этом разделе мы займемся созданием экранного представления для
нашего симулятора. Нам понадобится встроенный модуль Tkinter,
позволяющий создавать графические интерфейсы с использованием
типовых элементов управления, таких как кнопки, текстовые поля, меню
и пр. В модуле Tkinter они называются виджетами. Ниже показаны
виджеты, которые мы задействуем в приложении.
�
.r ' 1 · ·
i · 1 :а!". . :... .
i�....
. множесм8о к8аЭрамцко8,
11 1 �
'"'
j:- ·.••• , - ·,.., · r:: - ! --i' .. " ' · �� 1 .' ,';1 !�
- :.а • 1 • - • s..
""редсмавляющих жцвые
.
"-· :.ir.·
- 1• 1 ··u - · )
-
1. � • :-t- "" :;,,.�. :..a.=t " .,. . • • rc
клеw.кц
" _
1s1 ..a.'lfa • •• · • · :- ч·� · •-'.:.·•·· .,J'• . . ·." ·;.м
:е::·..а:.•.'.;.:.•i•..1;.-а:• •Г. r"•••• 1 . . . : 1 :.··::St : !
. :. • • ._.-;. " � " 'I
. • . ·:. ."
1 ·а ..:а.
.т: -
: -. -; . " .....".. :г -:
1'1. .t:r
" -·1
··.�·
" • r l IJ " ,:r, 1 . ...." :.8:J'=s
.
1 ":1-tf �i! � . " • •• ·•
• •1" ". :i)"
:
i- "·"·• • "....(.. чrt . ··=·.1 :.- --_. • • • •"
;;'"!�
•
1
"
• -::· .;
. • •· . ... -t" . :
••
=-1 · �" •· �. '1 • ;-:".:•.
.
• ::-._
_-.а ':: :." •' • 1 -:" .. • i:.r '
r · .•
- · 1_ .•"r••:J• 1'1t. • i ·
• - .• ·
ГI' • :•r .' ' 11 ·- ,!--. F•
•- -: ,. l1 1
Р' •1 1 _.. -11•;. . i:':•.1
. io
, ..J!:
а "• 1
.
.а: "=r" 1
1
11·1 • -.· • . . • -
• • •- .::- 1 1 •
.=:-.: .. • -; r 1J·.--
:aJ�·-��:;;V,'1-�
•• ' •.• • �
'1: 1
� 1.1:{(!: Р :Ч�i
iw!
.lr.
•
1 -:;:
, �._:!!• rr: ... ••
· •
:" ·,� .&. -i. r_,
·
J..." Г�
.,.
. • --. •. • t ;, Е:
• ] �--·- Li" ·;_!.1 =i'·.hG' ::"/ .� :,, -:
. •
а
i.: г: :
-• -
.
rf
•� ·"� •q.1 J:
•
1 •• • ,1•_ •.r (':• . �
.... .
_.
�-
а. а:А.:.
" !:
.
1-
r
-
. "' • .....
. '. -..
-./ �
. " ." of• 1i"a'IJi
: =--- " .
- "'11
. .:
1•
1
· . r; •
J.i.Sj ..r "' _-.i • "it·�=i .=i:i1.· " r �·:
• :-ч '
•
-.• ,' ':-'.а ..fа;:Ь: i
•
")
glider в1.1Эжеw.-КНОl'\1<а
gltderg-un
random
Start - эмо
в1.1Эжеw.-кнома
Зw.о в1.1джtW1 Сl'\цска Выбора;
он 1'1.ОзволяеtоА выбцрамь цз
набора Эосму....ных варцанмов
�
:from tkinter import
Создаем нобое окно
Окно Верхнего уровня ) с 1\О Мощ11ю класса
* Tk
root = Tk () �
наз171ваюм корне6171М,
� Задаем сw.року заzолобка,
root . ti tle ( ' 'l'he Gаше o:f Life '
мэмому М171 создалц
мременную root -.JТ ) оw.ображаемую Вверху окна
J
Наконец, как ц в случае с Эма команда 1\росцw. модул11 Tkinter ммес l'\-\ цw.11 кноl'\ку
череl'\ашкамц, нужно 1\ередаw.11 6 окно мам, где эмо Возможно. Такая функцця наз1716аемся
уl'\рабление модулю Tkinter, менеджером комl\онобкц, о чем М 171 Вскоре мzо8орцм.
мз8олив ему обрабам1716ам11 Когда 6 окне омображаемся нескол11ко в1.1джемо6, менеджер
щелчкц ц другце дейсмбця коммнобки 1\ОМоzаем мзuццонцро 6ам11 цх
1'\ОЛ17зо6амеля к_ Эмо функцця цз модуля Tkinter, ц нам не нужно 1'\ред6арям11
ее 6171зо8 цменем модуля, коw.орый б171л целцком uммрмиро8ан
522 Глава 11
Виджеты, события и непредсказуемое поведение
v
одного 1'\икселя, 1'\Оэмому необходимо ОбьяВляем глобмt�нь�е мременн1�1е
насмроимь размер1�1 окна u 1'\ереходим к Виджемам
def setup ( ) :
gloЬal root , grid_view , cell_size , start_button , clear_button , choice
Обрамиме Внuмание
(
на аргуменм1�1 с
root '"' Tk ( )
ключе811fМи сло8ами:
height=lllode l . height*cell_size ,
холсм для рuсо8анuя клемок.
borderwidth=O ,
К.онсмрукмору 1'\ередаемся
highlightthickness=O ,
много аргуменмо8, маких
start button = Button (root , text= ' Start ' , width=l 2 ) +-- Эмо знакомая KHOl'\Ka Start,
clear button = Button ( root , text= ' Clear ' , width=l2 ) � но нужна еще KHOl'\Ka C/ear
choice StringVar (root)
V- Создаем Сl'\исок Выбора,
option = OptionМenu (root , choice , ' Choose а Pattern ' , ' glider ' ,
а
option . pack ( )
8иджемо8 8 окне, 1'\Оэмому для
� и другие 6идЖеМ"4, НО здесt� ecмti
clear_button . pack ( )
каждого 8иджема 8111зt�16аемся
ряд 6ажн111х аргуменмо8, комор1�1е
мемод pack О
Mtil Вскоре обсудим
-
if -name- -main-
1 .
г
13ом наще окно. nомниме,
ЧМО его вид зависим ОМ
оn.ерационной сисмем1�1 Х:- Для сравнения: вом наш n.лан
• 1he Oame of Llfe
ТМ t:;a� oF LiFe
Stвn
C�aPattern
( Start/Pawss J @Ом.• Pottan. v\
Clur
I
UcnpaBдeиue мakema Расn.оложение в смолбuк
не мо, чмо нам нужно
-
524 Глава 11
Виджет1о1, со61о1тия и непредсказуемое поведение
,...
-
•-i,.
·:·
ri.I
., -
1
.-
- .
:) ·�·
• 11 .11 Ь
- .J""• .q.d:.
••
.•
·-·
·:· Ji- ·=·
.f.!.
.р
..•..
IS
·:·
j
�
k ме эмо смрокой о,
коморая 3анцмаем мрц
,""i = .�· � �·
ч 11 li
r. " ч -· ii:i
смолбца ц содержцм
ii.: ·
;;i- 1 . -
'1,'1 :_� .... .J.- {�> о:.
··-··1 . .
'!' 8цджем холсма
"
счем начuнаемся с о
..
- 1 "..
с•" .
·
..ь-·
·:"1 ·=·
r� :) -�ч"-1
-·
1 j
_"
Эмо смрока з., содержащая
мрц смолбца, 8 каждом и3
( Start/P�иst
) [C'
i.oou • Pattm. v} crr@
коморО/Х находимся 8иджем
�
t t t
К.ноl'\Ка Start: Виджем Сl'\иска: К.ноl'\Ка Cleat':
смрока З., смрока з., смрока з.,
смолбец о смолбец з. смолбец 2.
Kogupo8aнue мakema
Определившись с расположением каждого виджета, нужно
Холсм grid view доба8ляемся 6
_
передать менеджеру компоновки их координаты на сетке.
/ смроку семки u 3анимаем мри
о
j
oмcмyl'\ti1 для наглядносмц
grid_view .grid(ro.,..o , colWDnapan•Э, padx=20 , pad:y-20)
g:r:id
_wiew.pack()
аta:r:
t _butt
o 1
1.pa
ckО Найдиме эмом код 6 файле view.py
c
3:
e a:r:_
b utto
n.pa
ck() и замениме следующим кодом \
o
p t
ioн.pak()
c \j/
qrid_view. qrid(row=O, columnspan=З, padx=20 , pady=20)
start_button .qrid(row=l, column=O , sticky=W, padx=20 , pady=20)
option . qrid(row=l, column=l , padx=20)
clear_button. qrid(row=l, column=2 , sticky=E , padx=20 , pady=20)
а." (St4rt/Paiш
Пе €:oi1mecь
'Зада:Ваmь :Во�ось1
1': Почему окно верхнеrо уровня называют корневым?
содержит набор опций, а каждая из них снабжена
подписью. Аналогии с корнями дерева часто
По аналоrии с корнем дерева?
встречаются в компьютерных науках: корень файловой
526 Глава 11
Виджеты, события и непредсказуемое поведение
.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . " . . . . . ..
О:
реализуя функциональность каждого элемента интерфейса.
CALL next_gen ()
[
Tkinter речь идет о таких именах, как
rтроходu м ко.ждую
клeWIK!J моделu
Button, T k и другие названия виджетов) .
F O R переменная i in range(O, height): Тогда текст программ ы можно сделать
FOR
более коротким и понятн ы м .
переменная j in range(O, width):
Если клеW1ко. жибо.я, здкр о.шu6о.ем
cel l = model.grid_mod el [i] U] � соо 1'1'\6е мсм 6ующuu 1'\uкс ель
I F cell == 1: 1/_- 1'\редсW10.6ленuя
D RAW черная клетка в точке (i, j) решетки gri d_view
def update ( ) :
global grid_view
/ Удаляем все, ЧW\О eCW\11 на ХОЛСW\е, С 1'\ОМОЩ11Ю
мемода dele te ( ) обьекма Canvas
В1�1чцсляем следующее
/
grid_view . delete (ALL) :11
Слеиуем
model . next_gen ( ) 1'\ОКОЛенце КЛеWIОК :11 :11 ...
� 1'\Сев11окоиу
Функцця draw_cell ( )
млучаем номер смрокц
ц смолбца, а макже цвеW\
J �� г
Эмо чцсмо
7
эсмемцческце
насмройкц
def draw_cell ( row , col , color) :
global grid_view , cell_ ize Здес11 в1�1бцраемся цвем конмура
"'рямоугол11нцков. В случае черн1�1х
if color == ' Ьlack ' : "'рямоугол11нцков он сер1�1й
outline = ' grey '
else :
К.оордцнаW\111 левого верхнего
outline = ' white '
� угла "'рямоугол11нцка
grid_view . create_rectangle (row*cell_size , /.t:::'
К.оордцнам1�1
, �
col*cell_size ,
'<'"'"
t row*cell_size+cell_size , � ,,./ / V\равого нцжнего
\
небол11шой ....рямоугол11нцк, fill=color , outline=outline )
�
"'редсмавляющцй клеtv1ку Указ111ваем цвем залцвкц
""' "'рямоугол11нцка ц цвем
·
его KOHWlypa
528 Глава 11
Виджеты, события и непредсказуемое поведение
ЬОt7т-�-
.r•e:• 1 ,.
Код симулятора становится все более интересным. Откройте файл view.py
Tecm-дfi\iiв и добавьте в него функции update ( ) и draw cell ( ) . Также не забудьте включить
в него вызов функции update ( ) , чтобы протёстировать работу программы.
def upclat• ( ) :
тrомимuме функцuю
global grid_view
update ( ) меле функцuu
if color == 'Ыасk' :
outlin• 'grey'
а:
elae:
outlin• • 'whit• '
if -name- .
-шain- '
=
aetup ( )
update ( )
�
� ·.
-.
�":..
: >•-�
'f
.1r - _;. ,,,'":,.')
�=it.,,... ,
� ; ':':f'?
�4 .'=:
.= �" f..;
м
" ,:W_ ·.·
. . • . u
·:
.· �
шainloop ( ) . - ·· -
� 13сма8оме 81Хзо8 функцuu update ( ) � � r:.t;�
�f:r..' ·4 'L·� �
. 11.' '' • "t , ''1 � , :�"':· \.r.
�"!·:i:
�,�:
• •
·� .,"'?."'
,
k_
"
..../8(-'
..t. 1 • "_ " ...... <'.. k ....
,·
".:Т
�- "
"!-·u
..Z.'!J, • · � · .
·· • . • •·• •
�i
.. 4
• ;.11 r tJ
1.,;�.)."i!./ � ';:. .�·•r.......:
.
• •
·
{>
,....· .. ·-,;·
rr�
t• :4. ;.
• ··
�
,"",,_.'У!
• ·· .,."
..r""·
�;_:\ � ). .,. "•
::... ',�·· · .....--с.·"-.
- . ·,. :--rt ....
" •
.... • •-
�
1. : -.
:-
· -
. ·�·- 1
у
:,.". . (P.
-.-
_")• •• .:
�i.,._i '":"�
• -no:
,
" �
�
. :lt4_
...., · · ,:
·
'
:f. -·�···
'.
•
,
.:. t "
•
' ·;:i
13ом ч�о м111 млучuлu.
Уже лучше! ...� �:18:'z
..
:r(,':
...
... . L!
1 � • {'( '•.-•". 1
r
·j:t..:.r-
,
�,
,
•
•
..
,"� "
�
�J
:.
-r:
.
"'
;::-1'".;;.i:
:. ....
t :-•.
. - -.f�
.1r
• _r.,. -- � •
,
. -:.,
• 1
.1. -=- _"
•
. :,дl. �
". •
- --·- -
Sta rt
def s tart_handl.er ( ) :
print ( " Вu ще.пхнупи на хнопхе S tart . " )
print ( " Cпacибo , что обра!l'ИJIИ на меНR внимание ! " )
530 Глав а 11
Виджеты, события и непредсказуемое поведение
fvfew.o д Ьind ( )
можно
! И нмересующее на с
щелчке на KHOl'\Ke 8ызt11 8 аласи
функция s tart handle r ( )
_
r
Обрабомчикам ...ере даемся объекм собымия, содержащий
Мы щелкнул ц на кноУt.ке
Start несколико раз
�;::;,1
t<:.аждый раз r.р ц щелчке вызываемся
функция s tart_handler ( )
Получается, при
таком стиле программирования
приложение только и делает, что
.
ожидает каких-то действий или событий
в пользовател ьском интерсрейсе?
532 Гла в а 11
В uджеты, события и непр ед сказуе мо е по в едени е
�
root . after ( l O O , update )
t � ЭWIO функl.(иЯ update О ,
К.аЖеW\СЯ, ЧW\0-WIO 1'\ОХожее КОW\Орую Мtн уже наl'\исали
бtнло 8 1'\роzрамме, коW\орая
омслежи8ала мложенце М К.С
в главе з.о
Start Pau se
cell_size = 5
is_runninq = Fal••
� И ници ализt.tруем
is_running = False
глобал1>н ую t'\tр еме нную
значением False
61 $-; �::ga Обновите файл view.py, внеся в него указанные изменения. Запустите
Tecm -n.r�в программу и пощелкайте на кнопках Start и Pause. Вычисляются ли при этом
новые поколения клеток?
534 Гла в а 11
Виджеть1, события и непредсказуемое поведение
В секунде :/.ООО
м1.слл1.ссекунд
у объекt111а Tk nер81:11й apгyMtHt\I\ - Эt\110
i
Отлично, все
сработало как обещано! Функция
update О была запущена спустя
100 миллисекунд, как я и хотела.
Спасибо, объект root!
(f'
..@озьмumе kapaнgaw
�-�
Изучите приведенный ниже код. Что, по-вашему, он выводит? Как работает
эта программа? Сверьтесь с ответом, приведенным в конце rпавы.
root = Tk ( )
8;!,уем
count • 10
def countdown О :
countdown ()
-inloop ()
536 Глава 11
Виджеты, события и непредсказуемое поведение
grid_view.delete(ALL)
JllOdel . next_gen ( )
Щt:�!-�� Тот случай, когда все решает единственная строка кода. Внесите изменения
Тесm-дf�в в файл view.py и приготовьтесь увидеть, как программа превращается
в полноценный симулятор игры "Жизнь·.
r f•. L .11
L
ь'.:••".
.::�:�о::'
1 •' •
- . . -�r
!- Ч.:.1
··.s.:J :.1 Г· ·:� :l.•:I)
Зw.о уже не � ·...
• ·.а • i
:
:1 ·:ь:
·
.
:. • �
81>1zля.Эцw. как L'•· .._r, 1
"= .
1 11
• ·
::
ii.
·.
· ::;
-
·:.::с-i . ·". "
•
;•.-r :i
.
•-:1
" ·=-·
м экрану? Обласм�.с хаоса, ".; .
�j:-:.
.
1 "•
коw.ор1>1е w.o мя8ляюмся, : r
181.r
. _,
.•
...
-...::rJ
11
w.o цсче.заюw.? "• " ·=·
r_
••
:: .
_
... "
·: .·
538 Глава 11
Виджеты, события и непред сказуемое поведение
Что должна делать кнопка Clear? При щелчке на ней переменная is running
должна стать равной Fal s e , а все клетки должны обнулиться . Кроме того, на
кнопке слева должна снова появиться надпись "Start" . Наконец, должна быть
вызвана функция update ( ) , которая обновит игровое поле (когда все клетки
обнулены , поле будет пустым).
Используя код обработчика событий для кнопки Start в качестве образца,
напишите код управления кнопкой Clear.
if is_running :
is_running = False
s tart_button . configure ( text= ' Start ' ) �
else : Эмо обрабомчик s tar t handler ( ) ,
_
138едиме здесt>
с8ой код
. ��
Когда напишете код, сравните его с нашим вариантом , приведенным в конце главы,
после чего добавьте его в файл view.py и протести руйте программу.
"·· ...
..
:
�:�::::: � �::t:�:
=:
U (.м..1 . 9%
...-.i.
сЬ:мr -U. pU:
(�
-
x, у, I•) (у) • О
!4 ..м.1(•1 (у] 1):
.J.";
..rмkl p-id. у, -
-
.
't&J.t.e')
-.deJ.l•J (у]
и-_.uс•. ·�·1
1
06реботчм11
ТJользо8амель щелкаем
на 11.zро8ом мле
540 Глава 11
Виджеты, события и непредсказуемо е по веден и е
.
Нужно п онять, что должна делать функция grid_handle r ( ) Как насчет такого
поведения : если пользователь щелкает на б елой (мертвой) клетке, она должна
окрашиваться в черный цв ет и становиться живой? Н о если клетка уже черная, она
становится мертвой и меняет свой цвет на белый. При этом клетка меняется не только
в представлении, но и в м одели данных.
Рассмотрим пр ограммный код.
1Щli:it�t�. Добавьте фу н кцию gr i d_handl e r ( ) в ф айл view.py сразу же п о сле фу н кции s etup ( ) .
Тесm -дr�в И н е забуд ьте встав ит ь в ы зо в м етода Ьind ( ) , как показа н о н иже . Наконец, пора
удалить вызов функции randomi ze () из файла тоdе/.ру, чтобы начинать с пустой
решетки. �
Не 1'\роl'\усмиме эмом эмо.1'\ )
qrid_view . grid (row=O , columnspan=З , padx=20 , pady=20 )
qrid_view . Ьind ( ' <Вutton- 1> ' , qrid_hancЦer)
В модуле Tkinter цмееl'\l\сЯ обьекWI для хр().ненця ЗН().Ченцii. УсW1ан().8лц81).еМ ЗН().Ченце обьекWI().
в д().ННОМ случ().е МЬI созд().еМ обьекWI, Xpl).liЯЩIAii Cl'\l\poкy, choice р().8НЬ!М ' Choos e а Pattern ' .
и 31).1'\1АСЬ181).ем ezo 8 мременную choice
J
ЭW10 Hl).ЧMf:IHЫii 8арцанW1 Выбор().
�
8 8иджеW1е
choice = StringVar ( root)
choice . set ( ' Choose а Pattern ' )
option = OptionМenu ( root , choice , " Choose а Pattern " ,
\
" glider" ,
" glider gun" ,
" random" )
option . config (width=2 0 )
Дмее СО301).еМ Cl'\IACOK Выбор(). 1А �peOQeM ему
r
обьекм Н().шего осно8ноzо окн/). (к().К ЭWlo 8сеzд().
бы81).еWI 8 случ().е с 8цджеW11).Мц), 1'\еременную
для хр().ненця сW1рокц ц Н().бор 81).рц().нмоВ,
Для 9лучщен"' 8нещнего коморые 1'\ОЯ8ЯWIСЯ в Cl'\IACKe
Вид(). р().смягц81).еМ 8иджем
до ширины 20
542 Гла ва 1 1
Виджеты, события и непредсказуемое поведение
�
ранее объекм S tringVar модуля Tkinter
def option_hand.ler (event) :
global is_running , start_button , choice
Османа8ли8аем ri.poцecc
is_running = False � моделиро бания и сбрас1:>18аем
сосмояние кноr�.ки Start про8еряем, какое
start_button . configure ( text= ' Start ' )
� переменная
значение 8Ь1брал
choice храним объекм
1'\Ользо8амель, и
J
selection = choice . get ( ) s tringvar со значением, коW1орое либо загружаем
1'\ол11зо8амел11 8111брал 8 сl'\иске. У соом8емсм8ующую
if selection == • glider • : объекма StringVar есмь мемод ge t ( ) фигуру, либо 8Ь1зЬ18аем
model . load_J:1attern (model . glider_J:1attern , 10 , 10) функцию randomi ze ( )
Учмиме , ч мо нам еще
elif selection == ' glider gun ' : необходимо наl'\исамь
model . load_J:1attern (model . glider_gun_J:1attern , 10 , 1 0 ) функцию load_раttern () ,
а макже Оl'\ределимь
elif selection == ' random ' : фигуры
model . randomize (model . grid_model , model . width , model . height)
А
update ( ) Если 1'\Ользо8амел11 8111 бираем
temperature = Strin9Var ( )
temperature . trace ( "w" , my_handler)
544 Глава 11
Виджеты, события и непредсказуемое поведение
qlider_pattern = [ [ О , О , о , О , О] ,
[О, о, 1 , о , О] ,
О , о , 1 , О]
[О , '
Замечаеме сходсм8о?
1 , 1 , 1 , О)
[О ,
[О' О, О, о , О]
,
) � '---?f
t А здесо? )
•
•
•
••
�НИI Вам не нужно вводить этот код вруч ную. Откройте папку с материалами к главе 1 1 ,
найдите в ней файлы glider.py и glider_gun.py и скопируйте их содержи мое
в конец файла model.py (сразу после функции count neighbors ( ) ). Тестировать
пока нечего, п росто убедитесь в отсутствии синтаксиче ских ошибок.
За2рузчu k wа6Аоно8
Теперь напишем код, который будет загружать выбранную фигуру на игровое
поле. Все, что должен делать загрузчик, - получать двухмерный список и
копировать его содержимое (нули и единицы) в модель данных . Только
'
предварительно следует очистить решетку, заполнив ее одними нулями.
М111 будем
"
fJyдy/'VI. /'V\.акже мддержи8аl'Vl.t�ся
зazpyжal'Vlti
домлни/'V\.елt1н111е смещения ri.o
1
фиzур111 ,
осям (х, у) для фиzур111
коr�.цруя их
8 Cl'l.UCOK =
grid_model
г Mtll
помнцw�е, в главе s
)
го8орили о мом,
В tP!JHKЦIAЮ l'V\aKЖe r�.ередаЮМСЯ два дpyzux чмо у l'l.elpaмewipo6
Функцця млучае/'V\. фиzуру apzyмeнl'Vla, задающих смещение по осям моzум бt11 W1t1 значенця
(l'Vlaкyю, как r�.ланер цли (х, у), чмо мз8оляем ori.peдeляl'Vlti ле8ую м умолчанию?
манерное pyжtie) 8 8ц0г Верхнюю клеW1ку фиzур111
ОВухмерноzо сr�.цска
!.. � )' [
Вниманце: здесt� имееWI
месмо дублирование кода
(Взгляни/'V\.е на обрабоW1чцк
def load_pattern (pattern , ._. . ..,, у_." . . ... .
clear_handler ( ) ). СмоиWI
global grid_model
ri.eperi.иcaмti код 8 будущем,
Обнуляем
У- Все клеl'Vlки
for i in range ( O , height) : чмоб111 усмранимt� ненужную
for j in range ( O , width) : избымочносмt� (счцмайме
grid_model [ i ] [ j ] • О эмо домашним заданием)
_ � Задаем переменнt11е i и j
j = y_offset �/�
ра8нt11 м ц смещенцям
for row in pattern : � "1. проходим м каждой клемке фигурt11
i = х offset ц назначаем ее сооw�8еw�см8ующей
for value in row : ячейке решемки grid_mode l
grid_model [ i ] [ j ] = value
i = i + 1
j = j + 1
546 Глава 11
Виджеты, события и непредсказуемое поведение
щ-1- !J::tF
Добавьте в файл mode/.py приведенную на предыдущей странице функцию
Tecm -n.� �в load_pattern ( ) , расположив ее сразу после кода шаблонов. Теперь наконец-то
можно приступать к полноценному тестированию симулятора и гры "Жизнь"! На
протяжении главы мы рассматривали отдельные его фрагменты , поэтому ниже
приведен весь исходный код п рограммы.
model.py
import random
height = 1 0 0
width = 1 0 0
grid_model = [ О ] height
next_grid_model = [ О ] height
*
def next_gen ( ) :
global grid_model , next_grid_model
i f grid_model [ i ] [ j ] О:
if count == 3 :
==
cell = 1
elif grid_model [ i ] [ j ]
if count == or count
== 1:
3:
cell = 1
2 ==
next_grid_model [ i ] [ j ] = cell
temp = grid_model
grid_model = next_grid_model
next_grid_model = temp
count = О
if row- 1 >= О :
count = count + grid [ row- 1 ] [ col ]
if ( row- 1 >= О ) and ( col- 1 >= О ) :
count = count + grid [ row- 1 ] [ col- 1 ]
if ( row- 1 >= О ) and ( col+l < width) :
count = count + grid [ row- 1 ] [ col+l ]
if col- 1 >= О :
count = count + grid [ row] [ col- 1 ]
if col + 1 < width :
count = count + qrid [ row] [ col+l ]
if row + 1 < height :
count count + grid [ row+ l ] [ co l ]
if ( row + 1 < height) and ( col- 1 >= О ) :
count count + grid [ row+l ] [ col- 1 ]
if ( row + 1 < heiqht) and ( col+l < width) :
count count + qrid [ row+ l ] [ col+l ]
return count
glideryattern = [ [ О , О , О , О , О ] ,
[О , О , 1 , О , О] ,
[О, О , О , 1 , О] ,
[О, 1 , 1 , 1 , О] ,
[О , О , О , О , О] ]
glider_gunyattern = [ [ О , О , О , О , О , О , О , О , О , О , О , О , О , О , О , О , О , О , О , О , О , О , О ,
О , О , О , О , О , О , О , О , О , О , О , О , О , О , О] ,
[О , О , О , О , О , О , О , О , О , О , О , О , О , О , О , О , О , О , О , О , О , О , О , О , О , 1 ,
О , О , О , О , О , О , О , О , О , О , О , О] ,
[О , О , О , О , О , О , О , О , О , О , О , О , О , О , О , О , О , О , О , О , О , О , О , 1 , О , 1 ,
О , О , О , О , О , О , О, О , О , О , О , О] ,
[О , О , О , О , О , О , О , О , О , О , О , О , О , 1 , 1 , О , О , О , О , О , О , 1 , 1 , О , О , О ,
О , О , О , О , О , О , О , О , О , 1 , 1 , О] ,
[О , О, О , О , О , О , О , О , О , О , О , О , 1 , О , О , О , 1 , О , О , О , О , 1 , 1 , О , О , О ,
О , О , О , О , О , О , О , О , О , 1 , 1 , О] ,
[О, 1, 1, О, О , О, О, О, О, О, О, 1, О , О , О , О, О, 1, О, О, О, 1, 1, О, О, О,
О , О , О , О , О , О , О , О , О , О , О , О] ,
[О , 1 , 1 , О , О , О , О , О , О , О , О , 1 , О , О , О , 1 , О , 1 , 1 , О , О , О , О , 1 , О , 1 ,
О , О , О , О , О , О , О , О , О , О , О , О] ,
[О , О , О , О , О , О , О , О , О , О , О , 1 , О , О , О , О , О , 1 , О , О , О , О , О , О , О , 1 ,
О , О , О , О , О , О , О , О , О , О , О , О] ,
[О , О , О , О , О , О , О , О , О , О , О , О , 1 , О , О , О , 1 , О , О , О , О , О , О , О , О , О ,
О , О , О , О , О , О , О , О , О , О , О , О] ,
[О , О , О , О , О , О , О , О , О , О , О , О , О , 1 , 1 , О , О , О , О , О , О , О , О , О , О , О ,
О , О , О , О , О , О , О , О , О , О , О , О] ,
[О , О , О , О , О , О , О , О , О , О , О , О , О , О , О , О , О , О , О , О , О , О , О , О , О , q ,
О , О , О , О , О , О , О , О , О , О , О , О] ]
548 Глав а 11
Виджеты, события и непредсказуемое пов едение
j = y_offaet
next_gen ( )
vi ew. py
from tkinter import *
import aodel
cell_aize = S
ia_running = Fal ae
def aetup ( ) :
global root , grid_view , cell_aize , a tart_button , clear_button , choice
root = 'l'k ( )
root . ti tle ( ' 'l'he Gama of Li fe ' )
i s_running = False
s tart_button . configure ( text= ' Start ' )
i f selection ==
' glider ' :
model . load_pattern (model . glider_pattern , 1 0 , 1 0 )
elif selection ==
' glider gun ' :
model . load_pattern (model . glider_gun_pattern , 1 0 , 1 0 )
elif selection ==
' random ' :
model . randomize (model . grid_model , model . width , model . height)
update ( )
if is_running :
is_running = False
start_button . configure ( text= ' Start ' )
else :
is_running = True
start_button . configure ( text= ' Pause ' )
update ( )
is_running = False
for i in range ( O , model . height) :
for j in range ( O , model . width) :
model . grid_model [ i ] [ j ] = О
i f (model . grid_model [ x ] [у ] ==
1) :
model . grid_model [ x ] [у ] = О
draw_cell (x , у , ' white ' )
else :
model . grid_model [ x ] [у) = 1
draw_cell (x , у , ' Ыасk ' )
550 Глава 1 1
Виджеты, события и непредсказуемое поведение
def update () :
qloЬal 9rid_view, root, ia_rwшing
llOdel. next_9en ( )
for i in ranqe ( O , llOdel.height) :
for j in ran9e ( O , llOdel. width) :
if llOdel. 9rid JDOdel[i] [ j ] == 1 :
draw_cell (i, j , 'Ьlack ' )
if (i• runnin9) :
root .after(lOO,update)
qrid_view .create_rectan9le(row•cell_size,
col*cell_aize,
row*cell_aize+cell_aize,
col*cell aize+cell aize,
fill•color, outlin8-outlin•)
if _n..._ - __in_' ·
aetup ( )
update ()
111&inloop () . (.' Тhе Gameol Llfe
· ·=- �".
" ·J
�··
..
.
.:.
Cyf\tp! Тг�рь можно
•J
8до8оль f\оцграмь
манерным ружьем!
-:::r .:.
•J
.:.
...
.:.
·J
.:.
�
Чмо6ы млучимь эмом рцсунок, 8ь16гриме
шаблон gllder gun ц щглкниме на KHOf\Kt Start
Pa<Jse gбder gun CI-
Отличная работа!
Симулятор игры ·жизнь"
просто великолепен! Дайте знать,
если захотите обсудить стратегию
продвижения. Могу предложить
рекламу в книге.
-----
�CAМOEFIAIHOE
• Порождающий код генерирует • При создании пользовательских
результат, который невозможно интерфейсов обычно
предугадать путем анализа кода . придерживаются событийно
ориентмрованного, или
• Игра "Жизнь" была придумана
реактивного, стиля
математиком Джоном Конвеем.
программирования.
• Процесс создания графического
• В модели реактивного
интерфейса отличается от
программирования мы создаем
привычного процедурного стиля
функции-обработчики, которые
программирования.
вызываются при наступлении
• Бумажное прототипирование - определенных событий.
это методика тестирования
• В модуле Tkinter обработчик
графического интерфейса до его
события привязывается к виджету
программной реализации.
с омощью метода Ьind ( ) .
• Мы спроектировали графическое
• Большинству обработчиков
приложение, разделив его
передается специальный объект,
на модель, представление и
содержащий дополнительную
контроллер.
информацию о событии.
• Tkinter - это модуль Pythoп,
• В большинстве языков
предназначенный для создания
программирования существует
пользовательских интерфейсов.
возможность запуска обработчика
• Модуль Tkinter позволяет события по истечении
добавлять в приложение определенного периода времени.
виджеты - программные
• У объекта Tk имеется метод
объекты, реализующие элементы
after ( ) , позволяющий
пользовательского интерфейса.
запланировать выполнение кода
• Основное окно программы через заданный промежуток
представляется объектом Tk. времени.
552 Глава 11
Виджетьt, события и непредсказуемое поведение
- - - - - ·
- - - - - - - -
· - - - - - - -
1
�зьмumе kapaнgaw
� Peweнue
Прежде чем приступать к написанию кода, попробуйте вручную проследить
за судьбой нескольких поколений клеток. В качестве начального используйте
поколение 1 и вычислите для него поколения 2-6, применяя правила игры
·жизнь� Повторим их еще раз:
•
мертвая клетка, у которой три живые соседние клетки, оживает в следующем
поколении;
• живая клетка, у которой две или три живые соседние клетки, продолжает
жить в следующем поколении;
• живая клетка, у которой менее двух живых соседних клеток, умирает
в следующем поколении;
•
живая клетка, у которой более трех живых соседних клеток, умирает
в следующем поколении .
111 • " 111 1 • lill 111 111 • 111 • • 11 llf llfl/ " 11 " • 11/ 18 • " 111 111 • " 111 " • 111
111 11 • 11 llf • 111 111 111 • 11/ 111 • 11 11 111 1 " 111 11 • 111 " 11 11 11 111 1 11 . 111 111 111
554 Глава 11
Виджеты, события и непредсказуемое поведение
Ко� на маrнити:ках:
решение
Вам повезло! Пока вы изучали код, приведенный во
врезке "Готовый рецепт", мы не стали терять время
и создали функцию next_gen ( ) , код которой записали
на магн итиках, прикрепленных к дверце холодильника.
Но, как всегда, кто-то решил усложнить нам задачу
и все перемешал . Не поможете восстановить исходный
код функции? Только будьте внимательны : некоторые
магнитики могут оказаться лишними.
1 def next_gen () : t
l �
а
gloЬal grid_model
4 .1 1
1 1
6 следующем мколенцц,
cell = О мэмому гомо8цмся заранее
J.!MJ_ _
1 ; � � �
_ __ "С
coun
� = count_ne ghЬ rs rid_model , i , j )
l i f grid_model [ i ] [ j ] == О :
;. ; 2 1 J
i
1 if count � 2З : ' Здесь реалцзуемся
У\ра бцло рожденця
1 � ce l =1
1 t Здесь реалцзуеw.ся
У\рабцло ЖIАЗНIА
l elif grid_model [ i ] [ j ]
Ад 11 д А эW10 не У\Онадооцлось
l _
i f count - 2 or count
1 ;
= З:
1
1 cell = 1
1
2
�tt&!зьмume kapaнgaw
� Pe we н ue Мы не можем считать код функции next_gen ( ) завершенным, есл и он
тестируется на решетке из одних нулей. Напишите функцию randorni ze ( ) ,
которая, получив решетку заданной ширины и высоты , случайным образом
заполняет ее нулями и единицами.
import random
��зьмumе kapaнgaw
'�-" Pe w e н ue Изучите приведенный ниже код. Что, по-вашему, он выводит? Как работает эта
программа? Сверьтесь с ответом, приведенным в конце главы.
О!руем моз2
root = Tk ( ) при каждом новом вызобе она манцруем следующий
count = 1 0
вызов Cl'\!:)CW\Я одну секунду, мка омсчем не дойдем
Как думаете, это def countdown ( ) : до нуля, мсле чего функцця завершаемся
реку рси в ная global root , count
фун кция ? • tk
-------1'
r\\ if count > О :
С мехнической W\ОЧки print ( count)
count = count - 1
зрения функция никогда root . after ( l O O O , countdown )
не выз"1ваеW\ саму себя. else :
ВмесW\о ЭW\ого она l'\poc1.1.W\ print ( ' Вsпет ! ' )
556 Глава 11
Виджеты, события и непредсказуемое поведение
� НИЕ
[РЕШЕНИЕ]
Что должна делать кнопка Clear? При щелчке на ней переменная is _ runn ing
должна стать равной Fal s e , а все клетки должны обнулиться . Кроме того, на кнопке
слева должна снова появиться надпись "Start" . Наконец, должна быть вызвана
функция update ( ) , которая обновит игровое поле (когда все клетки обнулены, поле
будет пустым).
Используя код обработчика событий для кнопки Start в качестве образца, напишите
код управления кнопкой Clear.
if is_runninq :
is_runninq = False
start_button . confiqure ( text= ' Start ' ) �
else : Эмо обрабоW1чцк s tart_handler ( ) ,
is_runninq = True комор1:�1u мслужцl'VI 1\рцмером
start_button . confiqure (text= ' Pause ' )
update ( )
Дру2оu nogxog
k cmpykmypupoB a н u ю nро2рамм
Помните, в главе 1 мы обсуждали навыки, которые
понадобятся вам для изучения программирования?
Первый из них заключается в умении разбивать
сложную задачу на последовательность более простых
действий, а второй предполагает освоение языка
программирования, на котором вы сможете описать
эти действия компьютеру. К настоящему моменту вы
преуспели и в том, и в том.
Все это замечательно, поскольку полученные знания
навсегда останутся с вами и послужат основой для
разработки программ. Но существует и другой подход
к структурированию программ, поддерживаемый почти
всеми современными языками программирования и
предпочитаемый профессиональными программистами.
Он известен как объектно-ориентированное
программирование (ООП ) , с которым вы успели вкратце
познакомиться в главе 7.
В ООП, вместо того чтобы описывать привычный
алгоритм решения задачи с помощью функций, условий
и т.п. , мы моделируем набор взаимодействующих
объектов. Это непростая тема со своим жаргоном,
своими методиками и приемами программирования.
В то же время данный стиль программирования
зачастую оказывается более интуитивно понятным при
решении самых разных задач, в чем вы вскоре убедитесь.
Объектно-ориентированному программированию
посвящено множество книг. В этой главе мы
Помнwме класс1:11 , о комор1:11х __..;r постараемся понять саму суть ООП, чтобы вы научились
анализировать объектно-ориентированный код. Вы
zо8орцлосt1 8 zла8е 7?
достигнете того уровня, когда сможете создавать
собственные классы и применять их в программах.
Получив базовые знания, вы будете готовы продолжить
самостоятельное обучение.
560 Гла в а 12
Обьектно-ориентироеанное программирование
rfpoцeдypHЬIU criocoб
З) включить электричество;
� аналuза задачu
nомнuме, в главе 7 MtJI
4) отрезать кусок хлеба;
zоворилu о мом, чмо
5) удерживать его на расстоянии 2 см от нагревателя; все объекм1�1 создаюмся
6) держать хлеб до полной прожарки; на основе классов) а макже
обладаюм амрuб!lмамu
7) убрать хлеб; (сосмоянuем) и мемодами
8) выключить электричество. (мведенuем)?
·�U:�лu -----.
Крис, 39 лет,
руководитель проекта
О6ыкт Player
061.скт Paddlc
562 Глава 12
Объектно-ориентированное прогр а ммирование
.
name
... сосмояние, Оl'\uсываемое
age
weight � амриоумами . .
;;
Прежде чем писать код класса, нужно понять, как он будет
вводц w111 илц заl'\ус каw�ь
применяться. Вот пример кода, в котором задействован будущий
класс Dog. эW1ом ко
)
создаем
двух собак
Замем 6t>tзь�ваем с разн t>tми
мемод bark ( ) , амрибумами о
ЧW\OOt>t услt11 щ ам" о
каждую из собак"
(
мочнее, меW1од, а не функция, l'\OWloMy ЧW\о он
оl'l.ределен внуw.ри класса
clas s Doq :
def �init� ( self , name , aqe , weiqht) :
self . name = name
sel f . aqe = aqe
� 13 w.еле консмрукумора
насмрацваюмся амрибум111
self . weiqht = weiqht объекма: имя, 6oзpt1Cl'V\ и вес
Обыкт Dog
Эw.о наш нобый объекм Dog, w.олько он
/\ока чмо не содержим никаких аw.рибуилов
564 Глава 12
Объектно-ориентированное програ ммирова ние
с
его s e l f.
после за.Вершения 8морого
Далее 81:11з tн8аемся консмрукмор эмаt\.:1 соз.Эанн1:11 u объекм
класса с t\ере.Эанными ему Dog t\рuс8аи8аемся
аргуменмами и о.Эним nарамемру self
.Эомлнением".
l
init ( , ' Тузих ' , 12 , 3 8 )
def init
\ 1 f \
( self , narae , age , weight) :
объекма Dog
Ho8t11 u объекм Dog мре.Эаемся
8 качесм8е nер8ого аргуменма
1
def _ini t_ ( self , name , age , weight) :
self . name = name � поскольку self - эмо но6111 й
объекм Dog, МЬI 3дt\UСЬ18аем
значения name, age и weiqht
self . age = age
self . weight = weight
8 амрибумt11 соз.Эанного обьекма
Пе t:oumecь
з адаваmь Во11rось1
О:
содержит инструкцию return, и тем зарезервированным словом?
s e l f для глобальных и локальных
не менее конструктор возвращает
переменных.
Нет, это просто общепринятое
О: }j:
значение?
соглашение для названия копии
При запуске конструктора объекта, которая передается Получается, что атрибуты
интерпретатор Pythoп выполняет целый в качестве первого аргумента объекта - это всего-навсего пере
ряд скрытых операций . Во-первых, метода init ( ) при вызове менные, хранящие самые обычные
О:
создается новый объект, затем конструктора. Назы вать параметр значения?
он передается в качестве первого именно так совсем не обязательно.
Так и есть. В атрибут, как и
аргумента методу init ( ) , и, Тем не менее программисты стараются
в переменную, можно записать
наконец, этот объект возвращается придерживаться подобных соглашени й ,
любое допустимое значение Python .
при завершении конструктора. Именно чтобы не сбивать никого с толку.
И предваряя следующий вопрос:
так работает встроенный механизм
создания объектов в Pytho п . � методы - это функции Python , которые
объявляются не в общем коде, а внутри
Во мноz lАХ объекw�но-ор1Аен wшро8аннt>1Х
язt>1ках 1'\.роzраММ1А ро8ан1Ая цмеюw�ся объекта . П равда, у них есть одно
аналоz1АЧНt>1е соzлашенця, wioлt>кo с другцм отличие: параметр s e l f, с которым вы
ключе8t>1М сло8ом, на l'\.рцмер this уже познакомились.
Щt �.
j
М етод bar k ( ) еще н е н а п и с а н , но и ме ю щ и йся код можно п ротест и р овать и без н е го .
Tectn-д.f �B С ко п и руйте п р и веде н н ы й н иже код в ф а й л dog.py и запустите е го .
(1
class Doq :
Эмо не самый
def �init� ( self , name , aqe , weiqht) .
ра.ццона.лt>Нt>IU Cl'\.OCOO
Эмо на ш self . name = name
вывода цнфорМаЦIАIА
новыи класс". self . aqe = aqe
о собаках, но Вскоре
self . weiqht = weiqht
1�
6ы у81Адцtv1е, ко.к Все
МОЖНО !JЛ!JЧLUIAW\t>
функи,IА.q def print_doq ( doq) :
возраст - ' doq . aqe ,
••• t<
для вывода print ( doq . name + ' ·
в функц цю
print_dog ( )
Все ро. бо w.о.ем м а. к,
как 1А ОЖ!АОО.Л ОСt>! �
566 Глава 12
Объектно-ориентированное програ ммиров ание
M emog bark ( )
Прежде чем писать код метода bark ( ) , нужно понять разницу
между функциями и методами. Понятно, что методы определяются
в классе, но у них есть и другие особенности. В частности, способ
вызова: метод всегда вызывается для об"бсн:mа. Например:
f
tuzik . bark ( )
o.iь.....
j ackson . bark ( )
class Doq :
def init ( self , name , age , weight) :
self . naшe = name
/
мом же сцнмаксцс,
self . weigh переiJаемся обьекм, iJля комор ого он 8171з8ан
чмо ц функцця
(другцх 1'\арамемро б у мемо да нем)
if se lf . we iqht
бес собаки ц, еслц
> 29 :
�
.---7 V он 1'\ре8171шаем Z q,
print ( self . n81118 ,
1
' .пает " ГАВ - ГАВ " ' )
Всегда 81718одцм " ГАВ - ГАВ",
LICl'\OЛt13!JUMe else : 8 1'\ромц б ном случае
мрамемр self print ( self . n81118 , ' .пает 81718одим "га8-га8"
":riaa -raв " ' )
для досмум
(
к амрцбумам
В каждом случае
об't>е к ма
nоскол1:1ку 8 качесмбе пер8ого аргуменма М/71 макже 81'18одцм
Всегда 1'\ередаемся обьекм, для коморого имя собакц
6171зь�8аемся мемоiJ, к аргуменмам эмого
обьекма можно млучцми досмуl'\ через
1'\арамемр s e l f
prin t ( )
print ( self . name , ' nae'l' "ГАВ-ГАВ" ' ) Функцця с на чала
6ы8од!.(WI а 1Мр цбу1'\1\ name
568 Гла ва 12
Объектно-ориентированное про гр а ммиро ва ние
��ьмumе kapaнgaw
-�
В главе 2 мы нап исал и п рограмму, которая оп ределяла возраст
соба ки по человеческим меркам. Доба вьте в наш класс Dog метод,
реал изующий та кие вычислен ия, и назовите его human _years ( ) .
Метод не требует аргументов и возвращает целочисленный резул ьтат.
co •u акv?
, . ")
?
doq_name = input ( " Kaк SOBYIJ.' •8ШУ
вашеи соб аке . " )
doq_aqe = i. nput ( " Схопъко nelJ.'
w
Н емно20 о нacAegoBa н u u
Предположим, что в приложении требуется
описать новый класс - служебных собак Так 8"'глядuм дuаграмма класса
поводырей, обученных помогать людям. Servi ceDog, наследнемого ом
Это те же собаки, но с дополнительными класса Dog
характеристиками. Нужно ли все начинать
заново и писать класс S e rviceDog с нуля? Это Dog
бьvю бы нелепо , ведь мы потратили немало name
времени на разработку существующего класса age
weight
Dog, и нам хотелось бы воспользоваться
имеющимися наработками, если такое
bark()
возможно. Конечно возможно !
�
Все соврем е нные языки программирования
позволяют кл ассам заимствовать
атрибуты и методы у других классов. Эта
технология называется наследованием и
является краеугольным камнем объектно
ServiceDog
ориентированного программирования.
handler
Применительно к задаче описания собак
поводырей мы могли бы определить класс
walk()
S e rvice Dog так, чтобы он наследовал
атрибуты (имя, возраст и вес) и способность
лаять от исходного класса Dog. В то же
время он может обладать со б ственными
атрибутами, такими как имя хозяина (человека,
для которого собака служит поводырем) , и
методами, например wa l k ( ) .
Давайте попробуем определить такой класс.
Какие еще категории собак могут наследовать класс Dog? Какими собственными атрибутами
и м етодами они при этом будут обладать?
570 Глава 1 2
Обьектно-ориентированнов прогр а ммиро в а ние
print (self . name , ' покоl'ает саоеку хоаяииу ( ' + self . handler + ' ) хоДИ'1'• ' )
(
print_dog (rudy)
� К.ласе ServiceDog - 1'\ОМОМОК класса Dog,
)
rudy . bark ( ) 1'\ОЭМОМ!:J можно 8ыз17!8аw.ь Me Wloд print_dog ( )
rшiy . valk ( )
П оg kАассы
При создании класса, наследующего другой класс, мы получаем подхласс, или производн:ый
'КЛасс. В нашем случае подкласс S e rviceDog является производным от класса Dog.
Давайте еще раз рассмотрим синтаксис и семантику подкласса S e rviceDog, начав
с инструкции c l a s s .
и еще о мерм1Анолог1А1А: класс Doq
np1A создан1А1А нового класса можно л1Або чаемо назы6аюм базов111м , У\Оскольку
ОУ\редел1Амо ио с нуля, л1Або указамь он служ1Ам основной для Всех У\РО1Азводн111х
в скобках наследуемый класс классо6 (У\ОКа Ч МО макой класс всего Од/АН,
)
но МЬI создад1АМ еще)
{
Теперь изучим конструктор _in i t_ ( ) .
В об°t'я6лен1А1А мрамемров нем н1Ачего
необычного, мы У\росмо добо.61Ал1А од1Ан
но6ый, handler (но61:11х мрамемро6
можем б1:11 мь сколько угодно)
[
об1:оекмо6, У\орождо.ем1:11х ом класса ServiceDoq, но
def walk ( se l f ) : не ом смарого класса Dog
print ( self . name , ' noиorae'l' своему хозяину ( ' + self . handler + ' ) хоДИ'l'Ъ ' )
572 Гл а ва 12
Объектно-ориентированное програ ммирова ние
Dоg - эмо �
наш базов,,, ц Dog HotDog
класс name calorles
age
weight
cook()
bark() eat()
К.ласе ServiceDog
наследуеw� класс А 8ом
"· " ; HotDog -
Dog, wiaк чмо
ServiceDog -
не собака
wioжe собака
"..·
К.Ласе SeeingEyeDog
наследуем класс
ServiceDog "\/
Fri sbeeDog
wioжe собака
- J И даже ShowDog -
эмо собака
�����:�����
SeelngEyeDog
handler М ожно созда8аw�" скол"ко
угодно мдклассов класса Doq
listen()
r
SeeingEyeDog -
�
Доl\ускаемся созда8ам" мдкласс"' друzцх
може собака мдклассов. Наl\рцмер, класс seeingEyeDog
наследуем класс Servi ceDog
J
Вернула True, V\ОСкольку Mys teryDog -
Оболочка Python
print ( " Дa , это ServiceDoq" )
else :
Да , э!!'о ServiceDog
print ( ' Heт , это не ServiceDoq ' ) >»
[
к !:!Ка.занному классу и.ли
И еще один.
2
На ЭIМОW\ раз функция i s ins tance ( )
бозбращаем True, если оьекм
с
8oз6ptttщ:iew. F a l s e , мак ка.к ServiceDog
оw.носи w.ся к классу Seei ngEyeDog
не я6ляе1Мся 1'\одкла.ссом S e e i ngEyeDog
Оболочка Python
i f i s ins tance (mys tery_doq , SeeinqEyeDog )
print ( " Дa , это SeeingEyeDoq " )
Не!!' , э то н е SeeingEyeDog
else : »>
574 Глава 1 2
06ьектно-ориентироеанное программирование
�ume kapa19a111
Используя показанную слева диаграмму классов, укажите справа
значения, возвращаемые функцией isinstance ( ) . Помните, что эта
функция может возвращать только True или False. Первое задание
мы выполнили за вас.
Baw om8em:
Тrue UAU False
fl1vor
C1ke � aimple_cake '"' Cake ( )
chocolate_cake = FroatedCake ( )
Ьilla_Ьirthday_cake = BirthdayCake ( )
b1kt()
cut()
••t() False iainatance (ai.шple_cake , BirthdayCake)
:
ieinatance (ai.шple_cake, Froetedeake)
FrostedC1k•
fro1tlng
froat()
ieinatance (chocolate_cake , Froatedeake)
;-
-
' iainatance (chocolate_cake , BirthdayCake)
А 9ПРАЖНЕНИЕ
Подклассы можно порождать не только от собственных, но и от встроенных классов Python . Как
насчет того , чтобы создать подкласс для строкового класса Python (т.е. s t r)? Давайте напишем
подкласс PalindromeString, вкл ючающий метод is palindrome ( ) Изучите приведенный ниже .
код и протестируйте его. Подумайте над тем, какие 0ще методы можно было бы добавить в этот
/J
подкласс. Не и щите решения в конце главы: все находится здесь.
с
делам1:> 6се мо же самое, Чl'ИО и со с/'1'\рокой
ДаВайW1е 1'\ро6ерим нащ мдкласс. rтомниtv1е о мом, чtv10
объекм Pal indromeS tring я8ляеМСЯ смрокой, l'\OЭWIOMy
с ним л 1ожно делаw.1:> 6се WIO же самое, ЧWIO и со смрокой.
print (word + ' : дпииа - ' , len (word) + ' верхний ре:rистр - • word . upper ( ) )
print (word.2 + ' : дпииа - ' , len (word.2 ) + ' , верхний ре:rистр - ' word.2 . upper ( ) )
. .. 1
print ( word.2 , word.2 . i s_palindrome ( ) )
Вом нащи резул1:>W1аW11:>1. Сможеме 1'\ридумаW11:> другие radar : длина - 5 , верхний регистр - RADAR
Сl'\особь� исl'\0Л1:>з0Вания 1'\ОдклассоВ класса s tr? radar True
576 Глава 12
Объектно-ориентированное програ м м ир о в а ние
D:
Как описать самого себя в коде? С помощью метода
Я правильно понимаю, что при создании
s t r ( ) ! Пора заменить функцию print_dog ( )
чем-то объектно-ориентированным. В Python существует объекта ServiceDoq фактически создаются два
следующее соглашение: если в класс добавляется метод объекта, Doq и ServiceDoq, каждый со своими
s t r ( ) , возвращающий строку, то именно о н будет
О:
атрибутами и методами?
вызываться при выводе любого объекта данного класса
с помощью функции print ( ) . Нет, создается лишь один объект со
всеми атрибутами. Что касается методов, то
они заимствуются из определений классов и
class Doq :
не хранятся в объектах. Но с концептуальной
def init ( self , name , aqe , weiqht) : точки зрения считается , что создается только
self . name = name оди н экземпляр ServiceDog.
D:
self . aqe = aqe
self . weight = weight Я слышал, что в Pythoп поддерживается
О:
множественное наследование. Так ли это?
def bark ( self) :
if self . weiqht > 2 9 : Да, множественное наследование
print ( self . name , ' лает "ГАВ-ГАВ" ' ) означает, что атрибуты и методы
наследуются не от одного класса , а
else :
' лает " riaв-riaв " ' )
сразу от нескольких. Например, если вы
print ( self . name ,
захотите описать летающий автомобиль,
то он будет наследовать поведение как
def human_years ( self) :
от класса автомобилей, так и от класса
human_aqe = self . aqe * 7 самолетов. Прекрасно, что вы знаете о
return hшaan_aqe концепции множественного наследования,
но далеко не все специалисты считают
def str ( self) : это хорошей практикой. В некоторых
return "Я собака по имени " + self . name языках программирования множественное
наследование даже запрещено. В любом
rudy = ServiceDoq ( ' Py,ци ' , 8 , З 8 , ' Джозеф ' ) Я собака по имени Руди �
print ( tuzik) »>
print ( j ackson) /
print ( rudy) Мы не меняем сnособ рабоw�ы функции Ого, ф!:Jнкция срабомма даже
print ( ) ,
а лишt> задаем сnособ вывода для Р!:Jди, кowiopыiA оw�носимся
информации о конкремном экземnляре к клаСС!:J Servi ceDog!
класса Dog
clas s Doq :
def init ( se l f , name , aqe , weiqht ) :
self . name = name
self . aqe = aqe
self . weiqht = weiqht
def walk ( se l f ) :
print ( self . name , ' поио�ае� своему хозяину ( ' + self . handler + ' ) хо,цить ' )
def bark ( se l f ) :
)
(
i f self . is_workinq :
print ( self . name , • """"Р"" : " Не "°"" ".....,. , " работU> " • )
else :
Doq . bark ( self)
М111 мреоt".ределяем мемод bark ( ) в классе Servi ceDog. Если о.мрибум i s_working равен True, собака
Всякий раз, когда мемод выз111 в о.емся для собаки миt".о. сообщаем о мом, чмо оно. ро.бомо.ем и не можем
Servi ceDog, вЬlt'\ОЛНЯеМСЯ именно ЭМО. версия, О. не версия ло.ям�. 13 t'\ромивном случае вызываемся мемод bark ( )
из класса Dog. Эмо называемся мрекр111м ием мемодо. класса Dog, коморому мредо.емся объекм se l f
578 Глав а 12
Объ ектно-ориентированное пр ог р а ммиро ва ние
\filiC �· ::gtJ
..
с ��:� : �: :��
kinq = T rue
;
Дело.ем амриоум i s_working
"'- р � 6ным True и rtробуем сно6о.
подобное еще не �
6сW1речмосt>, но
rtр инциrt rtpocм:
о.мр ибуму можно
rtрисвоимt> значение ,
ко.к обычноii rtеременной
Учuм mермu и ы
Вы уже знаете, что в объектно-ориентированном
программировании используется собственный
жаргон. Давайте еще раз вспомним основные
термины, прежде чем двигаться дальше. Знать
профессиональный сленг не помешает!
bark()
ServiceDog
Мы говорим, что S e rvi ceDog
я вляется подклассом класса
Мы говори м, что handler
классS e rviceDog Dog. Его е ще назы ва ют
производным классо м
наследует класс Dog
walk()
bark()
Мы говори м, что класс
S e rvi ce Dog переопределяет
м етод bark ( ) класса Dog
Можно со здавать экземпляры (объекты) классов Dog
и S e rviceDog путе м вызова их конструкторов
, o ::�UA2
1
ш ,
: ·� Mlall:AU
Правда л и , что все объекты S e rvi ceDog являются экземплярами класса Dog, но
не все объекты Dog являются экземплярами класса S e rviceDog?
. ·вrи1 :wввwо
:
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
580 Глава 12
Объектно-ориентированное программиро в ание
582 Глава 12
Объектно-ориентированное программирование
�HHI Теперь ваша очередь создавать новый класс. Как насчет собаки ,
умеющей ловить диск-фрисби? Класс Fr i sbee мы уже создали за вас.
сохрани.мt> 1'\ереданнt>tй
объекt111 fri sbee 6 амри5уt111 е
fri sbee
ьс1=)р�
Сверьте свое решение предыдущего упражнения с нашим , после чего добавьте
Tecm�n.r�в новый код в файл dog.py. Удалите предыдущий код тестирования и вставьте
вместо него следующий фрагмент (добавляется в конец файла).
Оболочка Python
BOWI ЧW\О мы 1'\ОЛ!:JЧили
Я собаха по имени Джим
Джим лает " гав-гав "
Джим поймал синий диск-фрисби
Джим говорит : " Не могу лаять , я держу фрисби"
Я собака по имени Джим и у меня есть фрисби
,
Джим - собака,
!:JМеющо.я ло8иW1ь
фрисби
584 Глав а 12
Объектно-ориентиро ванное програ ммиро ва ние
• •
Созgанuе оmедя gдя co6ak •
•
•
�
•
Интересные бизнес-проекты всегда •
были нашей слабостью. Недавно •
мы узнали, что появился серьезный •
•
спрос на отели для собак. Все, что нам •
•
нужно, - принять нескольких собак « •
Отеnь
•
•
на передержку, позволить владельцам
регистрировать и выписывать своих
питомцев, ну и, конечно же, разрешить • •
собакам лаять в свое удовольствие. Что
•
"У пса"
•
ж, давайте приступим. Но сначала
• •
•
спланируем работу отеля, составив для •
него диаграмму классов.
Hotel Dog
name name
�
У омеля 1'\1\аюке есмt:> два names age
амриб!jма, я6ляющихся dogs ; weight
r\араллелоНt>IМи Cr\IACKaMи. -
Q
и соом6емсм6!jющие им check_out()
объекм1>1 Dog
' •"
.
,
. •.
[
Hotel, мы 1'\рцсваuваем ему цмя,
class Hotel : на...рцмер ' Отель "У пса " '
�
if i s ins tance ( doq , Doq) : и мя собаки и объекм Dog
self . kennel_names . append ( doq . name ) 6 соомвемс мбующ ие Сl'\ис ки".
self . kennel_doqs . append ( doq) " . а ма кже выводцм
сообщение для 1'\роверки
print ( doq . name , ' засепипся в ' , self . name )
f'(.__..---
� ...ереданный
else :
рrint ( ' ИзвиНИ'l'е , ' , self . name , ' топьхо ДJIЯ собах ' )
объекм не являемся
Г Ч мобы высел имо собаку из омеля, собакой, не заселяем
V) :
def сh ее k_ou t ( se lf , name досмаl'\l\ОЧ Н О 1'\редосмави мо ее иМЯ его
�
=
".ц, еслц эмо мак, извлекаем
doq self . kennel-doqs [ i ]
объекм Dog цз Сl'\иска, меле
del self . kennel_names [ i ] �� чего удаляем имя и объекм
del self . kennel_doqs [ i ] цз с ... исков амрцбумов
print ( doq . name ,
' высепипся из ' , self . name )
Также возбращаем объекм Dog. В конце концов,
return doq
вы ведо XOl'\l\иl'\l\e l'\OЛY Ч IAl'\l\11 своего 1'\иl'\l\ОМ Ца обрамно ?
print ( ' Извините , ' , name , ' не обнаружен в ' , self . name )
return None <?\__ Еслц собакц нем в омеле, даем 1'\ОЛозовамелю
знамо об Эl\-\ОМ и возвращаем None
586 Глава 12
Объектно-ориентированное програ ммиров а ние
'&5f:1,�
тecrn -дr i\iiв Добавьте класс Hotel в файл dog.py. Удалите предыдущий код тестирования
приложения, заменив его приведенным ниже кодом (добавляется в конец файла).
Да, и не забудьте про класс cat.
def meow ( se l f ) :
print ( se l f . name , ' говориw мяу ' )
Оболочка Python
Тузик заселился в Отель "У пса"
Джексон заселился в Отель "У пса"
Заселцлцсt> 6се... Руди заселился в Отель "У пса"
о
о ...кроме кошк � Джим заселился в Отель "У пса"
ИзвиНИ'l'е, Отель "У пса" только для собак
Тузик выселился из Отель "У пса"
588 Глава 12
Объектно.ориентированное программирование
Yco8epweнcm808aнue оmеАя
gАя co6ak
Пора взяться за отбойный молоток и заняться
перестройкой отеля! Нам нужно переписать
методы check_in ( ) и check_out ( ) ,
изменение которых не повлияет на работу
остальной программы. Сделать это несложно.
[
К.оzда мь� создаем экземмяр класса
Hotel, мь� r.рцс8ац8аем ему цмя,
наr.рцмер ' Отепь "У пса" '
class Hotel :
def init (self, name) :
self. name name
=
�
� СнаЧАМ у6е�мс�, чмо
цз8лекаем обwкм Doq
def check out (aelf, n81118 ) :
ocлe чего
if naJDe in aelf. kenne l : собака заселена в ом.ель " uз сло6ар�, r.
r:
удаляем соиаку цз
doq = ••lf . kenne1 [IUUll8 ]
print (do9. IUUll8 , ' JПZcemr.nc• иа' , aelf. IUUl)l8
сло6аря
del aelf. kennel [do9 . n81118 ]
Также 8оз8ращаем обьекм D09. 8 конце концов,
�
return dog
el�•: 8Ь1 � JCoмu� млучцмь с8оего l'\IАмо,1.ща обрамно?
print ( .na-ИJDl'lle , ' , n8JD8, ' .•• обаарv-ек а ' , вelf. n8JD8)
•
retUrц None
Гораздо более
�· Если собаки нем 6 омеле, даем 8111 должн111 r.омнимь цз
f\OIOIMHЬIW код! r.ользо6амелю знамь об эмом гла6111 8, чмо сло6ари намного
эффекми6нее сr.цско8 8 мане
r.oucкa элеменмо6
"У пса"
Обр а. w.ц м е 8н ц м а. н и е : Mtil не м е нял и Тузик заселился в Отель
Дzехсон заселипся в Отель " У пса"
месw.08t11 й ко д! Мы лишо измени ли Руди зaceJtИJicя в Отель "У пса "
Джим засепился в Отель "У пса"
8нумре нн и е меw.оды для регисw.рациlА И.Эвииите 1 ОтеJJь "У пса '1 только для собак
Тузик в1�1селился из Отель "У пса"
1А 8ыселеНIАЯ собак. Та.к pa.бow.a.ew.
В11селен Тузиж , возраст - 12, вес - 3 8
ЪJOl: ,�:oJ Добавьте метод barktime ( ) в файл dog.py. Удал ите п редыдущий код тестирования,
Te-ctn -дf�в заменив его приведенным ниже кодом (добавляется в конец файла), после чего
запустите приложение.
def test code ( ) : Все нашlА собаки омоз8ались
tuz ik = Doq ( ' Tyзик ' , 12 , 3 8 ) Г на к о м а н ду " Голос"
j ackson = Doq ( ' Д.ексон ' , 9 , 12 )
rudy = ServiceDoq ( ' Руди ' , 8 , 38 , ' Джозеф ' )
j im = FrisbeeDoq ( ' Джим ' , 5 , 2 0 )
frisbee = Frisbee ( ' краснъ�й ' ) Оболочка Python
j im . catch ( frisbee ) Джим поймал красный диск - фрисби
Тузик з аселил ся в Отель "У п са "
hotel = Hotel ( ' Оте.пь "У пса" ' ) Дже ксон заселился в Отель "У пса "
hotel . check in ( tuzik) Руди з аселился в Отель "У пса "
test_code ( )
590 Глава 12
Объектно-ориентированное программиро ва ние
В это й главе
рассматри вается
м ножество н овых концепци й .
� Руди - объекм
Д.ехсон пает
Руди пает " ГАВ-ГАВ " Servi ceDog
i
def init ( self , name , aqe , weight , handler ) : р&1бомо.ем, 61:>18одим сr.еццо.льное
Doq . �init� ( self , name , aqe , weiqht) сообщенце. 13 r.роми8ном случ&1е
self . handler = handler дело.ем мо же, чмо и с осмо.льными
self . i s_workinq = Fal se COOQKtlMU
592 Гла в а 12
Объектно-ориентированное программиров а ние
&1·г &3ОJ
.. Внесите рассмотренные изменения в файл dog.py. Удалите прежний код
Tecm -n.y�в тестирования приложения и добавьте показанный ниже код в конец файла,
после чего запустите программу.
def test code ( ) :
tuzix = Dog ( ' Туsих ' , 12 , 38 )
j ackson = Dog ( ' Джехсон ' , 9 , 12 ) Г Все собо.ки. 6ыщли. на r\рогулкн
rudy = ServiceDog ( ' Ру.ци ' , 8 , 38 , ' Джоsеф ' )
frisbee = Frisbee ( ' xpacJGIЙ ' )
j im = FrisbeeDog ( ' Джин ' , 5 , 2 0 ) Оболочка Python
j im . catch ( frisbee)
tuzik . walk ( ) Джим поймал itpacншi дисх-фрисби
Тузих на прогулке
j ackson . walk ( ) Джексон на прогулке
rudy . walk ( )
Джим на прогулке
Руди на прогулке
j im . walk ( )
>»
test_code ( )
Переопределите метод wal k ( ) в классе FrisbeeDog так, чтобы собака, поймавшая фрисби ,
говорила: "Не могу гулять, я играю с фрисби". В остальном поведение этого класса должно
повторять поведение класса Dog. Измените соответствующим образом файл dog.py
и протестируйте полученный результат, воспользовавшись тем же кодом тестирования, что
и в предыдущей врезке "Тест-драйв" .
def bark ( se l f ) :
if self . fri sbee ! = None :
print ( self . name ,
' говорит : " Не могу паять , я держу фрисби " ' )
else :
Dog . bark ( se l f )
def walk ( ) :
� rrереоr\ределиме
здесь мемод walk ( )
)
в базовый IOiacc Dog, и магическим образом остальные наследо6анце с 1\ОМощ11ю дцаzраммы
классо6. В данном СЛ!:JЧО.е КЛО.СС Ki tchen
но.следуеW\СЯ ow. класса Room, W\O ecl'\I\"
собаки (относящиеся к Юiассам S e rvi ceDog
и Fri sbeeDog) научились гулять, хотя раньше не умели.
А все благодаря наследованию. Мы можем менять кухня я6ляе1'\1\СЯ KOMHal'Vloй Room
и расширять поведение целого набора Юiассов, внося ontnnco
wldth
изменения в родительский IOiac c , который они наследуют. height
•nllrQ
Наследование - невероятно мощный инструмент, но
пользоваться им нужно с осторожностью, так как можно
столкнуться с непредсказуемыми последствиями при
leav8()
-
-
добавлении нового поведения. Что, если мы, например,
добавим метод chas e_ s qui r r e l ( ) (преследовать белку) House '
в IOiacc Dog, не подумав о том, что это означает для собак ldtchen Кltchen
desc�ptlon
IOiacca S e rviceDog? locl<O
unlockO
соо1со
Не стоит и чрезмерно усердствовать с наследованием н110 cleanO
при расширении функциональных возможностей
Юiассов, ведь для этого есть и другие способы. С одним
из них мы уже знакомы: вЮiючение IOiacca. Когда IOiacc
вЮiючается в атрибут другого IOiacca, мы получаем более BoW\ ко.к ооозно.чаеW\СЯ 6ключенце
гибкую объектно-ориентированную модель, чем при класса. В данном случае класс House
использовании одного лишь наследования.
содерЖ1АW\ ooьeKl'V\ класса Ki tchen
Для правильного применения наследования (в той
степени, в какой оно оказывается эффективным и
полезным) требуется хорошо понимать принципы
объектно-ориентированного проектирования и
уметь анализировать решаемые задачи. Все это
приходит с опытом. Конечно, сейчас мы говорим
о профессиональных тонкостях, но не помешает знать
о них заранее. Многие программисты только спустя годы
открывают для себя преимущ ества вЮiючения Юiассов.
Повторимся: все эти нюансы станут вам понятны
в будущем, по мере приобретения опыта. А пока вернемся
к обустройству нашего отеля для собак и попробуем
создать новые Юiассы.
После того как да нные о собаках в классе Hotel стали храниться в словаре, возникла одна
неочевидная проблема. Как быть, если в отеле регистрируются две собаки с одинаковыми
именами? Как решить эту проблему?
594 Гл ав а 12
Объектно-ориентированное программирование
class Hotel :
def init ( self , name ) :
self . name = name
sel f . kennel = { }
_ ,
Kak наня m ь чедоВеkа А II�-ооrь&Зн��У
gдя В ы2уда co6ak � В ООП, ко гда один
объе кт п о руч ает
Это непростая задача, ведь у нас даже нет объекта, вы п ол нен ие задач и д
руго му
который описывал бы человека. Что ж, давайте объ е кту, это назы вается
исправим ситуацию. Мы создадим простой класс деnеrи ровани ем. О но
Per s on (человек) , а затем напишем подкласс п озволяет снабдить объ е
кт
DogWa l ke r (человек для выгула собак) , в котором до п ол н и тел ь н ы м п овед е н и ем,
не
реализуем соответствующее поведение. зад е йствуя наследование
и не
р еализуя п овед е н и е н ап р я м
ую .
clas s Person :
def init ( sel f , name ) :
self . name = name �
Доба8цм 1'1.росмой класс Person
с амрцбумом name
def s tr ( self) :
return "Я человек , и иеня зовут " + self . name
. / в класс
и делегировать ему обязанности п о выгулу собак Эмц мемодь� доба8ляюмся
с помощью метода walking_ s e rvice ( ) нotel
596 Глава 12
Объектно-ориентированное программиро ван и е
В классе DogWalker
предполагается, что объекты
класса Dog хранятся в словаре. Но
если переписать код, вернув с писки ,
то класс DogWalker перестанет
работать. Я думал , что при инкапсуляции
мы не должны знать детали
реализации об"Ьектов.
Добавьте в файл dog.py классы Person и DogWal ker, а в класс Hotel методы -
Объект Pylhon
Тузик з а селил ся в О'!' ель "У п с а "
r.pozy�
Дже к сон з а селился в Оо:оель "У п са "
Похоже, все ра.бомаеW1. Руди з аселил ся в Отел ь "У п са "
rrогно.ли на Д1:им з а селил ся в Отель "У п с а "
Тузик на про гулке
Дже к сон на про гулке
�
Руди помо гает своему хоз яину ( Джозеф ) ходить
Джим на прогулке
»>
598 Глава 12
Объектно-ориентированное программиров а ние
import turtle
import random
turtles = list ( )
de:f setup ( ) :
gloЬal turtles
startline = - 6 2 0
screen = turtle . Screen ( )
screen . setup ( 1 2 9 0 , 7 2 0 )
screen . Ьgpic ( ' pavement . gif ' )
turtle_ycor = [ - 4 0 , - 2 0 , О , 2 0 , 4 0 ]
turtle_color • [ ' Ьlue ' , ' red ' , ' purple ' , ' brown ' , ' qreen ' ]
f
winner color = current-turtle . color ( )
prin t (1Победи'NtJIЪ - - ' , winner_color [ О ] )
Рещенuе будем найдено setup ( )
через д6е смран1.1ц111 race ( )
turtle . mainloop ( )
CR,ME SCENE DO NOT ENTER CRIME SCENE DO NOT ENTER CRIME SCENE 00 NOTENTER
rт .
9'аШшеь У"� иау"81Ш8М nршщи.по8 ввgс:: � ICtm
о8шше. и�
на.е.яед
rт (2тараi1.ея еоадо.8а,,,,,, проетьt.е и кон.крет.н.ьtв адм-, епцюя. на. их оен.оlе
еяожньdi IWd. CJ4ж,w �... 8 етроиmельетiе ма.яен.ь�шж домо8,
600 Глава 12
Объектно-ориентированное программирование
def setup ( ) :
global turtles
s tartline = - 62 0
screen = turtle . Screen ( )
screen . setup ( 12 90 , 7 2 0 )
screen . Ьgpic ( ' pavement . gif ' )
turtle_ycor • [ - 4 0 , - 2 0 , О , 2 0 , 4 0 ]
turtle_color = [ ' Ыuе ' , ' red ' , ' purple ' , ' brown ' , ' 9reen ' ]
5
new-turtle . pendown ( )
turtles . append ( new_turtle )
def race ( ) :
9lobal turtles
winner = False nолцморфцзм 6 дейсмбии:
finishline = 5 9 0 6 эмом коде меw.од
while not vinner : fo rward ( ) бызыбаеf'V\сЯ
for current turtle in turtles :
move = random . randint ( O , 2 )
для любого об1'екма
current_turtle . forward (move ) wщм Turtle, даже
Хакер создал подкласс
xcor = current turtle . xcor ( ) еслц ЭW\О SuperTurtle
класса ТUrtle, в котором i f ( xcor >= finishline ) :
переопределил метод winner = True
winner color = current turtle . color ( )
forward (J , пpибaвuв рrint (1Победите.m. - - ' , -vinner color [ O ] )
5 единиц к смещению setup ( )
race ( )
черепашки.
turtle . mainloop ( )
CRRiSCENE DO NOT ENTER CRIМE SCENE DO NOT ENTER CRIME SCENE 00 NOT ENТER
Путеш е с твие в страну объ екто в 601
Как нанять человека для выгула собак
602 Глава 12
Объектно-ориентированное программиро в а ние
�CAМOEFIAIHOE
• В объектно-ориентированном • Методы суперкласса можно
программировании (ООП) решение переопределять, создавая
задачи сводится к моделированию в подклассах методы с такими же
поведения реальных (или именами.
виртуальных) объектов. • Объект подкласса также является
• У объектов есть состояние (атрибуты) объектом родительского класса.
и поведение (методы). • Проверить принадлежность к классу
• Объекты создаются на основе классов, можно с помощью встроенной функции
которые служат в качестве шаблонов. i s instance ( ) .
• При создании нового объекта мы • Функция i s instance ( ) возвращает
получаем экземпляр класса. True, если объект является
•
экземпляром указанного класса (или
Конструктор - это метод, создающий
одного из его суперклассов).
и инициализирующий экземпляр
класса. • Переопределите метод str ( ) ,
чтобы задать строку, которая должна
• В Pythoп конструктор называется
выводиться на экран при передаче
init ( ) .
объекта функции print ( ) .
• В качестве первого аргумента • Полиморфизм подразумевает
конструктору передается создаваемый
написание кода, в котором один
объект.
и тот же программный интерфейс
• По соглашению первый параметр реализуется разными объектами.
конструктора называется self. • Интерфейсом объекта являются
• Атрибуты объекта подобны локальным методы, которые в нем реализованы и
переменным и могут содержать которые можно вызывать.
значения любых допустимых типов • Объект может быть атрибутом другого
данных Pythoп.
объекта.
• Методы объекта подобны функциям, • Включение другого объекта в качестве
за исключением того, что в качестве
атрибута - стандартный прием для
первого аргумента всегда передается
расширения поведения класса.
объект self.
• Переадресация вызова методу другого
• Атрибуты и методы можно
класса называется делегированием.
унаследовать от другого класса,
создав его подкласс. • Множественное наследование
имеет место, когда объект наследует
• Класс, для которого создается
состояние и поведение сразу от
подкласс, называется родительским ,
нескольких классов.
или суперклассом.
1 2
3
4
6 5
7
8
9
10
11
12
П о rоризонтая и По вертикал и
5. Изоляция состоян ия и поведен ия 1. Реализация одного и того же метода
внутри класса в разных классах
8. Родительски й класс 2. Передача вызова другому объекту
1 О. Перемен ная, оп ределяющая состояние 3. Тип наследования, когда методы
объекта заимствуются сразу от нескольких
11.
классов
Фун кция, оп ределяющая поведение
объекта 4. Замена метода в другом классе
1 2. Получен ие состояния и поведен ия от б. Метод, создающий объект
родительского класса
7. Дочерни й класс
9. Образец класса
604 Гла в а 1 2
Объектно-ориентированное программ ирован и е
Оболочка Python
Тузик : в о зраст п о меркам людей -84
Вом на.ши peзyлf:Jt\'\aWIЫ Джексок : в озраст п о меркам людей 63
-
»>
Peweнue
�
.Jозьмumе kapaнgaw
"�
Используя показанную слева диаграмму классов, укажите справа
значения, возвращаемые функцией isinstance ( ) . Помните, что эта
функция может возвращать только True или False. Первое задание
мы выполнили за вас.
Baw omBem:
Тrue uAu False
fl1vor
Cake
� simple_cake = Cake ( )
chocolate_cake = FrostedCake()
bills_Ьirthday_cake • BirthdayC&ke()
b1kt{)
cutQ
tlt() False isinstance (simple_cake , BirthdayC&ke)
.
,
� False isinstance (simple_cake , FrostedCake)
FrostedCake
'
fтosting
True isinatance (chocolate_cake , Cake)
..
False isinatance (chocolate_cake, BirthdayCake)
606 Глава 12
Объектно-ориентированное программ ирование
�..Qозьмumе kapaнgaw
"� Peweнue Изуч ите п оказан н ы й слева код классов, вкл ючающий нескол ько
п ерео п ределяемых методов. Мысленно вы п олн ите код, п ри веден н ы й
спра ва, и запишите п редполагаемые резул ьтаты .
class Car ( ) :
def init ( self) :
self . speed = О car = Car ( )
self . running = False taxi = Taxi ( )
npoaHO.ЛIA31Ap!:JUW.e limo = Limo ( )
def start ( self) : paбowiy '"'роzраммы
self . running = True 1А ЗQl'\IAЩIA W. e car . start ( )
car . drive ( )
def drive ( self) : "редмлагаемые
taxi . hire ( ' I<им ' )
if self . running : резул11w.о.w�ы taxi . start ( )
print ( ' Машина едет ' )
�
else : taxi . drive ( )
print ( ' Скача.па sааеДИ'1'е машину ' ) taxi . pay ( S . 0 )
class Taxi (Car) : limo . start ( )
def init ( self) : limo . hire ( ' Д.ен • )
ёir . Iiii t ( self) Здес11 taxi . drive ( )
self-:Passenger = None внимаw�ел11нее! limo . pour drink ( )
self . balance = О . О limo . pay ('I'O . O , 5 . 0 )
def drive ( self) : Зal'\uщuw.e сбои
print ( ' Bиn-биn , с дороrи ! ' )
Car . drive ( self) резульw.амы здес11 �
def hire ( self , passenger) :
11п11ва едет
print ( ' Заказано ' , passenger)
self . passenger = passenger
Зuuаво 11111
def pay ( self , amount) : 111111-бвu , с aopoI'll !
111111ва •аи
print ( ' Заn.nачено ' , amount)
self . balance = self . balance + amount
self . passenger = None Заоаачuо 5 . 0
ЗUUuo д..11
class Limo (Taxi ) : Вllll-CllD , с •opoI'll !
def init ( self) :
Taxi . �nit ( seH) 11а81в& едет
self . iUnrooГ= ' закрЫ':l' ' llum. 1181111'1'111
�mи(РЕШЕНИЕ)
Теперь ваша очередь создавать новый класс. Как насчет собаки ,
умеющей ловить диск-фрисби? Класс Frisbee мы уже создали з а вас.
clas s Frisbee :
V-- У кло.ссо. Fri sbee не мо.к много
Ваша задача - помочь нам завершить класс Fri sbeeDog. Собака должна уметь
ловить диск (метод catch ( ) ) и возвращать его хозяину (метод give ( ) ). Также
нужно добавить метод _s t r_ ( ) . Ну и, конечно, придется переопределить
метод bark ( ) поскольку собака не может лаять, пока держит фрисби.
,
Dog . bark ( self) к..__ nерео/1\ределяем мемод bark ( ) Если сооо.ко. 6 до.ннt>1й
else :
.
608 Глава 12
Объектно-ориентированное программиров а н ие
�rnн1
[РЕШЕНИЕ]
Переопределите метод wal k ( ) в классе Fri sbeeDog так, чтобы собака , поймавшая фрисби,
говорила: "Не могу гулять, я играю с фрисби". В остальном поведение этого класса должно
повторять поведение класса Dog. Измените соответствующим образом файл dog.py и
протестируйте полученный результат, воспользовавшись тем же кодом тестирования, что
и в предыдущей врезке "Тест-драйв".
def s tr ( se l f ) :
str =-..Я собака по имени " + self . name
i f sel f . fri sbee ! = None :
str = s tr + ' , и у иеня есть фрисби '
return s tr
Оболочка Python
Джим поймал кр асный диск - фрисби
Тузих на пр огул ке
Дже кс он на пр о гул ке
Руди на про гул ке
Джим говорит : " Не мо гу гуля ть , я играю с фрисби ' "
>»
1 2
п 3 д
о м 4 е
•
6 л с у л я ц и я
к и е е
о м р г
1\f�ссв�rд.:
н 7 о е и
8 с у п е р к л о р
rешен11�
т о ф т п о
р д и 9 в р в
у к 3 э е е 10 а т р и б у т
к л м к н д н
т а 3 н е и
о с 11 м е т о д л е
р с м е е
п 12 н а с л е д о в а н и е
л и
я е
р
61 0 Глава 12
:nrиложенuе: не :nonaвmee в uз�rанное
*
+Десять кпю11евых тем
(которые не были рассмотрены)
*
1 . CnuckoBыe ВkАючен uя
Вы уже знаете, как создать список чисел с помощью функции range ( ) .
Тем не менее в Python существует более эффективный способ создания
списков, основанный на элементах теории множеств. Он называется
списковъtм вкл'Ю'Чением и позволяет создавать списки любого типа.
Сначала рассмотрим список чисел.
lyric = [ ' I ' , ' saw ' , ' heard ' , ' on ' , ' you ' , ' the ' , ' wireless ' , ' back ' , ' in ' , ' 52 ' ]
[ s [ O ] for s in lyric]
Оболочка Python
берем riepв!:J ю б!:Jкв!:J каждого [ 'I1 , 'sr , ' h' , ro1 i ry' , ' t' ' ,w, , 'Ь' , 'i ' , '5 1 ]
»>
�
слова в сr�иске lyric
V7_ А ::.
включения.
)
элеМеНWI C!:J Щetl'V\в!IIOЩezo и сr�иска Наконец, !:JКазываемся
СУ\иСКа
�]
!:JСловие (макой варианм
�
[ ""/ЮЖ'КШ for """""т in rnuaж нам еще не всмречался)
61 2 Приложен и е
Не попав шее в избра нное
[
1'\О3ици ю 1'\ООСW1роки
else : ' '-
• v
print ( ' Совпадении не наидено ' ) v
Сообщаем 1'\озици ю наil.ден ноil. мдсW1роки ...
V\_ .. . или Сообща.ем об OWIC!JWICWl8ии C081'\aOeHиil.
В данном примере используется простое регулярное выражение,
но поисковые шаблоны могут быть гораздо более сложными,
ведь регулярные выражения применяются для нахождения имен
пользователей, паролей, URL-aдpecoв и т.п. Когда в следующий раз
столкнетесь с необходимостью написать функцию для проверки
имени пользователя или чего-то похожего, обратитесь к регулярным
выражениям - это позволит обойтись всего несколькими строками кода.
Поиск совпадений - не единственный способ применения регулярных
выражений. В модуле re собраны достаточно сложные инструменты
обработки поисковых шаблонов, которые могут пригодиться при
разработке приложений.
Для эффективной работы с регулярными выражениями нужно
научиться их создавать и анализировать. Это потребует изучения общих
принципов регулярных выражений, а также специального синтаксиса,
применяемого в Python.
61 4 Приложение
Не попавшее в избр а нно е
t
for :movie in my_list :
_fl ТRON
print (:movie) � Резул11W1аW1 Buckaroo Banzai
Back to the Future
r
for :movie in my_tuple : од1А нако81J1й!
print (:movie )
� � TRON
Buckaroo Banzai
set . add ( 9 9 )
ил и удалить:
even = { 2 , 4 , 6 , 8 , 10 }
odd = { 1 , З , 5 , 7 , 9 }
prime = { 1 , З , 5 , 7 } Оболочка Python
7
even_and_prime = even . intersection (prime } ,,------"/ set ( )
{1, з ' 5 ' 7)
/1
print (even_and_prime ) { 1 , 2 , з , 4 , 5 , 6 , 7 , 8 , 10)
>»
odd_and_prime = odd . intersection (pr ime ) � J1
print (odd_and_prime )
61 6 Прил ожение
Не попав шее в из бранное
2
на сервере 8 И нмернеме
предоставляя услуги поиска в Google, подключения
к социальным сетями и платежным системам. Такие
приложения пишутся на многих языках, включая Python.
\=
r-
Изучение принципов написания серверных приложений
требует знания многих технологий и протоколов,
включая НТТР (HyperText Transport Protocol - протокол
передачи гипертекста) , HTML (разметка веб-страниц) ,
JSON (формат передачи данных) и др. Кроме того ,
r l�e
в зависимости от выбранного языка программирования,
вам понадобится использовать один из веб-фреймворков.
Такие пакеты содержат функции, обеспечивающие
низкоуровневую обработку данных и веб-страниц. К.лиенмский код вымлняемся
на смороне клиенма, м.е.
В случае Python два самых популярных фреймворка - Flask на Вашем KOMl'\bIOWlepe
и Django.
7. Оmдо>kеииые Вычuсдеи uя
Предположим, имеется такой код.
м
Э ма функцuя возвра щае
def nth_prime (n) : { n -e npo cl'Vlo e чuс ло."
count = О
() : J
."uз Cr\IACKa
npoC Wll'JIX чuсел
for prime in list_of_primes Можно задам11 верхнuй
count = count + 1 nредел, наnрuмер юоо,
if count = n : но эмо може будем очен11
return prime нел11зя, неэффекw�uвно
О чевuдно , чмо ма к дела м11
cnucкa
вед11 созда нuе бесконечноzо
def list_of_primes ( ) :
primes = [ ]
� npoCl'V\tJIX чuсел длuмСЯ веч
но
V
Э му ф ун кцuю MtJt осм
next = 1 авляе м
while True : шнеzо за данuя
в качесмве до ма
next_prime = qet_prime (next)
( uлu nр осмо мzуzл u ме)
next = next + 1
primes . append (next_prime)
return primes
61 8 Приложение
Не попавшее в избранное
8 . Деkораmоры
Декоратор - один из шаблонов проектирования
объектно-ориентированных приложений. В Python
декораторы применяются в основном для расширения
возможностей одних функций за счет других.
Например, если имеется функция, возвращающая
простой текст, то можно создать набор декораторов, в HTML, Чl'\<\об111
добавляющих к тексту НТМL-разметку. Предположим, создаtv111 абзац,
что в возвращаемый текст нужно добавить теги
абзацев. С помощью декораторов это делается так.
� мек
необходцмо закл ючцм11
см ме жду мегами
<р > ц <lp>
<р> ц </р>
@paragraph
def get_text ( ) : Исмлозуем сцнмаксцс @ для
декорцро8о.нця другой функццц,
return ' Приает , ЧИ'l'а�еn• ! ' 8 до.нном случае get_text ( )
620 Приложение
Не попав шее в избранное
1 0 . Ва>kн ые 6u6Auomeku
В процессе обучения вам приходилось использовать некоторые библиотеки
Python. Но в вашем распоряжении находится намного больше библиотек,
как встроенных, так и сторонних. Ниже перечислено несколько популярных
библиотек.
Программный пакет сторонних разработчиков,
с которым вы уже успели познакомиться. Применяется
для отправки НТГР-запросов к серверу
622 Приложение
*
•
}IyeдNlemн.Ьrji yki\JliUneль
А о
API 472 Open N otify 4 79
запрос 485
в
Beautiful Soup 621 р
Pillow 621
pip 477
]) Pygame 621
Django 6 1 7 Python 52
r §
Flask 6 1 7 Spotify 475
в т
НТТР 474 Тimsort 275
I 11
IDLE 32, 49, 54, 76 URL 474
перезапуск 339
w
J Web API 472
JSON 48 1 , 486
1\{
мvс 5 1 2
Б
Баг 90 Закрытие файла 438
Библиотека 1 1 3, 330, 477 Запрос 473
Tk 544
Значение по умолчанию 246
Блок-схема 1 1 2
Булево значение 1 1 6
Бумажное прототипирование 509
Импорт модуля 6 1 , 1 1 3, 287, 288, 330, 335, 522
в Индекс 1 63
отрицательный 1 69
Веб-запрос 4 73 удобочитаемости 283, 314, 3 1 8
КОД СОСТОЯНИЯ 484 Инкапсуляция 355, 588
Веб-служба 4 72 Инструкция
адрес 474 break 442
Виджет 521 from 522, 527
меню 543 if 1 18
Вложенный цикл 267 import 6 1 , 1 1 3, 288, 330
return 228
Время 6 1 3
try 453
Вызов функции 73 yield 618
Выражение 8 1 Интерпретатор 49
Вычислительное мышление 30, 50 Исключение 453
КеуЕпоr 399
г
Исходный код 34, 42
Итератор 445
Генератор 6 1 8
Глобальная переменная 230, 238, 243
_name_ 332
Графический интерфейс 503
р
Отладка 90
Отложенные вычисления 6 1 8
Относительный путь 436 Разделитель 291
Отрицание 1 29 пути 436
Ошибка 58 Реактивное программирование 530
выполнения 90 Реализация 72
Регулярное выражение 614
II
Рекурсия 379
Рефакторинг 235
Пакет 330, 477 Рецепт 39
Палиндром 383
Параметр 222, 228, 238
обязательный 24 7 с
по умолчанию 246
Семантика 571
Переменная 74, 80
Семантическая ошибка 90
_name _332
глобальная 230, 238, 243 Символ новой строки 443, 444
имя 87 Синтаксис 73, 571
локальная 230, 238 Синтаксическая ошибка 90
область видимости 236, 238 Скобки 84
экземпляра 353
Словарь 398, 482
Поведение 35 1
строковый 400
Подкласс 572
Случайное число 1 14
Подстрока 291 , 308, 310
Снежинка Коха 418
Полиморфизм 591
Событие 453, 530
Порождающая система 506 запуск по таймеру 535
Порядок выполнения 123 Сортировка
Последовательность 182 алгоритм Тimsort 275
Потомок 573 пузырьковая 264
Представление 5 1 2 , 521 Списковое включение 6 1 2
у
sum() 378
аргумент 228, 248
вспомогательная 446
Удобочитаемость 283, 318 вызов 73
Управляющая последовательность 444 высшего порядка 620
Уровень текста 283, 318 значение None 250
имя 228
Условие 1 1 9
параметр 222, 228
Условное выражение 1 18
ф х
Хеш-таблица 403
Файл
Хеш-функция 403
закрытие 438
открытие 435
путь 436
режим доступа 435
сохранение 457 Цикл 141
текстовый 432 for 1 78
чтение 435, 439, 443 while 142
э
Число 94
Эвристический алгоритм 300
случайное 1 14
Фибоначчи 393, 412 ЭкземIUiяр 353
IIl
Шаблон проектирования 445 Язык программирования 37, 43
МаркЛутц
Роберт Седжвнк
Авторы книги сосредоточива
ются на самых полезных и важ
Кевнн У.эйн ных средствах языка Python и
РобертДондеро не стремятся к его абсолютно
полному охвату. Весь код этой
книги был отработан и прове
рен на совместимость как с язы
ком Python 2, так и Python 3,
что делает его подходящим для
каждого программиста и любо
го курса на много лет вперед.
Особенности книги:
• всеобъемлющий, основан
ный на приложениях под-
ход: изучение языка Python на
примерах из области науки,
математики, техники и ком
мерческой деятельности;
• основное внимание главно
му: самым полезным и важ
ным средствам языка Python;
• совместимость примеров
кода проверена на языках
Python 2.х и Python 3.х;
www.dia lektika.com • во все главы включены раз
делы с вопросами и ответа
ми, упражнениями и прак
тическими упражнениями.
СОЗДАНИЕ ПРИЛОЖЕНИИ
БИБЛИОТЕКА ПРОФЕССИОНАЛА
ТРЕТЬЕ И ЗДАНИЕ
Уэсли Чан Книга содержит всю
необходимую информацию для
создания реальных приложений
на языке Python. В ней
описаны профессиональные
приемы программирования
на языке Python, методы
создания клиентов и серверов
с помощью протоколов
ТСР, UDP и XML-RPC,
работа с высокоуровневыми
библиотеками SocketServer
и Twisted, изложены основы
СОЗДАНИЕ ПРИЛОЖЕНИЙ разработки GUI-приложений
с помощью библиотеки
.
""_�--
---
Tkinter, продемонстрированы
расширения на языке
·о.
�, �
С/С++ и использование
многопоточности, описана
·:-
, ::;:;..;::.::�
работа с реляционными базами
·--
данных, ORM и MongoDB,
,:.,
___
._...." .._ изложены основы веб
_..__......
._.......
программирования, регулярных
---
.......
·-
. ,_..._
выражений, программирования
.
:=.:i::_
СОМ-клиентов веб-разработки
-
УЭСЛИ Ж.ЧАН с помощью каркаса Django
и облачных вычислений на
платформе Google Арр Engine,
а также программирование
www.williamspublishing.com на языке Java в среде Jython
и способы установления
соединений с социальными
сетями Twitter и Google+.
Книга представляет
собой ценный источник
знаний по языку Python
и предназначена для
программистов всех уровней.
рекомендательных систем;
• логическое программирование
и способы его применения;
• построение
автоматизированных систем
распознавания речи;
• основы эвристического
w w w. d i a 1 e k t i k a . с о m поиска и генетического
программирования;
• разработка игр
с использованием
искусственного интеллекта;
• обучение с подкреплением;
• алгоритмы глубокого
обучения и создание
приложений на их основе.
и Вахид Мирджалили
мир программного обеспечения,
и теперь глубокое обучение
расширяет машинное обучение.
Освойте и работайте с
передовыми технологиями
машинного обучения, нейронных
сетей и глубокого обучения
М НЕНУ!Е )КСП ЕРТОI ОЛНОЦIЕ.ТНОf И3�f.IИ с помощью 2-го издания
бестселлера Себастьяна Рашки.
Себастьян Рашка
Вахид Мирджалили Будучи основательно обновленной
с учетом самых последних
Python библиотек Python с открытым
кодом, эта книга предлагает
Python 3
Каждому модулю посвящен
Стандартная библиотека отдельный раздел, содержащий
ссылки на дополнительные
ресурсы, что делает эту
книгу идеальным учебным
Справочник с примерами и справочным руководством.
Основные темы хниги:
• манипулирование текстом
и сжатие данных.
О Соста•ьте аnrоритм.
n�юмруl\1•''Of'"CYIO <!> --...."
.. .....
�NMl4 J� 14(0CTll•ft (!) �•......,....
llll��f.llVI"
ф �------"---
�"�._�...
8С•"'"'1•..... �� 0 --
��-��
f) Наnмwите nроrрамму.
� ·(
0(1
...... .., ,.. ... -�
�J'fJnt� -::
�-
•м16ор----
" ... �- ....
�l)ONtМA. Э1otт1n :т=.,:."%"" -- '
... _.r... .
--5.::. ::--
.
�PtJY-1.tfOМ
№tOPOf'O6уД1'11'1рО.!рОММО,. .
М111nропо
111 d +оРмм. ..о
..--
1 ::::...
1\
f) Выnоnните nроrрамму.
н,� И(K�"� ..o.a.npor�......,.
n.tptAМfC.1ll *""'�ttrpy, l(Ot�И
:::-
...,..,....._,
.. ,.,.not1"1111ь мuн:н.е _ _",
МНC-tP)'IWM" 8 )ИМСММОСТМ01
1w�нoro 111Jw-"6 l'IPOfP'M""-�"•
)tOf )16/'I МOIЧ't �..-Nt.Clll
11Нmt'P(lpttnaчuN, юnус.·ом ""'"
/J/111\J\ \
....,OllнtНutм nроrР'ММ"'
gAIJA,"'laOiua
w\vw.dialektika.com
Категория: ко,тьютерныс тс\но.1оr1111 P)thon
oreilly.com