программировать
с примерами на 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 )