КулЛиб - Классная библиотека! Скачать книги бесплатно 

Начинаем программировать на Python [Тони Гэддис] (pdf) читать онлайн

Книга в формате pdf! Изображения и текст могут не отображаться!


 [Настройки текста]  [Cбросить фильтры]
STARTING OUT WITH

РvтноN®

STARTING OUT WITH

РvтноN®

Топу

Gaddis

Haywood Community College

0Pearson

во H1нts011 Slгccl. :\е\\ \'огk.

\\' 1001 >

ТОНИ ГЗДДИС

НАЧИНА М ПРОГРАММИРОВАТЬ
НА>>>

4-Е ИЗДАНИЕ

Санкт-Петербург

«БХВ-Петербург»

2019

УДК
ББК

004.438 Python
32.973.26-018. l
Г98

Гэддис Т.
Г98

Начинаем программировать на

2019. -

768

4-е изд.: Пер. с англ.

Python. -

-

СПб.: БХВ-Петербург,

с.: ил.

ISBN 978-5-9775-4002-5
Изложены принципы программирования, с помощью которых читатель приобретет навыки алго­
ритмического решения задач на языке

Python,

даже не имея опыта программирования. Дано краткое

введение в компьютеры и программирование. Рассмотрен ввод, обработка и вывод данных, управляю­

щие структуры и булева логика, структуры с повторением, функции, файлы и исключения, списки
и кортежи, строковые данные, словари и множества, классы и ООП, наследование, рекурсия, програм­
мирование интерфейса, функциональное программирование и др.

Для облегчения понимания сути алгоритмов широко использованы блок-схемы, псевдокод и другие
инструменты. Приведено большое количество сжатых и практичных примеров программ. В каждой
главе предложены тематические задачи с пошаговым анализом их решения.

Для начинающих программистов,
старших школьников и студентов первых курсов
У ДК
ББК

004.438 Python
32.973.26-018.1

Группа подготовки издания:
Руководитель проекта

Евгений Рыбаков

Зав.редакцией

Екатерина Капалыгина

Компьютерная верстка

Ольги Сергиенко

Оформление обложки

Марины Дамбиевой

Authorized translation from the English language edition, entitled STARTING OUT WIТH PYTHON, 4th Edition;
ISBN: 978-0-13-444432-1: Ьу GADDIS, TONY; puЫished Ьу Pearson Education, Inc. Copyright © 2018 Ьу Pearson Education. Inc.
All rights reserved. No part of this book may Ье reproduced or transmitted in any form or Ьу any means, electronic or mechanical, including
photocopying, recording or Ьу any information storage retrieval system, without permission from Pearson Education,
Inc. RUSSIAN language edition puЫished Ьу LLC "BHV". Copyright © 2018.
Авторизованный перевод с английского на русский язык произведения

ISBN: 978-0-13-444432-1; GADDIS TONY,

опубликованного

STARТING OUT WIТH PYTHON, 4th Edition;
Pearson Education. Inc. Copyright © 2018 Ьу Pearson Education, Inc.

Все права защищены. Никакая часть этой книги не может быть воспроизведена или передана в любой форме или любыми средствами,
будь то электронными или механическими, включая фотокопирование, запись или иное использование любой информационно-поисковой
системы без разрешения

Pearson Education, Inc.

Русский перевод опубликован ООО "БХВ".

Подписано в печать

28.09.18.

Формат 84х108 1 / 16 . Печать офсетная. Усл. печ. л. 80,64.
Тираж 1500 экз. Заказ № 7475.
"БХВ-Петербург", 191036, Санкт-Петербург, Гончарная ул.,

20.

Отпечатано с готового оригинал-макета
ООО "Принт-М",

ISBN 978-0-13-444432-1
ISBN 978-5-9775-4002-5

(англ.)
(рус.)

142300,

М.О., г. Чехов, ул. Полиграфистов, д.

1

© 2018

Ьу

Pearson Education, Inc.

©Перевод на русский язык. оформление.
ООО "БХВ-Петербурr", ООО "БХВ".

2019

Оглавление ....................................................................................................................................

XI

Предисловие ..................................................................................................................................... 1
Прежде всего управляющие структуры и только потом классы

....... " ................................... " ....... " ........ ". 1
............................................................................................................................................ 1
Организация учебного материала .................................................................................................................... 4
Структурные элементы и условные обозначения книги ............................................................................... 5
Дополнительные материалы ............................................................................................................................. 6
Электронный архив ........................................................................................................................................... 7
Об авторе ............................................................................................................................................................ 7
Комментарий переводчика ................................................................................................................................ 7
Краткий обзор глав

Глава

1.1
1.2
1.3
1.4
1.5

1.

Введение в компьютеры и программирование ....................................................... 13

Введение

................................................................................................................................................. 13
14
Как компьютеры хранят данные .......................................................................................................... 20
Как программа работает ........................................................................................................................ 24
Использование языка Python ................................................................................................................ 32
Вопросы для повторения ................................................................................................................................. 36
Задачи ................................................................................................................................................................ 40
Аппаратное и программное обеспечение ............................................................................................

Глава

2.1
2.2
2.3
2.4
2.5
2.6
2.7
2.8
2.9
2.1 О

2.

Ввод, обработка и вывод .............................................................................................. 43

Проектирование программы ................................................................................................................. 43
Ввод, обработка и вывод ....................................................................................................................... 48

Вывод данных на экран при помощи функции

print ......................................................................... 48

Комментарии .......................................................................................................................................... 51
Переменные ............................................................................................................................................ 52
Чтение входных данных с клавиатуры ................................................................................................ 62

Выполнение расчетов ............................................................................................................................ 66
Подробнее о выводе данных ................................................................................................................. 79
Именованные константы ........................................... ............................................................................ 87
Введение в черепашью графику ........................................................................................................... 88

Вопросы для повторения ............................. ............ ..... ................................................. ............ ..... ...............
Задачи по программированию ............. ............ ........................ ..... ..... ..... ............ ..... ................. .......... ..........

Глава

3 .1
3.2
3.3

3.

Структуры принятия решения и булева логика

114
119

.................................................. 125

Инструкция

if ....................................................................................................................................... 125

Инструкция

if-else ................................................................................................................................ 133
............. " ....... " ...... "." ......... " ......... "." ................. "." .... " ...... " .. " ..... 137

Сравнение строковых значений

Vlll

Краткое оглавление

3.4
3.5
3.6
3.7

Вложенные структуры принятия решения и инструкция

if-elif-else ................................. " ........... 141
Логические операторы "."" .. "."."."."."." .. ".""." .. ".".".""" ..... "." .. "."." .. "."."."."."." .. " ... """" ... "149
Булевы переменные""."."."."."."."."."."."."." .. ""." .. "."." .. "."." .. " .. ".".".".""." .. "" .. "."."" ....... ".156
Черепашья графика: определение состояния черепахи"".".""".".""".".""""."."""."""."""""".157

Вопросы для повторения.".".".""."."."." .. ""."." .. ""."."."." .. " .. "."."." .. "."."" .. ".".".".".".".""""" .... "".165
Задачи по программированию""." .. "" .. "."."."."."."."."."." .. "." .. "" .. " .. ".".".".".".".""""." .. " .. " ...... "" .. 169
Глава

4.1
4.2
4.3
4.4
4.5
4.6
4.7
4.8

4.

Структуры с повторением ......................................................................................... 177

Введение в структуры повторения""."."."."."""""".""""."""."""""".".".".".""""""."""""""." 177
Цикл while: цикл с условием повторения"""""".""."""."."""""".""""""""""."""""""""""""" 178
Циклfоr: цикл со счетчиком повторений """"".".".".".""".".""""""""".".""".".".".""".""".""185
Вычисление нарастающего итога"."."" .. "."."."."."." .. "."." .. "."." .. "."."" .. "."."."."." ..... " ... "" .. ".

196
."."."."" .. "."."."."."."."."."."."."."." .. " .. "."." .. "."."."."."."."."."."." .. ""." .... ".200
Циклы валидации входных данных.".".""." .... "."."." .. "."." ..... "." .. " ....... "" .. "."" .. "." .. " .. ""." .. " .. 202
Вложенные циклы .. "".".""." .. ""." .. ""." .. ".""."." .. "."."."." .. "." .. ""."."."."."."." .. " .. " ... " .. " .......... 207
Черепашья графика: применение циклов для рисования узоров """"""""""""""""""""""""".214
Вопросы для повторения.".".""."."."."."."."." .. "" .. ""."."."""."." .. "."." .. ""." .. "".""""."."."."." ... " .. "".217
Задачи по программированию"."."."."."."."" .. "."."."."."." .. "."." .... " .. "." .. "" .. """""" .. "."" ... "." .... " ..... 220
Сигнальные метки

Глава

5 .1
5.2
5.3
5.4
5.5
5.6
5.7
5.8
5.9
5.10
5.11

5.

Функции ........................................................................................................................ 225

Введение в функции

"."."." ". ". ". ".".".".". ". ".".".". """."."." .. ".". ".".". ".".".".". ". " .. " .... "" ... "."" 225

Определение и вызов функции без возврата значения"""""""""."""""""""""""""""".""""""228
Проектирование программы с использованием функций""""""""""""""""""""""""""""""".233
Локальные переменные .. ".".""""."." .. ""."."."."."." .. "" .. " .. "."""" .. " ... "."." .. """".""." .. "."""" .... 239
Передача аргументов в функцию""."."."."."."."."."." .. "."." .. "."." .. ""."." .. """".""." .... "" ...... " ... 241

Глобальные переменные и глобальные константы.""".".".".""".".""".""""""."""".""""."".""251
Введение в функции с возвратом значения: генерирование случайных чисел."""""""."".""""255

Написание функций с возвратом значения """""".""""".""""""."""""""""""."""""""""."".".265
Математический модуль

math .. "."."."."."."."."."."." .. "." .. " .. "" .. " .. ".".".".".".".".""."." .. " .. " ... ".277
".".""." .. "."."."."."""" .. "."." .. "."." .. "."."" .. ""."""""" .. """ .... ""."280
Черепашья графика: модуляризация кода при помощи функций """"""""""""""""""""".".""284
Вопросы для повторения"."."."""""."."."."."."."." .. "."." ... """." .. "."." .. "."." .. ".""""."." .. " .. "." ...... "" .. 291
Задачи по программированию""."."."."."."."."."."."." .. "" .. ".".""" .. " .. " .. ".".""."" .. "."." .. "" ........ " ....... 296
Хранение функций в модулях

Глава

6.1
6.2
6.3
6.4

6.

Файлы и исключения ................................................................................................. 303

Введение в файловый ввод и вывод """"""""""".""".""""""""".".".".".".".""."."""""."".""."303
Применение циклов для обработки файлов.""." .. "."."."".".".".""." .. "" .. "." .. ".""." .. """.".".".".320

Обработка записей"".""."."."."." .. "."" .. "."."."."."." .. "."." .. "."."." .. ".".""." .. " .. """ .. """." ... " ... ".327
Исключения.".".""."."."." .... "."."."."."."."."."."."."""" .. " .. "" .. " .. "." .. " .. " .. ".".""".".""."".".""". 340

Вопросы для повторения.""."."."."."."."."."."." .. "" .. "."."."""." .. " .. ".""" .. "." .. ""."."." ... "." ... ".".".""" 353
Задачи по программированию ....................... " ............................................................................................. 357

Глава

7.1
7.2
7.3
7.4
7.5
7.6
7.7

7.

Списки и кортежи ....................................................................................................... 361

Последовательности""."."."."." .. ""." .. "."."."."."." .. "." .. " .. "."."."."." .. "." .. " .. " .. "."."."".""."." ... 361
Введение в списки

"."".".".".".""""." .. "" .. "."."."."." .. "."""" .. "." .. "."""." .. "."" .. ""."."."."."" .. ".361

Нарезка списка""." .. "".""."." .. "."."." .. "" .. """"."."." .. "." .. "."." .. "." .. ".".".".".".".".""."." .. "" ..... 369

Поиск значений в списках при помощи инструкции

in".".".".""".".".""".".".""".".""""".""""372

Списковые методы и полезные встроенные функции.".".""""""".""""".".""""""""".""""."."373
Копирование списков .. ""."."." .. ".""""."." .. " .... "" .. "." .. ".""".".""".".""""."."."""."."."" .. " .... " .. 381

Обработка списков

"."."."".""".".".".""""""".""".""""""." .. ".".""""""" .. "."."."."."."."."."." ... 382

Краткое оглавление

7.8
7.9
7.1 О

IX

Двумерные списки ............................................................................................................................... 395
Кортежи

................................................................................................................................................ 399
Построение графиков с данными списков при помощи пакета matplotlib ................................... .401
Вопросы для повторения ............................................................................................................................... 418
Задачи по программированию ...................................................................................................................... 421
Глава

8.1
8.2
8.3

8.

Подробнее о строковых данных

............................................................................... 427

Базовые строковые операции

............................................................................................................. 427
Нарезка строковых значений .............................................................................................................. 434
Проверка, поиск и манипуляция строковыми данными .................................................................. 439
Вопросы для повторения ............................................................................................................................... 451
Задачи по программированию ...................................................................................................................... 454
Глава

9.1
9.2
9.3

9.

Словари и множества ................................................................................................. 459

Словари ................................................................................................................................................. 459
Множества ............................................................................................................................................ 483
Сериализация объектов ....................................................................................................................... 496

Вопросы для повторения ............................................................................................................................... 502
Задачи по программированию ...................................................................................................................... 507

Глава

10.1
10.2
10.3
10.4

10.

Классы и объектно-ориентированное программирование

............................... 513

Процедурное и объектно-ориентированное программирование .................................................... 513
Классы ................................................................................................................................................... 516
Работа с экземплярами ........................................................................................................................ 534
Приемы конструирования классов

.................................................................................................... 556

Вопросы для повторения ............................................................................................................................... 567
Задачи по программированию ...................................................................................................................... 571

Глава

11.1
11.2

11.

Наследование

............................................................................................................. 575

Введение в наследование .................................................................................................................... 575
Полиморфизм ....................................................................................................................................... 589

Вопросы для повторения ............................................................................................................................... 596
Задачи по программированию ...................................................................................................................... 598

Глава

12.1
12.2
12.3

12.

Рекурсия ...................................................................................................................... 601

Введение в рекурсию ........................................................................................................................... 601

Решение задач на основе рекурсии .................................................................................................... 604
Примеры алгоритмов на основе рекурсии

........................................................................................ 607

Вопросы для повторения ............................................................................................................................... 615
Задачи по программированию ...................................................................................................................... 618

Глава

13 .1
13.2
13.3
13.4
13.5
13.6
13.7
13.8
13.9

13.

Программирование графического пользовательского интерфейса ................ 619

Графические интерфейсы пользователя ............................................................................................ 619

Использование модуля

tkinter ............................................................................................................ 621
Label .................................................................. 624
Упорядочение элементов интерфейса при помощи рамок Frame .................................................. 628
Элементы интерфейса Button и информационные диалоговые окна ............................................. 630
Получение входных данных при помощи элемента интерфейса Entry ......................................... 634
Применение элементов Label в качестве полей вывода .................................................................. 637
Радиокнопки и флаговые кнопки ....................................................................................................... 644
Рисование фигур при помощи элемента интерфейса Canvas ......................................................... 651
Вывод текста при помощи элемента интерфейса

Х

Краткое оглавление
Вопросы для повторения ............................................................................................................................... 671

Задачи по программированию ...................................................................................................................... 675

Глава

14.1
14.2
14.3
14.4
14.5

14. Основы

функционального программирования

.................................................. 681

Принципы функционального программирования ............................................................................ 681

Оператор

lambda,

функции

map,filter, reduce

и другие

............................................... " ................. 682

Включение в последовательность ...................................................................................................... 687
Замыкание ............................................................................................................................................. 689
Функциональное ядро программы на основе конвейера ................................................................. 691

Приложение

1. Установка языка Python ................................................................................ 699

Скачивание языка
Установка

Python

Приложение
Запуск среды

2.

Python .............................................................................................................................. 699
Windows .................................................................................................................. 699

3.х в

Введение в среду

IDLE

IDLE ................................................................................... 701

и использование оболочки

Python ................. " .... " ........................................... " ....... 701
Python в редакторе IDLE ....................................................................................... 703
Цветная разметка ............ " ............................................................................................................................. 704
Автоматическое выделение отступом ......................................................................................................... 704
Сохранение программы ................................................................................................................................. 705
Выполнение программы ................................................................................................................................ 705
Другие ресурсы .............................................................................................................................................. 706
Написание программы

Приложение

3.

Набор символов

ASCII ................................................................................... 707

Приложение

4.

Предопределенные именованные цвета

Приложение

5.

Подробнее об инструкции

..................................................... 709

import .................................................................. 715

Импортирование конкретной функции или класса .................................................................................... 715
Импорт с подстановочным символом .......................................................................................................... 716

Использование псевдонимов

......... " ... " .... " .... " ............................................................................................ 716

Приложение

6. Установка

Приложение

7. Ответы

модулей при помощи менеджера пакетов

pip ........................ 719

на вопросы в Контрольных точках .............................................. 721

Глава

1 ............................................................................................................................................................. 721
2 ............................................................................................................................................................. 722
Глава 3 ............................................................................................................................................................. 724
Глава 4 ............................................................................................................................................................. 725
Глава 5 ............................................................................................................................................................. 727
Глава 6 ............................................................................................................................................................. 729
Глава 7 ............................................................................................................................................................. 730
Глава 8 ............................................................................................................................................................. 732
Глава 9 ............................................................................................................................................................. 733
Глава 10 ........................................................................................................................................................... 735
Глава 11 ........................................................................................................................................................... 736
Глава 12 ........................................................................................................................................................... 736
Глава 13 ........................................................................................................................................................... 736
Глава

Предметный указатель

.............................................................................................................. 739

Краткое оглавление .................................................................................................................... VII
Предисловие ..................................................................................................................................... 1
Прежде всего управляющие структуры и только потом классы

................................... " ............................. 1
............................................................................................................................................ 1
Организация учебного материала .................................................................................................................... 4
Структурные элементы и условные обозначения книги . " ......... " ....... .......................................................... 5
Дополнительные материалы ............................................................................................................................. 6
Онлайновые учебные ресурсы ............................................................................................................... 6
Ресурсы для преподавателя .................................................................................................................... 6
Электронный архив ........................................................................................................................................... 7
Об авторе ............................................................................................................................................................ 7
Комментарий переводчика ................................................................................................................................ 7
Представление чисел ............................................................................................................................... 7
Базовый набор сторонних библиотек .................................................................................................... 8
Порядок установки библиотек ............................ ;.................................................................................. 9
Установка библиотек Python из whl-файлов ......................................................................................... 9
Установка и настройка инструментальной среды Spyder ...... " ......................................................... 1О
Блокноты Jupyter .................................................................................................................................... 10
Краткий обзор глав

Глава

1.1
1.2

1.3

1. Введение

Введение

в компьютеры и программирование ....................................................... 13

..................................................... "................. " ........................................................................ 13
Аппаратное и программное обеспечение ...................... " ................... " ............... " .......... " .................. 14
Аппаратное обеспечение ....................................................................................................................... 14
Центральный процессор ........................................................................................................................ 15
Основная память ............................................. ..................................................... .................................. 17
Вторичные устройства хранения ......................................................................................................... 17
Устройства ввода ................................................................................................................................... 18
Устройства вывода ................................................................................................................................ 18
Программное обеспечение .................................................................................................................... 18
Системное программное обеспечение .......................................................................................... 18
Прикладное программное обеспечение ........................................................................................ 19
Как компьютеры хранят данные .......................................................................................................... 20
Хранение чисел ...................................................................................................................................... 21
Хранение символов ............................................................................................................................... 22
Хранение чисел повышенной сложности ........................................................................................... 23
Другие типы данных ............................................................................................................................. 23

XI 1

Оглавление

1.4

Как программа работает

...................................................................................................................... 24
.......................................................................................... 27
Высокоуровневые языки ...................................................................................................................... 28
Ключевые слова, операторы и синтаксис: краткий обзор ................................................................ 29
Компиляторы и интерпретаторы ......................................................................................................... 30
1.5 Использование языка Python ............................................................................................................... 32
Установка языка Python ....................................................................................................................... 32
Интерпретатор языка Python ............................................................................................................... 32
Интерактивный режим ........................................................................................................................ .3 3
Написание программ Python и их выполнение в сценарном режиме .............................................. 34
Среда программирования IDLE .......................................................................................................... 35
Вопросы для повторения ............................................................................................................................... 36
Множественный выбор ........................................................................................................................ 36
Истина или ложь ................................................................................................................................... 40
Короткий ответ ..................................................................................................................................... 40
Задачи .............................................................................................................................................................. 40
От машинного языка к языку ассемблера

Глава 2. Ввод, обработка и вывод"""""""""""""""""""""""""""""""""""""""""""""". 43
2.1

Проектирование программы ............................................................................................................... .43
Цикл проектирования программы

..................................................................................................... .43

Подробнее о процессе проектирования ............................................................................................. .44
Понять задачу, которую программа должна выполнить ........................................................... .44

Определить шаги, необходимые для выполнения задачи ......................................................... .45
Псевдокод .............................................................................................................................................. 46
Блок-схемы ............................................................................................................................................ 46

2.2
2.3

Ввод, обработка и вывод ..................................................................................................................... .48
Вывод данных на экран при помощи функции

print ........................................................................ .48
........................................................................................ .49
Комментарии ........................................................................................................................................ 51
Переменные .......................................................................................................................................... 52
Создание переменных инструкцией присваивания ........................................................................... 53
Правила именования переменных ...................................................................................................... 55
Вывод многочисленных значений при помощи функции print ........................................................ 51
Повторное присваивание значений переменным .............................................................................. 58
Числовые типы данных и числовые литералы .................................................................................. 58
Хранение строковых данных с типом str ........................................................................................... 60
Повторное присвоение переменной значения другого типа ............................................................ 60
Чтение входных данных с клавиатуры ............................................................................................... 62
Чтение чисел при помощи функции input .......................................................................................... 63
Выполнение расчетов ........................................................................................................................... 66
*В центре внимания* Вычисление процентов ................................................................................. 68
Деление с плавающей точкой и целочисленное деление .................................................................. 69
Приоритет операторов ......................................................................................................................... 70
Группирование при помощи круглых скобок .................................................................................... 71
*В центре внимания* Вычисление среднего арифметического значения ..................................... 71
Оператор возведения в степень ........................................................................................................... 73
Оператор остатка от деления ............................................................................................................... 73
Преобразование математических формул в программные инструкции .......................................... 74
Строковые данные и строковые литералы

2.4
2.5

2.6
2.7

*В центре внимания* Преобразование математической формулы в программную
инструкцюо ........................................................................................................................................... 7 5

Оглавление
Смешанные выражения и преобразование типов данных

Xlll

................................................................ 77

Разбиение минных инструкций на несколько строк ........................................................................ 78
Подробнее о выводе данных

............................................................................................................... 79
print ....................................................... 79
Задание символа-разделителя значений ............................................................................................. 80
Экранированные символы ................................................................................................................... 80
Вывод многочисленных значений при помощи оператора+ ........................................................... 81
Форматирование чисел ........................................................................................................................ 82
Форматирование в экспоненциальной записи ................................................................................... 83
Вставка запятой в качестве разделителя ............................................................................................ 84
Определение минимальной ширины поля ......................................................................................... 84
Форматирование числа с плавающей точкой в виде процента ........................................................ 86
Форматирование целых чисел ............................................................................................................. 86
2.9 Именованные константы ..................................................................................................................... 87
2.1 О Введение в черепашью графику .......................................................................................................... 88
Рисование отрезков прямой при помощи черепахи .......................................................................... 89
Поворот черепахи ................................................................................................................................. 91
Установка углового направления черепахи в заданный угол ........................................................... 94
Получение текущего углового направления черепахи ..................................................................... 94
Поднятие и опускание пера ................................................................................................................. 95
Рисование кругов и точек .................................................................................................................... 96
Изменение размера пера ...................................................................................................................... 97
Изменение цвета рисунка .................................................................................................................... 97
Изменение цвета фона ......................................................................................................................... 98
Возвращение экрана в исходное состояние ....................................................................................... 98
Установление размера графического окна ......................................................................................... 98
Перемещение черепахи в заданную позицию .................................................................................... 99
Получение текущей позиции черепахи ............................................................................................ 100
Управление скоростью анимации черепахи .................................................................................... 1О1
Сокрытие черепахи ............................................................................................................................ 1О1
Вывод текста в графическое окно ..................................................................................................... 1О1
Заполнение геометрических фигур ................................................................................................... 103
Применение команды turt/e. dопеО ДJIЯ сохранения графического окна открытым ..................... 105
*В центре внимания* Программа "Созвездие Ориона" ................................................................. 105
Вопросы мя повторения ............................................................................................................................ . 114
Множественный выбор ...................................................................................................................... 114
Истина или ложь ................................................................................................................................. 117
Короткий ответ ................................................................................................................................... 118
Алгоритмический тренажер .............................................................................................................. 118
Задачи по программированию ..................................................................................................................... 119
2.8

Подавление концевого символа новой строки в функции

Глава

3.1

3.

Структуры принятия решения и булева логика ..................................................

Инструкция

125

if...................................................................................................................................... 125

Булевы выражения и операторы сравнения ..................................................................................... 127
Операторы

>= и >>

рrint('Программировать на

Python -

это круто!')

После набора инструкции нажмите клавишу

,

[EntEii]

и интерпретатор

Python

исполнит ин­

струкцию, как показано ниже:

>>>

рrint('Программировать на

Программировать

на

Python -

Python -

это круто!') ~~

круто!

>>>
После вывода сообщения снова появляется подсказка>», которая говорит о том, что интер­

претатор ожидает от вас набора следующей инструкции.

34

Глава 1. Введение в компьютеры и программирование
Давайте взглянем на еще один пример. В приведенном ниже примере сеанса мы ввели две
инструкции:

>>> print ('Быть
Быть

или не

>>> print
Во т

или не быть?'

) 1Enter1

быть?

('Вот в чем вопрос.') 1Ente ~

в чем вопрос.

>>>
Если в интерактивном режиме набрать инструкцию неправильно, то интерпретатор выведет
на экран сообщение об ошибке. Это делает интерактивный режим очень полезным во время

изучения языка

Python.

По мере изучения новых компонентов языка их можно испытывать

в интерактивном режиме и получать непосредственную обратную связь от интерпретатора .

Для того чтобы выйти из интерпретатора
под управлением

Windows,

Python

UNIX

нажмите

+ (нажимайте обе кла­
OS Х, Linux или на компьютере под

нажмите комбинацию клавиш

виши одновременно) и вслед за этим
управлением

в интерактивном режиме на компьютере

.
+ .

В Мае

ПРИМЕЧАНИЕ
В главе 2 мы рассмотрим показанные ранее инструкции подробнее. Если вы хотите их испытать
прямо сейчас в интерактивном режиме, то убедитесь, что набираете их на клавиатуре в точности,
как показано.

Написание программ

Python

и их выполнение в сценарном режиме
Интерактивный режим полезен для тестирования программного кода. Вместе с тем инструк­
ции, которые вы вводите в интерактивном режиме, не сохраняются в качестве программы.

Они просто исполняются, и их результаты отображаются на экране. Если вы хотите сохра­
нить перечень инструкций Python в качестве программы, то эти инструкции следует сохра­
нить в файле. Затем, чтобы исполнить эту программу, интерпретатор

Python

следует запус­

тить в сценарном режиме.

Например, предположим, что вы хотите написать программу

Python,

которая выводит на

экран приведенные далее три строки текста:

Мигнуть
Моргнуть
Кив нут ь .

Для написания программы следует создать файл в простом текстовом редакторе, таком как
Блокнот (который установлен на всех компьютерах с

Windows),

содержащий следующие

инструкции:

pr int
pr int
pri nt

('Мигнуть
('Морг нуть

(' Кив нуть .

')
')
')

ПРИМЕЧАНИЕ
Для создания программы Pythoп можно использовать текстовой процессор, но вы должны
убедиться, что сохраняете программу как файл с обычным текстом. В противном случае интер­
претатор Pythoп не сможет прочитать его содержимое .

Глава 1. Введение в компьютеры и программирование
При сохранении программы

фицирует ее как программу

Python ей следует
Python. Например,

35

дать имя с расширением ру, которое иденти­

приведенную выше программу можно сохра­
нить под именем test.py. Для того чтобы выполнить программу, следует перейти в каталог,
в котором сохранен файл, и в командной оболочке операционной системы набрать команду:

python test.py
Эта команда запустит интерпретатор

Python в сценарном режиме, в результате чего он ис­
полнит инструкции в файле test.py. Когда программа закончит исполняться, интерпретатор
Python

прекратит свою работу.

Среда программирования

IDLE

ВuдР11зr:тись "Пrюменение интерактивного vежима в среде

IOLE" (Using lnteracti11e Mode

iп

IOLE)

В предыдущих разделах рассматривался способ запуска интерпретатора Python в интерак­
тивном либо сценарном режимах в командной оболочке операционной системы . Как вари­
ант, можно использовать интегрированную среду разработки, т. е. отдельную программу,
которая предлагает все инструменты, необходимые для написания, исполнения и тестирова­
ния программы.

Последние версии

Python

содержат программу под названием

ся автоматически во время установки языка
окно, показанное на рис.

1.20.

Python.

IDLE 1,

которая устанавливает­

При запуске среды

Обратите внимание, что в окне

IDLE

IDLE

появляется

имеется подсказка

»>,

говорящая о том, что интерпретатор работает в интерактивном режиме. Напротив этой под­

сказки можно набирать инструкции

Python

и видеть их исполнение в окне

IDLE.

Среда IDLE также имеет встроенный текстовый редактор с функциональными возможно­
стями, специально предназначенными для того, чтобы помогать вам писать свои программы
на Python. Например, редактор IDLE "расцвечивает" код таким образом, что ключевые слова
и другие части программы размечаются на экране своим специальным цветом. Это упроща­
ет чтение программ. В редакторе
полнять их. В приложении

2

IDLE

можно писать программы, сохранять на диск и ис­

предоставлено краткое введение в среду

IDLE,

которое прове­

дет вас по всему процессу создания, сохранения и исполнения программы на языке

о
Option~

Pyct r.
)

[М$С

З . о .q

•.

:i.nf :::ir.ac1
.., >/ 1

(

indo v

Dec 9 : о ,
n w i:iЗ:
"c:::e::Ucs " о ::: "lice:1se () "

З . t: .~: d~~eceb,

'°00 t:q

Ь .:.с

х

Help
0€ : 5q : ~ O

(AМDt:~)

f

.r

rr.o:::e

=i •

Ln: 3 Col: 4
РИС.

1.20.

Окно интегрированной среды разработки

1

Integrated DeveLoprnent Environrnent -

интегрированная среда разработки.

Python.

36

Глава

Введение в компьютеры и программирование

1.

ПРИМЕЧАНИЕ
Помимо среды

IDLE,

которая устанавливается вместе с Pythoп, существует несколько других ин­

тегрированных сред разработки на Pythoп. Ваш преподаватель определит, какую из них исполь­

зовать на занятиях 1 •

Вопро ы для повт
Множественный выбор

l. _____ -это

набор инструкций, которые компьютер исполняет, чтобы решить за-

дачу.

2.

3.

4.

а)

компилятор;

б)

программа;

в)

интерпретатор;

г)

язык программирования.

Физические устройства, из которых компьютер состоит, называются
а)

аппаратным обеспечением;

б)

программным обеспечением;

в)

операционной системой;

г)

инструментами.

Компонент компьютера, который исполняет программы, называется

а)

ОЗУ;

б)

вторичным устройством хранения;

в)

основной памятью;

г)

центральным процессором, или ЦП.

а)

процессорами

б)

микропроцессорами;

в)

микросхемами памяти;

г)

операционными системами.

_____

ENIAC;

Компьютер хранит программу во время ее исполнения, а также данные, с которыми программа работает, в

1

_____

Сегодня центральные процессоры представляют собойнебольшие кристаллы интегральной микросхемы, которые называются

5.

_____

_ _ _ __

а)

вспомогательной памяти;

б)

ЦП;

в)

основной памяти;

г)

микропроцессоре.

В комментариях переводчика описаны две альтернативных среды программирования для создания и выполне­
Python - среда программирования Spyder и интерактивная среда программирования Jupyter. -

ния программ
ПptLw. пер.

Глава 1. Введение в компьютеры и программирование

6.

Энергозависимый тип памяти, который используется только для временного хранения
инструкций и данных во время работы программы, называется

7.

а)

ОЗУ;

б)

вторичным устройством хранения;

в)

дисководом;

г)

USВ-диском.

а)

ОЗУ;

б)

основной памятью;

в)

вторичным устройством хранения;

г)

устройством хранения данных ЦП.

_____

Компонент, который собирает данные от людей и различных устройств и отправляет их
в компьютер, называется

9.

_____

Тип памяти, который может хранить данные в течение долгого времени, даже когда
к компьютеру не подведено электропитание, называется

8.

37

_____

а)

устройством вывода;

б)

устройством ввода;

в)

вторичным устройством хранения;

г)

основной памятью.

Видеодисплей является - - - - а)

устройством вывода;

б)

устройством ввода;

в)

вторичным устройством хранения;

г)

основной памятью.
достаточно только для того, чтобы хранить одну букву алфавита или не-

10.

большое число.

11.

12.

а)

байта;

б)

бита;

в)

переключателя;

г)

транзистора.

Байт состоит из восьми

а)

центральных процессоров;

б)

инструкций;

в)

переменных;

г)

битов.

В

_____

системе исчисления все числовые значения записываются как последова-

тельности нулей и единиц.

а)

шестнадцатеричной;

б)

двоичной;

38

Глава 1. Введение в компьютеры и программирование

13.

14.

в)

восьмеричной;

г)

десятичной.

Бит в положении "включено" представляет значение
а)



б)

-1;

в)

о·

г)

"нет".

'
'

Набор из

числовых кодов, которые обозначают английские буквы, различные знаки

128

препинания и другие символы, представлен

15.

а)

двоичной системой исчисления;

б)

таблицей

в)

Юникодом;

г)

процессором

17.

18.

19.

_____

ASCII;
ENIAC.

Широкая схема кодирования, которая может представлять символы многих языков мира,
называется

16.

_____

-----

а)

двоичной системой исчисления;

б)

таблицей

в)

Юникодом;

г)

процессором

ASCII;
ENIAC.

Отрицательные числа кодируются при помощи

_____

а)

метода дополнения до двух;

б)

метода представления в формате с плавающей точкой;

в)

таблицы

г)

Юникода.

ASCII;

Вещественные числа кодируются при помощи

_____

а)

метода дополнения до двух;

б)

метода представления в формате с плавающей точкой;

в)

таблицы

г)

Юникода.

ASCII;

Крошечные цветные точки, из которых состоят цифровые изображения, называются
а)

битами;

б)

байтами;

в)

цветными пакетами;

г)

пикселами.

Если бы вам пришлось обратиться к программе на машинном языке, то вы бы увидели

а)

исходный код

б)

поток двоичных чисел;

Python;

Глава 1. Введение в компьютеры и программирование

20.

в)

английские слова;

г)

микросхемы.

На этапе

_____

39

в цикле "выборка-декодирование-исполнение" ЦП определяет, ка-

кую операцию он должен выполнить.

21.

а)

выборки;

б)

декодирования;

в)

исполнения;

г)

деконструирования.

Компьютеры могут исполнять только те программы, которые написаны на
а)

Java;

б)

языке ассемблера;

в)

машинном языке;

г)

Python.

_ _ _ __

транслирует программу на языке ассемблера в программу на машинном

22.
языке.

23.

24.

а)

ассемблер;

б)

компилятор;

в)

транслятор;

г)

интерпретатор.

Слова,

которые составляют высокоуровневый язык программирования, называются

а)

двоичными инструкциями;

б)

мнемониками;

в)

командами;

г)

ключевыми словами.

Правила,

которые

должны

соблюдаться

при

а)

синтаксическими правилами;

б)

правилами расстановки знаков препинания;

в)

правилами написания ключевых слов;

г)

правилами применения операторов.

написании

программы,

называются

транслирует программу, написанную на высокоуровневом языке, в отдель-

25.

ную программу на машинном языке.

а)

ассемблер;

б)

компилятор;

в)

транслятор;

г)

сервисная программа.

40

Глава 1. Введение в компьютеры и программирование

Истина или ложь
Сегодня ЦП представляют собой огромные устройства, изготовленные из электрических

1.

и механических компонентов, таких как вакуумные лампы и переключатели.

Основная память также называется оперативной памятью, или ОЗУ.

2.

Любая порция данных, которая хранится в памяти компьютера, должна храниться в виде

3.

ДВОИЧНОГО числа.

Изображения, аналогичные создаваемым вашей цифровой камерой, нельзя сохранить

4.

как двоичное число.

5.

Машинный язык

6.

Язык ассемблера считается высокоуровневым языком.

7.

Интерпретатор

-

это единственный язык, который ЦП понимает.

-

это программа, которая транслирует и исполняет инструкции в про­

грамме на высокоуровневом языке.

Синтаксическая ошибка не препятствует тому, чтобы программа была скомпилирована

8.

и исполнена.

9. Windows, Linux, Android, iOS

и Мае

OS

Х- все они являются примерами прикладного

программного обеспечения.

1О.

Программы обработки текста, программы по работе с электронными таблицами, почто­
вые программы, веб-браузеры и игры

-

все они являются примерами обслуживаюших

программ.

Короткий ответ
1.

2.

Почему ЦП является самым важным компонентом в компьютере?

Какое двоичное число представляет включенный бит? Какое двоичное число представляет выключенный бит?

3.

Как называется устройство, которое работает с двоичными данными?

4.

Как называются слова, которые составляют высокоуровневый язык программирования?

5.

Как называются короткие слова, которые используются в языке ассемблера?

6.

Какова разница между компилятором и интерпретатором?

7.

Какой тип программного обеспечения управляет внутренними операциями аппаратноп

обеспечения компьютера?

За
1.

Для того чтобы убедиться, что вы научились взаимодействовать с интерпретаторш

Python,

попробуйте выполнить на своем компьютере приведенные ниже шаги.



Запустите интерпретатор

Python



Напротив подсказки

наберите следующую инструкцию, затем нажмите клавиш

»>

в интерактивном режиме.

:
print ('Проверка интерпретатора Python. ') !E:rl~~rl

Глава 1. Введение в компьютеры и программирование



После нажатия клавиши



41

интерпретатор исполнит инструкцию. Если вы ввели

все правильно, то ваш сеанс должен выглядеть так:

>>>

print('Пpoвepкa интерпретатора

Python. ') IEnterJ

Python.

Проверка интерпретатора

>>>



Если вы увидите сообщение об ошибке, введите инструкцию снова и убедитесь, что

вы ее набираете в точности, как показано.



Выйдите из интерпретатора

.
2.

Python.



Windows

нажмите клавиши

В других операционных системах нажмите

+, а затем
клавиши +.)

Для того чтобы убедиться, что вы научились взаимодействовать с интегрированной сре­
дой разработки

IDLE,

попробуйте выполнить на своем компьютере приведенные ниже

шаги.

Видеозапись "Выполнение упражнения



2" (Petfo1ming Exercise 2)

Запустите среду
на элементе

IDLE: в Windows наберите слово IDLE в поле поиска. Щелкните
IDLE (IDLE Python 3.6), который будет выведен в отчете о результатах

поиска.



При запуске среды

было

представлено на рис.

инст­

рукцию, затем

print



IDLE она должна появиться в окне, похожем на то, которое
1.20. Напротив подсказки »> введите приведенную ниже
нажмите клавишу :

('Проверка

IDLE. ')

После нажатия клавиши

1

Enter J



интерпретатор

Python

исполнит инструкцию. Если

все набрано правильно, то ваш сеанс должен выглядеть так:

>>> print
Проверка

('Проверка среды
среды

IDLE. ') JEnter J

IDLE'.

>>>



Если вы видите сообщение об ошибке, то введите инструкцию снова и убедитесь, что

набираете ее в точности, как показано.



Выйдите из
виши

3.

IDLE, выбрав
+ ).

в меню

File

(Файл) команду

Exit

(Выход) (или нажав кла­

Примените ваши знания о двоичной системе исчисления, чтобы преобразовать следую­
щие ниже десятичные числа в двоичные:

11
65
100
255

4.

Примените ваши знания о двоичной системе исчисления, чтобы преобразовать следую­
щие ниже двоичные числа в десятичные:

1101
1000
101011

42

Глава 1. Введение в компьютеры и программирование

5.

По таблице

ASCII

из приложения

3

определите коды каждой буквы какого-нибудь анг­

лийского имени.

6.

Проведите исследование истории языка программирования

Python

при помощи Интерне­

та и ответьте на следующие вопросы:



Кто является создателем языка



Когда



Python

Python?

был создан?

В сообществе разработчиков на

BDFL.

Python

Что означает эта аббревиатура?

создателя языка

Python

принято называть

111111111111

2.1

а

1111111111(__

КЛЮЧЕВЫЕ ПОЛОЖЕНИЯ
Прежде чем приступать к написанию программы, ее необходимо спроектировать. Во
время

процесса

проектирования

программисты

применяют

специальные

инструменты,

такие как псевдокод и блок-схемы, для создания модели программы.

Цикл проектирования программы
В главе

1 вы

узнали, что для создания программ разработчики используют преимущественно

высокоуровневые языки, такие как

чивается

написанием

кода.

Python.

Процесс

Однако создание программы отнюдь не ограни­

создания

правильно работающей

правило, подразумевает пять фаз, показанных на рис.

2.1.

программы,

как

Весь этот процесс называется цик­

лом разработки программы.

Спроектировать
программу

------

Написать код

t
РИС.

2.1.

-

Исправить
синтаксические

f---+

Протестировать

ошибки

Исправить
~

программу

логические

ошибки

-

Цикл разработки программы

Рассмотрим каждый этап данного цикла подробнее.

1.

Спроектировать программу. Все профессиональные программисты вам скажут, что до

того, как рабочий код программы будет написан, программа должна быть тщательно
спроектирована. Когда программисты начинают новый проект, они никогда не бросаются
к написанию кода с места в карьер. Они начинают с того, что создают проект программы.
Существует несколько способов проектирования программы, и позже в этом разделе мы

рассмотрим некоторые методы, которые можно применять для разработки программ

Python.
2.

Написать код. После создания проекта программы разработчик начинает записывать код
на высокоуровневом языке, в частности на

Python.

Из главы

1 известно,

что каждый язык

имеет свои синтаксические правила, которые должны соблюдаться при написании про­

граммы. Эти правила языка диктуют, каким образом использовать такие элементы, как
ключевые слова, операторы и знаки препинания. Синтаксическая ошибка происходит
в случае, если программист нарушает какое-либо из этих правил.

44

Глава 2. Ввод, обработка и вывод

3.

Исправить синтаксические ошибки. Если программа содержит синтаксическую ошиб­
ку или даже простую неточность, такую как ключевое слово с опечаткой, то компилятор

или интерпретатор выведет на экран сообщение об ошибке с ее описанием. Практически
любой программный код содержит синтаксические ошибки, когда он написан впервые,
поэтому, как правило, программист будет тратить некоторое время на их исправление.
После того как все синтаксические ошибки и простые неточности набора исходного кода
исправлены, программа может быть скомпилирована и транслирована в программу
на машинном языке (либо, в зависимости от используемого языка, исполнена интерпре­
татором).

4.

Протестировать программу. Когда программный код находится в исполнимой форме,

его тестируют с целью определения каких-либо логических ошибок. Логическая ошиб­
ка- это неточность, которая не мешает выполнению программы, но

приводит к тому,

что программа выдает неправильные результаты. (Математические неточности являются
типичными причинами логических ошибок.)

5.

Исправить логические ошибки. Если программа приводит к неправильным результа­

там, программист выполняет отладку кода

-

отыскивает в программе логические ошиб­

ки и исправляет их. Иногда во время этого процесса программист обнаруживает, что ори­
гинальный проект программы должен быть изменен. Тогда разработка программы вновь
начинается и продолжается до тех пор, пока все ошибки не будут обнаружены и устра­
нены.

Подробнее о процессе проектирования
Процесс проектирования программы, возможно, является самой важной частью цикла. Про­

ект программы можно представить, как фундамент. Если возвести дом на плохо поставлен­
ном фундаменте, то в конечном счете можно оказаться в ситуации, когда придется потра­
тить уйму времени и усилий, чтобы его укрепить! Так и с программой: если она спроектиро­
вана плохо, то вам придется проделать большую работу, чтобы ее исправить.
Процесс проектирования программы можно обобщить так:

1.

Понять задачу, которую программа должна выполнить.

2.

Определить шаги, которые должны быть проделаны для выполнения задачи.

Давайте взглянем на каждый из этих шагов поближе.

Понять задачу, которую программа должна выполнить
Прежде всего крайне важно понять, что именно программа должна делать. Как правило,

профессиональный
с клиентом

-

программист достигает этого

понимания,

работая

непосредственно

заказчиком проекта. Мы используем термин "клиент" для обозначения чело­

века, группы или организации, которые поручают вам написать программу. Это может быть
клиент в традиционном

значении

слова,

т. е.

кто-то,

кто платит вам деньги

за написание

программы. Но им также может быть ваш руководитель или начальник отдела в вашей ком­

пании. Независимо от того, кем он является, клиент будет опираться на вашу программу при
выполнении важной задачи.

Для того чтобы понять предназначение программы, программист обычно берет у заказчика
интервью: клиент описывает задачу, которую программа должна выполнять, а программист

задаст вонросы, чтобы раскрыть как можно больше подробнос~-ей о задаче. Обычно требует-

45

Глава 2. Ввод, обработка и вывод

ся еще одно интервью, потому что во время первой встречи клиенты редко упоминают все,
что они хотят, и у программистов часто возникают дополнительные вопросы .

Программист изучает информацию, которая была собрана от клиента во время обоих ин­
тервью, и создает список различных технических требований к программному обеспечению.
Техническое требование к программному обеспечению

-

это просто отдельное задание, ко­

торое необходимо выполнить для удовлетворения потребностей клиента. Как только клиент
соглашается, что список технических требований полон, программист может перейти к сле­
дующей фазе.

СОВЕТ
Если вы примете решение стать профессиональным разработчиком ПО, то вашим клиентом
будет любой, кто поручает вам писать программы в рамках вашей работы. Однако, коль скоро вы
пока что еще являетесь учащимся, вашим клиентом является ваш преподаватель! Можно утверж­
дать практически со стопроцентной гарантией, что на каждом занятии по программированию,

которое вы будете посещать, ваш преподаватель будет ставить перед вами задачи. Для того
чтобы ваша академическая успеваемость была на высоте, первым делом убедитесь, что вы по­
нимаете технические требования своего преподавателя к этим задачам, и старайтесь писать
свои программы в соответствии с ними .

Определить шаги, необходимые для выполнения задачи
После того как вы разобрались в задаче, которую программа будет выполнять, вам нужно

разбить задачу на серию шагов. Например, предположим, что кто-то вас просит объяснить,
как вскипятить воду. Эту задачу можно разбить на серию шагов следующим образом:

1.

Налить нужный объем воды в чайник.

2.

Поставить чайник на плиту.

3.

Включить плиту.

4.

Следить за водой, пока вода не начнет бурлить. Когда она забурлит, вода будет вскипя­
чена.

Это пример алгоритма, т. е. набора четко сформулированных логических шагов, которые

должны быть проделаны для выполнения задачи. Обратите внимание, что в этом алгоритме
шаги последовательно упорядочены. Шаг

1 должен

быть выполнен перед шагом

2

и т. д.

Если человек выполняет эти шаги в· точности, как они описаны, и в правильном порядке, то
он сможет успешно вскипятить воду.

Программист разбивает задачу, которую программа должна выполнить, схожим образом. Он
создает алгоритм с перечислением всех логических шагов, которые должны быть выполне­
ны. Например, предположим, вам поручили написать программу, которая рассчитывает

и показывает заработную плату до налоговых и прочих удержаний для сотрудника с почасо­
вой ставкой оплаты труда. Вот шаги, которые вы бы проделали :

1.

Получить количество отработанных часов.

2.

Получить почасовую ставку оплаты труда.

3.

Умножить число отработанных часов на почасовую ставку оплаты труда.

4.

Показать результат вычисления, выполненного на шаге

3.

Разумеется, этот алгоритм совсем не готов к тому, чтобы его можно было исполнить на ком­
пьютере. Шаги, перечисленные в этом списке, сначала должны быть переведены в про-

46

Глава 2. Ввод, обработка и вывод
граммный код. Для достижения этой цели программисты широко применяют два инстру­

мента: псевдокод и блок-схемы. Давайте взглянем на каждый из них более развернуто.

Псевдокод
Поскольку неточности, т. е. слова с опечатками и пропущенные знаки препинания, могут

вызывать синтаксические ошибки, программисты должны быть внимательны к таким мел­
ким деталям при написании кода. По этой причине, прежде чем написать программу в рабо­

чем коде языка программирования, в частности на

Python,

программисты считают полезным

написать программу в псевдокоде (т. е. с пропуском несущественных подробностей).
Слово "псевдо" означает "фикция, подделка", поэтому псевдокод- это фиктивный код. Это
неформальный язык, который не имеет каких-либо синтаксических правил и не предназна­
чен для компиляции или исполнения. Вместо этого для создания моделей, или макетов, про­
грамм разработчики используют псевдокод. Поскольку при написании псевдокода програм­

мистам не приходится беспокоиться о синтаксических ошибках, они могут спокойно сосре­
доточить все свое внимание на проектировании программы. После того как на основе
псевдокода создан отвечающий требованиям проект, псевдокод может быть переведен непо­
средственно в рабочий код. Вот пример того, как можно написать псевдокод для программы
вычисления зарплаты, которую мы рассмотрели ранее:

Ввести отработанные часы.
Ввести почасовую

ставку оплаты труда.

Рассчитать заработную плату до удержаний,
и

ставки

Показать

оплаты

как произведение отработанных часов

труда.

заработную плату.

Каждая инструкция в псевдокоде представляет операцию, которая может быть выполнена на
языке

Python.

Например,

Python

может прочитать входные данные, набираемые на клавиа­

туре, выполнить математические расчеты и показать сообщения на экране.

Блок-схемы
Блок-схемы являются еще одним инструментом, который программисты используют для

проектирования программ. Блок-схема

-

это диаграмма, которая графически изображает

шаги, имеющие место в программе. Блок-схема для программы расчета заработной платы
представлена на рис.

2.2.

Обратите внимание, что в блок-схеме имеется три типа символов: овалы, параллелограммы
и прямоугольники. Каждый из этих символов представляет шаг в программе, как описано
далее.

+ Овалы,

которые появляются вверху и внизу блок-схемы, называются терминальными

символами. Терминальный символ Начало отмечает начальную точку программы, терми­
нальный символ Конец

-

ее конечную точку.

+ Параллелограммы используются в качестве входных и выходных символов.

Они обозна­

чают шаги, в которых программа считывает данные на входе (т. е. входные данные) или
показывает итоговые данные на выходе (т. е. выходные данные).

+ Прямоугольники используются в качестве обрабатывающих символов.

Они обозначают

шаги, в которых программа выполняет некую обработку данных, такую как математиче­
ское вычисление.

Глава 2. Ввод, обработка и вывод

47

Начало

Ввести

отработанные часы

Ввести почасовую
ставку оплаты труда

Рассчитать заработную
плату до удержаний, как

произведение отработанных
часов и ставки оплаты труда

Конец

РИС.

2.2. Блок-схема программы расчета заработной платы
Символы соединены стрелками, которые представляют "поток" вычислений программы. Для

того чтобы пройти символы в надлежащем порядке, нужно начать с терминального символа
Начшю и следовать вдоль стрелок, пока не будет достигнут терминальный символ Конец.

~ Контрольная точка
2.1.

Кто является клиентом программиста?

2.2.

Что такое техническое требование к программному обеспечению?

2.3.

Что такое алгоритм?

2.4.

Что такое псевдокод?

2.5.

Что такое блок-схема?

2.6.

Что означают приведенные ниже символы блок-схемы?



Овал.



Параллелограмм.



Прямоугольник.

Глава 2. Ввод, обработка и вывод

48
11111111111

об аботка и вывод

2.2

111111111(___ КЛЮЧЕВЫЕ ПОЛОЖЕНИЯ
Входные данные

-

это данные, которые программа получает на входе. При получении

данных программа обычно их обрабатывает путем выполнения над ними некой операции.
Выходные данные, или итоговый результат операции, выводятся из программы.

Компьютерные программы, как правило, выполняют приведенный ниже трехшаговый про­
цесс:

1.

Получить входные данные (ввести данные).

2.

Выполнить некую обработку входных данных.

3.

Выдать выходные данные (вывести данные).

Входные данные

-

это любые данные, которые программа получает во время своего вы­

полнения. Одной из типичных форм входных данных являются данные, вводимые с клавиа­
туры. После того как входные данные получены, обычно они подвергаются некой обработ­

ке, такой как математическое вычисление. Итоговые результаты этой обработки отправля­
ются из программы в качестве выходных данных.

На рис.

2.3

показаны шаги в программе расчета заработной платы, которую мы рассмотрели

ранее. Количество отработанных часов и почасовая ставка оплаты труда передаются в каче­

стве входных данных. Программа обрабатывает эти данные путем умножения отработанных
часов на почасовую ставку оплаты труда. Результаты расчетов выводятся в качестве выход­
ных данных.

Обработка

Вход
Отработанные часы

Почасовая ставка

"

Умножить отработанные часы
на почасовую ставку
оплаты труда

Выход

• • " • •~ Заработная плата
до удержаний

"

оплаты труда

РИС.

2.3.

Ввод, обработка и вывод программы расчета заработной платы

В этой главе мы обсудим основные способы, которыми вы можете вводить, обрабаты(iать
и выводить данные с использованием языка

Python.

11111111111

2.3

анных на экран при

Выво

омощи функции pГlnt

111111111(___ КЛЮЧЕВЫЕ ПОЛОЖЕНИЯ
Функция print используется для вывода на экран выходных данных в программе
Видеозагч1сь "Функция

Функция

Python

-

pnnt" rThe

nпnt

Python.

Function)

это фрагмент заранее написанного кода, который выполняет некую операцию.

имеет многочисленные встроенные функции, которые выполняют различные опера-

Глава 2. Ввод, обработка и вывод

49

ции. Возможно, самой фундаментальной встроенной функцией является функция печати

print,

которая показывает выходные данные на экране. Вот пример инструкции, которая

исполняет функцию

print

('Привет,

print:

мир!')

Если набрать эту инструкцию и нажать клавишу



в интерактивном режиме, то на

экран будет выведено сообщение "Привет, мир!". Вот пример, который показывает, как это
делается:

>>>

рrint('Привет,

Привет,

мир!')

~nter]

мир!

>>>
Когда программисты исполняют функцию, они говорят, что вызывают функцию. При вызо­
ве функции

print набирается слово print, а затем пара круглых скобок. Внутри круглых

скобок набирается аргумент, т. е. данные, которые требуется вывести на экран. В предыду­
щем примере аргументом является 'Привет,

мир! '. Отметим, что во время исполнения этой

инструкции символы кавычек не выводятся. Символы кавычек просто задают начало и ко­
нец текста, который вы хотите показать.

Предположим, что ваш преподаватель поручает вам написать программу, которая выводит

на мониторе имя и адрес. В программе

2.1

представлен код с итоговым результатом, кото­

рый она произведет при ее выполнении. (В книге номера строк, которые появляются в рас­
печатке программы, не являются частью программы. Номера строк используются в ходе
изложения, чтобы ссылаться на части программы.)

Программа

2.1

] (output.py)

1 print ( 'Кейт Остен')
2 print ( '123 Фул Серкл Драйв ' )
3 print ( 'Эшвиль, Северная Каролина 28899')
Вывод программы
Кейт Остен

123

Фул

Эшвиль ,

Серк.л Драйв
Северная

Каролина

28899

Важно понять, что инструкции в этой программе исполняются в том порядке, в котором они
появляются в программе сверху вниз. При выполнении этой программы исполнится первая
инструкция, вслед за ней вторая инструкция и затем третья.

Строковые данные и строковые литералы
Программы почти всегда работают с данными какого-то типа. Например, программа

2.1

ис­

пользует три приведенные порции данных:

'Кейт

'123

Остен'

Фул

'Эшвиль,

Серкл Драйв'
Северная

Каролина

28899'

Эти порции данных представляют собой цепочки символов. В терминах программирования
цепочка символов, которая используется в качестве данных, называется символьной после-

50

Глава 2. Ввод, обработка и вывод

дователыюстью, или строковым значением, или просто строкой. Когда символьная после­

довательность появляется в рабочем коде программы, она называется строковым литера­
лом. В программном коде

Python

строковые литералы должны быть заключены в знаки

кавычек. Как отмечалось ранее, знаки кавычек просто отмечают, где строковые данные
начинаются и заканчиваются.

В

можно заключать строковые литералы в одинарные кавычки

Python

кавычки("). Строковые литералы в программе

2.1

1

2.2

1

либо двойные

заключены в одинарные кавычки, но этот

программный код можно написать так же, как показано в программе

Программа

( ')

2.2.

(douЫe_quotes.py)

print("Keйт Остен")

2 print("l23

Фул Сер кл Драйв")

з рrint("Эшвиль,

Северная

Каролина

28899")

Вывод программы
Кейт Остен

123

Фул Серкл Драйв

Эшвиль ,

Северная Каролина

28899

Если требуется, чтобы строковый литерал содержал одинарную кавычку (апостроф), то
можно заключить строковый литерал в двойные кавычки. Например, программа

2.3

распеча­

тывает две строки, которые содержат апострофы.
Программа

2.3

1

(apostгophe.py)

1

print("Из

2

print("мнe больше

всех рассказов

О'Генри")

нравится

'Вождь

краснокожих'.")

Вывод программы
Из всех
мне

рассказов

больше

О ' Генри

нравится

' Вождь

краснокожих '

.

Аналогичным образом строковый литерал, в котором внутри содержатся двойные кавычки,

можно заключить в одинарные кавычки (программа

Программа 2.4
1 print

1

2.4).

(display_quote.py)

('Домашнее

задание на завтра

-

прочитать

"Гамлета".')

Вывод программы
Домашнее задание на

Python

завтра

-

прочитать

" Гамлета ".

позволяет заключать строковые литералы в тройные кавычки

("""

либо

' ' ').

Строки,

которые заключены в тройные кавычки, внутри могут содержать одинарные и двойные ка­
вычки.

print("""Bмecтo рассказов О'Генри сегодня

займусь

"Гамлетом".""")

Эта инструкция напечатает
Вместо рассказов

О'Генри сегодня

займусь

"Гамлетом".

Глава 2. Ввод, обработка и вывод

51

Тройные кавычки используются для заключения многострочных строковых данных, для
которых одинарные и двойные кавычки не могут применяться. Вот пример:
print("""Oдин
Два
Три""")

Эта инструкция напечатает:
Один
Два
Три

~

Контрольная точка
2.7.

Напишите инструкцию, которая показывает ваше имя.

2.8.

Напишите инструкцию, которая показывает приведенный ниже текст:

Python -

2.9.

лучше

всех!

Напишите инструкцию, которая показывает приведенный ниже текст:
Кошка

сказала

"мяу".

~

2.4

ента

ии

~ КЛЮЧЕВЫЕ ПОЛОЖЕНИЯ
Комментарии

это описательные пояснения, которые документируют строки програм­

-

мы или ее разделы. Комментарии являются частью программы, но интерпретатор

Python

их игнорирует. Они предназначены для людей, которые, возможно, будут читать исход­
ный код.

Комментарии

-

это короткие примечания, которые размещаются в разных частях про­

граммы и объясняют, как эти части программы работают. Несмотря на то, что комментарии
являются критически важной частью программы, интерпретатор

Python

их игнорирует.

Комментарии адресованы любому человеку, который будет читать программный код, и не
предназначены для компьютера.

В

Python

символ

#,

комментарий начинается с символа решетки #. Когда интерпретатор

2.5.

няют цель программы.

1

1
2
3
4
5

2.5

(comment1 .ру)

# Эта программа показывает
# ФИО и адрес человека.
print ( 'Кейт Остен')
print ( '123 Фул Серкл Драйв')
рrint('Эшвиль,

видит

он игнорирует все, что находится между этим символом и концом строки кода.

Например, взгляните на программу

Программа

Python

Северная

Каролина

28899')

Строки кода

1и 2-

комментарии, которые объяс­

Глава 2. Ввод, обработка и вывод

52

Вывод программы
Кейт Остен

123

Фул Серкл Драйв

Эшвиль ,

Северная Каролина

28899

В своем коде программисты чаще всего используют концевые комментарии. Концевой ком­
ментарий

-

это комментарий, который появляется в конце строки кода. Он обычно объяс­

няет инструкцию, которая расположена в этой строке. В программе

2.6

приведен пример,

в котором каждая строка кода заканчивается комментарием, кратко объясняющим, что эта
строка кода делает.

Программа

2.6

1

(comment2. ру)

1 print ( 'Кейт Остен')
2 print ( '123 Фул Серкл Драйв ' )
3 print ( 'Эшвиль, Северная Каролина 28899')

#
#
#

Показать

полное

Показать

адрес

проживания.

Показать

город

и

имя.

индекс.

Вывод программы
Кейт Остен

123

Фул Серкл Драйв

Эшвиль ,

Северная

Каролина

28899

Как начинающий программист, вы, возможно, будете противиться идее щедро наполнять

ваши программы комментариями. В конце концов, может показаться более продуктивным
писать лишь программный код, который делает что-то фактически! Между тем, крайне важ­
но тратить дополнительное время на написание комментариев. Они почти наверняка сэко­
номят время вам и другим в будущем, когда потребуется видоизменить или отладить про­
грамму. Большие и сложные программы практически невозможно прочитать и понять, если

они должным образом не были задокументированы.

~

2.5

менные

lllllllllll__ КЛЮЧЕВЫЕ ПОЛОЖЕНИЯ
Переменная

-

это имя, которое представляет значение, хранящееся в оперативной памя­

ти компьютера.

Программы обычно хранят данные в оперативной памяти компьютера и выполняют опера­
ции с этими данными. Например, рассмотрим типичный опыт совершения покупок в он­

лайн-магазине: вы просматриваете веб-сайт и добавляете в корзину товары, которые хотите

приобрести. По мере того как вы добавляете товары, данные об этих товарах сохраняются
в памяти. Затем, когда вы нажимаете кнопку оформления заказа, выполняющаяся на компь­
ютере веб-сайта программа вычисляет стоимость всех товаров, которые находятся в вашей

корзине, с учетом стоимости доставки и итоговой суммы всех сборов. При выполнении этих
расчетов программа сохраняет полученные результаты в памяти компьютера.

Для того чтобы обращаться к данным, которые хранятся в памяти, и управлять ими, про­
граммы используют переменные. Переменная

-

это имя, которое представляет значение

в памяти компьютера. Например, в программе, вычисляющей налог с продаж на приобре-

53

Глава 2. Ввод, обработка и вывод

таемые товары, для представления этого значения в памяти может использоваться имя пере­

менной tax (налог). Тогда как в программе, которая вычисляет расстояние между двумя
городами, для представления этого значения в памяти может использоваться имя перемен­

ной distance (расстояние). Когда переменная представляет значение в памяти компьютера,
мы говорим, что переменная ссылается на это значение.

Создание переменных инструкцией присваивания
Инструкция присваивания используется для создания переменной, которая будет ссылаться
на порцию данных. Вот пример инструкции присваивания:

age

=

25

После исполнения этой инструкции будет создана переменная с именем age (возраст), и она
будет ссылаться на значение

Этот принцип показан на рис.

25.

2.4:

здесь число

25

следует

рассматривать как значение, которое хранится где-то в оперативной памяти компьютера.

Стрелка, которая направлена от имени age в сторону значения

25,

говорит, что имя age ссы­

лается на это значение.

age

РИС.

2.4.

Переменная

age

ссылается на значение

25

Инструкция присваивания записывается в приведенном ниже общем формате:
=

переменная

выражение

Знак "равно"(=) называется операторо.111 присваивания. В данном формате переменная- это
имя переменной, а выражение -

значение либо любая порция программного кода, которая в

результате дает значение. После исполнения инструкции присваивания переменная, задан­

ная слева от оператора

=,

будет ссылаться на значение, заданное справа от оператора

=.

Для того чтобы поэкспериментировать с переменными, можно набрать инструкции присваи­
вания в интерактивном режиме, как показано ниже:

>>> width

=

>>> length

=

10 [16.~
5 ГEnterj

>>>
Первая инструкция создает переменную с именем width (ширина) и присваивает ей значе­

ние

1О.

Вторая инструкция создает переменную с именем length (длина) и присваивает ей

значение

5.

Далее, как показано ниже, можно применить функцию print для отображения

значений, на которые эти переменные ссылаются:

>>> print(width) IEnte;:-i

10
>>> print(length) 1~nte~
5
>>>
Во время передачи в функцию print переменной в качестве аргумента не следует заключать
имя переменной в кавычки. Для того чтобы продемонстрировать причину, взгляните на при­
веденный ниже интерактивный сеанс:

54

Глава 2. Ввод, обработка и вывод

>>> print ( 'width') 1Enter1
width
>>> print(width) IEnterl
10
>>>
В первой инструкции в качестве аргумента функции
распечатала строковый литерал

print

передано

переменная

width
width.

width.

print

передано

'width',

и функция

Во второй инструкции в качестве аргумента функции

(без кавычек), и функция показала значение, на которое ссылается

В инструкции присваивания переменная, получающая присваиваемое значение, должна сто­

ять с левой стороны от оператора =. Как показано в приведенном ниже интерактивном сеан­
се, если единица языка с левой стороны от оператора = не является переменной, то произой­

дет ошибка':

>>> 25 = age IEnterl

SyntaxError: can't assign to literal
>>>
В программе

демонстрируется переменная. Строка

2.7

(комната) и присваивает ей значение
Обратите внимание, что строка

Программа

1 #

2.7

j

4

503.

2

создает переменную с именем

Инструкции в строках

3

и

4

room

выводят сообщение.

выводит значение, на которое ссылается переменная

room.

(variaЫe_demo.py)

Эта программа демонстрирует переменную.

2 room = 503

3 print ('Я нахожусь
4 print(room)

в

комнате

номер')

Вывод программы
Я нахожусь

в

комнате

номер

503
В программе

2.8

приведен пример кода, в котором используются две переменные. Строка
присваивая ей значение

Строка

присваивая ее

(рис.

Программа

3 создает
2.5).

2.8

top_ speed (предельная скорость),
переменную с именем distance (расстояние),

2
160.
значение 300

создает переменную с именем

(variaЫe_demo2.py)

1 # Создать две переменные: top_speed
2 top_speed = 160
3 distance = 300

и

distance.

4



примере выводится системное сообщение об ошибке, которое переводится как синтаксическая ошибка: нельзя

присвоить значение литералу.

-

Прим. пер.

55

Глава 2. Ввод, обработка и вывод

1

5 # Показать значения, на которые ссыпаются
6
рrint('Предельная

скорость

7 print(top_speed)
8 рrint('Пройденное
9 print(distance)

переменные.

составляет')

расстояние составляет')

Вывод программы
Предельная

скорость составляет

160
Пройденное расстояние составляет

300

top_speed

distance
РИС.

2.5. Две

CD

переменные

ПРЕДУПРЕЖДЕНИЕ
Переменную нельзя использовать, пока ей не будет присвоено значение.

Если попытаться

выполнить операцию с переменной, например напечатать ее, до того, как ей будет присвоено
значение, то произойдет ошибка.

Иногда ошибка может быть вызвана простой опечаткой при наборе. Одним из таких примеров
является имя переменной с опечаткой:

temperature = 74.5 # Создать
print(tempereture) #Ошибка!

переменную
Имя переменной с

опечаткой

В этом фрагменте кода переменная

temperature

вания. Однако в инструкции

имя переменной написано по-другому, что вызовет ошибку.

print

(температура) создается инструкцией присваи­

Еще одним примером является неединообразное использование прописных и строчных букв
в имени переменной. Вот пример:

temperature = 74.5 #
print(Temperature) #

Создать

переменную

Ошибка!

Не единообразное применение регистра

В этом примере переменная

присваивания. В инструкции

temperature (все буквы в нижнем регистре)
print имя Temperature написано с буквой

создается инструкцией

Т в верхнем регистре.

Это вызовет ошибку, потому что в Pythoп имена переменных чувствительны к регистру симво­
лов (регистрочувствительны).

Правила именования переменных
Хотя разрешается придумывать переменным свои имена, необходимо соблюдать правила.



качестве имени переменной нельзя использовать одно из ключевых слов

(см. табл.

1.2 с

перечнем ключевых слов).

+ Имя переменной не может содержать пробелы.

Python

56

Глава 2. Ввод, обработка и вывод



Первый символ должен быть одной из букв от а до

z,

от А до

Z либо

символом подчерки­

вания 1 (_).



После первого символа можно использовать буквы от а до
до



9 либо

z

или от А до

Z,

цифры от О

символы подчеркивания.

Символы верхнего и нижнего регистров различаются. Это означает, что имя переменной

ItemsOrdered

(ЗаказаноТоваров) не является тем же, что и

itemsordered

(заказанотова­

ров).

В дополнение к соблюдению этих правил также всегда следует выбирать имена переменных,
которые дают представление о том, для чего они используются. Например, переменная для
температуры может иметь имя
назвать

speed.

temperature,

а переменную для скорости автомобиля можно

У вас может возникнуть желание давать переменным имена, типах и Ь2, но

такие имена не дают ключ к пониманию того, для чего переменная предназначена.

Поскольку имя переменной должно отражать ее назначение, программисты часто оказыва­
ются в ситуации, когда им приходится создавать имена из нескольких слов. Например, по­
смотрите на приведенные ниже именапеременных:

grosspay
payrate
hotdogssoldtoday
К сожалению, эти имена с трудом удается прочесть, потому что слова в них не отделены.
Поскольку в именах переменных нельзя использовать пробелы, нужно найти другой способ

отделять слова в многословном имени переменной и делать его более удобочитаемым для
человеческого глаза.

Один из способов

-

использовать символ подчеркивания вместо пробела. Например, при­

веденные ниже имена переменных читаются проще, чем показанные ранее:

gross_pay
pay_rate
hot dogs_sold_today
Этот стиль именования переменных популярен среди программистов на

Python

и является

стилем, который мы будем использовать в этой книге. Правда, есть и другие стили, такие

как горбатыйСтиль написания имен переменных. Имена переменных в горбатом стиле
записываются так:



имя переменной начинается с букв в нижнем регистре;



первый символ второго и последующих слов записывается в верхнем регистре.

Например, приведенные ниже имена переменных написаны в горбатом стиле:

grossPay
payRate
hotDogsSoldToday
ПРИМЕЧАНИЕ
Этот стиль именования переменных называется горбатым, потому что буквы верхнего регистра

в имени напоминают горбы верблюда.

1

Имена, или идентификаторы, переменных и собственных функций могут иметь кириллические буквы. Так, до­

пустимыми будут имя переменной ширина или вычислить_ площадь.

-

При,0.1. пер.

Глава 2. Ввод, обработка и вывод

В табл.

перечислено несколько примеров имен переменных и показано, какие из них до­

2.1

пустимы в
Таблица

57

Python

и какие нет.

Примеры имен переменных

2.1.

Имя переменной

Допустимое или недопустимое

units_per_day

Допустимое

- - -----+---------

dayOfWeek

--~-----------

---------------------<

Допустимое

---------+-----------------------------------------!
ЗdGraph

Недопустимое. Имена переменных не могут начинаться с цифры

Junel997

Допустимое

Mixture#З

1

1

Недопустимое. В именах переменных могут использоваться только буквы, цифры
или символы подчеркивания

1

Вывод многочисленных значений
при помощи функции

print

Если вы обратитесь к программе

2. 7,

то увидите, что в строках кода

3

и

4

мы использовали

приведенные две инструкции:

print ('Я нахожусь
print(room)

в

комнате номер')

Мы вызывали функцию

данных. Строка

3

print

дважды, потому что нам нужно было вывести две порции

выводит строковый литерал 'я

выводит значение, на которое ссылается переменная

нахожусь

запятыми, как показано в программе

Программа

1 #

Эта

2 room

3 print

2.9

номер', строка

4

Python

позволяет выводить многочис­

Мы просто должны отделить значения

2.9.

(variaЫe_demoЗ.py)

1

программа

=

print.

комнате

room.

Однако эту программу можно упростить, потому что
ленные значения одним вызовом функции

в

демонстрирует переменную.

503

('Я

нахожусь

в

комнате

номер',

room)

Вывод программы
Я

нахожусь

в

комнате

В строке

3

номер

503

мы передали в функцию

print

два аргумента: первый аргумент- это строковый

литерал 'я нахожусь в комнате номер', второй аргумент
полнения функция

print

-

переменная

room.

Во время ис­

вывела значения этих аргументов в том порядке, в каком мы их

передали функции. Обратите внимание, что функция
бел, разделяющий значения. Когда в функцию

print

print

автоматически напечатала про­

передаются многочисленные аргумен­

ты, при их выводе они автоматически отделяются пробелом.

Глава 2. Ввод, обработка и вывод

58

Повторное присваивание значений переменным
Переменные называются так потому, что во время работы программы они могут ссылаться
на разные значения. Когда переменной присваивается значение, она будет ссылаться на это
значение до тех пор, пока ей не будет присвоено другое значение. Например, в програм­
ме

2.1 О инструкция в
12.75 (верхняя

чение

строке

3

создает переменную с именем rouЫes и присваивает ей зна­

часть рис.

rouЫes другое значение

2.6).
990.95.

-

Затем инструкция в строке
В нижней части рис.

переменную rouЫes. Старое значение

12.75

2.6

8

присваивает переменной

показано, как это изменяет

по-прежнему находится в памяти компьютера,

но оно больше не может использоваться, потому что на него переменная не ссылается. Когда

переменная больше не ссылается на значение в памяти, интерпретатор

Python

автоматически

его удаляет из памяти посредством процедуры, которая называется сборщиком мусора.

Программа~ (variaЫe_demo4.py)
1 #
2 #

Эта программа
Присвоить

показывает

значение

3 rouЬles = 12.75
4 print('Y меня на

повторное

присвоение

переменной.

значения

переменной rouЬles.

счете',

rouЬles,

'рублей.')

5
6 #
7 #
8

Повторно

присвоить

чтобы она ссылалась

rouЬles

9 print

=

значение
на

переменной

другое

rouЫes,

значение.

990.95

('А теперь

там',

rouЬles,

'рублей!')

Вывод программы
У меня на

12.75 рублей .
990.95 рублей!

счете

А теперь там

Остаток рублей после исполнения строки
рубли

3

--------CIIO

Остаток рублей после исполнения строки В

рубли

1

[}Ю

l-199.951
РИС.

2.6. Повторное присвоение значения переменной в программе 2.1 О

Числовые типы данных и числовые литералы
В главе

1 мы рассмотрели, каким образом компьютеры хранят данные в оперативной памяти
1.3). Из этого обсуждения вы, возможно, помните, что для хранения вещественных

(см. разд.

чисел (чисел с дробной частью) компьютеры используют прием, который отличается от хра­
нения целых чисел. Мало того, что этот тип чисел хранится в памяти по-другому, но и ана­
логичные операции с ними тоже выполняются иначе.

Глава 2. Ввод, обработка и вывод

Поскольку разные типы чисел хранятся и обрабатываются по-разному, в

Python

59

используют­

ся типы данных с целью классификации значений в оперативной памяти. Когда в оператив­
ной памяти хранится целое число, оно классифицируется как int, а когда в памяти хранится
вещественное число, оно классифицируется как float.
Давайте посмотрим, как

Python

определяет у числа тип данных. В нескольких приведенных

ранее программах числовые данные записаны внутри программного кода. Например, в при­

веденной ниже инструкции (см. программу

room

=

2.9)

записано число

503:

503

Эта инструкция приводит к тому, что значение

503

сохраняется в оперативной памяти, и пе­

ременная room начинает ссылаться на это значение. В приведенной ниже инструкции (из
программы
rouЬles

2.10)

записано число

12.75:

12.75

=

Эта инструкция приводит к тому, что значение

12.75

сохраняется в оперативной памяти,

и переменная rouЫes начинает ссылаться на это значение. Число, которое записано в коде
программы, называется числовым литералом.

Когда интерпретатор

Python

считывает числовой литерал в коде программы, он определяет

его тип данных согласно следующим правилам:

+ числовой

литерал, который записан в виде целого числа без десятичной точки, имеет

целочисленный тип

+

int, например 7, 124 и -9;

числовой литерал, который записан с десятичной точкой, имеет вещественный тип

float,

например

1. 5, 3 .14159

и

5. о.

Так, в приведенной далее инструкции значение

room

=

503

сохраняется в памяти как int:

503

А другая инструкция приводит к тому, что значение
rouЬles

=

12.75

сохраняется в памяти как float:

12.75

Когда значение сохраняется в оперативной памяти, очень важно понимать, о значении како­
го типа данных идет речь. Скоро вы увидите, что некоторые операции ведут себя по-разному
в зависимости от типа участвующих данных, и некоторые операции могут выполняться со
значениями только того или иного типа данных.

В качестве эксперимента, чтобы определить тип данных конкретного значения в интерак­
тивном режиме, можно воспользоваться встроенной функцией type. Взгляните на приведен­
ный ниже сеанс:

>» type(l) IEnterl

>>>
В этом примере в функцию t уре в качестве аргумента передано значение
выводимое на следующей строке, >>

Сообщение,

'int' >, указывает на то, что это значение имеет

целочисленный тип int. Вот еще один пример:

»> type (1. 0) 1Enter1

1.

Глава 2. Ввод, обработка и вывод

60

В этом примере в функцию
выводимое на следующей

вещественный тип

CD

type в качестве аргумента передано значение 1.0. Сообщение,
строке, ,указывает на то, что это значение имеет

float.

ПРЕДУПРЕЖДЕНИЕ
В числовых литералах запрещено использовать обозначения денежных единиц, пробелов или
запятых. Например, приведенная ниже инструкция вызовет ошибку:

value

$4,567.99 #

=

Ошибка!

Эта инструкция должна быть написана вот так:

value

4567.99

=

#Правильно

Хранение строковых данных с типом
В дополнение к целочисленным типам данных

str

int и вещественным типам данных float

имеет тип данных str, который используется для хранения в оперативной памяти

Python

строковых данных. В программе

2.11

показано, как строковые данные присваиваются пере­

менным.

Программа

1 #

2.11

Создать

2 first name
з

last - name

1

(string_variaЫe.py)

переменные,

=
=

которые

ссьтаются

на

два

строковых

значения.

'Кэтрин'
'Марино'

4

5 #

Показать

значения,

на

которые

эти

переменные

ссылаются.

6 print(first - name, last_name)
Вывод программы
Кэтрин Марино

Повторное присвоение переменной значения другого типа
Следует учитывать, что в

Python

переменная

-

это просто имя, которое ссылается на пор­

цию данных в оперативной памяти. Этот механизм упрощает вам, программисту, хранение и

получение данных. Интерпретатор

Python

отслеживает создаваемые вами имена переменных

и порции данных, на которые эти имена переменных ссылаются. Всякий раз, когда необхо­
димо получить одну из этих порций данных, просто используется имя переменной, которое
на эту порцию ссылается.

Переменная в

Python

может ссылаться на значения любого типа. После того как переменной

присвоено значение одного типа, ей можно заново присвоить значение другого типа. Взгля­
ните на приведенный ниже интерактивный сеанс. (Для удобства добавлены номера строк
программного кода.)

1 >>> х = 99 IEnteri
2 >>> print(x) IEnterl
з 99
4 >>> х = 'Отведите меня

к своему шефу' IEnterl

Глава 2. Ввод, обработка и вывод

5 >>> print(x) Enter
6 Отведите меня к своему
7 >>>

61

шефу.

Инструкция в строке

1 создает переменную с именем х и присваивает ей значение 99
с типом int. На рис. 2. 7 показано, как переменная ссылается на значение 99 в оперативной
памяти. Инструкция в строке 2 вызывает функцию print, передавая ей переменную х в ка­
честве аргумента. Результат функции print выводится в строке 3. Затем инструкция в стро­
ке 4 присваивает строковое значение переменной х. После того как эта инструкция испол­
нится, переменная х больше не будет ссылаться на тип

int, а будет ссылаться на строковое

значение 'Отведите

Строка

меня

к

своему шефу' (рис.

2.8).

5

снова вызывает функцию

print, передавая переменную х в качестве аргумента. Строка 6 показывает результат функ­
ции print.
х

х----00
,____ ___,Отведите меня
РИС.

2.7.

Переменная х ссылается на целое число

РИС.

2.8.

к своему шефу

Переменная х ссылается на строковое значение

Контрольная точка

2.10.

Что такое переменная?

2.11.

Какие из приведенных ниже имен переменных недопустимы в

Python

и почему?

99bottles
july2009
theSalesFigureForFiscalYear
r&d
grade_report

2.12. Являются ли
2.13.

имена переменных Sales и sales одинаковыми? Почему?

Допустима ли приведенная ниже инструкция присваивания? Если она недопустима, то
почему?

72

2.14.

=

amount

Что покажет приведенный ниже фрагмент кода?

val = 99
print ('Значение

2.15.

равняется',

'val')

Взгляните на приведенные ниже инструкции присваивания:

valuel
value2
valueЗ

value4
valueS

99
45.9
7.0
7
'аЬс'

Какой тип данных

Python

будут иметь эти значения, когда на них будут ссылаться пе­

ременные после исполнения указанных инструкций?

62

Глава 2. Ввод, обработка и вывод

2.16.

Что покажет приведенный ниже фрагмент кода?

my_value = 99
my_value = О
print(my_value)

2.6 Чтение входных анных
~ КЛЮЧЕВЫЕ ПОЛОЖЕНИЯ

с клавиатуры

Программы обычно должны уметь считывать входные данные, набираемые пользовате­
лем на клавиатуре. Для этих целей мы будем использовать функции
Видеозапись "Чтение входных данных с клавиатуры"

Python.

(Reading lnput from the KeyboardJ

Большинство программ, которые вы будете писать, должны прочитать входные данные и
затем выполнить с ними операцию. В этом разделе мы обсудим элементарную операцию
ввода: чтение данных, набранных на клавиатуре. Когда программа считывает данные с кла­
виатуры, она обычно сохраняет эти данные в переменной, чтобы потом программа могла эти
данные использовать.

Для чтения данных, вводимых с клавиатуры, мы будем использовать встроенную функцию

Python input.

Функция input читает порцию данных, которая была введена с клавиатуры,

и возвращает эту порцию данных в качестве строкового значения назад в программу. Функ­

цию input обычно применяют в инструкции присваивания, которая соответствует приве­
денному ниже общему формату:
переменная=

inрut(подсказка)

В данном формате подсказка предназначение

-

это строковый литерал, который выводится на экран. Его

дать пользователю указание ввести значение. А переменная -

это имя

переменной, которая ссылается на данные, введенные на клавиатуре. Вот пример инструк­

ции, которая применяет функцию input для чтения данных с клавиатуры:

name

=

input

('Как Вас зовут?

')

Во время исполнения этой инструкции происходит следующее:

1.

Строка 'Как Вас зовут?

' выводится на экран.

2.

Программа приостанавливает работу и ждет, когда пользователь введет что-нибудь с кла­
виатуры и нажмет клавишу

3.

Когда клавиша



.

нажата, набранные данные возвращаются в качестве строкового

значения и присваиваются переменной

name.

В качестве демонстрации взгляните на приведенный ниже интерактивный сеанс:

>>> name

=

input ('Как Вас зовут? ') 1Enter1

Как Вас зовут? XOJIJIИ IEnterl

>>> print(name) IEnterl
Холли

>>>

Глава 2. Ввод, обработка и вывод

63

Когда была введена первая инструкция, интерпретатор вывел на экран подсказку 'как вас
зовут?

и приостановил работу в ожидании, когда пользователь введет немного данных.

'

Пользователь ввел Холли и нажал клавишу

'Холли' было присвоено переменной

name.

.

В результате строковое значение

Когда была введена вторая инструкция, интер­

претатор показал значение, на которое ссылается переменная

В программе

2.12

name.

представлен законченный код, который использует функцию

input

для

чтения двух строковых значений с клавиатуры.

Программа

1 #

2.12

Получить

2 first name
-

1

(string_input.py)

имя

=

пользователя.

inрut('Введите

свое

имя:

1)

3
4 # Получить фамилию пользователя.
5 last_name = inрut('Введите свою фамилию: 1)
6
7 # Напечатать пользователю приветствие.

8 print

('Привет,

', first_name, last_name)

Вывод программы (вводимые данные выделены жирным шрифтом)

Винни IEnter l

Введите

свое

Введите

свою фамилию :

Привет ,

Винни Пух

имя :

Пух 1Enter l

Взгляните поближе на строковый литерал в строке

2,

который мы использовали в качестве

подсказки:

'Введите

свое имя:

'

Обратите внимание, что в нем последний символ внутри кавычек является пробелом. То же
самое относится

и к приведенному ниже строковому литералу, используемому в качестве

подсказки в строке

5:

'Введите свою фамилию:

'

Мы помещаем пробел в конец каждого строкового значения, потому что функция

input

не

выводит пробел автоматически после подсказки. Когда пользователь начинает набирать

символы, они появляются на экране сразу после подсказки. Добавление в конец подсказки
символа пробела позволяет визуально отделять подсказку на экране от вводимых пользова­
телем данных.

Чтение чисел при помощи функции
Функция

input

input

всегда возвращает введенные пользователем данные как строковые, даже

если пользователь вводит числовые данные. Например, предположим, что вы вызываете

функцию
ции

input

input,

набираете число

72

и нажимаете клавишу

значение будет строковым,

'72 '.

.

Возвращенное из функ­

Это может создать проблему, если вы захотите

использовать это значение в математической операции. Математические операции могут
выполняться только с числовыми значениями, а не строковыми.

Глава 2. Ввод, обработка и вывод

64

К счастью, в

Python

имеются встроенные функции, которые используются для преобразова­

ния, или конвертации, строкового типа в числовой. В табл.

2.2

приведены две таких функ­

ции.

Таблица

2.2.

Функции преобразования данных

Функция

int

Описание

(значение)

В функцию передается аргумент, и она возвращает значение аргумента,
1

преобразованное в целочисленный тип

int

-

--

float

(значение)

В функцию передается аргумент, и она возвращает значение аргумента,
преобразованное в вещественный тип

float

Предположим, что вы пишете программу расчета заработной платы и хотите получить ко­
личество часов, которое пользователь отработал. Взгляните на приведенный ниже фрагмент
программного кода:

string_value
hours

=

=

input

('Сколько часов Вы отработали?

')

int(string_value)

Первая инструкция получает от пользователя количество часов и присваивает его значение

строковой переменной string_value. Вторая инструкция вызывает функцию int (), переда­
вая string_value в качестве аргумента. Значение, на которое ссылается string_value, пре­

образуется в целочисленное int и присваивается переменной hours.
Этот пример иллюстрирует прием работы с функцией int (), однако он не эффективен, по­
тому что создает две переменные: одну для хранения строкового значения, которое возвра­

щается из функции input (), и другую для хранения целочисленного значения, которое воз­
вращается из функции int (). Приведенный ниже фрагмент кода показывает более опти­
мальный подход. Здесь одна-единственная инструкция делает всю работу, которую ранее
делали две приведенные выше инструкции, и она создает всего одну переменную:

hours

=

int(input('Cкoлькo

часов Вы проработали?

'))

Эта инструкция использует вызов вложенной функции. Значение, которое возвращается из
функции input, передается в качестве аргумента в функцию int (). Вот как это работает:

1.

Она вызывает функцию input (), чтобы получить значение, вводимое с клавиатуры.

2.

Значение, возвращаемое из функции input () (т. е. строковое), передается в качестве ар­
гумента в функцию int ().

3.

Целочисленное значение int, возвращаемое из функции int (), присваивается перемен­
ной hours.

После исполнения этой инструкции переменной hours будет присвоено введенное с клавиа­
туры значение, преобразованное в целочисленное int.
Давайте взглянем на еще один пример. Предположим, что вы хотите получить от пользова­
теля почасовую ставку оплаты труда. Приведенная ниже инструкция предлагает пользовате­

лю ввести это значение с клавиатуры, преобразует это значение в вещественное float и
присваивает его переменной pay_rate:

pay_rate

=

float(input('Kaкaя у вас почасовая

ставка

оплаты труда?

'))

Глава 2. Ввод, обработка и вывод

65

Вот как это работает:

1.

Она вызывает функцию input (), чтобы получить значение, вводимое с клавиатуры.

2.

Значение, возвращаемое из функции input ()

(т. е. строковое), передается в качестве

аргумента в функцию float ().
Вещественное значение float, возвращаемое из функции float (), присваивается пере-

3.

менной pay_rate.

После исполнения этой инструкции переменной pay_rate будет присвоено введенное с кла­
виатуры значение, преобразованное в вещественное float.

В программе

2.13

представлен законченный код, в котором используется функция input ()

для чтения значений строкового str, целочисленного int и вещественного float типов
в качестве вводимых с клавиатуры данных.

Программа

1 #

2.13

(input.py)

Получить имя,

2 name

3 age

=

input

возраст и доход пользователя.

('Как Вас зовут?

')

int(input('Cкoлькo Вам лет?

=

4 income

=

float(input('Kaкoй у Вас

'))
доход?

'))

5
6 #

Вывод данных

на экран.

7 print
8 print

('Вот данные,

9 print

('Возраст:',

10 print

('Имя:',

которые Вы ввели:')

name)

('Доход:',

age)
income)

Вывод программы (вводимые данные выделены жирным шрифтом)

Как Вас зовут?? Крис
Сколько Вам лет?

!Enterl
25 IEnterl

Какой у Вас доход?
Вот

данные ,

Имя:

Крис

которые

75000.0 IEnterl
Вы ввели :

Возраст :
Доход :

25
75000 . 0
Давайте взглянем на этот программный код поближе.

+ Строка 2 предлагает пользователю ввести свое имя.

Введенное значение присваивается

в качестве строкового значения переменной name.

+ Строка 3 предлагает пользователю ввести свой возраст. Введенное значение конвертиру­
ется в целочисленное int и присваивается переменной age.

+ Строка 4 предлагает пользователю ввести свой доход. Введенное значение конвертируется в вещественное

float и присваивается переменной income.

+ Строки 7-10 показывают введенные пользователем значения.
Функции int () и float () срабатывают, только если преобразуемое значение представляет
собой допустимое числовое значение. Если аргумент не может быть преобразован в указан­
ный тип данных, то происходит ошибка, которая называется исключением. Исключение

-

66

Глава 2. Ввод, обработка и вывод

это неожиданная ошибка, происходящая во время выполнения программы, которая застав­

ляет программу остановиться, если ошибка должным образом не обрабатывается. Например,

взгляните на приведенный ниже сеанс интерактивного режима 1 :

>>> age

int(input('Cкoлькo Вам лет?

')) I Enter l
xyz IEnter ]
Traceback (most recent call last) :
File "", line 1, in
age = int(input('Cкoлькo Вам лет? '))
ValueError: invalid literal for int() with base 10: 'xyz'
>>>
=

Сколько Вам лет?

ПРИМЕЧАНИЕ
В этом разделе мы говорили о пользователе. Пользователь - это любой гипотетический чело­
век, который использует программу и предоставляет для нее входные данные . Такой пользова­
тель иногда называется конечным пользователем.

Контрольная точка

2.17.

Вам нужно, чтобы пользователь программы ввел фамилию клиента. Напишите инст­
рукцию, которая предлагает пользователю ввести эти данные и

присваивает их пере­

менной .

2.18.

Вам нужно, чтобы пользователь программы ввел объем продаж за неделю. Напишите
инструкцию,

которая

предлагает

пользователю

ввести

эти данные

и

присваивает

их

переменной.
1111111111

2.7

лнен

111111111{___

с

етов

КЛЮЧЕВЫЕ ПОЛОЖЕНИЯ
Python

имеет многочисленные операторы, которые используются для выполнения мате­

матических расчетов.

Большинство реально существующих алгоритмов требует, чтобы выполнялись расчеты. Ин­
струментами программиста для расчетов являются ,wате.\ютuческuе операторы. В табл.
перечислены математические операторы, которые имеются в языке
Приведенные в табл.

2.3

Python.

операторы программисты используют для создания математиче­

2.3

ских выражений. Математическое выражение выполняет расчет и выдает значение. Вот
пример простого математического выражения :

12 + 2
Значения справа и слева от оператора

+ называются

операнда.ни. Оператор +складывает эти

значения между собой. Если набрать это выражение в интерактивном режиме, то можно

увидеть, что оно выдаст значение

1

14:

В этом сеансе показан отчет об обратной трассировке, где самый недавний вызов в отчете приводится послед­

ним и указывает на ошибку:

ValueError,

ValueE1·ror: недопусти.иый .111тера1

д.1я Ф.v11ю11ш

int()

с ос1ювшше.и

10: xyz'.

Ошибка

т. е . ошибка значения, сообщает, что функция получает аргумент правильного типа, но который

имеет неподходящее значение.

-

Прим. пер.

Глава 2. Ввод, обработка и вывод

67

>>> 12 + 2 IEnterl

14
>>>
Таблица

2.3.

Математические операторы

Python

Символ

Операция

Описание

+

Сложение

Складывает два числа

-

Вычитание

Вычитает одно число из другого

*

Умножение

Умножает одно число на другое

/

Деление

Делит одно число на другое и выдает результат в качестве числа
с плавающей точкой

11

Целочисленное деление

Делит одно число на другое и выдает результат в качестве
целого числа

%

Остаток от деления

Делит одно число на другое и выдает остаток от деления

**

Возведение в степень

Возводит число в степень

Переменные тоже могут использоваться в математическом выражении. Например, предпо­

ложим, что имеются две переменные с именами

hours (часы) и рау rate (ставка оплаты

труда). Приведенное ниже математическое выражение использует оператор
ния значения, на которое ссылается переменная
переменная

hours,

*

для умноже­

на значение, на которое ссылается

pay_rate:

hours * pay_rate
Когда для вычисления значения используется математическое выражение, обычно мы хотим
сохранить его результат в оперативной памяти, чтобы им снова можно было воспользовать­
ся в программе. Это делается при помощи инструкции присваивания (программа

Программа 2.14

1

(simple_math.py)

1 # Присвоить значение
2 salary = 25000.0

переменной

salary.

3

4 # Присвоить значение
5 bonus = 12000.0

переменной boпus.

6

7 # Рассчитать заработную плату до удержаний, сложив salary
8 # и bonus. Присвоить результат переменной рау.
9 рау = salary + bonus
10
11 # Вывести переменную рау.
12 print('Baшa заработная плата составляет', рау)
Вывод программы
Ваша заработная

плата

составляет

37000 . 0

2.14).

68

Глава 2. Ввод, обработка и вывод

Строка

12

присваивает значение

2

ООО.О переменной

bonus.

ООО.О переменной

25

Строка

9

salary,

строка

5

присваивает значение

присваивает результат выражения

salary + bonus

переменной рау. Как видно из вывода программы, переменная рау содержит значение

37 ООО.О.

Вычисление процентов
Если вы пишете программу, которая работает с процентами, то прежде, чем выполнять лю­
бые математические расчеты с процентами, необходимо убедиться, что десятичная точка
процентного значения находится в правильной позиции. Это в особенности верно в случае,
когда пользователь вводит процентное значение в качестве входных данных. Большинство
пользователей вводит число

50,

имея в виду

50%, 20,

имея в виду

20%,

и т. д. Перед выпол­

нением любых вычислений с таким процентным значением необходимо его разделить на

100, чтобы

преобразовать в доли числа.

Давайте пошагово разберем процесс написания программы, которая вычисляет процентное
значение. Предположим, что розничное предприятие планирует организовать распродажу,

где цены всех товаров будут снижены на

Нам поручили написать программу для

20%.

вычисления отпускной цены товара после вычета скидки. Вот алгоритм:

1.

Получить исходную цену товара.

2.

Вычислить

3.

Вычесть скидку из исходной цены. Это отпускная цена.

4.

Вывести на экран отпускную цену.

На шаге

1

20%

от исходной цены. Это сумма скидки.

мы получаем исходную цену товара. Мы предложим пользователю ввести эти

данные на клавиатуре. В нашей программе для этого мы применим приведенную ниже инст­

рукцию. Обратите внимание, что вводимое пользователем значение будет сохранено в пере­
менной с именем

original_price
На шаге

original_price

float(input("Bвeдитe исходную цену

=

ниже

инструкция

результат переменной

На шаге

3

товара:

"))

мы вычисляем сумму скидки. Для этого мы умножаем исходную цену на

2

Приведенная

discount

(первоначальная цена).

=

исполняет

это

вычисление

и

присваивает

20%.

полученный

discount:

original_price * 0.2

мы вычитаем скидку из исходной цены. Приведенная ниже инструкция исполняет

это вычисление и сохраняет полученный результат в переменной

sale_price

=

original_price - discount

Наконец, на шаге

4

для вывода на экран отпускной цены мы воспользуемся приведенной

ниже инструкцией:
рrint('Отпускная цена

В программе

sale_price:

2.15

составляет',

sale_price)

представлен весь код с примером вывода.

Глава 2. Ввод, обработка и вывод

69

Программа 2.15 1 (sale_pгice.py)
1 # Эта программа получает исходную цену товара
2 # и вычисляет его отпускную цену с 20%-й с кидкой.
3

4 # Получить исходную цену товара.
5 original_price = float(input("Bвeдит e

исходную цену товара:

"))

6

7 # Вычислить сумму скидки.
В discount = original_price * 0 .2
9

10 # Вычислить отпускную цену.
11 sa l e_price = original_pr i ce - discount
12

13 # Показать отпускную цену.
14 рrint('Отпускная цена составляет', sale_price)
Вывод программы (вводимые данные выделены жирным шрифтом)

Введите исходную цену товара :
Отпускная цена составляет

100.00

I Eлterl

ВО . О

Деление с плавающей точкой и целочисленное деление
Стоит отметить, что

Python

имеет два разных оператора деления (см. табл .

выполняет деление с плавающей точкой, оператор

//

2.3).

Оператор

/

осуществляет целочисленное деление.

Оба оператора делят одно число на другое. Разница между ними состоит в том, что опера­
тор

/

выдает результат в качестве значения с плавающей точкой, а оператор

// -

результат

в качестве целочисленного значения. Давайте воспользуемся интерпретатором в интерак­
тивном режиме, чтобы продемонстрировать работу этих операторов:



5 / 2 IEnterl

2.5
>>>
В этом сеансе мы применили оператор
татом будет

2.5.

/

для деления числа

Теперь давайте применим оператор

//

5 на 2.

Как и ожидалось, резуль­

для выполнения целочисленного

деления :

>>> 5 // 2 IEnterl
2

>>>
Как видно, результат равняется

2.

Оператор / / работает следующим образом :

+ когда результат положительный, он усекается, т. е. его дробная часть отбрасывается;
+ когда результат отрицательный, он округляется вверх до ближайшего целого числа.
Приведенный ниже интерактивный сеанс демонстрирует работу оператора / / , когда резуль­
тат отрицательный:

70

Глава 2. Ввод, обработка и вывод

>>> -5 // 2

IEnterl

-3

>>>

Приоритет операторов
можно писать операторы, в которых используются сложные математические выра­
жения с участием нескольких операторов. Приведенная ниже инструкция присваивает пере­
В

Python

answer сумму из значения 17, значения переменной х, значения 21 и значения пере­

менной

менной у:

answer

17 +

=

х

+ 21 +

у

Правда, некоторые выражения не настолько прямолинейные. Рассмотрим приведенную ни­
же инструкцию:

outcome

=

12.0 + 6.0 / 3.0

Какое значение будет присвоено переменной outcome? Число

6.0

может использоваться

в качестве операнда для оператора сложения либо для оператора деления. Результирующей
переменной outcome может быть присвоено 6.0 либо 14.0 в зависимости от того, когда про­

исходит деление. К счастью, ответ можно предсказать, потому что

Python

соблюдает тот же

порядок следования операций, которые вы изучали на уроках математики.

Прежде всего сначала выполняются операции, которые заключены в круглые скобки. Затем,
когда два оператора используют операнд совместно, сначала применяется оператор с более
высоким приоритетом. Ниже приведен приоритет математических операторов от самого
высокого до самого низкого:

1.

Возведение в степень:

2.

Умножение, деление и остаток от деления:

3.

Сложение и вычитание: + - .

* *.
* / // %.

( * ), деления с плавающей точкой (/), целочисленного
(%) имеют одинаковый приоритет. Операторы сложения

Отметим, что операторы умножения

деления

( +)

(/ /)

и остатка от деления

и вычитания

(-)

тоже имеют одинаковый приоритет. Когда два оператора с одинаковым

приоритетом используют операнд совместно, они выполняются слева направо.

Теперь вернемся к предыдущему математическому выражению:

outcome

=

12.0 + 6.0 / 3.0

Значение, которое будет присвоено переменной

outcome, составит 14.0, потому что оператор

деления имеет более высокий приоритет, чем оператор сложения. В результате деление вы­
полняется перед сложением. Это выражение можно изобразить схематически, как показано
на рис.

2.9.

outcome =
РИС.

2.9. Приоритет операторов

14.0

Глава 2. Ввод, обработка и вывод
В табл.
Таблица

2.4.

показаны некоторые другие примеры выражений вместе со своими значениями.

2.4

Некоторые выражения

Выражение

Значение

5 + 2 * 4

13

10 / 2 - 3

2.0

8 + 12 * 2 - 4

28

6 - 3 * 2 + 7 - 1

6

()

71

ПРИМЕЧАНИЕ
Из правила вычисления слева направо есть исключение. Когда два оператора возведения в сте­

пень

**

используют операнд совместно, операторы выполняются справа налево. Например, вы­

ражение

2 ** 3 ** 4 вычисляется

как

2 ** (3 ** 4).

Группирование при помощи круглых скобок
Части математического выражения можно группировать при помощи круглых скобок, чтобы
заставить некоторые операции выполняться перед другими. В приведенной ниже инструк­
ции переменные а и ь складываются, и их сумма делится на

result

=



Ь)

+

/ 4

Без круглых скобок переменная ь будет поделена на
ной а. В табл.
Таблица

2.5.

2.5

4,

Еще несколько выражений и их значений
Значение

+ 2) * 4

10 /

(5 -

28

3)

5.0

8 + 12 * (6 - 2)
(6 -

3)

и результат прибавлен к перемен­

показаны еще несколько выражений и их значений.

Выражение

(5

4:

* (2 + 7)

56
/

3

9.0

Вычисление среднего арифметического значения
Среднее арифметическое группы значений вычисляется очень просто: надо сложить все зна­
чения и разделить полученную сумму на количество значений. Хотя оно вычисляется доста­
точно прямолинейно, при написании программы, которая вычисJtяет среднее арифметиче­
ское значение, очень легко допустить ошибку. Например, предположим, что каждая пере­
менная а, ь и с содержит числовое значение, и мы хотим вычислить среднее арифметическое

72

Глава 2. Ввод, обработка и вывод

этих значений. Если быть неосмотрительными, то для выполнения этого вычисления можно
написать инструкцию, к примеру, содержания:

average =

а

Ь

+

/ 3.0

с

+

Заметили, где в этой инструкции ошибка? Во время ее исполнения первым будет выполнено
деление. Значение в с будет разделено на

3,

затем полученный результат будет прибавлен

к а + ь. Это неправильный способ вычисления среднего значения . Для того чтобы испра­
вить эту ошибку, вокруг выражения а

average

=



+

Ь

+

с)

+

ь

+

с следует поместить круглые скобки:

/ 3.0

Давайте разберем шаг за шагом процесс написания программы, которая вычисляет среднее

значение. Предположим, что на занятиях по информатике вы получили три оценки и хотите
написать программу, которая выведет средний балл из полученных оценок. Вот алгоритм:

1.

Получить первую оценку.

2.

Получить вторую оценку .

3.

Получить третью оценку.

4.

Вычислить средний балл, сложив эти три оценки и разделив сумму на

5.

Показать средний балл .

В шагах

1, 2

ременных

и

3

3.

мы предложим пользователю ввести эти три оценки. Мы сохраним их в пе­

testl, test2

и

test3 .

В шаге

4

мы вычислим средний балл из этих трех оценок.

Для того чтобы вычислить и сохранить результат в переменной

average,

воспользуемся при­

веденной ниже инструкцией :

average

=

(testl + test2 + test3) / 3.0

Наконец, в шаге

Программа 2.16

1

5 мы

покажем среднюю оценку . В программе

(test_score_average.py)

1 # Получить три оценки и присвоить их переменным
2 # testl, test2 и test3.
3 testl = float(input('Bвeдитe первую оценку: '))
4 test2 = fl oat (input ('Введите вторую оценку : '))
5 test3 = float(input('Bвeдитe третью оценку: '))
6
7 # Вычислить средний балл из трех оценок
8 # и присвоить результат переменной average.
9 average = (testl + test2 + test3) / 3.0

10
11 # Показать переменную average.
12 рrint('Средний балл составляет', average)
Вывод программы (вводимые данные выделены жирным шрифтом)

Введите первую оценку :

5 \Enterl
\ Enter J

Введите вторую оценку : З
Введите третью оценку :
Средний балл составляет

4 \Enter\

4.0

2.16

представлен код.

73

Глава 2. Ввод, обработка и вывод

Оператор возведения в степень
В дополнение к элементарным математическим операторам сложения, вычитания, умноже­

ния и деления

Python

предоставляет оператор возведения в степень

денная инструкция возводит переменную
менной

area:

area

length**2

=

( * *).

Например, приве­

length в степень 2 и присваивает результат пере­

Представленный ниже сеанс с интерактивным интерпретатором показывает значения выра­
жений

4**2, 5**3 и 2**10:

>>> 4**2 IEnterl
16
>>> 5**3 IEnterl
125
>>> 2**10 1Enter1
1024
>>>

Оператор остатка от деления
В

Python

символ% является оператором остатка от деления. (Он также называется операто­

ром деления по модулю.) Оператор остатка выполняет деление, но вместо того, чтобы вер­
нуть частное, он возвращает остаток. Приведенная ниже инструкция присваивает
менной

2

пере­

leftover (остаток).

leftover

17 % 3

=

Эта инструкция присваивает
с остатком

2.

2

переменной leftover, потому что

17

деленное на

3

равно

5

В определенных ситуациях оператор остатка от деления оказывается очень по­

лезен. Он широко используется в вычислениях, которые преобразовывают показания време­
ни или расстояния, обнаруживают четные или нечетные числа и выполняют другие специа­
лизированные операции. Например, программа

2.17

получает от пользователя количество

секунд и преобразует это количество секунд в часы, минуты и секунды:
в

3 часа 15

Программа

1
2
3
4
5
6
7
8

2.17

# Получить от
total seconds

минут

30 секунд.

(time_converter.py)
пользователя
=

количество секунд.

float(input('Bвeдитe количество секунд:

# Получить количество часов.
hours = total seconds // 3600
# Получить количество оставшихся минут.
minutes = (total seconds // 60) % 60

9

10 # Получить количество оставшихся
11 seconds = total seconds % 60
12

секунд.

'))

11 730

секунд

Глава 2. Ввод, обработка и вывод

74

113 # Показать
· 14 print('Boт

результаты.
минутах

часах,

в

время

и

секундах:')

hours)

15 print

('Часы:',

16 print

('Минуты:',

17 print

(' Секунды:',

minutes)
seconds)

Вывод программы (вводимые данные выделены жирным шрифтом)

Введите количество секунд :
в часах ,

Вот время

Часы :

11730

I Enter l

минутах и секундах :

3.0
15 . О

Минуты :

Секунды :

30 . О

Давайте взглянем на этот программный код поближе.

+

Строка

2

получает от пользователя количество секунд, приводит это значение к типу

floa t и присваивает его переменной total _ seconds.

+

Строка

5

вычисляет количество часов в заданном количестве секунд. В одном часе

3600 секунд,

следовательно, эта инструкция делит total _ seconds на

мание, что мы использовали оператор целочисленного деления

(/ /).

3600.

Обратите вни­

Это вызвано тем, что

мы хотим получить количество часов без дробной части.

+

8 вычисляет количество оставшихся минут. Инструкция сначала использует опе­
/ / для деления total _ seconds на 60. Это дает нам общее количество минут. Затем
использует оператор %, чтобы разделить общее количество минут на 60 и получить

Строка
ратор
она

остаток от деления. Результатом является количество оставшихся минут.

+ Строка

11 вычисляет

число оставшихся секунд. В одной минуте

60

секунд, следователь­

но, эта инструкция использует оператор %, чтобы разделить total _ seconds на

60

и полу­

чить остаток от деления. Результатом является количество оставшихся секунд.

+ Строки 14- 17 показывают количество часов, минут и секунд.
Преобразование математических формул
в программные инструкции

Из уроков алгебры вы, вероятно, помните, что выражение 2ху понимается как произведе­
ние

2

на х и на у. В математике оператор умножения не всегда используется. С другой

стороны,

Python,

а также другие языки программирования, требует наличия оператора для

любой математической операции. В табл.

2.6

показаны некоторые алгебраические выраже­

ния, которые выполняют умножение, и эквивалентные им программныевыражения.

Таблица

2.6.

Алгебраические выражения

Произведение

68
·- - - -

-

-··

- --- -

-

4ху

-

·-

- - · ··

-

6

6

на В
· -- -

~

Произведение

3· 12
- - -- - -- - - -

Программное выражение

Выполняемая операция

Алгебраическое выражение

~ -- -

-

3

на

4

*

в

- ··- - - - - -

- · - ·- · · - - ·

--·- --

3 * 12

12

· - -- --

Произведение

~

- · --·--- ·· -

на х на у

~

- - -···--

4 *

х

*

у

- - ·· · - -

-

--

Глава 2. Ввод, обработка и вывод

75

Во время преобразования некоторых алгебраических выражений в программные выражения
нередко приходится вставлять круглые скобки, которые отсутствуют в алгебраическом вы­
ражении. Например, взгляните на формулу:

а+Ь

х=--.
с

Для того чтобы преобразовать ее в программную инструкцию, выражение а

ь нужно за­

+

ключить в круглые скобки:
х =



В табл.

+

!

Ь)

2. 7

с

приведены дополнительные алгебраические выражения и их эквиваленты на

Python.
Таблица

2.7.

Алгебраические и программные выражения

Алгебраическое выражение

Инструкция на

х

у=3-

у

=

3 *

х /

z

=

3 *

ь

а

=



2

z=

3Ьс+4

Python

2

*

с

+ 4

--

х+2
а=--

Ь-1

+ 2) /



-

1)

Преобразование математической формулы в программную инструкцию
Предположим, что вы хотите внести определенную сумму денег на сберегательный счет и
оставить ее там для начисления процентного дохода в течение следующих

1О-летнего

срока вы хотели бы иметь на счету





лет. В конце

ООО руб. Сколько денег необходимо внести

сегодня, чтобы это реализовать в будущем? Для того чтобы это узнать, можно воспользо­
ваться формулой:

Р=
где Р

-

1

(l+r)"'

это текущая стоимость или сумма, которую необходимо внести сегодня;

будущее значение, которое вы хотите иметь на счету (в данном случае



ООО руб.);

r-

это годовая процентная ставка; п

-

F

F-

это

составляет

это количество лет, в течение которых

вы планируете оставить деньги на счету.

Целесообразно для выполнения этих расчетов написать компьютерную программу, потому
что тогда можно поэкспериментировать с разными значениями переменных. Вот алгоритм,
который можем применить:

1.

Получить желаемое будущее значение.

2.

Получить годовую процентную ставку.

76

Глава 2. Ввод, обработка и вывод

3.

Получить количество лет, в течение которых деньги будут лежать на счету.

4.

Рассчитать сумму, которая должна быть внесена на счет.

5.

Показать результат расчетов, полученный в шаге

В шагах

1-3

4.

мы предложим пользователю ввести указанные значения. Мы присвоим желае­

мое будущее значение переменной с именем
процентную ставку- переменной с именем

future_value (будущее значение), годовую
rate и количество лет- переменной с именем

years.
В шаге

мы вычислим текущую стоимость, которая представляет собой сумму денег, кото­

4

рую мы должны будем внести. Мы преобразуем ранее показанную формулу в приведенную
ниже инструкцию. Эта инструкция хранит результат расчетов в переменной

present_value

(текущая стоимость).

present_value
На шаге

5

=

future_value / (1.0 + rate)**years

мы покажем значение в переменной

present _ value.

Программа

2.18

демонстри­

рует этот алгоритм.

Программа 2.18

J

(future_value.py)

1 # Получить требуемое будущее значение.
2 future_value = float(input('Bвeдитe требуемое

будущее

значение:

'))

3

4 # Получить годовую процентную ставку.
5 rate = float(input('Bвeдитe годовую процентную

ставку:

'))

6

7 # Получить количество лет роста стоимости
8 years = int(input('Bвeдитe количество лет

денег.
роста стоимости денег:

'))

9

10 # Рассчитать сумму, необходимую для внесения на счет.
11 present_value = future_value / (1.0 + rate)**years
12
13 # Показать сумму, необходимую для внесения на счет.
14 print('Baм потребуется внести сумму:', present_value)
Вывод программы (вводимые данные выделены жирным шрифтом )

Введите требуемое будущее значение :

10000.0 IEnterl
0.05 [Enterl
роста стоимости денег : 10 IEnterl
сумму : 6139 . 1"3253541

Введите годовую процентную ставку :

Введите количество лет
Вам потребуете.я внести

ПРИМЕЧАНИЕ
В отличие от итогового результата, показанного для этой программы, суммы в долларах, рублях и
в любой другой валюте обычно округляются до двух десятичных разрядов. Позже в этой главе вы
научитесь форматировать числа с округлением до конкретного количества десятичных разрядов.

Глава 2. Ввод, обработка и вывод

77

Смешанные выражения и преобразование типов данных
Когда выполняется математическая операция с двумя операндами, тип данных результата
будет зависеть от типа данных операндов. При вычислении математических выражений

Python

следует руководствоваться указанными ниже правилами.

+ Когда

операция выполняется с двумя целочисленными значениями int, результатом

будет int.

+ Когда

операция выполняется с двумя вещественными значениями float, результатом

будет float.

+ Когда операция выполняется с int и

float, целочисленное значение int будет временно

преобразовано в вещественное float, и результатом операции будет float. (Выражение,
в котором используются операнды разных типов данных, называется смешанным выра­

жением.)
Первые две ситуации довольно прямолинейны: операции с int производят int и операции
с float производят float. Давайте посмотрим на пример третьей ситуации, в которой задей­
ствовано смешанное выражение:

5 * 2.0

my_nшnЬer =

Когда эта инструкция исполнится, значение
умножено на

2.0.

Результат,

1О.О,

5

будет приведено к типу float

(5.0)

и затем

будет присвоен переменной my _ nшnЬer.

Преобразование int в float, которая имеет место в приведенной выше инструкции, проис­
ходит неявно. Если нужно выполнить преобразование явным образом, то можно применить

функцию int () либо float (). Например, как показано в приведенном ниже фрагменте кода,
можно применить функцию int () для преобразования значения с плавающей точкой в целое
число:

fvalue

2.6

ivalue

int(fvalue)

Первая инструкция присваивает значение

2.6

переменной fvalue. Вторая инструкция пере­

дает fvalue в качестве аргумента в функцию int (). Функция int () возвращает значение

2,

которое присваивается переменной ivalue. После исполнения этого фрагмента кода пере­
менной fvalue по-прежнему будет присвоено значение
своено значение

2.6,

а переменной ivalue будет при­

2.

Как продемонстрировано в предыдущем примере, функция int ()

преобразует аргумент

с плавающей точкой в целое число путем его усечения. Это означает, что отбрасывается
дробная часть числа. Вот пример, в котором используется отрицательное число:

fvalue
ivalue

-2.9
=

int(fvalue)

Во второй инструкции из функции int () возвращается значение
фрагмента

кода

переменная

ivalue- на значение

-2.

После исполнения этого

fvalue будет ссылаться на значение

-2.9,

-2.

Функцию float () можно применить для явного преобразования int в float:

ivalue
fvalue

2
=

float(ivalue)

а переменная

78

Глава 2. Ввод, обработка и вывод
После исполнения этого фрагмента кода переменная
ное значение

2,

переменная

fvalue

ivalue

будет ссылаться на целочислен­

будет ссылаться на значение с плавающей точкой

2.0.

Разбиение длинных инструкций на несколько строк
Большинство программных инструкций пишут на одной строке. Однако если программная
инструкция слишком длинная, то вы не сможете ее увидеть целиком в своем окне редактора,

не используя горизонтальную прокрутку. Кроме того, если при распечатке программного

кода на бумаге одна из инструкций окажется слишком длинной, чтобы уместиться на одной
строке, то она продолжится на следующей строке и тем самым сделает ваш код неудобочи­
таемым.

При помощи символа продолжения строки, в качестве которого используется обратная ко­
сая черта

(\), Python

позволяет разбивать инструкцию на несколько строк. Для этого просто

нужно ввести символ обратной косой черты в точке, где следует прервать инструкцию,
и затем нажать клавишу

.

Вот инструкция с математическими расчетами, которая была разбита, чтобы уместиться на
двух строках:

result

varl * 2 + var2 * 3 + \
varЗ * 4 + var4 * 5

=

Символ продолжения строки, который появляется в конце первой строки кода, говорит ин­
терпретатору, что инструкция продолжится на следующей строке.

Python

позволяет разбивать на несколько строк любую часть инструкции, которая заключена

в круглые скобки, не используя для этого символ продолжения строки. Например, взгляните
на приведенную ниже инструкцию:

monday,
tuesday,
wednesday)

рrint("Продажи в понедельник составили",
"во
"и в

вторник они
среду они

составили",
составили",

Приведенный ниже фрагмент кода показывает еще один пример:

total

=

(valuel + value2 +
valueЗ + value4 +
valueS + valueб)

~ Контрольная точка
2.19.

Заполните значение каждого выражения в столбце "Значение" в приведенной ниже
таблице.
Выражение

6 + 3 * 5

12 / 2 - 4
9 + 14 * 2 - 6
(6 + 2) * 3

14 /

(11

- 4)

9 + 12 * (8 - 3)

Значение

Глава 2. Ввод, обработка и вывод

2.20.

Какое значение будет присвоено переменной

79

resul t после того, как исполнится приве­

денная ниже инструкция?

result = 9 // 2

2.21.

Какое значение будет присвоено переменной

result после того, как исполнится приве­

денная ниже инструкция?

result = 9 % 2

~

2.8
111111111

Подробнее о выводе данных
До сих пор мы обсуждали лишь элементарные способы вывода данных. В конечном счете
вы захотите осуществлять более тщательный контроль того, как данные появляются на

экране. В этом разделе вы познакомитесь с функцией

Python print

подробнее и увидите раз­

личные приемы форматирования выходных данных.

Подавление концевого символа новой строки
в функции

print

Функция print обычно показывает одну строку вывода. Например, приведенные ниже три
инструкции произведут три строки вывода:

print
print
print

('Один')
('Два')

('Три')

Каждая показанная выше инструкция выводит строковое значение и затем печатает символ

новой строки. Сам символ новой строки вы не увидите, но когда он выводится на экран, это
приводит к тому, что данные выводятся со следующей строки. (Символ новой строки можно
представить как специальную команду, которая побуждает компьютер переводить позицию
печати на новую строку.)
Если потребуется, чтобы функция print не начинала новую строку, когда она заканчивает

выводить на экран свои выходные данные, то в эту функцию можно передать специальный
аргумент

print
print
print

end='

('Один',
('Два',

':

end=' ')
end=' ')

('Три')

Обратите внимание, что в первых двух инструкциях в функцию print передается аргумент

end='

'. Он говорит о том, что вместо символа новой строки функция print должна в конце

своих выводимых данных напечатать пробел. Вот результат исполнения этих инструкций:
Один Два

Три

Иногда, возможно, потребуется, чтобы функция print в конце своих выводимых данных
ничего не печатала, даже пробел. В этом случае в функцию print можно передать аргумент

end=' ':
print
print
print

('Один',
('Два',
('Три')

end=' ')
end=' ')

80

Глава 2. Ввод, обработка и вывод
Отметим, что в аргументе

end=' ' между кавычками нет пробела. Он указывает на то, что
в конце выводимых данных функции print ничего печатать не нужно. Вот результат испол­

нения этих инструкций:
ОдинДваТри

Задание символа-разделителя значений
Когда в функцию print передаются многочисленные аргументы, они автоматически отде­
ляются пробелом при их выводе. Вот пример в интерактивном режиме:
('Один',

>>> print
Один Два

'Два',

'Три')

1

EnteiJ

Три

>>>
Если потребуется, чтобы между значениями печатался пробел, то в функцию print можно
передать аргумент

sep= • • :

print('Oдин',

'Два',

>>>

'Три',

sep='') [EntelJ

ОдинДваТри

>>>
Этот специальный аргумент также можно применить, чтобы определить иной символ кроме
пробела, который будет отделять несколько значений:

>>>

print('Oдин',

'Два',

'Три',

sep='*') [iii@

Один*Два*Три

>>>
Обратите внимание, что в этом примере в функцию print передан аргумент sep=' * '. Он
указывает на то, что выводимые значения должны быть отделены символом

*.

Вот еще один

пример:

>>>

print('Oдин',

'Два',

'Три',

sep='---') [Enterl

Один---Два---Три

>>>

Экранированные символы
Экранированный сu\1вол

-

это специальный символ в строковом литерале, которому пред­

шествует обратная косая черта(\). Во время печати строкового литерала, который содержит
экранированные символы, они рассматриваются как специальные команды, которые встрое­

ны в строковый литерал.
Например,

\n -

это экранированный символ новой строки. При его печати он на экран не

выводится. Вместо этого он переводит позицию печати на следующую строку. Например,
взгляните на приведенную ниже инструкцию:

print ( 'Один\nДва\nТри')
Во время выполнения этой инструкции она выводит
Один
Два

Три

Глава 2. Ввод, обработка и вывод

Python
в табл.
Таблица

2.8.

81

распознает несколько экранирQванных символов, некоторые из них перечислены

2.8.

Некоторые экранированные символы

Python

Экранированный символ

Результат

\n

Переводит позицию печати на следующую строку

\t

Переводит позицию печати на следующую горизонтальную позицию табуляции

\'

Печатает одинарную кавычку

\"

Печатает двойную кавычку

\\

Печатает обратную косую черту

Экранированный символ

\t

продвигает позицию печати к следующей горизонтальной пози­

ции табуляции. (Позиция табуляции обычно появляется после каждого восьмого символа.)
Вот пример:

print ( 'Пн\ tВт\ tCp')
print ( 'Чт\tПт\tСб')
Первая инструкция печатает пн и переносит позицию печати к следующей позиции табуля­
ции, потом печатает Вт и переносит позицию печати к следующей позиции табуляции, затем
печатает ер. Результат будет выглядеть так:
Пн

Вт

Ср

Чт

Пт

Сб

Экранированные символы

и

\'

\"

применяются для отображения кавычек. Приведенные

ниже инструкции являются наглядным примером:

рrint("Домашнее задание на завтра

-

прочитать

\"Гамлета\".")

рrint('Дочитаю рассказ О\'Генри и возьмусь за домашку.

')

Эти инструкции покажут следующее:
Домашнее

задание

на

завтра

-

прочитать

Дочитаю рассказ О'Генри и возьмусь

за

"Гамлета".
домашку.

Как показано в приведенном ниже примере, экранированный символ

\\

используется для

вывода обратной косой черты:
print('Пyть

C:\\temp\\data. ')

Эта инструкция покажет:
Путь

C:\temp\data.

Вывод многочисленных значений при помощи оператора
Ранее в этой главе вы видели, что оператор
когда оператор

+

+ применяется

+

для сложения двух чисел. Однако,

используется с двумя строковыми литералами, он выполняет их конкате­

нацию (или сцепление). Это означает, что он добавляет один литерал к другому. Например,
взгляните на приведенную ниже инструкцию:

print('Этo

' +

'один строковый литерал.')

Глава 2. Ввод, обработка и вывод

82

Эта инструкция напечатает
Это один строковый литерал.

Конкатенация строковых значений может быть полезна с целью разбиения строкового лите­
рала, в результате чего длинный вызов функции

print

может простираться на несколько

строк текста. Вот пример:
рrint('Введите объем

' +
' +

'продаж за каждый день и
'нажмите

Enter. ')

Эта инструкция выведет следующее:
Введите объем продаж за каждый день

и нажмите

Enter.

Форматирование чисел
Иногда бывают ситуации, когда числа, в особенности числа с плавающей точкой, выводятся

на экран не так, как хотелось бы. Когда число с плавающей точкой выводится функцией

print,

оно может появиться, имея до

граммы

Программа

1
2
3
4
5

2.19

12

значащих разрядов. Это показано в выводе про­

2.19.
J

(no_formatting.py)

#

Эта программа демонстрирует,

#

с плавающей точкой выводится без форматирования.

как

ЧИСЛО

amount- due = 5000.0
monthly_payment = amount_due / 12.0
рrint('Ежемесячный платеж составляет',

monthly_payment)

Вывод программы
Ежемесячный платеж составляет

416 . 6666666666667

Поскольку эта программа выводит денежную сумму, было бы неплохо увидеть ее, округ­
ленной до двух десятичных знаков после точки. К счастью,

Python

сделать именно это, и даже больше, при помощи встроенной функции

При вызове встроенной функции

предоставляет способ

format .

format в эту функцию передаются два аргумента: числовое

значение и спецификатор формата. Спецификатор формата

-

это строковый литерал,

который содержит специальные символы, определяющие то, как числовое значение должно

быть отформатировано. Давайте посмотрим на пример:

format(l2345.6789, '.2f')
Первый аргумент, число

12345.6789

- это
' . 2f', -

с плавающей точкой,

отформатировать. Второй аргумент, строковый литерал

число, которое мы хотим
это спецификатор форма­

та. Вот значение его содержимого :

+ .2 задает точность. Эта часть спецификатора говорит о том, что мы хотим округлить чис­
ло до двух десятичных знаков;



f задает, что тип форматируемого нами числа является числом с плавающей точкой.

Глава 2. Ввод, обработка и вывод

Функция

83

forrnat возвращает строковое значение, содержащее отформатированное число.

Приведенный ниже сеанс интерактивного режима демонстрирует использование функции

format вместе с функцией print для вывода отформатированного числа:
>>> print(format(12345.6789, '.2f')) IEnterl
12345.68
>>>
Обратите внимание, что число округлено до двух десятичных знаков. Приведенный ниже
пример показывает то же самое число, округленное до одного десятичного знака:

»> print(format(12345.6789,
12345.7

'.lf'))

IEnterj

>>>
Вот еще один пример:

>>> print('Чиcлo равно',
Число равно

format(l.234567,

'.2f')) IEnter]

1.23

>>>.
В программе

2.20

показано, как можно видоизменить программу

2.19,

чтобы она формати­

ровала свой вывод при помощи этого метода.

гn;;грамма 2.20
1
2
3
4
5

#

Эта

1

(formatting.py)

программа

демонстрирует,

как может быть

# отформатировано число с плавающей
amount due = 5000.0
monthly_payment = amount due / 12

точкой.

рrint('Ежемесячный платеж составляет',

format(monthly_payment,

6

'.2f'))

Вывод программы
Ежемесячньо.1 платеж составляет

416 . 67

Форматирование в экспоненциальной записи
Если вы предпочитаете отображать числа с плавающей точкой в экспоненциальной записи 1 ,
то вместо буквы f можно использовать букву е или букву Е. Вот пара примеров:

»> print(format(l2345.6789,

'е'))

[inter]

1.234568е+04

»> print ( format (12345. 6789, ' . 2е') ) [fuiter]
1.23е+04

>>>

1

В тексте компьютерных программ экспоненциальную запись записывают в виде МЕр, где М -

Е- экспонента, означающая "".умножить на
=

1,602176565 · 10- 19 • -

При.и. пер.

10

это мантисса,

в степени ... ", и р- порядок. Например, 1.602176565Е-19 =

Глава 2. Ввод, обработка и вывод

84

Первая инструкция просто форматирует число в экспоненциальной записи . Число выводится

с буквой е, которая обозначает экспоненту . (Если в спецификаторе формата вы используете
заглавную букву Е, то результат будет содержать заглавную Е, которая обозначает экспонен­
ту . ) Вторая инструкция дополнительно задает точность до двух десятичных знаков.

Вставка запятой в качестве разделителя
Если требуется отформатировать число с разделителями в виде запятой, то в спецификатор
формата можно вставить запятую :

print(format(l2345.6789, ',.2f')) IEnter l
12,345.68

>>>

>>>
Вот пример, который форматирует еще более крупное число:

print(format(l23456789.456, ', .2f')) I Enter]
123,456,789.46

>>>
>>>

Обратите внимание, что в спецификаторе формата запятая записывается до (слева от) указа­
теля точности. Ниже приводится пример, который задает разделитель в виде запятой, но не
задает точность:

» > print(format(l2345.6789, ',f')) [Enter l

12,345.678900
>>>
В программе

2.21

показано применение разделителя в виде запятой и точности до двух деся­

тичных знаков для форматирования крупных чисел в виде сумм в валюте.
Программа

1
2
3
4
5
6
7

#
#

Эта

2.21

1

(dollar_display.py)

программа демонстрирует,

может быть

отформатировано

в

как

число

качестве

с

плавающей т о чкой

валюты.

monthly_pay = 30000.0
annual_pay = monthly_pay * 12
print('Baшa

годовая

заработная

плата

составляет

$' ,

format(annual_pay, ', .2f'),
sep=' ')

Вывод программы
Ваш годовой платеж составляет

Отметим, что в строке

7

$360 , 000 . 00
в функцию

pr int

был передан аргумент

sep=' ' .

Как уже упомина­

лось ранее, он говорит о том, что между выводимыми значениями не должно быть пробела .
Если этот аргумент не передавать, то после знака$ будет напечатан пробел.

Определение минимальной ширины поля
Спецификатор формата может также содержать минимальную ширину поля, т . е . минималь­
ное количество пробелов, которые следует использовать для вывода значения. В приведен­

ном ниже примере печатается число в поле шириной

12

пробелов:

85

Глава 2. Ввод, обработка и вывод

>>>

print('Чиcлo равняется',

forrnat(12345.6789,

'12.,2f')) [Enter[

12,345.68

Число равняется

>>>
В этом примере значение

12

в спецификаторе формата указывает на то, что число должно

быть выведено в поле шириной как минимум

12

пробелов. В нашем случае выводимое число

короче, чем поле, в котором оно выводится. В числе

лов на экране, но оно выводится в поле шириной

12, 345. 68

12

используется всего

9

пробе­

пробелов. В подобном случае число

выравнивается по правому краю поля. Если значение слишком большое, чтобы уместиться
в указанную ширину поля, то поле автоматически увеличивается, чтобы это значение уме­
стилось.

Обратите внимание, что в предыдущем примере указатель ширины поля записан до (слева
от) запятой. Ниже приводится пример, в котором задаются ширина поля и точность, но запя­
тые не используются:

>>>

print('Чиcлo равно',

Число равно

format(12345.6789,

'12.2f')) [Enter[

12345.68

>>>
Ширина поля в спецификаторе формата широко используется, когда нужно напечатать чис­
ла, выровненные в столбцах. Например, взгляните на программу
водятся в полях шириной семь пробелов.
Программа

1
2
3
4
5
6
7
8
9
10

2.22

(columns.py)

# Эта программа выводит приведенные ниже
# числа с плавающей точкой в столбце,
# в котором десятичные знаки выровнены.
numl
127.899
num2
3465.148
num3
3.776
num4
264.821
num5
88.081
num6
799.999

11 #

Вывести

12
13
14
15
16
17
18

с

каждое

число

в

поле

2 десятичными знаками.
print(format(numl, '7. 2f'))
print(format(num2, '7 .2f'))
print(format(num3, '7 .2f'))
print(format(num4, '7. 2f'))
print(format(num5, '7. 2f'))
print(forrnat(num6, '7 .2f'))
#

Вывод программы

127 . 90
3465 . 15
3 . 78
264 . 82
88 . 08
800 . 00

шириной

7

пробелов

2.22.

Все переменные вы­

86

Глава 2. Ввод, обработка и вывод

Форматирование числа с плавающей точкой
в виде процента
Вместо использования символа f в качестве указателя типа можно воспользоваться симво­

лом % для форматирования числа с плавающей точкой в виде процента. Символ % приводит
к умножению числа на

>>> print(format(0.5,

100

и выводу числа со знаком % после него. Ниже приведен пример:

'%')) IEnterl

50.000000%
>>>
Вот пример, в котором точность задана нулем:

>>> print(format(0.5,

'.0%')) IEnterJ

50%
>>>

Форматирование целых чисел
Все предыдущие примеры демонстрировали способы форматирования числа с плавающей
точкой. Функция format также применяется для форматирования целых чисел. При написа­
нии спецификатора формата, который будет использован для форматирования целого числа,
необходимо учитывать два отличия:

+ в качестве указателя типа используется символ ct;
+ точность не указывается.
Взглянем на несколько примеров в интерактивном интерпретаторе. В приведенном ниже

сеансе число

123456 печатается

>>> print(format(123456,

без специального форматирования:

'd')) IEnterl

123456
>>>
А здесь число

123456 печатается

>>> print(format(123456,

с разделителем в виде запятой:

',d')) IEnterl

123,456
>>>
В приведенном ниже сеансе число

>>> print(format(123456,

123456 печатается

в поле шириной

10

пробелов:

'10d')) IEnterJ

123456
>>>
А здесь число

123456

печатается с разделителем в виде запятой в поле шириной

белов:

>>> print(format(l23456,

123,456
>>>

'10,d')) IEnterl

10

про­

Глава 2. Ввод, обработка и вывод

87

Контрольная точка

2.22.

Как убрать концевой символ новой строки в функции

2.23.

Как изменить символ, автоматически выводимый между несколькими значениями,
которые передаются в функцию

print?

print?

2.24.

В чем смысл экранированного символа

2.25.

Что делает оператор+, когда он используется с двумя строковыми литералами?

2.26.

Что выводит инструкция

print (format (65.4321, '.2f') )?

2.27.

Что выводит инструкция

print (format (987654 .129, ',. 2f'))?

'\n '?

1111111111

2.9

нованные константы

llllllllllt___ КЛЮЧЕВЫЕ ПОЛОЖЕНИЯ
Именованная константа

-

это имя, представляющее значение, которое не изменяется во

время выполнения программы.

На мгновение предположим, что вы

-

существующую

вычисляет данные,

программу,

которая

программист и работаете на банк. Вы обновляете
имеющие

отношение

к

кредитам,

и видите приведенную ниже строку кода:

amount

balance * 0.069

=

Поскольку эту программу написал кто-то другой, вы не уверены, что именно означает чис­

ло

0.069.

Выглядит, как процентная ставка, но может быть числом, которое используется для

вычисления какого-то сбора. Назначение числа

0.069

невозможно определить, просто про­

читав эту строку кода. Этот наглядный пример демонстрирует волшебное число. Волшебное
число

-

это значение, которое появляется в программном коде без объяснения его смысла.

Волшебные числа могут создавать проблемы по ряду причин. Во-первых, как проиллюстри­
ровано в нашем примере, читающий программный код специалист может испытывать труд­

ности при определении назначения числа. Во-вторых, если волшебное число используется
в программе в нескольких местах, то в случае возникновения необходимости поменять это
число во всех местах его появления могут потребоваться невероятные усилия. В-третьих,
всякий раз, когда вы набираете это волшебное число в программном коде, вы рискуете сде­
лать опечатку. Например, предположим, что вы намереваетесь набрать
но набираете

.0069.

0.069,

но вы случай­

Эта опечатка вызовет математические ошибки, которые бывает сложно

отыскать.

Эти проблемы могут быть решены при помощи именованных констант, которые заменяют
волшебные числа. Именованная константа

-

это имя, представляющее значение, которое

не изменяется во время выполнения программы. Вот пример объявления именованной кон­
станты в программном коде:

INTEREST RATE =

0.069

Эта инструкция создает именованную константу INTEREST_ RATE, которой присваивается зна­
чение

0.069.

Обратите внимание, что именованная константа пишется буквами в верхнем

регистре. В большинстве языков программирования такое написание является общеприня-

Глава 2. Ввод, обработка и вывод

88

той практикой, потому что это делает именованные константы легко отличимыми от регу­
лярных переменных.

Одно из преимуществ использования именованных констант состоит в том, что они делают
программы более самоочевидными. Приведенная ниже инструкция:

amount

=

balance * 0.069

может быть изменена и читаться как

amount

=

balance * INTEREST RATE

Новый программист прочтет вторую инструкцию и поймет, что тут происходит. Совершен­
но очевидно, что здесь остаток суммы умножается на процентную ставку.

Еще одно преимущество от использования именованных констант состоит в том, что они
позволяют легко вносить большие изменения в программный код. Скажем, процентная став­
ка появляется в десятке разных инструкций по всей программе. Когда ставка изменяется,

инициализирующее значение в объявлении именованной константы будет единственным
местом, которое нужно изменить. Если ставка повышается до

7.2%,

то объявление может

быть заменено на:

INTEREST RATE

=

0.072

После этого новое значение
ет константу

0.072

будет применено к каждой инструкции, которая использу­

INTEREST_ RATE.

Еще одно преимущество от применения именованных констант состоит в том, что они по­

могают избегать опечаток, которые часто случаются при использовании волшебных чисел.
Например, если в математической инструкции вместо

0.069

случайно набрать

грамма вычислит неправильное значение. Однако если при наборе имени

сделаете опечатку, то интерпретатор

Python

.0069,

то про­

INTEREST_ RATE

вы

выведет сообщение с указанием, что такое имя

не определено.

Контрольная точка

2.28.

Каковы три преимущества от использования именованных констант?

2.29.

Напишите инструкцию

Python,

которая задает именованную константу для

1О-процент­

ной скидки .

....._
2.10

в

ение в че епашью графику

111111111(__ КЛЮЧЕВЫЕ ПОЛОЖЕНИЯ
Черепашья графика, или графика с относительными командами,

-

это интересный и

очень простой способ изучения элементарных принципов программирования. Система
черепашьей графики языка

Python

имитирует "черепаху", которая повинуется командам

рисования простых графических изображений.
В конце 1960-х годов преподаватель Массачусетского технологического института (МIТ)
Сеймур Пейперт начал использовать роботизированную "черепаху" для обучения програм­

мированию. Черепаха была связана с компьютером, на котором обучаемый мог вводить
команды, побуждающие черепаху перемещаться. У черепахи также имелось перо, которое

Глава 2. Ввод, обработка и вывод

89

можно было поднимать и опускать, и поэтому ее можно было класть на лист бумаги и про­
граммировать рисование изображений.

Python

имеет систему черепашьей графики, которая

имитирует эту роботизированную черепаху. Данная система выводит на экран небольшой
курсор (черепаху). Для того чтобы перемещать черепаху по экрану, рисуя линии и геомет­
рические фигуры, можно использовать инструкции

81·

~1:зr 11с

bRi-.t

нн//f'

R UAf)AПЯ/IJЬIO

Python.

:>рафику" (/п roductюn

to Turt/r' Graphtcs)

Первый шаг в использовании системы черепашьей графики

Python

состоит в написании

приведенной ниже инструкции:

import turtle
Система черепашьей графики не встроена в интерпретатор

Python

и хранится в файле как

модуль turtle. Поэтому инструкция import turtle загружает данный модуль в память, что­
бы интерпретатор

Python

мог его использовать.

При написании программы

Python,

в которой используется черепашья графика, в начале

программы следует написать инструкцию импорта

import.

Если есть желание поэкспери­

ментировать с черепашьей графикой в интерактивном режиме, то эту инструкцию можно
набрать прямо в оболочке

Python:

>>> import turtle
>>>

Рисование отрезков прямой при помощи черепахи
Черепаха языка

Python

первоначально расположена в центре графического окна, которое

служит ее холстом. Для того чтобы отобразить черепаху в ее окне, в интерактивном режиме
можно ввести команду

turtle. showturtle ().

Ниже приводится демонстрационный сеанс,

который импортирует модуль черепахи и затем показывает черепаху:

>>> import turtle
>>> turtle.showturtle()
В результате появляется графическое окно (рис.

2.1 О).

Черепаха совсем не похожа на чере­

паху в собственном смысле этого слова. Напротив, она скорее выглядит, как указатель

стрелки(~). Это очень важно, потому что он указывает в ту сторону, куда черепаха обраще­
на в настоящее время. Если дать черепахе команду переместиться вперед, то она перемес­
тится в том направлении, куда указывает наконечник стрелки. Давайте попробуем. Для
перемещения черепахи вперед на п пикселов применяется команда

turtle. forward (n). (Про­
turtle. forward (200)

сто наберите желаемое число пикселов вместо п.) Например, команда
переместит черепаху вперед на
в оболочке

200

пикселов. Ниже приводится пример полного сеанса

Python:

>>> import turtle
>>> turtle.forward(200)
>>>
На рис.

2.11

представлен результат этого интерактивного сеанса. По ходу перемещения

черепахи была начерчена линия.

Глава 2. Ввод, обработка и вывод

90

f

РИС.

2.10.

2.11.

о

х

о

х

Графическое окно черепахи

f

РИС.

Python Т ur11e Graphics

Python Tur11e Graphics

Черепаха перемещена вперед на

200

пикселов

Глава 2. Ввод, обработка и вывод

91

Поворот черепахи
Когда черепаха появляется в начале сеанса, она по умолчанию направлена на восток (т. е.
вправо, или под углом

1

0°)- рис. 2.12.
о

Python Turtle Grophics

х

90 градусов

1

180 градусов

О градусов

1

270 градусов

РИС.

2.12.

Угловые направления черепахи

При помощи команд

turtle. right

(угол) либо

turtle. left (угол) можно повернуть черепа­
turtle. right (угол) поворачивает

ху, чтобы она была обращена в другую сторону. Команда
черепаху

вправо

на

turtle. left (угол)

количество

градусов,

заданных

аргументом

угол,

команда

поворачивает черепаху влево на количество градусов, заданных аргу­

ментом угол. Ниже приведен демонстрационный сеанс, в котором применяется команда

turtle. right (угол):
>>> import turtle
>>> turtle.forward(200)
>>> turtle.right(90)
>>> turtle.forward(200)
>>>
Этот сеанс сначала перемещает черепаху на
черепаху на

200

90°

пикселов вперед. Далее он поворачивает

пикселов вперед. Результат сеанса показан на рис.

Далее

приведен

демонстрационный

left (угол):
>>> import turtle
>>> turtle.forward(lOO)
>>> turtle.left(120)
>>> turtle.forward(l50)
>>>

200

вправо (черепаха будет смотреть вниз). Затем он перемещает черепаху на

сеанс,

в

2.13.

котором

использована

команда

turtle.

Глава 2. Ввод, обработка и вывод

92

f

о

Pythcn Turtle Graph1c;

х

"
РИС.

2.13.

Черепаха поворачивается вправо

Этот сеанс сначала перемещает черепаху на
черепаху на
черепаху на

100 пикселов вперед. Затем он поворачивает
120° влево (черепаха будет смотреть на северо-запад). И далее он перемещает
150 пикселов вперед. Результат сеанса показан на рис. 2.14.

Следует иметь в виду, что команды

turtle. right

и

turtle. left

поворачивают черепаху под

указанным углом. Например, текущее угловое направление черепахи составляет
на север). Если ввести команду

90°

(строго

turtle. left (20), то черепаха будет повернута влево на 20°.

Это означает, что угловое направление черепахи составит

110°.

В качестве еще одного при­

мера взгляните на приведенный ниже интерактивный сеанс:

>>> import turtle
>>> turtle.forward(SO)
>>> turtle. left (45)
>>> turtle.forward(50)
>>> turtle.left(45)
>>> turtle.forward(SO)
>>> turtle.left(45)
>>> turtle.forward(SO)
>>>
На рис.

ляет

0°.

2.15

показан результат сеанса. В начале этого сеанса направление черепахи состав­

В строке

3

черепаха поворачивается на

поворачивается влево на дополнительные
вается на

45°

нец составит

45°.

45°

влево. После всех этих поворотов на

135°.

влево. В пятой строке черепаха снова

В седьмой строке черепаха еще раз поворачи­

45°

угловое направление черепахи нако­

Глава 2. Ввод, обработка и вывод

f

РИС.

2.14.

Python Tшtle Graphics

2.15.

х

о

х

Черепаха поворачивается влево

:/ Python Т urtle Graphic'

РИС.

о

Многократное поворачивание черепахи на

45°

93

Глава 2. Ввод, обработка и вывод

94

Установка углового направления черепахи

в заданный угол
Команда

turtle. setheading (угол) применяется для установки углового направления чере­

пахи в заданный угол. В качестве аргумента угол надо просто указать желаемый угол. Вот
пример:

>>> import turtle
>>> turtle.forward(SO)
>>> turtle.setheading(90)
>>> turtle.forward(lOO)
>>> turtle.setheading(l80)
>>> turtle.forward(SO)
>>> turtle.setheading(270)
>>> turtle.forward(lOO)
>>>
Как обычно, первоначальное угловое направление черепахи составляет
направление черепахи установлено в
новлено в

180°.

90°.

0°.

В третьей строке

Затем в пятой строке направление черепахи уста­

Потом в седьмой строке направление черепахи установлено в

тат сеанса показан на рис.

270°.

Резуль­

2.16.

:/ Python Т urtle Graphic5

о

х

с
РИС.

2.16.

Установка углового направления черепахи

Получение текущего углового направления черепахи
В интерактивном сеансе можно применить команду
экран текущее угловое направление черепахи. Пример:

turtle. heading (), чтобы вывести на

Глава 2. Ввод, обработка и вывод

95

>>> import turtle
>>> turtle.heading()
о.о

>>> turtle.setheading(l80)
>>> turtle.heading()

180.0
>>>

Поднятие и опускание пера
Исходная роботизированная черепаха лежала на большом листе бумаги и имела перо, кото­
рое можно было поднимать и опускать. Когда перо опускалось, оно вступало в контакт
с бумагой и чертило линию во время перемещения черепахи. Когда перо поднималось, оно

не касалось бумаги, и поэтому черепаха могла перемещаться без начертания линии.

1

РИС.

Python Т urtlt Graphics

о

х

2.17. Поднятие и опускание пера
В

Python

команда

pendown () -

turtle. penup ()

применяется для поднятия пера, а команда

turtle.

для опускания пера. Когда перо поднято, черепаха будет перемещаться без

начертания линии. Когда перо опущено, черепаха оставляет линию во время ее перемеще­
ния. (По умолчанию перо опущено.) Приведенный ниже сеанс показывает пример. Результат

сеанса представлен на рис.

>>> import turtle
>>> turtle.forward(SO)
>>> turtle.penup ()
>>> turtle.forward(25)
>>> turtle.pendown()
>>> turtle.forward(SO)

2.17.

96

Глава 2. Ввод, обработка и вывод

>>> turtle.penup()
>>> turtle.forward(25)
>>> turtle.pendown()
>>> turtle.forward(50)
>>>

Рисование кругов и точек
Для

того

circle

чтобы

(радиус)

,

черепаха

нарисовала

круг,

можно

применить

команду

turtle.

и она начертит круг с радиусом в пикселах, заданным аргументом радиус.

Например, команда

turtle.circle (100) побуждает черепаху нарисовать круг с радиусом

100

пикселов. Приведенный ниже интерактивный сеанс выводит результат, показанный на

рис.

2.18:

>>> import turtle
>>> turtle.circle(100)
>>>

1

РИС.

Python Tшtie Graphics

о

х

2.18. Круг
Команда

turtle. dot ()

применяется, чтобы заставить черепаху начертить простую точку.

Например, приведенный ниже интерактивный сеанс производит результат, который показан
на рис.

2.19:

>>> import turtle
>>> turtle.dot()
>>> turtle.forward(50)

Глава 2. Ввод, обработка и вывод

97

>>> turtle. dot ()
>>> turtle.forward(50)
>>> turtle. dot ()
>>> turtle.forward(50)
>>>

j Python Turtle Graphics

РИС.

2.19.

о

х

Рисование точек

Изменение размера пера
Для изменения ширины пера черепахи

pensize

в пикселах можно применить команду

turtle.

(ширина). Аргумент ширина - - это целое число, которое задает ширину пера. Напри­

мер, следующий ниже интерактивный сеанс назначает ширине пера

5

пикселов и затем ри­

сует круг:

>>> import turtle
>>> turtle.pencsize(5)
>>> turtle.circle(lOO)
>>>

Изменение цвета рисунка
Для изменения цвета рисунка черепахи можно применить команду
Аргумент цвет -

turtle. pencolor (цвет).

это название цвета в виде строкового литерала. Например, приведенный

ниже интерактивный сеанс меняет цвет рисунка на красный и затем рисует круг:

>>> import turtle
>>> turtle.pencolor('red')
>>> turtle.circle(l00)
>>>

98

Глава 2. Ввод, обработка и вывод
С командой turtle. pencolor можно использовать многочисленные предопределенные на­

4 приведен их полный перечень. Вот некоторые из наиболее
широко используемых названий цветов: 'red', 'green ', 'Ыuе', 'yellow' и 'cyan' 1•

звания цветов, и в приложении

Изменение цвета фона
Для изменения фонового цвета графического окна черепахи можно применить команду

turtle. bgcolor (цвет). Аргумент цвет- это название цвета в виде строкового литерала.
Например, приведенный ниже интерактивный сеанс меняет цвет фона на серый, цвет рисун­
ка на красный и затем рисует круг:

>>> import turtle
>>> turtle.bgcolor ( 'gray')
>>> turtle. pencolor ( 'red')
>>> turtle.circle(lOO)
>>>
Как было упомянуто ранее, существуют многочисленные предопределенные названия цве­
тов, и в приложении

4

приведен их полный перечень.

Возвращение экрана в исходное состояние
Для возвращения графического окна черепахи в исходное состояние существуют три коман­

turtle. reset (), turtle. clear()

ды:

+ Команда

и

turtle. clearscreen ().

turtle. reset () стирает все рисунки, которые в настоящее время видны в гра­

фическом окне, задает черный цвет рисунка и возвращает черепаху в ее исходное поло­

жение в центре экрана. Эта команда не переустанавливает цвет фона графического окна.

+

Команда turtle. clear () просто стирает все рисунки, которые в настоящее время видны

в графическом окне. Она не меняет положение черепахи, цвет рисунка или цвет фона
графического окна.

+ Команда

turtle. clearscreen () стирает все рисунки, которые в настоящее время видны

в графическом окне, переустанавливает цвет рисунка в черный, переустанавливает цвет

фона графического окна в белый и возвращает черепаху в ее исходное положение в цен­
тре графического окна.

Установление размера графического окна
Для

установления

setup (ширина,

размера

графического

окна

можно

высота). Аргументы ширина и высота -

применить

команду

turtle.

это ширина и высота в пикселах.

Например, приведенный ниже интерактивный сеанс создает графическое окно шириной
и высотой

480

пикселов:

>>> import turtle
>>> turtle.setup(640, 480)
>>>

1

Красный, зеленый, синий, желтый и голубой. -

Прю1. пер.

640

Глава 2. Ввод, обработка и вывод

99

Перемещение черепахи в заданную позицию
Декартова система координат используется для идентификации позиции каждого пиксела
в графическом окне черепахи (на рис.

2.20).

Каждый пиксел имеет координаты Х и У. Коор­

дината Х идентифицирует горизонтальную позицию пиксела, координата У -

его верти­

кальную позицию. Важно понимать следующее:

+ пиксел в центре графического окна находится в позиции (О, О), т. е. его координата Х рав­
няется О, координата У равняется О;

+ значения координат Х увеличиваются при перемещении в правую сторону и уменьшают­
ся при перемещении в левую сторону окна;

+ значения координат

У увеличиваются при перемещении вверх и уменьшаются при пере­

мещении вниз окна;

+ пикселы, расположенные справа от центральной точки, имеют положительные координа­
ты Х, а расположенные слева от центральной точки

-

отрицательные координаты Х;

+ пикселы, расположенные выше центральной точки, имеют положительные координаты У,
а расположенные ниже центральной точки

!/

-

отрицательные координаты У.

о

Pythcn iurtle Graphics

х

+ У-координаты

(О, О)

- Х-координаты

'--.

+ Х-координаты

-

РИС.

2.20.

'(-координаты

Декартова система координат

Для перемещения черепахи из ее текущего положения в конкретную позицию в графиче­
ском окне применяется команда

turtle. goto

(х,

у). Аргументы х и у

-

это координаты по­

зиции, в которую черепаха будет перемещена. Если перо черепахи опущено вниз, то по ходу
перемещения черепахи будет начерчена линия. Например, приведенный ниже интерактив­
ный сеанс чертит линии, показанные на рис.

>>> import turtle
>>> turtle.goto(O, 100)

2.21:

Глава 2. Ввод, обработка и вывод

100

>>> turtle.goto(-100,

О)

>>> turtle.goto(O, 0)
>>>

!/

о

P1thcn TurtlE Graphics

х

/
РИС.

2.21.

Перемещение черепахи

Получение текущей позиции черепахи
Для отображения текущей позиции черепахи в интерактивном сеансе применяется команда

turtle. pos ():
>>> import turtle
>>> turtle.goto(lOO, 150)
>>> turtle. pos ()

(100.00, 150.00)
>>>
Для отображения координаты Х черепахи служит команда
ния координаты У черепахи

>>> import turtle
>>> turtle.goto(lOO, 150)
>>> turtle. xcor ()

100
>>> turtle. ycor ()

150
>>>

-

команда

turtle. ycor ():

turtle. xcor (), а для отображе­

Глава 2. Ввод, обработка и вывод

101

Управление скоростью анимации черепахи
Для изменения скорости, с которой черепаха перемещается, можно применить команду

turtle. speed (скорость). Аргумент скорость -

это число в диапазоне от О до

1О.

Если ука­

зать О, то черепаха будет делать все свои перемещения мгновенно (анимация отключена).
Например, приведенный ниже интерактивный сеанс отключает анимацию черепахи и затем

рисует круг. В результате круг будет нарисован немедленно:

>>> import turtle
>>> turtle.speed(O)
>>> turtle.circle(lOO)
>>>
Если указать значение скорости в диапазоне

1О -

1-10,

то

1 будет

самой медленной скоростью,

самой большой скоростью. Приведенный ниже интерактивный сеанс устанавливает

скорость анимации в

1 (в

самую медленную скорость) и затем рисует круг:

>>> import turtle
>>> turtle.speed(l)
>>> turtle.circle(lOO)
>>>
При помощи команды

turtle. speed () можно получить текущую скорость анимации (аргу­

мент скорость не указывается):

>>> import turtle
>>> turtle.speed()

3
>>>

Сокрытие черепахи
Если не нужно, чтобы черепаха отображалась на экране, то для этого применяется команда

turtle. hideturtle (), которая ее прячет. Эта команда не изменяет то, как рисуется графиче­
ское изображение, она просто скрывает значок черепахи. Когда потребуется снова вывести
черепаху на экран, применяется команда

turtle. showturtle ().

Вывод текста в графическое окно
Для вывода текста в графическое окно применяется команда
мент текст -

turtle. write (текст). Аргу­

это строковый литерал, который требуется вывести на экран. После вывода

левый нижний угол первого символа будет расположен в точке с координатами Х и У чере­
пахи. Приведенный ниже интерактивный сеанс это демонстрирует. Результат сеанса показан
на рис.

2.22.

>>> import turtle
>>>

turtle.write('Пpивeт,

мир!')

>>>
Приведенный ниже интерактивный сеанс показывает еще один пример, в котором черепаха
перемещается в соответствующие позиции для вывода текста. Результат сеанса представлен

на рис.

2.23.

102

Глава

2.

Ввод, обработка и вывод

>>> import turtle
>>> turtle.setup(400, 300)
>>> turtle.penup ()
>>> turtle.hideturtle()
>>> turtle.goto(-120, 120)
>>> turtle. wri te ("Слева вверху")
>>> turtle.goto(70, -120)
>>> turtle. wri te
>>>

("Справа

внизу")

Python Turtl~ Gr•phics

/

о

х

~риsет. МЩ>

РИС.

2.22. Текст выведен в графическом окне

Python Т urtle Gr11phics

о

х

"

Слева вверху

i

1

1

1

'

1

Справа вн1"у

>

<
'

РИС.

2.23. Текст выведен в графическом окне в указанных позициях

"'

Глава 2. Ввод, обработка и вывод

103

Заполнение геометрических фигур
Для

заполнения

геометрической

фигуры

цветом

используется

команда

turtle.begin_

f i 11 () , причем она применяется до начертания фигуры, и затем после того, как фигура была
начерчена,

используется

команда

turtle.end_fill ().

Во

время

исполнения

команды

геометрическая фигура будет заполнена текущим цветом заливки. При­

turtle.end_fill ()

веденный ниже интерактивный сеанс это демонстрирует.

>>> import turtle
>>> turtle.hideturtle()
>>> turtle.begin_fill()
>>> turtle.circle(l00)
>>> turtle.end_fill()
>>>
После выполнения кода круг будет заполнен черным цветом, являющимся цветом по умол­
чанию.

Цвет заливки можно изменить при помощи команды

Аргумент цвет ниже

(рис.

интерактивный

сеанс

изменяет

цвет рисунка

на

красный

2.24):

>>> import turtle
>>> turtle.hideturtle()
>>> turtle. fillcolor ( 'red')
>>> turtle.begin_fill()
>>> turtle.circle(100)
>>> turtle.end_fill()
>>>

r/

РИС.

2.24.

Заполненный круг

turtle. fillcolor

(цвет).

это название цвета в виде строкового литерала. Например, приведенный

Python Turtle Gr•phics

о

х

и

затем

рисует

круг

Глава 2. Ввод, обработка и вывод

104

turtle. fillcolor () можно использовать многочисленные предопределенные
названия цветов. В приложении 4 приведен их полный перечень. Вот некоторые из наиболее
широко используемых названий цветов: 'red', 'green', 'Ыuе ', 'yellow' и 'cyan'.
С командой

Посмотрите, как чертится квадрат, заполненный синим цветом. Результат сеанса показан на
рис.

2.25.

>>> import turtle
>>> turtle.hideturtle()
>>> turtle. fillcolor ( 'Ыuе')
>>> turtle.begin_fill()
>>> turtle.forward(100)
>>> turtle. left ( 90)
>>> turtle.forward(100)
>>> turtle. left ( 90)
>>> turtle.forward(lOO)
>>> turtle. left ( 90)
>>> turtle.forward(lOO)
>>> turtle.end_fill()
>>>

/

РИС.

2.25.

Pythcn Tш"tle Grapl1ics

о

х

Заполненный квадрат

Если закрасить незамкнутую фигуру, то она будет заполнена, как будто был начерчен отре­
зок, соединяющий начальную точку с конечной точкой. Например, приведенный ниже интер­

активный сеанс чертит два отрезка прямой. Первый из (О, О) в

(120, 120)

в

(200, -100).

Во время выполнения команды

ется, как будто имелся отрезок из (О, О) в

>>> import turtle
>>> turtle.hideturtle()
>>> turtle.begin_fill()

(200, -120).

(120, 120),

второй из

turtle.end_fill () фигура заполня­

На рис.

2.26 показан

результат сеанса.

Глава 2. Ввод, обработка и вывод

105

>>> turtle.goto(l20, 120)
>>> turtle.goto(200, -100)
>>> turtle.end_fill()
>>>

,

РИС.

2.26.

о

Pythcn Turtle Graphic1

х

Заполненная фигура

Применение команды

turtle.doneO

для сохранения графического окна открытым
Если выполнить программу

Python

с черепашьей графикой не из среды

IDLE

(например,

в командной оболочке), то вы заметите, что графическое окно исчезает, как только програм­
ма заканчивается. Для предотвращения закрытия окна после завершения программы нужно

в самый конец программ с черепашьей графикой добавлять инструкцию

turtle. done (). Она

заставит графическое окно оставаться открытым. В результате появляется возможность
увидеть его содержимое после того, как программа закончит выполняться. Для того чтобы

закрыть окно, нужно в окне просто нажать на стандартной кнопке Закрыть.
Если же выполнять свои программы из

IDLE,

то инструкция

turtle. done ()

в программах не

требуется.

Программа "Созвездие Ориона"
Орион

-

одно из самых известных созвездий на ночном небе. Схема на рис.

2.27

показыва­

ет приблизительные положения нескольких звезд в данном созвездии. Самые верхние звез­
ды

-

это плечи Ориона, ряд из трех звезд в середине

колени Ориона. На рис.

2.28

-

пояс Ориона, две нижние звезды

показаны названия всех этих звезд, а на рис.

которые, как правило, используются для соединения звезд.

2.29 -

-

линии,

Глава 2. Ввод, обработка и вывод

106












РИС.

2.27.

Звезды в созвездии Ориона

Бетельгейзе



Ха тиса





Минтака

• Альнилам


Альнитак

Ригель



Саиф



РИС.

2.28.

Названия звезд

Глава 2. Ввод, обработка и вывод

107

Бетельгейзе
Ха тиса

Альнилам
Альнитак

Ригель

РИС.

2.29.

Линии созвездия

В этом разделе мы разработаем программу, которая рисует звезды, их названия и линии со­
звездия в том виде, как они показаны на рис.
шириной

500

и высотой

600

2.29.

Будем использовать графическое окно

пикселов. Программа будет ставить точки, которые будут пред­

ставлять звезды. Мы воспользуемся миллиметровой бумагой (рис.

2.30),

чтобы сделать

набросок позиций точек и определить их координаты.

В нашей программе мы много раз будем использовать координаты, которые были иденти­
фицированы на рис.

2.30.

Отслеживать правильные значения координат каждой звезды мо­

жет оказаться сложным и утомительным делом. Для того чтобы все максимально упростить,
создадим именованные константы, которые будут представлять координаты каждой звезды:

LEFT SHOULDER Х = -70
LEFT SHOULDER У = 200
RIGHT SHOULDER Х = 80
RIGHT SHOULDER У = 180
LEFT BELTSTAR Х
-40
LEFT BELTSTAR У = -20
MIDDLE BELTSTAR Х = О
MIDDLE BELTSTAR У = О
RIGHT BELTSTAR Х = 40
RIGHT BELTSTAR У = 20
LEFT KNEE Х = -90
LEFT KNEE У = -180
RIGHT KNEE Х
120
RIGHT KNEE У = -140

Глава 2. Ввод, обработка и вывод

108

(-]'С,~)



:юо \

(li'Q, 11i'Q)



1001
(.... О, ::W)

(0,Q)

Осьу

нo,-:w) ":i.

()

~



1



1

- 100
(:i.:

~,,.,' 0 r r11cfl()1

Prn/ '"rn'

В компании было подсчитано, что ее ежегодная прибыль, как правило, составляет

23%

от

общего объема продаж. Напишите программу, которая просит пользователя ввести пла­

новую сумму общего объема продаж и затем показывает прибыль, которая будет получе­
на от этой суммы.

Подсказка: для представления

3.

23%

используйте значение

0.23.

Расчет площади земельного участка. Один акр земли эквивалентен квадратным мет­

рам. Напишите программу, которая просит пользователя ввести общее количество квад­
ратных метров участка земли и вычисляет количество акров в этом участке.

Подсказка: разделите введенное количество на

4.

4047,

чтобы получить количество акров.

Общий объем продаж. Покупатель приобретает в магазине пять товаров. Напишите про­
грамму, которая запрашивает цену каждого товара и затем выводит накопленную стои­

мость приобретаемых товаров, сумму налога с продаж и итоговую сумму. Допустим, что
налог с продаж составляет

5.

7%.

Пройденное расстояние. Допустим, что несчастные случаи или задержки отсутствуют,

тогда расстояние, проходимое автомобилем по автостраде, можно вычислить на основе
формулы:
расстояние= скорость х время.

Автомобиль движется со скоростью

6.

70

км/ч. Напишите программу, которая показывает:



расстояние, которое автомобиль пройдет за

6 часов;



расстояние, которое автомобиль пройдет за



часов;



расстояние, которое автомобиль пройдет за

15

часов.

Налоr с продаж. Напишите программу, которая попросит пользователя ввести величину

покупки. Затем программа должна вычислить федеральный и региональный налог с про­
даж. Допустим, что федеральный налог с продаж составляет

5%,

а региональный

-

2.5%.

Программа должна показать сумму покупки, федеральный налог с продаж, региональный
налог с продаж, общий налог с продаж и общую сумму продажи (т. е. сумму покупки и

общего налога с продаж).
Подсказка:
ния

7.

5% -

для

представления

2.5%

используйте

значение

0.025,

для

представле­

0.05.

Расход бензина в расчете на километры пройденного пути. Расход бензина в расчете
на километры пройденного автомобилем пути можно вычислить на основе формулы:
расход

=

пройденные километры

/ расход

бензина в литрах.

Напишите программу, которая запрашивает у пользователя число пройденных километ­

ров и расход бензина в литрах. Она должна рассчитать расход бензина автомобилем
и показать результат.

8.

Чаевые, налоr и общая сумма. Напишите программу, которая вычисляет общую стои­
мость еды в ресторане. Программа должна попросить пользователя ввести стоимость

Глава 2. Ввод, обработка и вывод

121

еды, вычислить размер 18-процентных чаевых и 7-процентного налога с продаж и пока­
зать все стоимости и итоговую сумму.

9.

Преобразователь температуры по шкале Цельсия в температуру по шкале Фарен­

гейта. Напишите программу, которая преобразует показания температуры по шкале
Цельсия в температуру по шкале Фаренгейта на основе формулы:

F=~C+32.
5

Программа должна попросить пользователя ввести температуру по шкале Цельсия и по­
казать температуру, преобразованную в шкалу Фаренгейта.

10.

Регулятор ингредиентов. Рецепт булочек предусматривает ингредиенты:
стакана сахара;



1.5



1 стакан

• 2.75

масла;

стакана муки.

С таким количеством ингредиентов этот рецепт позволяет приготовить

48

булочек.

Напишите программу, которая запрашивает у пользователя, сколько булочек он хочет
приготовить, и затем показывает число стаканов каждого ингредиента, необходимого

для заданного количества булочек.

11.

Процент учащихся обоего пола. Напишите программу, которая запрашивает у пользо­
вателя количество учащихся мужского и женского пола, зарегистрированных в учебной
группе. Программа должна показать процент учащихся мужского и женского пола.

Подсказка: предположим, что в учебной группе

20 учащихся. Процент юношей
девушек: 12/20 = 0.6, или 60%.
12.

8

12 девушек, т. е. всего
8/20 = 0.4, или 40%. Процент

юношей и

можно рассчитать, как

Программа расчета купли-продажи акций. В прошлом месяце Джо приобрел немного
акций некой ИТ-компании. Вот детали этой покупки:



число приобретенных акций было



при покупке акций Джо заплатил



Джо заплатил своему биржевому брокеру комиссию, которая составила

2000;

40.00 долларов за

акцию;

3%

от суммы,

3%

от суммы,

уплаченной за акции.

Две недели спустя Джо продал акции. Вот детали продажи:



количество проданных акций составило



он продал акции за



он заплатил своему биржевому брокеру комиссию, которая составила

42.75

2000;

долларов за акцию;

полученной за акции.

Напишите программу, которая показывает приведенную ниже информацию:



сумму денег, уплаченную за акции;



сумму комиссии, уплаченную брокеру при покупке акций;



сумму, за которую Джо продал акции;



сумму комиссии, уплаченную брокеру при продаже акций.

122

Глава 2. Ввод, обработка и вывод



сумму денег, которая у Джо осталось, когда он продал акции и заплатил своему бро­
керу (оба раза). Если эта сумма- положительная, то Джо получил прибыль. Если же
она

13.

отрицательная, то Джо понес убытки.

-

Выращивание виноrрада. Владелец виноградника высаживает несколько новых гряд
винограда, и ему нужно знать, сколько виноградных лоз следует посадить на каждой
гряде. Измерив длину будущей гряды, он определил, что для расчета количества вино­
градных лоз, которые поместятся на гряду вместе с концевыми опорами, которые долж­

ны быть установлены в конце каждой гряды, он может применить приведенную ниже
формулу:

V= R-2E

s

где

V-

'

количество виноградных лоз, которые поместятся на гряде;

в метрах; Е

-

R-

длина гряды

размер пространства в метрах, занимаемых концевыми опорами;

S-

размер пространства между виноградными лозами в метрах.

Напишите программу, которая для владельца виноградника выполняет расчеты. Данная
программа должна попросить пользователя ввести:



длину гряды в метрах;



объем пространства, занимаемого концевой опорой в метрах;



объем пространства между виноградными лозами в метрах.

После того как входные данные будут введены, программа должна рассчитать и пока­
зать количество виноградных лоз, которые поместятся на гряде.

14.

Сложный процент. Когда банк начисляет процентный доход по сложной ставке на
остаток счета, он начисляет процентный доход не только на основную сумму, которая

была внесена на депозитный счет, но и на процентный доход, который накапливался
в течение долгого времени. Предположим, что вы хотите внести немного денег на сбере­
гательный счет и заработать доход по сложной ставке в течение определенного коли­
чества лет. Ниже приведена формула для вычисления остатка счета после конкретного
количества лет:

где А

-

сумма денег на счете после конкретного количества лет; Р

которая была внесена на счет в начале;
начисления процентного дохода в год;

t-

r-

-

основная сумма,

годовая процентная ставка; п

-

частота

конкретное количество лет.

Напишите программу, которая выполняет для вас расчеты. Программа должна попро­
сить пользователя ввести:



основную сумму, внесенную на сберегательный счет в самом начале;



годовую процентную ставку, начисляемую на остаток счета;



частоту начисления процентного дохода в год (например, если проценты начисляют­
ся ежемесячно, то ввести
ввести



12;

если процентный доход начисляется ежеквартально, то

4);

количество лет, в течение которых сберегательный счет будет зарабатывать процент­
ный доход.

Глава 2. Ввод, обработка и вывод

123

После того как входные данные будут введены, программа должна рассчитать и пока­
зать сумму денег, которая будет на счету после заданного количества лет.

ПРИМЕЧАНИЕ
Пользователь должен ввести процентную ставку в виде процента. Например,
как

2,

а не как

.02.

Программа должна сама разделить введенное число на

2% будут вводиться
100, чтобы перемес­

тить десятичную точку в правильную позицию.

15.

Рисунки черепашьей графики. Примените библиотеку черепашьей графики для напи­
сания программ, которые воспроизводят все эскизы, показанные на рис.

Север

Юг

РИС.

2.34.

Эскизы

2.34.

1111111111

я 1f

3.1

~ КЛЮЧЕВЫЕ ПОЛОЖЕНИЯ
Инструкция i f применяется для создания управляющей структуры, которая позволяет

иметь в программе более одного пути исполнения. Инструкция i f исполняет одну или
несколько инструкций, только когда булево выражение является истинным.

8 1 1 )R •::inuc

The f St

"Инструкция 1f'

Управляющая структура

-

item~m

J

это логическая схема, управляющая порядком, в котором ис­

полняется набор инструкций. До сих пор мы использовали только самый простой тип управ­
ляющей структуры: последовательную структуру, т. е. структуру с последовательным ис­

полнением. Последователыюя структура представляет собой набор инструкций, которые
исполняются в том порядке, в котором они появляются. Например, приведенный ниже
фрагмент кода имеет последовательную структуру, потому что инструкции исполняются
сверху вниз:

name
age

=

print

input('Kaк Вас

int (input

=

('Вот

данные,

print('Имя:',

print

зовут?

')

('Сколько Вам лет?
которые

'))

Вы ввели:')

name)

('Возраст:',

age\

Хотя в программировании последовательная структура находит активное применение, она

не способна справляться с любым типом задач, т. к. некоторые задачи просто не могут быть
решены путем поочередного выполнения набора упорядоченных шагов. Рассмотрим про­

грамму расчета заработной платы, которая определяет, работал ли сотрудник сверхурочно.
Если сотрудник работал более

свыше

40.

40

ч, то ему выплачиваются сверхурочные за все часы

В противном случае начисление сверхурочных должно быть пропущено. Такого

рода программы требуют другого типа управляющих структур: тех, которые могут испол­

нять набор инструкций только при определенных обстоятельствах. Этого можно добиться
при помощи управляющей структуры принятия решения. (Структуры принятия решения

также называются структурами с выбором.)
В простейшей структуре принятия решения определенное действие выполняется, только
если существует определенное условие. Если условия нет, то действие не выполняется.

Блок-схема на рис.

3.1

показывает, каким образом можно схематически изобразить логику

принятия повседневного решения в виде управляющей структуры принятия решения. Ром­

бовидный символ обозначает логическое условие со значениями истина/ложь. Если условие

Глава 3. Структуры принятия решения и булева логика

126

истинное, то мы следуем по пути, который приводит к исполнению действия. Если условие
ложное, то мы следуем по пути, который это действие пропускает.

В блок-схеме ромбовидный символ обозначает некоторое условие, которое должно быть
проверено. В данном случае мы определяем, является ли условие На улице холодно истин­

ным или ложным. Если это условие истинное, то выполняется действие Надеть куртку. Если
условие ложное, то действие пропускается. Действие исполняется по условию, потому что
оно выполняется только в том случае, если определенное условие истинное.

Истина

Ложь

Надеть куртку

Истина

Надеть шапку

Ложь

Надеть куртку
Надеть перчатки

РИС.

3.1.

Простая структура принятия решения

РИС.

3.2. Структура принятия решения, которая исполняет

три действия при условии, что на улице холодно

Программисты называют показанный на рис.

3.1

тип структуры структурой принятия

решения с единственным вариантом. Это связано с тем, что она предоставляет всего один
вариант пути исполнения. Если условие в ромбовидном символе истинное, то мы принима­
ем этот вариант пути. В противном случае мы выходим из этой структуры. На рис.

3.2

пред­

ставлен более детализированный пример, в котором выполняются три действия, только
когда на улице холодно. Это по-прежнему структура принятия решения с единственным
вариантом, потому что имеется всего один вариант пути исполнения.

В

Python

для написания структуры принятия решения с единственным вариантом использу­

ется инструкция if. Вот общий формат инструкции if:

if

условие:
инструкция
инструкция

Для простоты мы будем называть первую строку условным выражением, или выраже­
нием if. Условное выражение начинается со слова if, за которым следует условие, т. е.

Глава 3. Структуры принятия решения и булева логика

127

выражение, которое будет вычислено, как истина либо ложь. После условия стоит двоето­
чие. Со следующей строки начинается блок инструкций. Блок

-

это просто набор инструк­

ций, которые составляют одну группу. Обратите внимание, что в приведенном выше общем

формате все инструкции блока выделены отступом. Такое оформление кода обязательно,
потому что интерпретатор

Python

использует отступы для определения начала и конца

блока.
Во время исполнения инструкции if осуществляется проверка условия. Если условие ис­
тинное, то исполняются инструкции, которые появляются в блоке после условного выраже­

ния. Если условие ложное, то инструкции в этом блоке пропускаются.

Булевы выражения и операторы сравнения
Как упоминалось ранее, инструкция i f осуществляет проверку выражения, чтобы опреде­
лить, является ли оно истинным или ложным. Выражения, которые проверяются инструкци­

ей if, называются булевыми выражениями в честь английского математика Джорджа Буля.
В 1800-х годах Буль изобрел математическую систему, в которой абстрактные понятия ис­
тинности и ложности могли использоваться в вычислениях.

Как правило, булево выражение, которое проверяется инструкцией if, формируется опера­
тором сравнения (реляционным оператором). Оператор сравнения определяет, существует
ли между двумя значениями определенное отношение. Например, оператор больше
определяет, является ли одно значение больше другого. Оператор равно

значения друг другу. В табл.
Таблица

3 .1

перечислены имеющиеся в

( ==) -

Python операторы

(>)

равны ли два

сравнения.

3.1. Операторы сравнения

Оператор

Значение

>

Больше

<

Меньше

>=

Больше или равно

):

length > width
Это выражение определяет, является ли значение, на которое ссылается переменная length,

больше значения, на которое ссылается переменная width. Если length больше width, то
значение выражения является истинным. В противном случае значение выражения является
ложным.

В приведенном ниже выражении, чтобы определить, является ли переменная length меньше
переменной width, применяется оператор меньше

length < width

(

у

х больше у?

х

<

у

х меньше у?

х

>=

у

х больше или равно у?

х

набрать булево

покажет его значение

вычислит и

выражение

как

True

(Истина) или False (Ложь). Например, взгляните на приведенный ниже интерактивный
сеанс. (Для удобства добавлены номера строк.)

1 >>>

х

=

1 [ii)ter 1
О

IEnterl

2 >>>

у

3 >>>

х

> у 1Enter1

у

> х IEnterl

4 True

5 >>>
б

False

7 >>>
Инструкция в строке

1

присваивает значение

сваивает значение О переменной у. В строке
ние выражения (тrue) выводится в строке
ние у

4.

3

1

переменной х. Инструкция в строке

мы набираем булево выражение х

Затем в строке

> х. Значение выражения (False) выводится в строке

5
6.

х

2 >>>

у

3 >>>

=

1 [E!lter 1

у

<

Х

!Enterl
!Enterl

х

<

у

1Enter1

О

при­

мы набираем булево выраже­

Приведенный ниже интерактивный сеанс демонстрирует оператор

1 >>>

>

2

у. Значе­

>>
б

False

7 >>>

Инструкция в строке

1

присваивает значение

сваивает значение О переменной у. В строке
ние выражения (тrue) выводится в строке
ние х

4.

3

1

переменной х. Инструкция в строке

мы набираем булево выражение у

Затем в строке

5

< у. Значение выражения (False) выводится в строке 6.

2

при­

< х. Значе­

мы набираем булево выраже­

Глава 3. Структуры принятия решения и булева логика

Операторы

>=

и

129

=

и

=определяет, является ли операнд с левой стороны больше или равняется операнду с пра­
вой стороны. Оператор

>> х = 1 1Enter1
2 >>> у = О IEnterl
3 >>> z = 1 IEnterl
4 >>> х >= у 1Enter1
1

5 True
6

>>>

х

>= z IEnterl

х

>

9 True

10

>>>

у 1Enter1

11 False
12

>>>

В строках

1-3

выражение х

мы присваиваем значения переменным х, у и

>=

z.

В строке

у, которое является истинным (тrue). В строке

6

4

мы вводим булево

мы вводим булево выра­

жение х

выражение

х

выражение

х

>= z, которое является истинным (тrue). В строке 8 мы вводим булево
> х = 1 IEnterl
о IEnterl
>>>
3 >>> z = 1 1Enter1
-- у 1Enter1
4 >>>
1

2

у

5
6
7
8

False

х

>>>

х

z [Enterl

True

>>>

ПРИМЕЧАНИЕ
Оператор равенства состоит из двух последовательных символов
с оператором присваивания, который состоит из одного символа

=.

=.

Не путайте этот оператор

Глава 3. Структуры принятия решения и булева логика

130

Оператор!=
Оператор

! = является оператором неравенства. Он определяет, не равняется ли операнд

с левой стороны операнду с правой стороны, т. е. противоположен оператору
что а равно

4,

ь равно

6

и с равно

4,

тогда оба выражения, а

ными, потому что а не равно ь и ь не равно с. Однако а

==.

Допустим,

! = ь и ь ! = с, являются истин­

! = с является ложным, потому что

а равно с.

Приведенный ниже интерактивный сеанс демонстрирует оператор ! =:

>>> х
1 1Enter1
>>> у
о 1Enter1
>>> z
1 1Enter1
>>> х != у i Enter 1
True
>>> х != z IEnterl
7 False
8 >>>

1
2
3
4
5
6

Собираем все вместе
Давайте взглянем на приведенную ниже инструкцию if:

if sales > 50000:
bonus = 500.0
sales (продажи)
sales > 50000 является истинным, то переменной bonus

Эта инструкция применяет оператор >, чтобы определить, является ли
больше

50 ООО.

Если выражение

присваивается значение

500.0.

Однако если это выражение является ложным, то инструкция
3.3 представлена блок-схема для этого фрагмента кода.

присваивания пропускается. На рис.

Истина

sales > 50000

Ложь

РИС.

3.3.

bonus = 500.0

Пример структуры принятия решения с одной инструкцией

Приведенный ниже пример исполняет блок с тремя инструкциями по условию. На рис.

приведена блок-схема для этого фрагмента кода.

if sales > 50000:
bonus = 500.0
commission rate = 0.12
print ('Вы вьmолнили свою

квоту продаж!')

3.4

Глава

3. Структуры принятия решения и булева логика

131

Истина

sales > 50000

Ложь

boпus

=500.0

commissioп_rate

=0.12

priпt('Bы выполнили
свою квоту продаж!')

РИС.

3.4.

Пример структуры принятия решения с тремя инструкциями

В приведенном ниже фрагменте кода используется оператор
ли два значения равными. Выражение

balance

==,

чтобы определить, являются

о будет истинным, если переменной

будет присвоено значение О. В противном случае выражение будет ложным.

if balance == О:
# Появляющиеся
#

balance ==

здесь

инструкции будут исполнены,

только если переменная

balance

равна

О.

В приведенном ниже фрагменте кода используется оператор ! =, чтобы определить, являются
ли два значения не равными. Выражение

choice

не ссылается на значение

5.

choice ! = 5

будет истинным, если переменная

В противном случае выражение будет ложным.

if choice != 5:
#
#

Появляющиеся здесь

инструкции будут исполнены,

только если переменная

Применение инструкции

choice

не равна

5.

if

Кэтрин преподает естественно-научный предмет, и ее студенты обязаны выполнить три кон­

трольные работы. Она хочет написать программу, которую ее студенты могут использовать
для расчета своего среднего балла. Она также хочет, чтобы программа с энтузиазмом
поздравила студента, если его средний балл больше
в псевдокоде:

Получить

оценку за

первую контрольную работу.

Получить

оценку за

вторую контрольную работу.

Получить

оценку за

третью контрольную работу.

95.

Вот соответствующий алгоритм

Глава 3. Структуры принятия решения и булева логика

132

Рассчитать
Показать

средний балл.

средний балл.

Если средний балл больше
Поздравить

В программе

Программа 3.1
1 #
2 #
3 #

1

3.1

95:

пользователя

приведен соответствующий код.

(test_aveгage.py)

Эта программа получает три оценки за контрольные работы
и показывает их средний балл.
если средний балл

Она поздравляет пользователя,

высокий.

4

5 # Именованная константа HIGH SCORE
6 # считается высоким баллом.
7 HIGH- SCORE = 95

содержит

значение,

8
9 # Получить три оценки за контрольные работы.
10 testl = int(input('Bвeдитe оценку 1: 1 ) )
11 test2 = int(input('Bвeдитe оценку 2: 1 ) )
12 test3 = int (input ('Введите оценку 3: 1 ) )
13
14 # Рассчитать средний балл.
15 average = (testl + test2 + test3) / 3
16

17
18

#Напечатать

средний балл.

рrint('Средний балл составляет:',

average)

19

20 # Если средний балл высокий, ТО
21 # поздравить пользователя.
22 i f average >= HIGH_SCORE:
23
pr in t ( 'Поздравляем! ' )
24
рrint('Отличный средний балл!')
Вывод

1 программы (вводимые данные выделены жирным шрифтом)

Введите оценку

1 : 82 IEnter l
2 : 76 IEnter l
оценку 3 : 91 IEnter l
балл составляет : 83 . 0

Введите оценку

Введите
Средний

Вывод

2 программы (вводимые данные выделены жирным шрифтом)

Введите оценку

1 : 93 IEnter l
2 : 99 1Enter 1
оценку 3 : 96 IEnter l
балл составляет : 96 . 0

Введите оценку
Введите
Средний

Поздравляем!
Отличный средний балл!

которое

Глава 3. Структуры принятия решения и булева логика

133

Контрольная точка

3.1.

Что такое управляющая структура?

3.2.

Что такое структура принятия решения?

3.3.

Что такое структура принятия решения с единственным вариантом исполнения?

3.4.

Что такое булево выражение?

3.5.

Какие типы отношений между значениями можно проверить при помощи операторов
сравнения (реляционных операторов)?

3.6.

Напишите инструкцию if, которая присваивает значение О переменной х, если пере­
менная у равна

3.7.

20.

Напишите, инструкцию if, которая присваивает значение

0.2 переменной commissionRate

(ставка комиссионного вознаграждения), если переменная sales (продажи) больше или
равна

10 ООО.

~

3.2

р кuия

if-e/se

11111111(___ КЛЮЧЕВЫЕ ПОЛОЖЕНИЯ
Инструкция if-else исполняет один блок инструкций, если ее условие является истин­
ным, либо другой блок, если ее условие является ложным.
Видеозапись "Инструкция

if-else" (The 1f-else Statement)

Предыдущий раздел познакомил со структурой принятия решения с единственным вариан­

том (инструкцией if), в которой имеется всего один вариант пути исполнения . Теперь мы
рассмотрим структуру принятия решения с двумя ШlЬтернативными вариантами, в кото­
рой имеется два возможных пути исполнения

-

один путь принимается, если условие явля­

ется истинным, и другой путь принимается, если условие является ложным. На рис.

3.5

представлена блок-схема для структуры принятия решения с двумя альтернативными ва­
риантами.

Истина

Ложь

temperature < 5

рrint("Отличная
погодка у нас

рrint("Холодновато,

сегодня!")

РИС.

3.5.

Структура принятия решения с двумя альтернативными вариантами

не находишь?")

Глава 3. Структуры принятия решения и булева логика

134

В приведенной блок-схеме структура принятия решения выполняет проверку выражения

temperature < 5. Если это условие является истинным, то исполняется инструкция
print ("Холодновато, не находишь?"). Если условие является ложным, то исполняется
инструкция pr int ("Отличная погодка у нас сегодня! ").
В программном коде мы записываем структуру принятия решения с двумя альтернативными
вариантами, как инструкцию if-else. Вот общий формат инструкции if-else:

if

условие:
инструкция
инструкция

else:
инструкция
инструкция

Когда эта инструкция исполняется, осуществляется проверка условия. Если оно истинное, то
исполняется блок инструкций с отступом, расположенный после условного выражения,
затем поток управления программы перескакивает к инструкции, которая следует за инст­

рукцией if-else. Если условие ложное, то исполняется блок инструкций с отступом, распо­
ложенный после выражения

else, затем поток управления программы перескакивает к инст­
if-else. Это действие описано на рис. 3.6.

рукции, которая следует за инструкцией

Если условие истинное, - {

то этот блок инструкций

· if условие:

if условие:

инструкция

инструкция

инструкция

инструкция

ит.д.

ит.д.

исполняется

else
инструкция
инструкция

Затем поток управления

Затем поток управления

ит.д.

..,

перескакивает сюда,

if-else

к инструкции, следующей

за инструкцией

3.6.

инструкция

исполняется

к инструкции, следующей

РИС.

инструкция

то этот блок инструкций

ит.д.

перескакивает сюда,

за инструкцией

Если условие ложное, - {

else

Исполнение по условию в инструкции

if-else

if-else

Приведенный ниже фрагмент кода показывает пример инструкции if-else. Этот фрагмент

соответствует блок-схеме на рис.

3.5.

if temperature < 5:
рrint("Холодновато,

не находишь?")

else:
рrint("Отличная

погодка у нас

сегодня!")

Глава 3. Структуры принятия решения и булева логика

Выделение отступом в инструкции
Когда вы пишете инструкцию

if-else,

135

if-else

при выделении отступами следует руководствовать­

ся следующими принципами:

+ убедитесь, что выражение if и выражение else выровнены относительно друг друга;
+ выражение if и выражение else сопровождаются блоком инструкций. Убедитесь,

что

инструкции в блоках расположены с одинаковым отступом.
Это показано на рис.

Выровнять

выр~жения
1f и

else

3. 7.

<

jf !~~~~~~~:
1

>

______________ ,

рrint("Холодновато, не находишь?")

:

: рrint("Включи отопление, nожалуйста")

L- - - - - - - - - - - - - - - - - - - - - -

else
1- - - - - - - - - - - - - - - - - - - - -

Инструкции в каждом
блоке должны иметь

-1

одинаковые отступы

1 рrint("Отличная погодка у нас сегодня")

: рrint("Раэдвинь шторы, пожалуйста")

:

L---------------------РИС.

3.7.

Выделение отступом в инструкции

Применение инструкции

if-else

if-else

Крис владеет авторемонтным предприятием и имеет в подчинении несколько сотрудников.

Если сотрудники работают больше

40

часов в неделю, то он им платит в

регулярной почасовой оплаты труда в течение всех часов свыше

40.

1.5

раза больше их

Он попросил вас разра­

ботать простенькую программу расчета заработной платы, которая вычисляет заработную
плату до удержаний, включая надбавку за сверхурочную работу. Вы разрабатываете приве­
денный ниже алгоритм:
Получить

количество

Получить

почасовую

отработанных часов.
ставку оплаты труда.

Если сотрудник работал более

40

часов:

Рассчитать и показать зарплату до удержаний со сверхурочными.
Иначе:

Рассчитать и показать зарплату до удержаний в

обычном порядке.

Соответствующий программный код приведен в программе
переменные, которые создаются в строках
сваивается значение

40,

3

и

4.

3.2.

Обратите внимание на две

Именованной константе BASE _ HOURS при­

т. е. количество часов, которые сотрудник может работать в неделю

без надбавки за сверхурочную работу. Именованной константе от_МULTIPLIER присваивает­
ся значение

1.5,

т. е. мультипликатор ставки оплаты труда за сверхурочную работу. Она

означает, что почасовая ставка оплаты труда сотрудника умножается
урочных часов.

1.5

для всех сверх­

136

Глава 3. Структуры принятия решения и булева логика

nр;рамма 3.2

j

(auto_repair_payroll.py)

1 # Именованные константы представляют базовые часы
2 # и мультипликатор сверхурочного времени.
3 BASE- HOURS = 40
# Базовые часы в неделю.
4 OT_МULTIPLIER = 1.5 # Мультипликатор сверхурочного

времени.

5

6 # Получить отработанные часы и почасовую ставку оплаты труда.
7 hours = float(input('Bвeдитe количество отработанных часов: '))
8 pay_rate = float(input('Bвeдитe почасовую ставку оплаты труда: '))
9

10 # Рассчитать и показать заработную плату до удержаний.
11 if hours > BASE HOURS:
12
# Рассчитать заработную плату до удержаний без сверхурочных.
13
# Сначала получить количество отработанных сверхурочных часов.
14
overtime hours = hours - BASEHOURS
15
# Рассчитать оплату за работу в сверхурочное время.
16
17
overtime_pay = overtime_hours * pay_rate * ОТ МULTIPLIER
18
19

#

Рассчитать

заработную плату до удержаний.

gross_pay = BASE_HOURS * pay_rate + overtime_pay
20
21 else:
22
# Рассчитать заработную плату до удержаний без сверхурочных.
23
gross_pay = hours * pay_rate
24
25 # Показать заработную плату до удержаний.
26 рrint('Заработная плата до удержаний составляет: $',
format(gross_pay, ', .2f'), sep=' ')
Вывод

1

nроrраммы (вводимые данные выделены жирным шрифтом)

Введите количество отработанных часов :

40 IEnter l
Введите почасовую ставку оплаты труда : 20 IEnter l
Заработная плата до удержаний составляет : $800 . 00 .
Вывод

2

программы (вводимые данные выделены жирным шрифтом)

Введите количество отработанных часов :

50 IEnter l
Введите почасовую ставку оплаты труда : 20 IEnter l
Заработная плата до удержаний составляет : $1 , 100 . 00 .

Контрольная точка

3.8.

Как работает структура принятия решения с двумя альтернативными вариантами?

3.9.

Какую инструкцию следует применить в

Python

для написания структуры принятия

решения с двумя альтернативными вариантами?

3.10.

При

каких

выражения

обстоятельствах

срабатывают

инструкции,

else при написании инструкции if-else?

которые

появляются

после

Глава 3. Структуры принятия решения и булева логика

137

11111111111

С а

3.3

нение стооковых значений

~ КЛЮЧЕВЫЕ ПОЛОЖЕНИЯ
Python

предоставляет возможность сравнивать строковые значения. Это позволяет созда­

вать структуры принятия решения, которые выполняют их проверку.

В предыдущих примерах вы увидели, как в структуре принятия решения могут сравниваться

числа. В

Python

можно сравнивать и строковые значения. Например, взгляните на приведен­

ный ниже фрагмент кода:

namel = 'Mary'
name2 = 'Mark'
if namel == name2:
print ('Имена одинаковые.')
else:
print ('Имена НЕ одинаковые.')
Оператор== сравнивает имена

Поскольку строки
одинаковые.

'Mary'

и

namel и name2, чтобы определить, являются ли они равными.
'Mark' не равны, выражение else выведет сообщение 'Имена НЕ

'.

Давайте взглянем на еще один пример. Допустим, что переменная

month

ковое значение. Приведенный ниже фрагмент кода использует оператор
лить, не равно ли значение, на которое ссылается переменная

if month !=

! =,

чтобы опреде­

слову 'Январь':

'Январь':

print('Ceйчac

В программе

month,

ссылается на стро­

3.3

не

время

праздновать

Татьянин день!')

представлен законченный код, демонстрирующий, как могут сравниваться

два строковых значения. Здесь пользователю предлагается ввести пароль, затем программа
пытается определить, равно ли введенное строковое значение слову

Программа

3.3

(password.py)

1 # Эта программа сравнивает два строковых
2 # Получить от пользователя пароль.
3 password = inрut('Введите пароль: ')

значения.

4

1

5
6
7
8
9
10

#

Определить,

#

пароль.

был ли введен

правильный

if password == 'prospero':
print ('Пароль принят. ')
else:
print ('Извините, этот пароль

Вывод

1

Введите

проrраммы (вводимые данные выделены жирным шрифтом)
пароль:

Извините ,

Вывод

2

Введите
Пароль

неверный.')

ferdi.nand 1 Enter 1

этот пароль

неверный .

проrраммы (вводимые данные выделены жирным шрифтом)
пароль :

принят .

prospero 1 En er 1

'prospero'.

138

Глава 3. Структуры принятия решения и булева логика
Операции сравнения строковых значений имеют одну особенность
к регистру. Например, строковые значения

'суббота' и

-

они чувствительны

'Суббота' не равны, потому что

в первом значении буква "с" написана в нижнем регистре, а во втором значении
нем регистре. Приведенный ниже пример сеанса с программой

3.3

-

в верх­

показывает, что проис­

ходит, когда в качестве пароля пользователь вводит слово Prospero (буква Р в верхнем
регистре).

Вывод

3

nроrраммы (вводимые данные выделены жирным шрифтом)

Введите пароль :
извините ,

Prospero

этот пароль

IEnterl

неверный .

СОВЕТ
В главе В вы узнаете, как манипулировать строковыми значениями для выполнения нечувстви­
тельных к регистру сравнений.

Другие способы сравнения строковых значений
Помимо выяснения, являются ли строковые значения равными или не равными друг другу,
можно также определить, является ли одно строковое значение больше или меньше другого
строкового значения. Это полезно, потому что программистам очень часто приходится про­
ектировать

программы,

которые сортируют строковые

значения

в каком-то определенном

порядке.

Из главы

1

известно, что в действительности в оперативной памяти хранятся не символы,

такие как А, В, С и т. д. Вместо этого там хранятся числовые коды, которые представляют
эти символы. В главе

1

упоминалось, что

ASCII -

это широко используемая схема кодиро­

вания символов (стандартный американский код обмена информацией). Вы найдете набор
кодов

ASCII

в прило.жении

3,

однако здесь приведено несколько фактов об этой схеме коди­

рования:

+ символы верхнего регистра A-Z представлены числами в интервале от 65 до 90;
+ символы нижнего регистра a-z представлены числами в интервале от 97 до 122;
+ когда цифры 0-9 хранятся в памяти как символы, они представлены числами в интервале
от

48

до

57

(например, строковое значение 'аЬс 123' будет храниться в оперативной памя­

ти в виде КОДОВ

97, 98, 99, 49, 50

и

51);

+ пробел представлен числом 32.
Наряду с введением набора числовых кодов, которые представляют символы в оперативной
памяти, схема кодирования

ASCII

также предусматривает упорядоченность сим~олов. Сим­

вол "А" идет перед символом "В", который идет перед символом "С" и т. д.

Когда программа сравнивает символы, она фактически сравнивает коды символов. Напри­
мер, взгляните на приведенную ниже инструкцию

if

'а'<

print

if:

'Ь':
('Буква

а

меньше

буквы Ь.

')

Этот фрагмент кода определяет, является ли код

для символа 'ь'. Выражение 'а'

ASCII

для символа 'а' меньше кода

ASCII

< 'ь' будет истинным, потому что код для символа 'а'

Глава 3. Структуры принятия решения и булева логика

139

меньше кода для символа 'ь'. И если бы этот фрагмент кода был частью рабочей програм­
мы, то он бы вывел сообщение 'Буква а меньше буквы Ь. '.
Давайте посмотрим, каким образом обычно происходит сравнение строковых значений,
состоящих из более одного символа. Предположим, что программа использует строковые

значения 'Магу' и 'Магk' следующим образом:

namel
name2
На рис.

'Магу'
'Магk'

3.8

показано, как отдельные символы в строковых значениях 'Магу' и 'Магk'

тически будут храниться в памяти на основе кодов

М

М

РИС.

3.8.

а

фак­

ASCII.
а

у

k

РИС.

Символьные коды для строковых значений

3.9.

Сравнение каждого символа в строке

'Магу' и 'Магk'

Когда для сравнения этих строковых значений применяются реляционные операторы, они

сравниваются посимвольно. Например, взгляните на приведенный ниже фрагмент кода:

namel = 'Магу'
name2 = 'Магk'
if namel > name2:
ргint('Строка

Магу

больше

Магу

не

строки Магk')

else:
ргint('Строка

Оператор

>

больше

строки Магk')

сравнивает каждый символ в строках 'ма ry' и 'маг k', начиная с первых, или

крайних левых, символов. Это показано на рис.

3.9.

Вот как происходит процесс сравнения:

1.

Символ 'м' в 'Магу' сравнивается с символом 'м' в 'Маг k'. Поскольку они одинаковые,
выполняется переход к сравнению следующих символов.

2.

Символ 'а' в 'Mary' сравнивается с символом 'а' в 'Магk'. Поскольку они одинаковые,
выполняется переход к сравнению следующих символов.

3.

Символ

' г'

в 'Магу' сравнивается с символом

' r'

в 'Маг k'. Поскольку они одинаковые,

выполняется переход к сравнению следующих символов.

4.

Символ 'у' в 'Магу' сравнивается с символом 'k' в 'Магk'. Поскольку они не одинако­
вые, два строковых значения не равны. Символ 'у' имеет более высокий код
чем символ

' k' ( 107),

ASCII ( 121 ),

поэтому определяется, что строка 'Магу' больше строки 'Маг k'.

Если одно из сравниваемых строковых значений короче другого, то сравниваются только

соответствующие символы. Если соответствующие символы идентичны, то более короткое
значение считается меньше более длинного значения. Так, при сравнении строковых зна­
чений 'High' и 'Hi' строка 'Hi' будет считаться меньше строки
короче.

'High', потому что она

Глава 3. Структуры принятия решения и булева логика

140

Программа

3.4

является простой демонстрацией того, как два строковых значения могут

сравниваться оператором

= 2.

Если это условие является ис­

тинным, то клиент получает одобрение на ссуду. Если это условие является ложным, то кли­

ент не проходит квалификацию. В программе

3.5

представлен соответствующий код.

Глава 3. Структуры принятия решения и булева логика

Истина

print('Bы ДОЛЖНЫ

зарабатывать не менее

$30 ООО в год, чтобы
получить одобрение.')

print('Bы ДОЛЖНЫ
отработать не менее

print('Bawa ссуда

2 лет, чтобы

одобрена.')

получить одобрение.')

РИС.

3.12.

Вложенная структура принятия решения

Программа

1 #
2 #

3.5

(loan_qualifier.py)

Эта программа определяет,

удовлетворяет ли

клиент требованиям банка на получение

ссуды.

3

4 MIN SALARY = 30000.0 #
5 MIN YEARS = 2
#
#

6

Минимально допустимая годовая зарплата.
Минимально допустимый стаж
на текущем месте работы.

7 # Получить размер годовой заработной платы
8 salary = float(input('Bвeдитe свой годовой

клиента.
оклад:

'))

9

10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25

#

Получить

количество лет на текущем месте работы.

years_on_job

int(input('Bвeдитe

количество лет'

'рабочего стажа:

# Определить, удовлетворяет ли клиент
if salary >= MIN_SALARY:
if years on_job >= MIN YEARS:
print ('Ваша ссуда одобрена.')
else:
print ('Вы должны отработать',
'не менее', MIN_YEARS,
'лет,

else:
print

чтобы получить

('Вы должны зарабатывать

+

'))

требованиям.

одобрение

не менее

.')

$',

forrnat(MIN_SALARY, ', .2f'),
' в год, чтобы получить одобрение.', sep=' ')

143

Глава 3. Структуры принятия решения и булева логика

144
Вывод

1 программы

(вводимые данные выделены жирным шрифтом)

Введите свой годовой оклад :

35000 1Enter 1

Введите количество лет рабочего стажа :

Вы дОJlЖНЫ отработать

Вывод

2

не менее

3

Ваша

одобрение .

25000 1Enter 1
стажа : 5 1Ente rl

не менее

$30 , 000 . 00

в

год ,

чт обы получить

одобрение .

программы {вводимые данные выделены жирным шрифтом)

Введите свой годовой оклад :
Введите

1 I Eпtei: I

чтобы получить

количество лет рабочего

Вы должны зарабаТЫБать

Вывод

лет ,

программы (вводимые данные выделены жирным шрифтом)

Введите свой годовой оклад:
Введите

2

35000 1Enter 1

количество лет рабочего стажа :

5 I Enter l

ссуда одобре н а .

Взгляните на инструкцию

if-else,

которая начинается в строке

Она проверяет условие

15.

salary >= MIN_ SALARY. Если это условие является истинным, то исполняется инструкция
if-else, которая начинается в строке 16. В противном случае программа переходит к выра­
жению else в строке 22 и исполняет инструкцию в строках 23-25.
При этом во вложенной структуре принятия решения очень важно использовать надлежа­

щий отступ, который не только требуется для интерпретатора

Python,

му читателю вашего программного кода видеть, какие действия

частью структуры. При написании вложенных инструкций

if

но и позволяет любо­
выполняются

каждой

соблюдайте приведенные ни­

же правила:

+ убедитесь, что каждое выражение else выровнено по соответствующему ему выражению
if (рис. 3.13);
if salary >= MIN_SALARY:
Эти if и else - ( if years_onjob >= MIN_YEARS:
сочетаются
Эти

print('Baшa ссуда одобрена.')

else:

if и else

print('Bы должны отработать',

сочетаются

'не менее',

MIN_YEARS,

'лет, чтобы получить одобрение.')

else:
print('Bы должны зарабатывать не менее$',

format(MIN_SALARY, '.2f),
'в год, чтобы получить одобрение.',

РИС.

3.13.

Выравнивание выражений

sep=")

if и else

+ убедитесь, что инструкции в каждом блоке выделены отступом единообразным образом.
Затененные части рис.

3.14

показывают вложенные блоки в структуре принятия решения.

Обратите внимание, что в каждом блоке все инструкции имеют одинаковый отступ.

Глава 3. Структуры принятия решения и булева логика

145

if salary >= MIN_SALARY :
if years_on_job >= MIN_YEARS :
print ( ' Ваша ссуда одобрена . ' )
else :
print ('Вы должны отработать ',
' не менее ' , MIN_ YEARS ,
' лет ,

чтобы получить

одобрение .')

else :
print( ' Bы должны зарабатывать

не менее$ ',

format(MIN_SALARY , ', . 2f ' ) ,
' в год , чтобы получить одобрение.
РИС.

3.14.

',

sep= ' ' )

Вложенные блоки

Проверка серии условий
В предыдущем примере вы увидели, каким образом в программе для проверки более одного
условия применяются вложенные структуры принятия решения. Нередки случаи, когда
в программе имеется серия условий, подлежащих проверке, и затем действие выполняется

в зависимости от того, какое из этих условий является истинным. Один из способов этого

добиться состоит в том, чтобы иметь структуру принятия решения, в которую вложено
несколько других структур принятия решения. Например, взгляните на программу, пред­
ставленную в следующей рубрике "В центре внимания".

Многочисленные вложенные структуры принятия решения
Доктор Суарес преподает уроки литературы и для всех своих контрольных работ использует
приведенную ниже пятиуровневую градацию оценок.

О~енка

90

Уровень

и выше

А

80-89

в

70-79

с

60-69

D

Ниже

60

F

Он попросил написать программу, которая позволит студенту вводить оценку и затем будет
показывать его уровень знаний. Вот алгоритм, который вы будете использовать:

1.

Попросить пользователя ввести оценку за контрольную работу.

2.

Определить уровень знаний следующим образом:
Если оценка

Иначе

больше или равна

если оценка

90,

то уровень

больше или равна

80,

знаний

то уровень

-

А.

знаний

-

В.

Глава 3. Структуры принятия решения и булева логика

146

Иначе если оценка

больше или равна

Иначе если оценка

70, то уровень знаний - С.
60, то уровень знаний - D.

больше или равна

Иначе уровень знаний

- F.

Вы решаете, что процесс определения уровня знаний потребует нескольких вложенных
структур принятия решения (рис.

3.15).

В программе

3.6

представлен соответствующий код.

Фрагмент кода с вложенными структурами принятия решения находится в строках

print('Baw
- А')

уровень

print('Baw
уровень -

С')

print('Baw
D')

уровень -

РИС.

3.15. Вложенная структура принятия решения для определения уровня знаний

Программа

1 #
2 #

3.6

(grader.py)

Эта программа получает от пользователя числовую оценку

и показывает буквенный уровень знаний согласно этой оценке.

3

4 # Именованные
5 А SCORE
90
80
6 В SCORE
70
7 С SCORE
8 D SCORE
60
9

константы,

представляющие пороги уровней.

14-26.

Глава 3. Структуры принятия решения и булева логика

10 # Получить от пользователя
11 score = int(input('Bвeдитe

147

оценку за контрольную работу.
свою оценку:

'))

12

13 # Определить буквенный уровень.
14 if score >= А SCORE:
15
print ('Ваш уровень - А.')
16 else:
17
if score >=В SCORE:
18
print ('Ваш уровень - В.')
19
else:
20
if score >= С SCORE:
21
print ('Ваш уровень - С.')
22
else:
23
if score >= D SCORE:
24
print ('Ваш уровень - О.')
25
else:
26
print ('Ваш уровень - F. ')
Вывод

1

программы {вводимые данные выделены жирным шрифтом)

Введите свою оценку :
Ваш

Вывод

2

Введите
Ваш

-

уровень

78

1

Enter J

С .

программы (вводимые данные выделены жирным шрифтом)
свою оценку :

-

уровень

84 [ Enter [

В.

Инструкция

if-elif-else

Хотя приведенный в программе

3.6

пример является простым, логика вложенной структуры

принятия решения довольно сложная.

Python

предоставляет специальный вариант структуры

принятия решения, именуемый инструкцией

if-elif-else,

которая упрощает написание

логической конструкции такого типа. Вот общий формат инструкции

if

условие_ 1:
инструкция
инструкция

elif

условие_2:
инструкция

инструкция

Вставить столько выражений

else:
инструкция
инструкция

elif,

сколько нужно:

if-elif-else:

148

Глава 3. Структуры принятия решения и булева логика
При исполнении этой инструкции проверяется условие_ 1. Если оно является истинным, то
исполняется блок инструкций, который следует сразу после него, вплоть до выражения elif.
Остальная часть структуры игнорируется. Однако если условие_ 1 является ложным, то про­
грамма перескакивает непосредственно к следующему выражению

elif

и проверяет усло­

вие_ 2. Если оно истинное, то исполняется блок инструкций, который следует сразу после
него, вплоть до следующего выражения elif. И остальная часть структуры тогда игнориру­

ется. Этот процесс продолжается до тех пор, пока не будет найдено условие, которое являет­
ся истинным, либо пока больше не останется выражений elif. Если ни одно условие не

является истинным, то исполняется блок инструкций после выражения else.
Приведенный ниже фрагмент является примером инструкции if-elif-else. Этот фрагмент

кода работает так же, как вложенная структура принятия решения в строках
мы

14-26

програм­

3.6.

if score >=
print

А

-

А.')

-

В . ')

-

С .')

('Ваш уровень

-

О.

('Ваш уро вень

- F. ')

('Ваш уровень

elif score >=
print

В

С

SCORE:

('Ваш уро вень

elif score >=
print

SCORE:

('Ваш уро вень

e lif score >=
print

SCORE:

О

SCORE:
')

else:
pri nt

Обратите внимание на выравнивание и выделение отступом, которые применены в инструк­
ции if-elif-else: выражения if, elif и else выровнены , и исполняемые по условию блоки
выделены отступом.

Инструкция if-elif-else не является обязательной, потому что ее логика может быть за­
программирована вложенными инструкциями if-el se. Однако длинная серия вложенных
инструкций

i f- e l se имеет два характерных недостатка при выполнении отладки программ­

ного кода.

+ Программный код может стать сложным и трудным для восприятия .
+ Из-за необходимого выделения отступом продолжительная серия вложенных инструкций
if-else может стать слишком длинной , чтобы целиком уместиться на экране монитора
без горизонтальной прокрутки. Длинные инструкции имеют тенденцию "переходить" на

новую строку при распечатке на бумаге, что еще больше затрудняет чтение программно­
го кода.

Логика инструкции if-elif-else обычно прослеживается легче, чем длинная серия вложен­
ных инструкций if-else. И поскольку в инструкции if-elif-else все выражения выровне­
ны, длина строк в данной инструкции, как правило, короче.

Контрольная точка

3.13.

Преобразуйте приведенный ниже фрагмент кода в инструкцию if-elif-el s e :

if

numЬer

== 1:

pr in t (' Oдин')

Глава 3. Структуры принятия решения и булева логика

149

else:
if

numЬer ==

print

2:

('Два')

else:
if

numЬer ==

print

3:

('Три')

else:
print

('Неизвестное'

)

~

Л

3.5

гические оnеDаторы

111111111(___ КЛЮЧЕВЫЕ ПОЛОЖЕНИЯ
Логический оператор

and и логический оператор or позволяют соединять многочислен­

ные булевы выражения для создания составного выражения. Логический оператор not
изменяет значение булева выражения на противоположное.

Python

предоставляет ряд операторов, именуемых логическими операторами, которые мож­

но использовать для создания составных булевых выражений. В табл.

3.3

перечислены эти

операторы.

Таблица

3.3.

Логические операторы

Оператор

Значение

and

Оператор соединяет два булева выражения в одно составное выражение. Для того чтобы
составное выражение было истинным, оба подвыражения должны быть истинными

f--

or

Оператор соединяет два булева выражения в одно составное выражение. Для того чтобы
составное выражение было истинным, одно либо оба подвыражения должны быть истинными.
Достаточно, чтобы только одно из подвыражений было истинным, и не имеет значения какое
из них

not

Оператор является унарным оператором, т. е. он работает только с одним операндом. Операнд
должен быть булевым выражением. Оператор

not

инвертирует истинность своего операнда.

Если он применен к выражению, которое является истинным, то этот оператор возвращает
ложь. Если он применен к выражению, которое является ложным, то этот оператор
возвращает истину

В табл.

3.4

представлены примеры нескольких составных булевых выражений, в которых

использованы логические операторы.

Таблица

3.4.

Составные булевы выражения с использованием логических операторов

Выражение
х

>

х

==

not

у
у



Значение

and

а

<

or

х

==

>

у)

ь

х больше у И а меньше Ь?

z

х равно у ИЛИ х равно
Выражение х

>

z?

у НЕ истинное?

Глава 3. Структуры принятия решения и булева логика

150

Оператор
Оператор

and

and принимает два булевых выражения в качестве операндов и создает составное

булево выражение, которое является истинным, только когда оба подвыражения являются
истинными. Приведенный ниже фрагмент кода является примером инструкции if, в которой

and:

применен оператор

if temperature <

О

and minutes > 100:

print('Teмnepaтypa находится в опасной зоне.')

< О и minutes > 100 объединены
print будет вызвана, только если temperature меньше О

В этой инструкции два булева выражения temperature
в составное выражение. Функция
и

minutes больше 100. Если любое булево подвыражение является ложным, то составное

выражение является ложным, и сообщение не выводится.

В табл.

3.5

представлена таблица истинности для оператора and. В ней перечислены выра­

жения, соединенные оператором

and,

показаны все возможные комбинации истинности

и ложности и приведены результирующие значения выражений.
Таблица

3.5. Таблица истинности для оператора and
Значение выражения

Выражение
Истина

and ложь

Ложь

истина

Ложь

Ложь

and

Ложь

and ложь

Истина

Ложь

and истина

Истина

Как показывает таблица, для того чтобы оператор вернул истинное значение, должны быть
истинными оба выражения в операторе

Оператор
Оператор

or

and.

or

принимает два булевых выражения в качестве операндов и создает составное

булево выражение, которое является истинным, когда любое из подвыражений является ис­
тинным. Приведенный ниже фрагмент кода является примером инструкции
применен оператор

if temperature <

if, в которой

or:
О

and temperature > 40:

print('Teмпepaтypa экстремальная.')

Функция

40.

print будет вызвана, только если temperature меньше О или temperature больше

Если любое булево подвыражение является истинным, то составное выражение является

истинным. В табл.

3.6

приведена таблица истинности для оператора

Для того чтобы выражение
ратора

or

операнд.

or

or.

было истинным, требуется, чтобы хотя бы один операнд опе­

был истинным. При этом не имеет значения, истинным или ложным будет второй

Глава 3. Структуры принятия решения и булева логика
Таблица

3.6. Таблица

истинности для оператора

or
Значение выражения

Выражение
Истина

or ложь

Ложь

or

Ложь

or ложь

Истина

Истина

Истина

истина

or

151

Ложь

истина

Истина

Вычисление по укороченной схеме
Оба оператора,
тором

and.

and

и

or,

вычисляются по укороченной схеме. Вот как это работает с опера­

Если выражение слева от оператора

and ложное,

то выражение справа от него не

проверяется. Поскольку составное выражение является ложным, если является ложным все­

го одно подвыражение, то проверка оставшегося выражения будет пустой тратой процес­
сорного времени. Поэтому, когда оператор

and

обнаруживает, что выражение слева от него

является ложным, он следует по укороченной схеме и выражение справа от него не вычис­
ляет.

Вот как работает вычисление по укороченной схеме с оператором
от оператора

or

or.

Если выражение слева

является истинным, то выражение справа от него не проверяется. Поскольку

требуется, чтобы всего одно выражение было истинным, проверка оставшегося выражения
будет пустой тратой процессорного времени.

Оператор
Оператор

not

not -

это унарный оператор, который в качестве своего операнда принимает

булево выражение и инвертирует его логическое значение. Другими словами, если выраже­

not

ние является истинным, то оператор

ным, то оператор

not

возвращает ложь, и если выражение является лож­

возвращает истину. Приведенный ниже фрагмент кода представляет

собой инструкцию if, в которой применен оператор

if not(temperature > 5):
print ('Это ниже максимальной
Сначала проверяется выражение

температуры.

not:

')

(temperature > 5),

в результате чего получается значение

истина либо ложь. Затем к этому значению применяется оператор

(temperature > 5)
(temperature > 5)

является истинным, то оператор
является ложным, то оператор

not
not

not.

Если выражение

возвращает ложь. Если выражение
возвращает истину. Приведенный

выше программный код эквивалентен вопросу: "Действительно температура не больше

5?"

ПРИМЕЧАНИЕ
В этом примере мы поместили круглые скобки вокруг выражения

бы было четко видно, что мы применяем оператор
а не только к переменной

В табл.

3.7

not

temperature > 5 для того, что­
temperature > 5,

к значению выражения

temperature.

приведена таблица истинности для оператора

not.

Глава 3. Структуры принятия решения и булева логика

152
Таблица

3.7. Таблица истинности для оператора not

Выражение

Значение выражения

not

Ложь

истина

Истина

not ложь

Пересмотренная программа одобрения на получение ссуды
В некоторых ситуациях оператор

может применяться для упрощения вложенных струк­

and

тур принятия решения. Например, вспомните, что программа
ссуды применяет приведенные ниже вложенные инструкции

3.5

одобрения на получение

if-else:

if salary >= MIN_SALARY:
if years_on_job >= MIN YEARS:
print ('Ваша ссуда одобрена. ')
else:
print ('Вы должны отработать',
'не менее', MIN_YEARS,
'лет,

else:
print

чтобы получить

('Вы должны зарабатывать

одобрение.')

не менее

$',

format(MIN_SALARY, ', .2f'),
' в год, чтобы получить одобрение. ' , sep=' ' )
Задача этой структуры принятия решения заключается в том, чтобы определить, составляет
ли годовой оклад человека не менее

30

ООО долларов и отработал ли он на своем текущем

месте работы не менее двух лет. В программе

3.7

представлен способ выполнения подобной

задачи при помощи более простого кода.

Программа

l #
2 #

3.7

(loan_qualifier2.py)

Эта программа

определяет,

удовлетворяет ли

клиент требованиям банка на получение ссуды.

3

4 MIN SALARY = 30000.0 # Минимально допустимая
5 MIN YEARS = 2
# Минимально допустимый стаж

годовая

зарплата.

на текушем месте работы.

6

7 # Получить размер годовой заработной платы
8 salary = float(input('Bвeдитe свой годовой

клиента.
оклад:

'))

9

10
11
12
13
14
15
16

# Получить количество лет на текушем месте работы.
years_on job
int(input('Bвeдитe количество лет' +
'рабочего стажа:
'))
#

Определить,

удовлетворяет ли клиент

требованиям.

if salary >= MIN_SALARY and years_on_job >= MIN YEARS:
print ('Ваша ссуда одобрена.')

Глава 3. Структуры принятия решения и булева логика

153

17 else:
print

18
Вывод

1

('Ваша

ссуда

не

Ваша

2

не

Введите

Ваша

стажа :

5 IEnter l

не одобрена .

программы (вводимые данные выделены жирным шрифтом)

Введите свой годовой оклад :
Введите

25000 1Enter 1

количество лет рабочего

3

l IEnter l

программы (вводимые данные выделены жирным шрифтом)

ссуда

Вывод

стажа :

одобрена .

Введите свой годовой оклад :

Ваша

35000 1Enter 1

количество лет рабочего

ссуда

Вывод

')

программы (вводимые данные выделены жирным шрифтом)

Введите свой годовой оклад :
Введите

одобрена.

35000 1Enter1

количество лет рабочего стажа :

5 IEnter l

ссуда одобрена .

Инструкция if-else в строках

15-18

проверяет составное выражение salary

>= MIN_SALARY

and years _ on_j оЬ >= MIN_ YEARS. Если оба подвыражения являются истинными, то состав­
ное выражение будет истинным, и выводится сообщение "Ваша ссуда одобрена". Если

любое из подвыражений является ложным, то составное выражение будет ложным, и выво­
дится сообщение "Ваша ссуда не одобрена".

()

ПРИМЕЧАНИЕ
Наблюдательный читатель поймет, что программа

3.7

аналогична программе

лентна ей. Если пользователь не проходит проверку, то программа
щение "Ваша ссуда не одобрена", тогда как программа

3.5

3.7

3.5,

но не эквива­

выводит лишь одно сооб­

выводит два возможных сообщения

с объяснением, почему пользователю отказано в ссуде.

Еще одна программа об одобрении ссуды
Предположим, что банк теряет клиентов в пользу конкурирующего банка, который не на­
столько строг в отношении того, кому он выдает деньги в ссуду. В ответ наш банк решает
изменить свои требования к получению ссуды. Теперь клиентов следует проверять всего по

одному предыдущему условию, а не обоим. В программе

3.8

показан новый код для одобре­

ния ссуды. В составном выражении, которое проверяется инструкцией if-else в строке
теперь применен оператор

~амма 3.8
1

or.

] (loaп_qualifierЗ.py)

~ ~ Эта программа определяет, удовлетворяет ли
2 # клиент требованиям банка на получение ссуды.
3

4 MIN SALARY = 30000.0 # Минимально допустимая годовая зарплата
5 MIN YEARS = 2
# Минимально допустимый стаж на текушем месте
6

работы.

15,

Глава 3. Структуры принятия решения и булева логика

154
7 #
в

Получить размер годовой заработной платы

salary =

float(input('Bвeдитe

свой годовой

клиента.
оклад:

'))

9

10 # Получить количество лет на текущем месте работы.
11 years_on_job = int(input('Bвeдитe количество лет' +
12
'рабочего стажа: '))
13
14 # Определить, удовлетворяет ли клиент требованиям.
15 if salary >= MIN_SALARY or years_on_job >= MIN- YEARS:
16
print ('Ваша ссуда одобрена. ' )
17 else:
18
print ('Ваша ссуда не одобрена. ' )
Вывод

1

программы (вводимые данные выделены жирным шрифтом)

Введите свой годовой оклад :
Введите
Ваша

ссуда

Вывод

одобрена .

2 программы (вводимые данные выделены жирным шрифтом)

Введите свой годовой оклад :
Введите
Ваша

25000 1Enter1
5 IEnterl

количество лет рабочего стажа :

ссуда

Вывод

35000 1Enter 1
1 1Enter1

количество лет рабочего стажа :

3

одобрена .

программы (вводимые данные выделены жирным шрифтом)

Введите

свой годовой оклад :

Введите

количество лет рабочего стажа :

Ваша

ссуда

12000 1Enter1
1 1Eлter1

одобрена .

Проверка числовых диапазонов
при помощи логических операторов

Нередко требуется разработать алгоритм, который определяет, лежит ли числовое значение
в заданном диапазоне значений либо за его пределами. При определении, находится ли чис­
ло внутри диапазона, лучше всего применять оператор

инструкция
ОТ

if

and.

Например, приведенная ниже

if проверяет значение х, чтобы определить, находится ли оно в диапазоне

20 ДО 40:
>= 20 and х 40:

рrint('Значение лежит за пределами допустимого диапазона.')

or.

Приве­

20 до 40:

Глава 3. Структуры принятия решения и булева логика

155

Во время проверки диапазона чисел очень важно не перепутать логику логических операто­

ров. Например, составное булево выражение в приведенном ниже фрагменте кода никогда
не будет давать истинное значение:

# Ошибка!
if х < 20 and

> 40:

х

рrint('Значение лежит за пределами допустимого диапазона.')

Совершенно очевидно, что х не может одновременно быть меньше

~

20

и больше

40.

Контрольная точка
3.14. Что такое
3.15.

составное булево выражение?

Приведенная ниже таблица истинности показывает разные комбинации истинности и
ложности значений, соединенных логическим оператором. Заполните таблицу, обведя
"И" или "Л", чтобы показать, является ли результатом такой комбинации истина или
ложь.

Результат (обвести И или Л)

Логическое выражение

Истина

and ложь

Истина

arid

истина

и

л

и

л

Ложь

and истина

и

л

Ложь

and ложь

и

л

и

л

и

л

Истина

or ложь

Истина

or

истина

~

Ложь

or истина

и

л

Ложь

or ложь

и

л

not

истина

и

л

not

ложь

и

л

3.16. Допустим,

что даны переменные а = 2, ь = 4 и с = 6. Обведите "И" и "Л" для каждого

приведенного ниже условия, чтобы показать, является ли значение истинным или ложным.

а

-- 4 or

и

л

6 3

и

л

1 !=

ь

and

с

!= 3

и

л

>= -1 or

а

ь

и

л

и

л

а

not

3.17.

> 2

Ь



> 2)

= 50000.0:
sales_quota_met

True

else:
sales_quota_met

=

False

В результате исполнения этого фрагмента кода переменная sales _ quota _ met (квота продаж
выполнена) может использоваться в качестве флага, чтобы показывать, была ли достигнута
квота продаж. Позже в программе мы могли бы проверить этот флаг следующим образом:

if sales_quota_met:
print ('Вы вьmолнили

свою

квоту продаж!

')

Этот фрагмент кода показывает сообщение 'вы выполнили свою квоту продаж! ', в случае
если булева переменная sales _ quota _ met равняется True. Обратите внимание, что нам не
требуется применять оператор

==,

чтобы явным образом выполнить сравнение переменной

sales _ quota _ met со значением True. Этот программный код эквивалентен следующему:
if sales_quota_met == True:
print ('Вы вьmолнили свою

квоту продаж!')

Глава 3. Структуры принятия решения и булева логика

157

Контрольная точка

3.20.

Какие значения можно присваивать переменной с типом

3.21.

Что такое флаговая переменная?

bool?

11111111111

пашья г асЬика. определение состо ния черепахи

3.7

111111111(__ КЛЮЧЕВЫЕ ПОЛОЖЕНИЯ
Библиотека черепашьей графики предоставляет многочисленные функции, которые мож­
но использовать в структурах принятия решения для определения состояния черепахи и

выполнения действия по условию.

Функции библиотеки черепашьей графики можно применять для получения разнообразных
сведений о текущем состоянии черепахи. В этом разделе мы рассмотрим функции, которые
определяют

позицию

черепахи,

угловое

направление

черепахи,

положение

пера

над

хол­

стом, текущий цвет рисунка и т. д.

Определение позиции черепахи
Из главы

2 известно,

что функции

turtle. xcor ()

и

turtle. ycor ()

применяются для получе­

ния текущих координат Х и У черепахи. Приведенный ниже фрагмент кода использует инст­
рукцию

if для определения, является ли координата Х больше 249
349. Если это так, то черепаха перемещается в позицию (О, О):
if turtle.xcor() > 249 or turtle.ycor() > 349:
turtle.goto(O, 0)

или координата У больше

Определение углового направления черепахи
Функция

turtle. heading ()

возвращает угловое

направление

черепахи.

По

умолчанию

направление возвращается в градусах. Приведенный ниже интерактивный сеанс это демон­
стрирует:

>>> turtle.heading()
о.о

>>>
Приведенный далее фрагмент кода использует инструкцию i f для определения, направлена
ли черепаха под углом между

устанавливается в

90

и

270

градусами. Если это так, то направление черепахи

180°:

if turtle.heading() >= 90 and turtle.heading() >> turtle.isdown()

True
>>>

False

в про­

158

Глава 3. Структуры принятия решения и булева логика
Приведенный ниже фрагмент кода использует инструкцию i f для определения, опущено ли
перо черепахи. Если перо опущено, то этот фрагмент кода его поднимает:

if turtle.isdown():
turtle. penup ()
Для того чтобы определить, поднято ли перо, применяется оператор

not вместе с функцией

turtle. isdown (). Приведенный ниже фрагмент кода это демонстрирует:
if not(turtle.isdown()):
turtle.pendown()

Определение видимости черепахи
Функция

turtle. isvisiЫe () возвращает True, если черепаха видима, либо False в против­

ном случае. Приведенный ниже интерактивный сеанс это демонстрирует:
turtle.isvisiЬle()

>>>

True
>>>
Приведенный ниже фрагмент кода использует инструкцию i f для определения, видима ли
черепаха. Если черепаха видима, то этот фрагмент кода ее прячет:

if

turtle.isvisiЬle():

turtle.hideturtle()

Определение текущего цвета
При выполнении функции

turtle. pencolor () без передачи ей аргумента она возвращает

текущий цвет пера в качестве строкового значения. Приведенный ниже интерактивный
сеанс это демонстрирует:

>>> turtle.pencolor()
'Ьlack'

>>>
Приведенный ниже фрагмент кода использует инструкцию i f для определения, является ли

текущий цвет пера красным. Если цвет красный, то этот фрагмент кода его меняет на синий:

if turtle.pencolor() == 'red':
turtle .pencolor ( 'Ыuе')
При выполнении функции

turtle. fillcolor () без передачи ей аргумента она возвращает

текущий цвет заливки в качестве строкового значения. Приведенный ниже интерактивный
сеанс это демонстрирует:

>>> turtle.fillcolor()
'Ьlack'

>>>
Приведенный ниже фрагмент кода использует инструкцию

if для определения, является ли

текущий цвет заливки синим. Если цвет заливки синий, то этот фрагмент кода его меняет
на белый:

Глава 3. Структуры принятия решения и булева логика

159

if turtle.fillcolor() == 'Ыuе':
turtle. fillcolor ( 'white')
При выполнении функции

turtle. bgcolor () без передачи ей аргумента она возвращает

текущий фоновый цвет графического окна черепахи в качестве строкового значения. Приве­
денный ниже интерактивный сеанс это демонстрирует:

>>> turtle.bgcolor()

'white'
>>>
Приведенный ниже фрагмент кода использует инструкцию i f для определения, является ли

текущий цвет фона белым. Если цвет фона белый, то этот фрагмент кода меняет его на
серый:

f turtle.bgcolor() == 'white':
turtle. fillcolor ( 'gray')

Определение размера пера
При выполнении функции turtle. pensize ()

без передачи ей аргумента она возвращает

текущий размер пера. Приведенный ниже интерактивный сеанс это демонстрирует:

>>> turtle.pensize()
1

>>>
Приведенный ниже фрагмент кода использует инструкцию i f для определения, является ли

текущий размер пера меньше
его на

3.

Если размер пера меньше

3,

то этот фрагмент кода меняет

3:

if turtle.pensize() < 3:
turtle.pensize(З)

Определение скорости анимации черепахи
При выполнении функции

turtle. speed () без передачи ей аргумента она возвращает ско­

рость текущей анимации черепахи. Приведенный ниже интерактивный сеанс это демонстри­
рует:

>>> turtle.speed()

3
>>>
Из главы

2

известно, что скорость анимации черепахи представляет собой значение в диапа­

зоне от О до

10.

Если скорость равна О, то анимация отключена, и черепаха выполняет все

свои перемещения мгновенно. Если скорость находится в диапазоне от

ставляет самую медленную скорость, а

1О -

1 до 1О,

то

1

пред­

самую быструю скорость.

Приведенный ниже фрагмент кода определяет, является ли скорость черепахи больше О.

Если это так, то ее скорость устанавливается в О:

if turtle.speed() >
turtle.speed(O)

О:

Глава 3. Структуры принятия решения и булева логика

160

Приведенный ниже фрагмент кода показывает еще один пример. В нем применена инструк­
.ция

if-elif-else

для определения скорости черепахи и затем задания цвета пера. Если ско­

рость равна О, то цвет пера устанавливается в красный. В противном случае, если скорость
больше

5,

цвет пера устанавливается в синий. Иначе цвет пера устанавливается в зеленый:

if turtle.speed() == О:
turtle. pencolor ( 'red')
elif turtle.speed() > 5:
turtle .pencolor ( 'Ыuе')
else:
turtle.pencolor('green')

ТРЕ

iИЯ

Игра "Порази цель"
В этом разделе мы обратимся к программе

Python,

в которой черепашья графика использу­

ется, чтобы можно было сыграть в простую игру. Когда программа запускается, она выводит
графический экран (рис.

3.16).

Небольшой квадрат, который нарисован в правой верхней

области окна, является целью. Нужно запустить черепаху как снаряд, чтобы она попала по

о

о

РИС.

3.16.

Игра "Порази цель"

х

Глава 3. Структуры принятия решения и булева логика

161

намеченной цели. Это делается путем ввода в окне оболочки угла и величины силы. Затем
программа устанавливает угловое направление черепахи в заданный угол и применяет

заданную величину силы в простой формуле расчета расстояния, на которое черепаха пере­
местится. Чем больше величина силы, тем дальше черепахапереместится. Если черепаха
останавливается в квадрате, значит она попала в цель.

Например, на рис.
и



3.17

показан сеанс с программой, в которой мы ввели

45

в качестве угла

качестве величины силы. Видно, что снаряд (черепаха) прошел мимо цели. На рис.

мы запустили программу снова и ввели

67

в качестве угла и

9.8

Эти значения заставили снаряд достигнуть намеченной цели. В программе

3.9

представлен

соответствующий код.

о

Fil•

Edit

Sh.tl

D•bug

Option•

1ndow

х

Help

3 . 6._ (v3 . 6 . _:6~c iJ dt;S, HC!..r :: :C•l7,
_ 3 , 4 _ :36 ) ·мsс .". 9Jo:· 64 Ьн: (АИDбq )
о" "

Py~ho:-1

D

""3:
Iype "copyr.tQh:.",
.fo:r

~.::е>

"l.lC~:"l~~

()"

..:..r:.f orrr.~т:.i. o:'!I .

RESTART :
~~Q Ои ~

c:::ed..:.t:."• 1 o.r

11

C : \Us~rs \l ab o= \p y_prO)~Cr.s \ Sr.art

wi~h

P~hc~

4ed\:vI4~4

3~~.:~;и~~

yrc.n:

C~4PR~4 :

9~е:~...,е

~:;·c!t.:o~;,""IO с,.-_-;:"

З\h~~

~he

~~

r .;er. . py



45
З

(--- ·J) :

:-:i:;. oмi!. X~ Y-"IИC~ .

,., ' 1

Ln: 8 Col: 4
РИС.

3.17.

Непопадание по цели

L..-

/
ёd'1

l!ytn.;n

-11
~ .

l~ : н : зо)

t. . _

1r,1:1cn.

i.:D
rv~ . ь .

iмsc

-i1n ...

: ~:.c u =~ .

v._" ,) ,

:

С:\

s~rs \

аЬ r\py_pr oj ect~ \3 car"

1n9 OUc

wi~h

Fych o~

З~е~7е

уrол

сма~яда :

9~е.:= TARGET LLEFT Х and
turtle.xcor() = TARGET LLEFT У and
turtle.ycor() ,< и== являются
а)

реляционными;

б)

логическими;

в)

условными;

г)

трехкомпонентными.

операторами.

Какая структура проверяет условие и затем принимается один путь, если условие истин­

ное, либо другой путь, если условие ложное?

6.

а)

инструкция

б)

структура принятия решения с единственным вариантом;

в)

структура принятия решения с двумя альтернативными вариантами;

г)

последовательная.

if;

Инструкция

используется

для

написания

структуры

принятия

решения

для

написания

структуры

принятия

решения

с единственным вариантом.

7.

а)

перехода по условию;

б)

if;

в)

if-else;

г)

вызова по условию.

Инструкция

используется

с двумя альтернативными вариантами.

8.

9.

а)

перехода по условию;

б)

if;

в)

if-else;

г)

вызова по условию.

and, or

И

not -

это

а)

реляционные;

б)

логические;

в)

условные;

г)

трехкомпонентные.

операторы.

Составное булево выражение, созданное при помощи оператора

_____ ,

истинным, только если оба его подвыражения являются истинными.
а)

and;

б)

or;

в)

not;

г)

both.

является

Глава 3. Структуры принятия решения и булева логика

1О.

Составное булево выражение, созданное при помощи оператора

_____,

167
является

истинным, если одно из его подвыражений является истинным.

11.

а)

and;

б)

or;

в)

not;

г)

either.

Оператор

______

принимает булево выражение в качестве своего операнда и ин­

вертирует его логическое значение.

а)

and;

б)

or;

в)

not;

г)

either.

12. ______ -это

булева переменная, которая сигнализирует, когда в программе воз­

никает некое условие.

а)

флаг;

б)

сигнал;

в)

метка;

г)

гудок.

Истина или ложь

1.

Любая программа может быть написана лишь при помощи последовательных структур.

2.

Программа может быть составлена только из одного типа управляющих структур. Объ­
единять структуры нельзя.

3.

Структура принятия решения с единственным вариантом проверяет условие и затем при­

нимает один путь, если это условие является истинным, либо другой путь, если это усло­
вие является ложным.

4.

Структура принятия решения может быть вложена внутрь другой структуры принятия
решения.

5.

Составное булево выражение, созданное при помощи оператора

and, является истинным,

только когда оба его подвыражения являются истинными.

Короткий ответ

1.

Объясните, что имеется в виду под термином "исполнимый по условию".

2.

Вам нужно проверить условие. Если оно является истинным, то исполнить один набор
инструкций. Если же оно является ложным, то исполнить другой набор инструкций.
Какую структуру вы будете использовать?

3.

Кратко опишите, как работает оператор

and.

4.

Кратко опишите, как работает оператор

or.

168

Глава 3. Структуры принятия решения и булева логика

5.

Какой логический оператор лучше всего использовать при определении, находится ли
число внутри диапазона?

6.

Что такое флаг и как он работает?

Алгоритмический тренажер

1.

Напишите инструкцию if, которая присваивает значение
переменной

2.

z,

если переменная х больше

40

100.
1

1О.

Напишите инструкцию if-else, которая присваивает значение О переменной ь, если
переменная а меньше
ние

4.

переменной у и значение

Напишите инструкцию if, которая присваивает значение О переменной ь и значение
переменной с, если переменная а меньше

3.

20

1О.

В противном случае она должна присвоить переменной ь значе­

99.

Приведенный ниже фрагмент кода содержит несколько вложенных инструкций if-else.
К сожалению, они были написаны без надлежащего выравнивания и выделения отступом.
Перепишите этот фрагмент и примените соответствующие правила выравнивания и вы­
деления отступом.

if score >= А score:
print ('Ваш уровень - А.')
else:
if score >= В score:
print ('Ваш уровень - В. ')
else:
if score >= С score:
print ('Ваш уровень - С. ' )
else:
if score >= D score:
print('Baш уровень - D.')
else:
print ('Ваш уровень - F. ')

5.

Напишите вложенные структуры принятия решения, которые выполняют следующее:

если amountl больше
ременных

6.

amountl

и

10

и amount2 меньше

100,

то показать большее значение из двух пе­

amount2.

Напишите инструкцию if-else, которая выводит сообщение
если переменная speed находится в диапазоне от

speed лежит

7.

24

до

вне этого диапазона, то показать 'Скорость

56.

'Скорость

нормальная',

Если значение переменной

аварийная'.

Напишите инструкцию if-else, которая определяет, находится ли переменная points вне
диапазона от

9 до 51.

Если значение переменной лежит вне этого диапазона, то она долж­

на вывести сообщение

' Недопустимые

точки' . В противном случае она должна показать

сообщение 'Допустимые точки' .

8.

Напишите инструкцию if, которая применяет библиотеку черепашьей графики, чтобы
определить, находится ли угловое направление черепахи в диапазоне от О до
чая О и

9.

45).

45°

(вклю­

Если это так, то поднимите перо черепахи.

Напишите инструкцию if, которая применяет библиотеку черепашьей графики, чтобы
определить, является ли цвет пера черепахи красным или синим. Если это так, то устано­
вите размер пера

5 пикселов.

Глава 3. Структуры принятия решения и булева логика

169

Напишите инструкцию if, которая применяет библиотеку черепашьей графики, чтобы

10.

определить, находится ли черепаха в прямоугольнике. Левый верхний угол прямоуголь­
ника находится в позиции

( l 00, l 00),

а его правый нижний угол

-

в позиции

(200, 200).

Если черепаха в прямоугольнике, то спрячьте черепаху.

Зад

ПDОГ

l.

а

и

ованию

День недели. Напишите программу, которая запрашивает у пользователя число в диапа­
зоне от

l7-

1

до

7.

Эта программа должна показать соответствующий день недели, где

понедельник,

вторник,

2-

3-

среда,

четверг,

4-

вводит номер, который находится вне диапазона от

2.

5-

пятница,

6-

суббота и

воскресенье. Программа должна вывести сообщение об ошибке, если пользователь

1 до 7.

Площади прямоугольников. Площадь прямоугольника- это произведение его длины
на его ширину. Напишите программу, которая запрашивает длину и ширину двух прямо­

угольников. Программа должна выводить пользователю сообщение о том, площадь како­
го прямоугольника больше, либо сообщать, что они одинаковы.

3.

Классификатор возраста. Напишите программу, которая просит пользователя ввести
возраст человека. Программа должна определить, к какой категории этот человек при­

надлежит: младенец, ребенок, подросток или взрослый, и вывести соответствующее со­
общение. Ниже приведены возрастные рекомендации:

4.



если возраст

1 год или



если возраст старше



если возраст не менее



если возраст более

меньше, то он или она
года, но моложе

l

13

13

лет, но моложе

20 лет, то

-

младенец;

лет, то он или она- ребенок;

20 лет, то

он или она

-

подросток;

он или она- взрослый.

Римские цифры. Напишите программу, которая предлагает пользователю ввести число

в диапазоне от

1

до

Программа должна показать для этого числа римскую цифру.

10.

Если число находится вне диапазона
ошибке. В табл.
Таблица

3.8

3.8.

1--1 О,

то программа должна вывести сообщение об

приведены римские цифры для чисел от 1до10.
Римские цифры
Число

Римская цифра

1

1

2

11

3

ш

4

IV

5

v

6

VI

7

VII

8

VIII

9

IX

10

х

170

Глава 3. Структуры принятия решения и булева логика

5.

Масса и вес. Ученые измеряют массу физического тела в килограммах и вес в ньютонах.
Если известна величина массы тела в килограммах, то при помощи приведенной ниже

формулы можно рассчитать вес в ньютонах:
вес= массах

9,8.

Напишите программу, которая просит пользователя ввести массу тела и затем вычисляет
его вес. Если вес тела больше

500

Н (ньютонов), то вывести сообщение, говорящее о том,

что тело слишком тяжелое. Если вес тела меньше

100

Н, то показать сообщение, что оно

слишком легкое.

6.

Волшебные даты. Дата



июня

1960

года является особенной, потому что если ее запи­

сать в приведенном ниже формате, то произведение дня и месяца равняется году:

10.06.60
Разработайте программу, которая просит пользователя ввести месяц (в числовой форме),
день и двузначный год. Затем программа должна определить, равняется ли произведение
дня и месяца году. Если это так, то она должна вывести сообщение, говорящее, что вве­

денная дата является волшебной. В противном случае она должна вывести сообщение,
что дата не является волшебной.

7.

Цветовой ми кш ер. Красный, синий и желтый называются основными цветами, потому
что их нельзя получить путем смешения других цветов. При смешивании двух основных
цветов получается вторичный цвет:



если смешать красный и синий, то получится фиолетовый;



если смешать красный и желтый, то получится оранжевый;



если смешать синий и желтый, то получится зеленый.

Разработайте программу, которая предлагает пользователю ввести названия двух основ­
ных цветов для смешивания. Если пользователь вводит что-нибудь помимо названий

"красный", "синий" или "желтый", то программа должна вывести сообщение об ошибке.
В противном случае программа должна вывести название вторичного цвета, который по­
лучится в результате.

8.

Калькулятор сосисок для пикника. Допустим, что сосиски упакованы в пакеты по

10

штук, а булочки

в пакеты по

-

8

штук. Напишите программу, которая вычисляет

количество упаковок с сосисками и количество упаковок с булочками, необходимых для
пикника с минимальными остатками. Программа должна запросить у пользователя коли­
чество участников пикника и количество хот-догов, которые будут предложены каждому

участнику. Программа должна показать приведенные ниже подробности:

9.



минимально необходимое количество упаковок с сосисками;



минимально необходимое количество упаковок с булочками;



количество оставшихся сосисок;



количество оставшихся булочек.

Цвета колеса рулетки. На колесе рулетки карманы пронумерованы от О до

36.

Ниже

приведены цвета карманов:



карман О- зеленый;



для карманов с

1

по

с четным номером

-



карманы с нечетным номером имеют красный цвет, карманы

черный;

Глава 3. Структуры принятия решения и булева логика




для карманов с

по

18

с четным номером

-

красный;

для карманов с

по

28

-

черный;

11
19

с четным номером



для карманов с

29

с четным номером

171

карманы с нечетным номером имеют черный цвет, карманы

карманы с нечетным номером имеют красный цвет, карманы

по

36

-

красный.

карманы с нечетным номером имеют черный цвет, карманы

Напишите программу, которая просит пользователя ввести номер кармана и показывает,
является ли этот карман зеленым, красным или черным. Программа должна вывести

сообщение об ошибке, если пользователь вводит число, которое лежит вне диапазона
ОТ

1О.

0 ДО 36.

Игра в подсчитывание монет. Создайте игру, которая просит пользователя ввести не­

обходимое количество монет, чтобы получился ровно один рубль. Программа должна
предложить пользователю ввести количество монет достоинством

5, 1О

и

50

копеек.

Если итоговое значение введенных монет равно одному рублю, то программа должна
поздравить пользователя с выигрышем. В противном случае программа должна вывести

сообщение, говорящее о том, была ли введенная сумма больше или меньше одного
рубля. Подумайте о варианте игры, где вместо рубля используется доллар и разменные
монеты: пенс, пятицентовик, десятицентовик и четвертак.

11.

Очки книжного клуба. Прозорливая книготорговая фирма владеет книжным клубом,
который присуждает своим клиентам очки, основываясь на количестве книг, приобре­
тенных ими ежемесячно. Очки присуждаются следующим образом:



если клиент приобретает О книг, то зарабатывает О очков;



если клиент приобретает

2 книги,



если клиент приобретает

4



если клиент приобретает

6 книг,



если клиент приобретает

8 книг или

то зарабатывает

книги, то зарабатывает
то зарабатывает

5 очков;
15

очков;

30 очков;

больше, то зарабатывает

60

очков.

Напишите программу, которая просит пользователя ввести количество книг, приобре­
тенных им в этом месяце, и затем выводит присужденное количество очков.

12.

Реализация программного обеспечения. Компания-разработчик программного обес­
печения продает программный пакет, который реализуется в рознице за

Скидки за количество предоставляются в соответствии с табл.
Таблица

3.9.

долларов.

3.9.

Скидки

Количество, штук

Скидка,%

10-19

10

20-49

20

50-99

30

l 00

99

или больше

40

Напишите программу, которая просит пользователя ввести количество приобретенных
пакетов. Программа должна затем показать сумму скидки (если таковая имеется) и об­
щую сумму покупки после вычета скидки.

Глава 3. Структуры принятия решения и булева логика

172

Стоимость доставки. Грузовая компания срочной доставки взимает плату согласно

13.

ставкам, приведенным в табл.
Таблица

3.10.

3.10.

Ставки по доставке грузов

Ставка за

Масса пакета, г

200 или

меньше

100

г, рублей

150

Свыше

200,

но не более

600

300

Свыше

600,

но не более

1ООО

400

Свыше

1000

475
Напишите программу, которая просит пользователя ввести массу пакета и показывает
плату за доставку.

14.

Индекс массы тела. Напишите программу, которая вычисляет и показывает индекс

массы тела (ИМТ) человека. ИМТ часто используется для определения, весит ли человек
больше или меньше нормы для своего. ИМТ человека рассчитывают по формуле:

ИМТ= масса

,

рост

где масса измеряется в килограммах, а рост

-

в метрах. Программа должна попросить

пользователя ввести массу и рост и затем показать ИМТ пользователя. Программа также
должна вывести сообщение, указывающее, имеет ли человек оптимальную, недостаточ­

ную или избыточную массу. Масса человека считается оптимальной, если его ИМТ
находится между

18.5

и

25.

Если ИМТ меньше

ниже нормы. Если значение ИМТ больше

25,

18.5,

то считается, что человек весит

то считается, что человек весит больше

нормы.

15.

Калькулятор

времени. Напишите программу, которая просит пользователя ввести

количество секунд и работает следующим образом.



В минуте

60,

60

секунд. Если число введенных пользователем секунд больше или равно

то программа должна преобразовать число секунд в минуты и секунды.



В часе

3 600 секунд. Если число введенных пользователем секунд больше или равно
3 600, то программа должна преобразовать число секунд в часы, минуты и секунды.



В дне

86 400 секунд. Если число введенных пользователем секунд больше
86 400, то программа должна преобразовать число секунд в дни, часы,

или равно
минуты и

секунды.

16.

Дни в феврале. Февраль обычно имеет

28

дней. Но в високосный год в феврале

29 дней.

Напишите программу, которая просит пользователя ввести год. Затем она должна пока­
зать количество дней в феврале в этом году. Для определения високосных лет исполь­
зуйте следующие критерии.



Определить, делится ли год на

100. Если да, то этот год високосный тогда и
400. Например, 2000 является високосным

тогда, если он также делится на
а



только

годом,

2100 нет.

Если год не делится на

лится на

4.

Например,

100, то этот год високосный тогда и только тогда,
2008 является високосным годом, но 2009 нет.

если он де­

Глава 3. Структуры принятия решения и булева логика

173

Вот пример выполнения этой программы:
Введите год:
В

17.

2008

году

в

2008 IEnterl
феврале 29

дней.

Диагностическое дерево проверки качества

Wi-Fi.

На рис.

3.19

приведена упрощен­

ная блок-схема поиска причины плохого Wi-Fi-соединения. Используйте ее для создания
программы, которая проведет пользователя по шагам исправления плохого Wi-Fi-со­
единения. Вот пример вывода программы:
Перезагрузите

компьютер и попробуйте подключиться.

Вы исправили проблему? нет 1Enter 1
Перезагрузите маршрутизатор и попробуйте

подключиться.

Вы исправили проблему? да 1Enter 1

Обратите внимание, что программа завершается, как только решение проблемы найдено.
Вот еще один пример вывода программы:
Перезагрузите

компьютер и попробуйте

подключиться.

Вы исправили проблему? нет [Enter 1
Перезагрузите маршрутизатор и попробуйте подключиться.

Вы исправили проблему? нет 1Enter 1
Убедитесь,

что

кабели между маршрутизатором и модемом

прочно

подсоединены.

Вы исправили проблему? нет 1Enter1
Переместите

маршрутизатор

на

новое

место.

Вы исправили проблему? нет 1Enter 1
Возьмите

18.

новый маршрутизатор.

Селектор ресторанов. На вашу встречу выпускников собирается прибыть группа ваших
друзей, и вы хотите их повести в местный ресторан на ужин. Вы не уверены, что ваши

друзья придерживаются диетических ограничений, но ваши варианты выбора ресторана
будут такими.
Изысканные гамбургеры от Джо

-

вегетарианская: нет, веганская (строгая вегетариан­

ская): нет, безглютеновая: нет.
Центральная пиццерия
Кафе за углом

-

-

вегетарианская: да, веганская: нет, безглютеновая: да.

вегетарианская: да, веганская: да, безглютеновая: да.

Блюда от итальянской мамы
Кухня шеф-повара

-

-

вегетарианская: да, веганская: нет, безглютеновая: нет.

вегетарианская: да, веганская: да, безглютеновая: да.

Напишите программу, которая запрашивает, есть ли в группе вегетарианцы, веганцы ли­

бо приверженцы безглютеновой диеты, после чего она выводит только те рестораны,
в которые можно повести группу друзей. Вот пример вывода программы:
Будет ли на ужине вегетарианец? да IEnterl
Будет ли на ужине веганец? нет IEnteri
Будет ли на ужине приверженец безглютеновой диеты? да 1Enter 1
Вот

ваши

варианты ресторанов:

Центральная

Кафе
Кухня

за

пиццерия

углом

шеф-повара

Глава 3. Структуры принятия решения и булева логика

174

Перезагрузите комnьютер
и nоnробуйте nодкnючиться

Нет

Перезагрузите маршрутизатор
и nоnробуйте nодкnючиться

Да

Нет

Убедитесь, что кабели между
маршрутизатором и модемом
nрочно nодсоединены

Нет

Да

Переместите маршрутизатор
на новое место

Нет

Возьмите новый
маршрутизатор

РИС.

3.19.

Исправление плохого Wi-Fi-соединения

Да

Глава 3. Структуры принятия решения и булева логика

175

Вот еще один пример вывода программы:
Будет ли на ужине вегетарианец? да IEnterl
Будет ли на ужине веганец? да IEnterl
Будет ли на ужине приверженец безглютеновой диеты? да
Вот

Кафе

ваши

за

1

Enter

1

варианты ресторанов:

углом

Кухня шеф-повара

19.

Черепашья графика: модификация игры "Порази цель". Усовершенствуйте код из

файла

hit_the_target.py,

который вы увидели в программе

3.9,

так, чтобы при непопада­

нии снаряда по цели программа показывала пользователю подсказки в отношении того,

нужно ли увеличить или уменьшить угол и/или величину силы. Например, программа
должна показывать такие сообщения, как 'Попробуйте
силу поменьше

'.

угол

побольше' и 'Примените

1111111111

4.1

ение в ст

ы

кт

ов

орения

~ КЛЮЧЕВЫЕ ПОЛОЖЕНИЯ
Структура с повторением исполняет инструкции или набор инструкций многократно.
Программистам в большинстве случаев приходится писать код, который выполняет одну и
ту же задачу снова и снова. Предположим, что вас попросили написать программу, которая
вычисляет

1О-процентные

торговые комиссионные для нескольких продавцов. Один из под­

ходов, который предоставляет неплохое решение, состоит в том, чтобы написать программ­
ный код, вычисляющий комиссионные для одного продавца, и затем повторить этот про­

граммный код для каждого продавца. Взгляните на приведенный ниже фрагмент кода:

#

Получить

продажи продавца и его ставку комиссионных.

sales = float(input('Bвeдитe объем продаж: '))
comm_rate = float(input('Bвeдитe ставку комиссионных: '))
#

Рассчитать

commission
#

Показать

комиссионное

вознаграждение.

sales * comm rate
комиссионное вознаграждение.

рrint('Комиссионное вознаграждение составляет$',

format(commission,
#

Получить

продажи еще

'.2f'), sep=' ')

одного

продавца и его

ставку комиссионных.

sales = float(input('Bвeдитe объем продаж: '))
comm_rate = float(input('Bвeдитe ставку комиссионных: '))
# Рассчитать комиссионное вознаграждение.
commission
sales * comm rate
#

Показать

комиссионное

рrint('Комиссионное

вознаграждение.

вознаграждение составляет$',

format(commission,
#

Получить

продажи еще

'.2f'), sep=' ')

одного

продавца и

его

ставку комиссионных.

sales = float(input('Bвeдитe объем продаж: '))
comm rate = float(input('Bвeдитe ставку комиссионных: '))

Глава 4. Структуры с повторением

178

#

Рассчитать

комиссионное вознаграждение.

sales * comm rate

commission
#

Показать

комиссионное вознаграждение.

рrint('Комиссионное

вознаграждение составляет$',

format (commission, '.2f'), sep=' ')
И этот код повторяется снова и снова ...

Как видите, этот программный код представляет собой одну длинную последовательную
структуру,

содержащую

много повторяющихся

фрагментов.

У этого

подхода имеется

несколько недостатков:

+ повторяющийся код увеличивает программу;
+ написание длинной последовательности инструкций может быть трудоемким;
+ если часть повторяющегося программного кода нужно исправить или изменить,

то

исправление или изменение должны быть повторены много раз.
Вместо неоднократного написания одинаковой последовательности инструкций более опти­
мальный способ неоднократно выполнить операцию состоит в том, чтобы написать про­
граммный код операции всего один раз и затем поместить этот код в структуру, которая
предписывает компьютеру повторять его столько раз, сколько нужно. Это делается при

помощи структуры с повторением, которая более широко известна как цикл.

Циклы с условием повторения и со счетчиком повторений
В этой главе мы обратимся к двум популярным циклам: циклам с условием повторения и
циклам со счетчиком повторений. Цикл с условием повторений использует логическое усло­

вие со значениями истина/ложь, которое управляет количеством повторов цикла. Цикл со
счетчиком повторений повторяется заданное количество раз. Для написания цикла с усло­

~

вием повторения в

Python

ком повторений

инструкция

-

используется инструкция

for.

while, для написания цикла со счетчи­

В этой главе мы покажем, как писать оба вида циклов.

Контрольная точка
4.1.

Что такое структура с повторением?

4.2.

Что такое цикл с условием повторения?

4.3.

Что такое цикл со счетчиком повторений?

11111111111

4.2

к

while:

икл с условием повторения

111111111(_ КЛЮЧЕВЫЕ ПОЛОЖЕНИЯ
Цикл с условием повторения исполняет инструкции или набор инструкций повторно

до тех пор, пока условие является истинным. В
повторения применяется инструкция

Видеозапись "Цикл

Цикл

while"

(Т11е

Python

для написания цикла с условием

while.

w/1i/e Loop)

while ("пока") получил свое название из-за характера своей работы: он выполняет

некую задачу до тех пор, пока условие является истинным. Данный цикл имеет две части:

Глава 4. Структуры с повторением

179

условие, которое проверяется на истинность либо ложность, и инструкцию или набор инст­
рукций, которые повторяются до тех пор, пока условие является истинным. На рис.
ставлена логическая схема цикла

Истина

Условие

РИС.

4.1.

Логическая схема цикла

4.1

пред­

while.

Инструкция

(инструкции)

while

Ромбовидный символ представляет проверяемое условие. Обратите внимание, что происхо­
дит, если условие является истинным: исполняется одна или несколько инструкций, и вы­

полнение программы перетекает назад к точке чуть выше ромба. Условие проверяется снова,
и если оно истинное, то процесс повторяется. Если условие является ложным, то программа

выходит из цикла. В блок-схеме цикл всегда идентифицируется по соединительной линии,
которая возвращается в предыдущую часть блок-схемы.

Вот общий формат цикла с условием повторения в

while

Python:

условие:

инструкция

инструкция

Для простоты мы будем называть первую строку выражением while. Оно начинается со

слова while, после которого идет булево условие, вычисляемое как истина либо как ложь.
После условия идет двоеточие. Начиная со следующей строки расположен блок инструкций.
(Из главы

3

известно, что все инструкции в блоке должны быть единообразно выделены

отступом. Такое выделение отступом необходимо потому, что интерпретатор

Python

его

использует для определения начала и конца блока.)
При исполнении цикла while проверяется условие. Если условие является истинным, то

исполняются инструкции, которые расположены в блоке после выражения while, и цикл на­
чинается с начала. Если условие является ложным, то программа выходит из цикла. В про­
грамме

4.1

показано, как цикл while может быть применен для написания программы расче­

та комиссионного вознаграждения, которая была представлена в начале этой главы.

Программа

l #

4.1

(commission.py)

Эта программа

вычисляет торговые

комиссионные.

2

3 #

Создать

переменную для управления циклом.

4 keep_going

=

'д'

5

6 #

Вычислить

серию комиссионных

7 while keep going

==

'д':

вознаграждений.

180
8
9
10
11
12
13
14
15
16

Глава 4. Структуры с повторением

#

Получить

sales =

=

coпun_rate

#

продажи продавца и его ставку комиссионных.

float(input('Bвeдитe

Рассчитать

Показать

'))

float(input('Bвeдитe ставку комиссионных:

'))

комиссионное вознаграждение.

sales *

coпunission

#

объем продаж:

rate

coпun

комиссионное вознаграждение.

рrint('Комиссионное вознаграждение составляет$',

17

format

18
19
20
21

# Убедиться,
keep_going

(coпunission,

' . 2f') , sep=' ')

что пользователь хочет вьmолнить

еще одно.

input('Xoтитe

' +

'

вычислить

(Введите

д,

еще

если да)

одно

: ')

Вывод программы (вводимые данные выделены жирным шрифтом)

Введите объем продаж :

10000.00 IEnter J
0 . 10 IEnter J
вознаграждение составляет $1 , 000.00

Введите ставку комиссионных :
Комиссионное

Хотите вычислить еще одно

(Введите д ,

если да): д

IEnt er l

Введите объем продаж :

20000 . 00 1 Enter 1
Введите ставку комиссионных : 0.15 IEnter \
Комиссионное вознаграждение составляет $3 , 000 . 00
Хотите вычислить еще одно

(Введите д ,

если да): д IEnt er\

Введите объем продаж:

12000 . 00 \Ent er l
0.10 !Enter l
Комиссионное вознаграждение составляет $1 , 200 . 00
Хотите вычислить еще одно (Введите д , если да) : н 1Enter 1
Введите ставку комиссионных :

В строке

4

мы применяем инструкцию присваивания для создания переменной с именем

keep going

(продолжать). Отметим, что переменной присваивается значение 'д'. Это ини­

циализирующее значение имеет большую важность, и через мгновение вы увидите почему.
Строка

7-

это начало цикла

while keep_going ==

while:

'д':

Обратите внимание на проверяемое условие:

keep _going ==

'д'. Цикл проверяет это усло­

вие, и если оно истинное, то исполняются инструкции в строках
ся заново в строке

7.

Он проверяет выражение

инструкции в строках

keep_going ==

8-21

keep_going ==

8-21.



',

Затем цикл начинает­

и если оно истинное, то

исполняются снова. Этот цикл повторяется, пока выражение

'д' будет проверено в строке



не обнаружится, что оно ложное. Когда это

происходит, программа выходит из цикла. Это проиллюстрировано на рис.

4.2.

Для того чтобы этот цикл прекратил выполняться, что-то должно произойти внутри цикла,
что сделает выражение

keep_going ==

'д' ложным. Инструкция в строках

занимается. Эта инструкция выводит подсказку 'Хотите

если

да-)

'.
keep going.

Значение,

которое

считывается

с

вычислить

клавиатуры,

еще

20-21

этим и

одно

(Введите д,

присваивается

переменной

Если пользователь вводит букву д (и она должна быть в нижнем регистре), то,

Глава 4. Структуры с повторением
когда цикл начинается снова, выражение keep _going

==

181

'д' будет истинным. А значит,

инструкции в теле цикла исполнятся еще раз. Но если пользователь введет что-то иное, чем

буква д в нижнем регистре, то, когда цикл начинается снова, выражение будет ложным,
и программа выйдет из цикла.
Это условие проверяется

while

keep_goiпg

== 'у':

# Получить nродажи продавца и его ставку комиссионных.
sales = float(input('Bвeдитe объем продаж:'))
comm_rate = float(input('Bвeдитe ставку комиссионных: '))
Если условие является истинным,
то исполняются эти инструкции,

# Рассчитать комиссионное вознаграждение.
commissioп = sales • comm_rate

и затем цикл начинается заново

# Показать комиссионное вознаграждение.
ргiпt('Комиссионное вознаграждение составляет
Если условие является ложным,

format(commissioп,

$',

'.2f), sep=")

то эти инструкции пропускаются,
и программа выходит из цикла

# Убедиться, что пользователь хочет выполнить еще одно действие.
keep_goiпg

= iпрut('Хотите

выполнить еще одно

'+

'commissioп(Bвeдитe д, если да):')

РИС.

4.2.

Цикл

while

Теперь, когда вы исследовали программный код, взгляните на результат демонстрационного
выполнения программы. Сначала пользователь ввел

1О 000.00

в качестве продаж и

0.1 О

в качестве ставки комиссионных. Затем программа показала комиссионное вознаграждение

для этой суммы, которое составляет
'Хотите вычислить еще одно

$1000.00.

(Введите д,

Далее пользователю выводится подсказка

если да) '. Пользователь ввел д, и цикл начался

заново. В демонстрационном выполнении пользователь прошел этот процесс три раза. Каж­

дое отдельное исполнение тела цикла называется итерацией. В демонстрационном выпол­
нении цикл сделал три итерации.

На рис.

4.3

представлена блок-схема программы. Здесь имеется структура с повторением,

т. е. цикл while. Проверяется условие keep _going

==

'д', и если оно истинное, то исполня­

ется серия инструкций, и поток выполнения возвращается к точке чуть выше проверки усло­
вия.

Цикл

while

как цикл с предусловием

Цикл while также называется ци1G7ОМ с предусловием, а именно он проверяет свое условие до
того, как сделает итерацию. Поскольку проверка осуществляется в начале цикла, обычно

нужно выполнить несколько шагов перед началом цикла, чтобы гарантировать, что цикл
выполнится как минимум однажды. Например, цикл в программе

while keep_going ==

4.1

начинается вот так:

'д':

Данный цикл выполнит итерацию, только если выражение keep _going

==

'д' является

истинным. Это означает, что переменная keep _going должна существовать, и она должна

182

Глава 4. Структуры с повторением

Начало

Присвоить 'д' переменной
keep_jjoiпg

Истина

Предложить

пользователю ввести объем
продаж и присвоить его

Конец

переменной

sales

Предложить
комиссионных и присвоить

ее переменной

comm_rate

commission = sales • comm_rate

Показать комиссионное
вознаграждение

Показать
пользователю 'Хотите
вычислить еще ОДНО

(Введите д, если да)'
и присвоить введенное

значение переменной

keep_jjoing

РИС.

4.3. Блок-схема программы 4.1
ссылаться на значение 'д'. Для того чтобы выражение гарантированно было истинным при
первом исполнении цикла, в строке

keep_going =

4 мы

присвоили переменной keep_going значение 'д':

'д'

Выполняя этот шаг, мы знаем, что условие keep_going

==

'д' будет истинным при первом

исполнении цикла. В этом заключается важная особенность цикла while: он никогда не
исполнится, если его условие с самого начала будет ложным. В некоторых программах это
именно то, что нужно.

Глава 4. Структуры с повторением

Проектирование программы с циклом

183

while

Проект, который в настоящее время осуществляется в компании "Химическая аналитика",

требует, чтобы вещество в баке непрерывно поддерживалось в нагретом состоянии. Лабо­
рант должен проверять температуру вещества каждые

не превышает

102,5

102,5

15

мин. Если температура вещества

°С, то лаборант ничего не делает. Однако если температура больше

°С, то он должен убавить нагрев с помощью термостата, подождать

5 мин

и проверить

температуру снова. Лаборант повторяет эти шаги до тех пор, пока температура не превысит

102,5

°С. Директор по разработке попросил вас написать программу, которая будет помогать

лаборанту проходить этот процесс.
Вот алгоритм:

1.

Получить температуру вещества.

2.

Повторять приведенные ниже шаги до тех пор, пока температура больше

3.

а)

сообщить лаборанту убавить нагрев, подождать

б)

получить температуру вещества.

5 мин и

102,5

°С:

проверить температуру снова;

После завершения цикла сообщить лаборанту, что температура приемлема, и проверить
ее снова через

15

мин.

Изучив этот алгоритм, вы понимаете, что шаги 2а и 2б не будут выполняться, если прове­
ряемое условие (температура больше
ситуации цикл

while

1 #
2 #

4.2

°С) является ложным с самого начала. В этой

сработает хорошо, потому что он не выполнится ни разу, если его

условие будет ложным. В программе

Программа

102,5

4.2

представлен соответствующий код.

(temperature.py)

Эта программа помогает лаборанту в процессе
контроля температуры вещества.

3

4 # Именованная константа,
5 # температуру.
6 МАХ ТЕМР = 102.5

которая представляет максимальную

7

8 # Получить температуру вещества.
9 temperature = float(
10
inрut("Введите температуру вещества в градусах Цельсия: "))
11 # Пока есть необходимость, инструктировать пользователя
12 # в корректировке нагрева.
13 while temperature > МАХ_ТЕМР:
14
print('Teмпepaтypa слишком высокая.')
15
рrint('Убавьте нагрев и подождите')
16
print('5 минут. Затем снимите показание температуры')
17
print('cнoвa и введите полученное значение.')
18
temperature = float(input('Bвeдитe новое показание температуры: '))
19

Глава 4. Структуры с повторением

184

i 20 # Напомнить пользователю проконтролировать температуру
21 # через 15 минут.
22 print ('Температура приемлемая.')
23 рrint('Проверьте ее снова через 15 минут.')
Вывод

1 программы

(вводимые данные выделены жирным шрифтом)

Введите температуру вещества в градусах Цельсия :
Температура
Убавьте

5

слишком высокая .

и

Затем снимите показание температуры
введите

полученное

значение .

Введите новое показание температуры :
Температура
Убавьте

5

и

Затем снимите показание
введите

полученное

температуры

значение .

Введите новое показание температуры :
Температура

102.1 jEnter l

приемлемая .

Проверьте ее снова

Вь 1 вод

103.2 IEnter l

CJJIOIJ.Кoм высокая .

нагрев и подождите

минут .

снова

104.7 IEnter l

нагрев и подождите

минут .

снова

снова

2 программы

через

15

минут .

(вводимые данные выделены жирным шрифтом)

Введите температуру вещества в градусах Цельсия :
Температура

102.1 IEnter l

приемлемая .

Проверьте ее снова через

15

минут .

Бесконечные циклы
Всегда, кроме редких случаев, циклы должны содержать возможность завершиться. То есть
в цикле что-то должно сделать проверяемое условие ложным. Цикл в программе
шается, когда выражение

keep_going

==

4.1

завер­

'д' является ложным. Если цикл не имеет возмож­

ности завершиться, то он называется бесконечным цикло.~t. Бесконечный цикл продолжает

повторяться до тех пор, пока программа не будет прервана. Бесконечные циклы обычно по­
являются, когда программист забывает написать программный код внутри цикла, который

делает проверяемое условия ложным. В большинстве случаев вам следует избегать приме­
нения бесконечных циклов.
Программа

4.3

демонстрирует бесконечный цикл. Это видоизмененная версия программы

расчета комиссионного вознаграждения (см. программу
который изменяет переменную
жения

keep_going

==

'д'

keep_going

в строке

6

4.1 ).

В этой версии мы удалили код,

в теле цикла. Во время каждой проверки выра­

переменная

keep_going

будет ссылаться на строковое

значение 'д'. И как следствие, цикл не имеет никакой возможности остановиться. (Един­

ственный

способ

+ для

остановить

ее прерывания.)

эту

программу

состоит

в

нажатии

комбинации

клавиш

Глава 4. Структуры с повторением

1

Программа 4.3

1

185

(infinite.py)

1 # Эта программа демонстрирует
2 # Создать переменную, которая
3 keep_going = 'д'

бесконечный цикл.

будет управлять

циклом.

4

5 # Предупреждение! Бесконечный цикл!
6 while keep_going == 'д':
7
# Получить продажи продавца и его ставку комиссионных.
В
sales = float(input('Bвeдитe объем продаж: '))
9
comm_rate = float(input('Bвeдитe ставку комиссионных: '))
10
Рассчитать

11

#

12

commission

комиссионное

вознаграждение.

sales * comm rate

13

14
15
16

#

Показать

комиссионное

вознаграждение.

рrint('Комиссионное вознаграждение составляет$',

format(commission,

~

'.2f'), sep=")

Контрольная точка
4.4.

Что такое итерация цикла?

4.5.

Когда цикл

while

проверяет свое условие: до или после того, как он выполнит итера­

цию?

4.6.

Сколько раз сообщение 'Привет,

мир!' будет напечатано в приведенном ниже фраг­

менте кода?

count = 10
while count < 1:
print ('Привет,

4.7.

мир!')

Что такое бесконечный цикл?

~

4.3

for:

uикл со счетчико

повторений

~ КЛЮЧЕВЫЕ ПОЛОЖЕНИЯ
Цикл со счетчиком повторений повторяется заданное количество раз. В
сания цикла со счетчиком повторений применяется инструкция
Виnрn·щпись "Цикл fог"

Python

для напи­

for.

(The for LoooJ

Как упомянуто в начале этой главы, цикл со счетчиком повторений повторяется заданное
количество раз. Циклы со счетчиком повторений находят широкое применение в програм­

мах. Предположим, что предприятие открыто шесть дней в неделю, и вы собираетесь напи­

сать программу для вычисления общего объема продаж за неделю. Вам понадобится цикл,
который повторяется ровно шесть раз, т. е. делает шесть итераций. При каждом выполнении
итерации он будет предлагать пользователю ввести продажи за один день.

Глава 4. Структуры с повторением

186

Для написания цикла со счетчиком повторений применяется инструкция
рукция

for

for.

В

Python

инст­

предназначена для работы с последовательностью значений данных.Когда эта

инструкция исполняется, она повторно выполняется для

каждого значения последователь­

ности. Вот ее общий формат:

for

in

переменная

[значениеl,

значение2,

... ] :

инструкция
инструкция

Мы будем обозначать первую строку, как выражение

for. В выражении for переменная­

это имя переменной. Внутри скобок находится последовательность разделенных запятыми
значений. (В

Python

последовательность разделенных запятыми значений данных, заклю­

ченная в скобки, называется списко,w. В главе

7 вы

узнаете о списках подробнее.) Начиная со

второй строки, располагается блок инструкций, который исполняется во время каждой ите­
рации цикла.

Инструкция

исполняется следующим образом: переменной присваивается первое значе­

for

ние в списке, и затем исполняются инструкции, которые расположены в блоке. Затем пере­
менной присваивается следующее значение в списке, и инструкции в блоке исполняются
снова. Этот процесс продолжается до тех пор, пока переменной не будет присвоено послед­
нее значение в списке. В программе
меняется для вывода чисел от
Программа

1 #

Эта

4.4

1

4.4

приведен простой пример, в котором цикл

for

при­

1 до 5.

(simple_loop1 .ру)

программа демонстрирует

простой цикл

for,

2 # который использует список чисел.
3
4 print('Я покажу числа от 1 до 5. ')
5 for num in [ 1, 2, 3, 4, 5):
print (num)
6
Вывод программы
я

покажу

числа

от

1

до

5.

1
2
3
4
5
Во время первой итерации цикла

for

полняется инструкция в строке

(печатающая значение

цикла переменной

num

(печатающая значение
пока переменной

num

6

переменной

присваивается значение

2).

Как показано на рис.

nurn

2,
4.4,

присваивается значение

1).

1,

и затем ис­

Во время следующей итерации

и исполняется инструкция в строке

6

этот процесс продолжается до тех пор,

не присваивается последнее значение в списке. Поскольку в списке

всего пять значений, цикл сделает пять итераций.
Программисты

for,

Python

обычно называют переменную, которая используется в выражении

целевой переменной, потому что она является целью присвоения в начале каждой итера­

ции цикла.

Глава 4. Структуры с повторением

~

for num in
print(num)

1-я итерация:

4.4.

Цикл

(1, 2, 3, 4, 5]:

~

for num in
(1,
print(num)

2-я итерация:

РИС.

187

2,

3,

4,

5):

4,

5]:

~
(1, 2, 3,
4,

5]:

~

3-я итерация:

for num in
(1,
print(num)

4-я итерация:

for num in
print(num)

5-я итерация:

for num in
[1,
print(num)

2,

3,

~
2,

3,

4,

5):

for

Значения, которые появляются в списке, не обязательно должны представлять собой серию
расположенных подряд чисел. Например, в программе

4.5

применяется цикл

for для вывода

списка нечетных чисел. В списке всего пять чисел, и поэтому цикл повторяется пять раз, т. е.
делает пять итераций.
Проrрамма

4.5

1

(simple_loop2.py)

1 #

Эта

2 #

который использует

программа демонстрирует

простой цикл

for,

список чисел.

3
4 print

('Я покажу нечетные числа от

1

ДО

9.

1 )

5 for num in [ 1, 3, 5, 7, 9]:
6

print(num)

Вывод программы
я

покажу

нечетные

числа от

1

до

9.

1

3
5

7

9
В программе

4.6

приведен еще один пример. Здесь цикл

for выполняет последовательный

обход списка строковых значений. Обратите внимание, что список (в строке
строковых значения:
итерации.

'Мигнуть', 'Моргнуть'

4)

содержит три

и 'Кивнуть'. В результате цикл сделает три

Глава 4. Структуры с повторением

188

Программа

4.6

1

(simple_loopЗ.py)
простой цикл

for,

1 #

Эта программа демонстрирует

2 #

который использует список строковых значений.

3
4 for name in [ 'Мигнуть ' ,
print(name)
5

'Моргнуть',

'Кивнуть']:

Вывод программы
Мигнуть
Моргнуть

Кивнуть

Применение функции

Python

range

с циклом

for

предоставляет встроенную функцию range (диапазон), которая упрощает процесс

написания цикла со счетчиком повторений . Функция range создает тип объекта, который
называется итерируемым, т. е. пригодным для итеративной обработки в цикле. Итерuруе­
мый объект аналогичен списку. Он содержит последовательность значений, которые можно
по порядку обойти на основе чего-то наподобие цикла. Вот пример для цикла, который при­
меняет функцию range:

for num in range(S):
print (num)
Обратите внимание, что вместо использования списка значений мы вызываем функцию
r a nge, передавая 5 в качестве аргумента. В этой инструкции функция range порождает ите­
рируемую последовательность целых чисел в диапазоне от О до (но не включая)

5.

Этот

фрагмент кода работает так же, как и приведенный ниже:

for nurn in [0, 1, 2, 3, 4]:
print (nurn)
Как видно из примера, список содержит пять чисел, и поэтому этот цикл выполнит пять ите­

раций. В программе

4.7

применяется функция range с циклом for для пятикратного вывода

сообщения "Привет, мир!".
Программа

4.7

(simple_loop4.py)

1 #

Эта программа

2 #

функции

r a nge

демон с трируе т

с циклом

применение

f o r.

3
4 # Напечатать сообщение
5 for х in range(5):

6

print

('Привет,

Вывод программы
Привет ,

мир!

Привет ,

мир!

Привет ,

мир!

Привет ,

мир!

Привет ,

мир!

пять

мир!')

раз.

Глава 4. Структуры с повторением
Если передать функции

189

range один аргумент, как продемонстрировано в программе 4. 7, то

этот аргумент используется в качестве конечного предела последовательности чисел. Если

передать функции

range два аргумента, то первый аргумент используется в качестве началь­

ного значения последовательности, второй аргумент

-

в качестве ее конечного предела.

Вот пример:

for num in range(l, 5):
print(num)
Этот фрагмент кода выведет следующее:

1

2

3
4
По умолчанию функция
на

1 для

range создает последовательность чисел, которая увеличивается
range третий аргу­

каждого последующего числа в списке. Если передать функции

мент, то этот аргумент используется в качестве величины шага. Вместо увеличения на
каждое последующее

число в

последовательности

увеличится

на величину

шага.

1,

Вот

пример:

for num in range(l, 10, 2):
print(num)
В этой инструкции

for

в функцию

+ первый аргумент ( 1) + второй аргумент (1 О) -

range

передано три аргумента:

это начальное значение последовательности;
это конечный предел списка. Иными словами, последним числом

последовательности будет

9;

+ третий аргумент (2)- это величина шага. Иными словами, 2 будет добавляться к каждому последующему числу последовательности.

Этот фрагмент кода выведет следующее:

1

3
5
7
9

Использование целевой переменной в цикле
В цикле

for целевая переменная предназначена для того, чтобы ссылаться на каждое значе­

ние последовательности значений в ходе выполнения итераций цикла. Во многих ситуациях
целесообразно использовать целевую переменную в расчетах или другой задаче внутри тела
цикла. Предположим, что вам нужно написать программу, которая выводит числа от

и соответствующие квадраты чисел (табл.

1 до 10

4.1 ).

Этого можно добиться, написав цикл for, который выполняет последовательный обход зна­
чений от
ние

1,

1 до 1О.

Во время первой итерации целевой переменной будет присвоено значе­

во время второй итерации ей будет присвоено значение

2

и т. д. Поскольку во время

выполнения цикла целевая переменная будет ссылаться на значения от
использовать в расчетах внутри цикла. В программе

4.8

1

до

1О,

показано, как это делается.

ее можно

Глава 4. Структуры с повторением

190

Таблица

Программа 4.8
1 #
2 #
3 #

и их

4
5 #

Напечатать

6

1

4.1.

Число

Квадрат числа

1

1

2

4

3

9

4

16

5

25

6

36

7

49

8

64

9

81

10

100

(squaгes.py)

Эта программа использует

таблицы с числами от

1

до

цикл для

10

квадратами.

заголовки таблицы.

рrint('Число\tКвадрат числа')

7 print('--------------------- 1 )
8

9 # Напечатать числа от 1 до 10
10 # и их квадраты.
11 for nШ!\Ьеr in range(l, 11):
12
square = nlli!1Ьer**2
13
print(nlli!1Ьer, '\t', square)
Вывод программы
Число

Квадрат числа

1

1

2

4

3
4

9
16

5

25

6
7

36

в

9

10

49
64
81
100

Квадраты чисел

вывода

Глава 4. Структуры с повторением
Прежде всего взгляните на строку

print ( 'Число\tКвадрат

6,

которая выводит заголовки таблицы:

числа')

Обратите внимание на экранированную последовательность
"Квадрат числа" внутри строкового литерала. Из главы

последовательность

191

2

\t

между словами "Число" и

известно, что экранированная

подобна нажатию клавиши ; она перемещает курсор вывода

\t

к следующей позиции табуляции. Это приводит к появлению пространства, которое вы ви­

дите в примере выходных данных между словами "Число" и "Квадрат числа".

Цикл for, который начинается в строке

11, применяет функцию range для создания после­
довательности, содержащей числа от 1 до 1О. Во время первой итерации переменная nшnЬer
ссылается на 1, во время второй итерации nшnЬer ссылается на 2 и т. д., вплоть до 1О. В этом
цикле инструкция в строке 12 возводит nшnЬer в степень 2 (из главы 2 известно, что ** это оператор возведения в степень) и присваивает результат переменной square. Инструкция
в строке

13

печатает значение, на которое ссылается nшnЬer, переходит к следующей пози­

ции табуляции и затем печатает значение, на которое ссылается square. (Переход к позиции
табуляции при помощи экранированной последовательности

\t

приводит к выравниванию

чисел в двух столбцах в итоговом результате.)
На рис.

4.5

показано, как могла бы выглядеть блок-схема этой программы.

Начало

Показать заголовки

Истина

Присвоить переменной
пumber следующее
Ложь

значение списка

Конец

square = пumber••2

Показать
переменную пumber
и переменную

РИС.

4.5.

Блок-схема программы

4.8

square

Глава 4. Структуры с повторением

192

Проектирование цикла со счетчиком повторений
на основе инструкции

for

Ваша подруга Аманда только что получила в наследство европейский спортивный автомо­

биль от своего дяди. Аманда живет в США и боится, что будет оштрафована за превышение

скорости, потому что спидометр автомобиля показывает скорость в километрах в час. Она
попросила вас написать программу, которая выводит таблицу скоростей, где эти значения
преобразованы в мили в час. Формула для преобразования КРН

(kilometers per hour)

в МРН

(miles per hour):
МРН = КРН х

В данной формуле МРН

-

0.6214.

это скорость в милях в час, КРН

-

скорость в километрах в час.

Таблица, которую ваша программа выводит, должна показать скорости от
с приращением



60

до

130

км/ч

км вместе с их значениями, преобразованными в мили в час. Таблица

должна выглядеть примерно так:

КРН

МРН

60

37.3
-----------

43.5

70
80

49.7

1

-

i

".

".

----

1

130

80.8

Поразмыслив по поводу этой таблицы скоростей, вы решаете написать цикл for. Список
значений, последовательный обход которых должен выполнять цикл, будет содержать ско­

рости в километрах в час. В цикле вы вызовете функцию range вот так:

range (60, 131, 10)
Первым значением в последовательности будет
задает



60.

Обратите внимание, что третий аргумент

в качестве величины шага. Это означает, что числами в списке будут

и т. д. Второй аргумент задает

131

60, 70, 80

в качестве конечного предела последовательности и по­

этому последним числом последовательности будет

130.

Внутри цикла вы примените целевую переменную для расчета скорости в милях в час.
В программе

Программа 4.9- ]
1 #
2 #
3 #

в

130
mph.

км/ч

показан соответствующий код.

(speed_converter.py)

Эта программа
до

4.9



преобразует

скорости от

приращениями в

10

60

км)

4

5 START SPEED = 60
131
6 END SPEED

#
#

Начальная

Конечная

скорость.

скорость.

Глава 4. Структуры с повторением

7 INCREМENT = 10
8 CONVERSION FACTOR

0.6214

#

Приращение

#

Коэффициент пересчета.

193

скорости.

9

10
11
12
13
14
15
16
17

#

Напечатать

заголовки таблицы.

print ( 'КРН\ tMPH')
print('--------------')
#

Напечатать

скорости.

for kph in range(START_SPEED, END SPEED,
mph = kph * CONVERSION_FACTOR
print(kph, '\t', format(mph, '.lf'))

INCREМENT):

Вывод программы
КРН

МРН

60
70
80
90
100
110
120
130

37 . 3
43 . 5
49 . 7
55 . 9
62 . 1
68 . 4
74 . 6

80 . 8

Пользовательский контроль итераций цикла
Во многих случаях программист знает точное число итераций, которые цикл должен выпол­

нить. Вспомните программу

4.8,

которая выводит таблицу с числами от

1 до 1О

и их квадра­

ты. Когда программный код был написан, программист знал, что цикл должен был выпол­
нить последовательный перебор значений от

1 до 10.

Иногда программисту нужно предоставить пользователю возможность управлять количест­
вом итераций цикла. Например, предположим, вы захотите, чтобы программа

4.8

была уни­

версальнее, позволив пользователю определять максимальное значение, выводимое циклом

на экран. В программе

Программа

1 #
2 #

4.10

4.10

представлено, как этого можно добиться.

(user_squares1.py)

Эта программа использует цикл для

вывода

таблицы чисел и их квадратов.

3

4
5
6
7

#

Получить

print
print
end =

конечный предел.

('Эта программа выводит
('(начиная

с

1)

список чисел')

и их квадраты.')

int(input('Hacкoлькo далеко мне

8

9 # Напечатать
10 print ()

заголовки таблицы.

заходить?

'))

Глава 4. Структуры с повторением

194

11 рrint('Число\tКвадрат числа')
12 print('--------------------- 1 )
13
14 # Напечатать числа и их квадраты.
15 for numЬer in range(l, end + 1):
16
square = numЬer**2
17
print(numЬer, '\t', square)
Вывод программы (вводимые данные выделены жирным шрифтом)
Эта программа
(начиная

с

1)

выводит список чисел
и их

квадраты .

Насколько далеко мне заходить?

Число

квадрат числа

1

1

2

4

3
4

9

5 IEnter l

16
25

5

Эта программа просит пользователя ввести значение, которое используется в качестве

конечного предела списка. Это значение присваивается переменной

end в строке 7. Затем
end + 1 используется в строке 15 в качестве второго аргумента функции range.
должны прибавить единицу к переменной end, потому что иначе последовательность

выражение
(Мы

приблизится к введенному пользователем значению, но его не включит.)
В программе

4. l l

приведен пример, который разрешает пользователю определять начальное

значение и конечный предел последовательности.

Программа

1 #
2 #

4.11

(user_squares2.py)

Эта программа использует
таблицы чисел и их

цикл для

вывода

квадратов.

3

4 # Получить начальное значение.
5 print('Этa программа выводит список чисел')
6 print ('и их квадратов.')
7 start = int(input('Bвeдитe начальное число: '))
в

9 #

10
11
12
13
14
15
16

Получить

end
#

=

конечный предел.

int(input('Hacкoлькo

Напечатать

далеко мне

заголовки таблицы.

print ()
рrint('Число\tКвадрат числа')

print('--------------------- 1 )

заходить?

'))

Глава 4. Структуры с повторением

195

17 # Напечатать числа и их квадраты.
18 for numЬer in range(start, end + 1):
19
square = numЬer**2
20
print(numЬer,
'\t', square)
Вывод программы (вводимые данные выделены жирным шрифтом)
Эта
и

программа

их

выводит список чисел

квадратов .

Введите начальное число :

5 IEnter l
заходить? 10 IEnter l

Насколько далеко мне

Число

Квадрат числа

5
6

25
36

7

49

8

64

9

81

10

100

Порождение итерируемой последовательности
в диапазоне от максимального до минимального значений
В примерах, которые вы видели до сих пор, функция range применялась для создания
последовательности

с

числами,

которые

проходят

значения. Как альтернативный вариант, функцию

от

минимального

до

максимального

range можно применить для создания

последовательностей чисел, которые проходят в обратном порядке от максимального до
минимального значения. Вот пример:

range(lO,

О,

-1)

В этом вызове функции начальное значение равняется
ности равняется О, а величина шага равняется

-1.

1О,

конечный предел последователь­

Это выражение создаст приведенную ниже

последовательность:

10, 9, 8, 7, 6, 5, 4, 3, 2, 1
Вот пример для цикла, который распечатывает числа от

for nurn in range(5,
print(num)

О,

5 до 1:

-1):

Контрольная точка

4.8.

Перепишите приведенный ниже фрагмент кода, чтобы вместо использования списка

он вызывал функцию

range:

[О,

1, 2, 3, 4, 5]:

for

х in [О, 1, 2, 3, 4, 5] :
print ('Обожаю эту программу!')

196

Глава 4. Структуры с повторением

4.9.

Что покажет приведенный ниже фрагмент кода?

for

nшnЬer

print

4.10.

(nшnЬer)

nшnЬer

print

in range(2, 6):

(numЬer)

Что покажет приведенный ниже фрагмент кода?

for

numЬer

print

4.12.

range(б):

Что покажет приведенный ниже фрагмент кода?

for

4.11.

in

in range(O, 501, 100):

(numЬer)

Что покажет приведенный ниже фрагмент кода?

for

nшnЬer

print

in range(lO, 5, -1):

(nшnЬer)

lilllllll

4.4

В

числение на

астающего итога

~ КЛЮЧЕВЫЕ ПОЛОЖЕНИЯ
Нарастающий итог

-

это сумма чисел, которая накапливается с каждой итерацией цикла.

Переменная, которая используется для хранения нарастающего итога, называется нако­
пителем.

Многие задачи программирования требуют вычисления суммы числового ряда. Предполо­
жим, что вы пишете программу, которая вычисляет общий объем продаж предприятия за
неделю. На входе программа считывает продажи за каждый день и вычисляет сумму этих
чисел.

Программы, которые вычисляют сумму числового ряда, обычно используют два элемента:



цикл, читающий каждое число в ряду;



переменную, накапливающую сумму чисел по мере их чтения.

Переменная, которая используется для накапливания суммы чисел, называется накопите­
лем, или аккумулятором. Часто говорят, что цикл содержит нарастающий итог, потому что

он накапливает сумму по мере чтения каждого числа в ряду. На рис.

4.6

показана стандарт­

ная логическая схема цикла, который вычисляет нарастающий итог.

Когда цикл заканчивается, накопитель будет содержать сумму чисел, которые были считаны
циклом. Обратите внимание, что первый шаг в блок-схеме состоит в присвоении накапли­
вающей переменной значения О. Это крайне важный шаг. Всякий раз, когда цикл читает
число, он прибавляет его к накопителю. Если накопитель начинается с любого значения

кроме О, то он будет содержать неправильную сумму чисел, когда цикл завершится.
Рассмотрим пример, в котором вычисляется нарастающий итог. Программа
пользователю ввести пять чисел и выводит сумму введенных чисел.

Программа

1 #
2 #
3

4.12

(sum_numbers.py)

Эта программа
чисел,

вычисляет

сумму серии

вводимых пользователем.

4.12

позволяет

Глава 4. Структуры с повторением

4

МАХ =

5 #

197

Максимальное число.

5

6 # Инициализировать
7 total = О.О

накапливающую переменную.

8

9 # Объяснить, что мы делаем.
10 print('Этa программа вычисляет сумму из')
11 print(МAX, 'чисел, которые вы введете.')
12
13 # Получить числа и накопить их.
14 for counter in range(МAX):
15
nшnЬer = int(input('Bвeдитe число: '))
16
total = total + nшnЬer
17

18 # Показать сумму чисел.
19 print('Cyммa составляет', total)
Вьtвод программы (вводимые данные выделены жирным шрифтом)
Эта программа вычисляет
из

5

чисел ,

которые

Введите число :
Введите число :

1 1 Enter 1
2 Enter
3 1 Enter 1

Введите число :

4 Enter

Введите число :

5 1 Enter 1
15 . 0

Введите число :

сумму

вы введете.

J

J

J

J

Сумма составляет

Назначить накопителю
значение О

Истина

РИС.

4.6.

Прочитать

Прибавить число

следующее число

в накопитель

Логическая схема вычисления нарастающего итога

Переменная

total,

создаваемая инструкцией присваивания в строке

7,

является накопите­

лем. Обратите внимание, что она инициализирована значением О.О. Цикл

16 занимается

for

в строках

получением чисел от пользователя и вычислением их суммы. Строка

15

14-

пред­

лагает пользователю ввести число и затем присваивает его переменной nшnЬer. Следующая
далее инструкция в строке

total

=

total +

nшnЬer

16 прибавляет это

число к

total:

Глава 4. Структуры с повторением

198

После того как эта инструкция исполнится, значение, на которое ссылается переменная

numЬer, будет прибавлено к значению переменной total. Очень важно разобраться в том,
как эта инструкция работает. Сначала интерпретатор получает значение выражения на пра­
вой стороне от оператора =, т. е.

total + numЬer. Затем оператором = это значение при­
total. В результате исполнения этой инструкции значение перемен­
ной numЬer прибавляется к переменной total. Когда цикл завершается, переменная total
сваивается переменной

будет содержать сумму всех чисел, которые были к ней прибавлены. Это значение показано
в строке

19.

Расширенные операторы присваивания
Довольно часто программы имеют инструкции присваивания, в которых переменная на
левой стороне от оператора = также появляется на правой от него стороне. Вот пример:
х

= х

+ 1

На правой стороне оператора присваивания

1

прибавляется к переменной х. Полученный

результат затем присваивается переменной х, заменяя значение, на которое ранее ссылалась

переменная х. В сущности, эта инструкция добавляет
инструкций вы видели в программе

total

total +

=

1

к х. Еще один пример такого типа

4.13:

numЬer

Эта инструкция присваивает значение выражения total

+

numЬer переменной total. Как

упоминалось ранее, в результате исполнения этой инструкции numЬer прибавляется к значе­
нию

total. Вот еще один пример:

balance

=

balance - withdrawal

Эта инструкция присваивает значение выражения balance withdrawal переменной
balance. В результате исполнения этой инструкции withdrawal (снято со счета) вычтено из
balance (остаток).
В табл.
Таблица

4.2

представлены другие примеры инструкций, написанных таким образом.

4.2. Различные инструкции присваивания (в каждой инструкции х

Инструкция

Что она делает

6)
Значение х после инструкции

х

=

х

+ 4

Прибавляет

4

х

=

х

- 3

Вычитает

из х

х

=

х

* 10

Умножает х на

х

=

х

/ 2

Делит хна

х

=

х

% 4

Присваивает х остаток от х/4

3

=

кх

10
3



60

2

3
2

Эти типы операций находят широкое применение в программировании. Для удобства
предлагает особую
В табл.

4.3

группу операторов,

Python

специально предназначенных для таких задач.

перечислены расширенные операторы присваивания.

Как видите, расширенные операторы присваивания не требуют, чтобы программист дважды
набирал имя переменной. Приведенную ниже инструкцию:

total

=

total +

numЬer

Глава 4. Структуры с повторением

199

можно переписать как

total +=

numЬer

Точно так же инструкцию

balance

=

balance - withdrawal

можно переписать как

balance -= withdrawal
Таблица

4.3.

Расширенные операторы присваивания
Эквивалент

Оператор

Пример использования

+=

х

+= 5

х

=

х

+ 5

=

у

-= 2

у

=

у

- 2

-

z = z * 10

*=

z *= 10

/=

а

/=

ь

а

=

а

/

%=

с

%= 3

с

=

с

%3

ь

Контрольная точка

4.13.

Что такое накопитель (аккумуляторная переменная)?

4.14.

Следует ли инициализировать накопитель конкретным значением? Почему или почему
нет?

4.15.

Что покажет приведенный ниже фрагмент кода?

total = О
for count in range(l, 6):
total = total + count
print(total)

4.16.

Что покажет приведенный ниже фрагмент кода?
numЬer
numЬer
numЬer

1
2
1

=

10
5

=

numЬer

1 +

2

numЬer

print (numЬerl)
print(numЬer2)

4.17.

Перепишите приведенные ниже инструкции с использованием расширенных операто­
ров присваивания:

а)

quantity = quantity + 1·

б)
в)

days left = days - lef t price
price * 10;

г)

price

'

price / 2.



'

200

Глава 4. Структуры с повторением

~

4.5

льн

1е м

тк

~ КЛЮЧЕВЫЕ ПОЛОЖЕНИЯ
Сигнальная метка

-

это специальное значение, которое отмечает конец последователь­

ности значений.
Рассмотрим следующий сценарий: вы разрабатываете программу, которая будет использо­

вать цикл для обработки длинной последовательности значений. Вы еще не знаете количе­
ство значений, которые будут в последовательности. При каждом выполнении программы
количество значений последовательности может быть разным. Какой вариант цикла подой­
дет лучше всего? Вот несколько приемов, которые вы уже видели в этой главе, вместе с не­

достатками их применения при обработке длинного списка значений.

+ Просто спрашивать пользователя в конце каждой итерации цикла, есть ли еще одно обра­
батываемое значение. Однако если последовательность значений будет длинной, то вы­
вод этого вопроса в конце каждой итерации цикла может сделать программу громоздкой
для пользователя.

+ Спрашивать

пользователя в начале программы, сколько в последовательности имеется

значений. Правда, это также может причинить пользователю неудобства. Если последо­
вательность очень длинная, и пользователь не знает количество значений, которые она

содержит, то это потребует от него вести их учет.

При обработке длинной последовательности значений при помощи цикла, вероятно, более
оптимальный прием состоит в использовании сигнальной метки. Сигншrьная метка

-

это

специальное значение, которое отмечает конец последовательности значений. Когда про­

грамма читает значение сигнальной метки, она знает, что достигла конца последовательно­
сти, и поэтому цикл завершается.

Например, врачу требуется программа, которая вычисляет среднюю массу всех его пациен­
тов. Такая программа могла бы работать следующим образом: цикл предлагает пользовате­
лю ввести массу пациента либо О, если данных больше нет. Когда программа считывает О
в качестве массы, она интерпретирует это как сигнал, что весовых данных больше нет. Цикл
завершается, и программа выводит среднюю массу.

Значение сигнальной метки должно быть характерным настолько, что оно не будет ошибоч­
но принято за регулярное значение последовательности. В приведенном ранее примере врач

(либо его помощник) вводит О, что говорит о завершении последовательности весовых дан­
ных. Поскольку масса пациента не может равняться О, такое значение хорошо подойдет для
использования в качестве сигнальной метки.

\j) ····~
Применение сигнальной метки
Налоговая служба муниципального округа исчисляет ежегодные налоги на имущество с ис­
пользованием приведенной ниже формулы:
налог на имущество= стоимость имущества х

0.0065.

Каждый день сотрудник налоговой службы получает список имущественных объектов и

должен исчислять налог для каждого объекта в списке. Вас попросили разработать програм­
му, которую сотрудник может использовать для выполнения этих расчетов.

Глава 4. Структуры с повторением

201

В интервью с налоговым сотрудником вы узнаете, что каждому имущественному объекту

присваивается номер лота, и все номера лотов равны или больше

1.

Вы решаете написать

цикл, который использует в качестве значения сигнальной метки число О. Во время каждой

итерации цикла программа будет предлагать сотруднику ввести номер лота либо О для
завершения. Соответствующий код показан в программе

Программа 4.13
1 #

1

4.13.

(ргорегtу_tах.ру)

Эта программа показывает

налоги на имущество.

2

3 TAX_FACTOR = 0.0065 #

Представляет налоговый коэффициент.

4

5 # Получить номер первого лота.
6 рrint('Введите номер имущественного лота')
7 print ('либо О, чтобы завершить работу. ')
8 lot = int(input('Hoмep лота: '))
9

10 # Продолжить обработку, пока пользователь
11 # не введет номер лота О.
12 while lot != О:
13
# Получить стоимость имущества.
14
value = float(input('Bвeдитe стоимость
15
16
# Исчислить налог на имущество.
17
tax = value * ТАХ FACTOR

имущества:

'))

18

19
20
21
22
23
24
25

#

Показать

print
#

налог.

('Налог на имущество:

Получить

$', format (tax, '. 2f'), sep=' ')

следующий номер лота.

рrint('Введите

следующий номер либо')

print ('введите О, чтобы завершить
lot = int(input('Hoмep лота: '))

работу.

')

Вывод программы (вводимые данные выделены жирным шрифтом)
Введите

номер имущественного лота

либо О ,

чтобы завершить работу .

Номер лота :

100 1Enter 1

Введите стоимость имущества :
Налог на имущество :

100000 IEnter l

$650 . 00

Введите следующий номер либо

введите О ,

Номер лота :

чтобы завершить работу .

200 IEnterl

Введите стоимость имущества :
Налог на имущество :

5000 IEnterl

$32 . 50

Введите следующий номер либо
введите

О,

Номер лота :

чтобы завершить работу .

О

IEnterl

202

Глава 4. Структуры с повторением

~ Контрольная точка
4.18.

Что такое сигнальная метка?

4.19.

Почему следует позаботиться о выборе для сигнальной метки характерного значения?

11111111111

4.6

н

в

11111111(__ КЛЮЧЕВЫЕ ПОЛОЖЕНИЯ
Валидация входных данных

-

это процесс обследования данных, введенных в програм­

му, с целью убедиться в их допустимости, прежде чем они будут использованы в вычис­

лениях. Валидация входных данных обычно выполняется при помощи цикла, который
повторяется до тех пор, пока входная переменная ссылается на плохие данные.

Одно из самых известных высказываний среди программистов звучит так: "Мусор зало­
жишь, мусор получишь". Это высказывание, иногда сокращаемое до

garbage out),

GIGO (garbage in,

обозначает тот факт, что компьютеры не способны видеть разницы между хо­

рошими и плохими данными. Если на входе в программу пользователь предоставит плохие

данные, то программа эти плохие данные обработает и в результате произведет плохие дан­
ные на выходе. Например, взгляните на расчет заработной платы в программе

4.14

и обрати­

те внимание, что происходит в демонстрационном выполнении программы, когда на входе
пользователь предоставляет плохие данные.

Гпро~амм~ ~

(gross_pay.py)

1 # Эта программа показывает заработную плату до удержаний.
2 # Получить количество отработанных часов.
3 hours = int(input('Bвeдитe часы, отработанные на этой неделе: '))
4

5 # Получить
6 pay_rate =

почасовую ставку.
float(input('Bвeдитe

почасовую ставку:

'))

7

8 # Рассчитать заработную плату до удержаний.
9 gross_pay = hours * pay_rate
10
11 # Показать заработную плату до удержаний.
12 рrint('Заработная плата до удержаний составляет: $',
13
format(gross_pay, '.2f'), sep=' ')
Вывод проrраммы (вводимые данные выделены жирным шрифтом)
Введите часы ,

400

отработанные на этой неделе :

Введите почасовую ставку :

20

Заработная плата до удержаний составляет :

$8000 . 00

Вы заметили, что на входе были предоставлены плохие данные? Человек, которому вручат

чек на получения зарплаты, будет приятно удивлен, потому что в демонстрационном выпол­
нении программы сотрудник бухгалтерии в качестве количества отработанных часов ввел

400.

Сотрудник, вероятно, имел в виду

40,

потому что в неделе не может быть

400

часов.

Глава 4. Структуры с повторением

203

Тем не менее компьютер об этом факте не знает, и программа обработала плохие данные
так, как если бы они были хорошими. Можете ли вы представить другие типы входных

данных, которые могут быть переданы в эту программу и в результате приведут к плохим
выходным результатам? Один такой пример
отработанных часов; еще один

-

-

это отрицательное число, введенное для

недопустимая почасовая ставка оплаты труда.

Иногда из новостных сообщений мы узнаем истории о компьютерных ошибках, которые по
недоразумению в итоге взимают с людей тысячи долларов за незначительные покупки или

возмещают им большие суммы по уплате налогов, на получение которых они не имеют пра­
во. Однако эти "компьютерные ошибки" редко являются результатом работы компьютера;
они чаще всего вызваны плохими данными, которые были считаны в программу на входе.
В программе целостность данных на выходе хороша лишь настолько, насколько хороша це­

лостность ее данных на входе. По этой причине вам следует разрабатывать программы та­
ким образом, чтобы на вход никогда не допускались плохие данные. Данные, поступающие
на вход программы, должны быть тщательно обследованы, прежде чем они будут обработа­

ны. Если входные данные недопустимы, то программа должна их отбросить и предложить
пользователю ввести правильные данные. Этот процесс называется валидацией входных
данных.
На рис.

4. 7

показан стандартный метод валидации входного значения. В этом методе вход­

ное значение считывается, затем выполняется цикл. Если входное значение неправильное, то

цикл исполняет свой блок инструкций. Цикл выводит сообщение об ошибке, чтобы пользо­
ватель знал, что входное значение было недопустимым, и затем он считывает новое входное
значение. Цикл повторяется до тех пор, пока входное значение будет неправильным.

Получить входное
значение

Значение

>-И_с_ти_н"а~, Показать сообщение,_____

неправильное?

об ошибке

Получить входное
значение еще раз

Ложь

РИС.

4.7.

Логическая схема с циклом валидации входных данных

Обратите внимание, что блок-схема на рис.

4.7

читает данные в двух местах: сначала сразу

перед циклом и затем внутри цикла. Первая входная операция

циклом

-

-

непосредственно перед

называется первичны~w чтением, и ее задача состоит в том, чтобы получить пер­

вое входное значение, которое будет проверено циклом валидации. Если это значение будет
недопустимым, то цикл будет выполнять последующие входные операции.
Давайте рассмотрим пример. Предположим, что вы разрабатываете программу, которая счи­
тывает оценку за контрольную работу, и вы хотите убедиться, что пользователь не вводит
значение меньше О. Приведенный ниже фрагмент кода показывает, как можно применить

цикл валидации входных данных для отклонения любого входного значения меньше О.

204

Глава 4. Структуры с повторением

#

Получить оценку за контрольную работу.

score = int(input('Bвeдитe оценку за ко нтрольную рабо ту: '))
# Убедиться, что она не меньше О.
while score < О:
print ('ОШИБКА: оценка не может быть отрицательной.')
score = int(input('Bвeдитe правильную оценку: '))
Этот фрагмент кода сначала предлагает пользователю ввести оценку за контрольную работу
(это первичное чтение), затем выполняется цикл

Вспомните, что цикл

while.

циклом с предусловием, т. е. он проверяет выражение

score <

while

является

о перед выполнением итера­

ции. Если пользователь ввел допустимую оценку за тест, то это выражение будет ложным, и
цикл итерацию не выполнит. Однако если оценка за тест будет недопустимой, то выражение

будет истинным, и исполнится блок инструкций цикла. Цикл выводит сообщение об ошибке
и предлагает пользователю ввести правильную оценку за контрольную работу. Цикл про­
должит повторяться до тех пор, пока пользователь не

введет допустимую оценку за кон­

трольную работу.

ПРИМЕЧАНИЕ
Цикл валидации входных данных иногда называется ловушкой ошибок или обработчиком ошибок.

Этот фрагмент кода отклоняет только отрицательные оценки . Что, если также требуется от­
клонять любые оценки за контрольную работу выше

5?

Цикл валидации входных данных

можно видоизменить так, чтобы в нем использовалось составное булево выражение, как по­
казано ниже.

# Получит ь оценку за те ст .
score = int(input('Bвeдитe
#

Убедиться,

while score <

О

p rint('или

=

'))

5.

or score > 5:

print(' OillИБКA:

scor e

оценку за контрольную работу :

что она не меньше О или бол ьше

оценка не может быть о трицательн ой . ')

вьШJе

5.')

int( inpu t ('Bвeдитe правильную оцен ку:

'))

В этом фрагменте кода цикл определяет, является ли оценка меньше О или больше

5.

Если

любое из них истинное, то выводится сообщение об ошибке, и пользователю предлагается
ввести правильную оценку.

Написание цикла валидации входных данных
Саманта владеет предприятием, которое занимается импортом, и она вычисляет розничные
цены своих товаров при помощи приведенной ниже формулы :
розничная цена= оптовая стоимость х

2.5.

Для вычисления розничных цен она в настоящее время использует код, который представ­
лен в программе

4.15.

Глава 4. Структуры с повторением

Программа 4.15
1 #

Эта

1

205

(retail_no_validation.py)

программа вычисляет розничные цены.

2

3 МАRК UP = 2.5
4 another = 'д'

#
#

Процент надбавки.
Переменная управления циклом.

5

6 # Обработать один или несколько товаров.
7 while another == 'д' or another -- 'Д':
8

9
10

#

Получить

оптовую стоимость

wholesale =

товара.

float(input("Bвeдитe
"товара:

оптовую стоимость

" +

"))

11

12
13
14
15
16
17

# Вычислить розничную цену.
retail = wholesale * МАRК UP

#

Показать розничную цену.

рrint('Розничная цена:

$', format(retail,

'.2f'), sep=' ')

18

19
20
21

# Повторить?
another = input('Ecть еще
' (Введите

один
д,

товар?

если да)

' +
: ')

Вывод nроrраммь1 (вводимые данные выделены жирным шрифтом)

Введите оптовую стоимость товара :
Розничная цена :

10 IEnter l

$25 . 00

Есть еще один товар?

(Введите д ,

если да) : А IEnter l

Введите оптовую стоимость товара : 15 IEnterl
Розничная цена :

$37 . 50

Есть еще один товар?

(Введите д ,

Введите оптовую стоимость товара :
Розничная цена :

если да)

:

А

1Enter1

12.5 IEnterl

$31 . 25

Есть еще один товар?

(Введите д ,

если да)

:

и

1Enter1

Тем не менее во время использования программы Саманта столкнулось с проблемой. Не­
которые продаваемые ею товары имеют оптовую стоимость
в программу как
она

иногда

0.50.

случайно

50

центов, которые она вводит

Поскольку клавиша О расположена рядом с клавишей знака "минус",
вводит

отрицательное

число.

Она

попросила

вас

видоизменить

программу так, чтобы та не давала ей вводить отрицательное число для оптовой стои­
мости.

Вы решаете добавить в программу цикл валидации входных данных, который отклоняет лю­
бые отрицательные числа, которые вводятся в переменную

wholesale. Программа 4.16 ил­

люстрирует пересмотренный код с новым программным кодом валидации входных данных,

показанным в строках

13-16.

Глава 4. Структуры с повторением

206

Программа 4.16
1 #

1

(retail_with_validation.py)

Эта программа вычисляет розничные цены.

2

3 МАRК UP = 2.5 #
4 another = 'д' #

Процент надбавки.
Переменная управления циклом.

5
б # Обработать один или несколько товаров.
7 while another == 'д' or another == 'Д':
8
# Получить оптовую стоимость товара.
9
wholesale = float(input("Bвeдитe оптовую
10
"товара: "))

стоимость

" +

11

12
13
14
15

17
18
19
20
21
22
23
24
25
26
27

#

Проверить

допустимость

оптовой стоимости.

while wholesale < О:
print ('ОШИБКА: стоимость не может быть отрицательной.')
wholesale = float(input('Bвeдитe правильную ' +
'оптовую стоимость : ' ) )
#

Вычислить

розничную цену.

retail = wholesale *

#

Показать

МАRК

UP

розничную цену.

рrint('Розничная цена:$',

# Повторить?
another = input('Ecть еще
' (Введите

format(retail, '.2f'), sep=")

один
д,

товар?

если да)

' +
: ')

Вывод nроrраммы (вводимые данные выделены жирным шрифтом)
Введите оптовую стоимость товара :
О!Ш1БКА :

стоимость

-.50

не может быть отрицательной .

Введите правильную оптовую стоимость :
Розничная цена :

$1 . 25

Есть еще один товар?

~

0.50

(Введите д ,

если да)

:

н

Контрольная точка
4.20. Что

означает фраза "мусор заложишь, мусор получишь"?

4.21. Дайте
4.22.

общее описание процесса валидации входных данных.

Опишите обычно предпринимаемые шаги, когда для проверки допустимости данных
используется цикл валидации входных данных.

4.23.

Что такое первичное чтение? Какова его задача?

4.24.

Сколько итераций выполнит цикл валидации входных данных, если входное значение,
которое прочитано первичным чтением, допустимо?

Глава 4. Структуры с повторением

207

~

4.7

енные

икль

~ КЛЮЧЕВЫЕ ПОЛОЖЕНИЯ
Цикл, который расположен внутри еще одного цикла, называется вложенным циклом.
Вложенный цикл

-

это цикл,который расположен в еще одном цикле. Часы являются хо­

рошим примером того, как работает вложенный цикл. Секундная, минутная и часовая стрел­

ки вращаются вокруг циферблата. Часовая стрелка смещается всего на

1 шаг (час) для
60 шагов или 1 оборота минутной стрелки. И секундная стрелка должна сделать
60 шагов (1 оборот) для 1 шага минутной стрелки. Это означает, что для каждого полного
оборота часовой стрелки (12 шагов), минутная стрелка делает 720 шагов. Вот цикл, который
частично моделирует электронные часы. Он показывает секунды от О до 59:
каждых

for seconds in range(60):
print(seconds)
Можно добавить переменную minutes и вложить цикл выше внутрь еще одного цикла, кото­
рый повторяется

60

минут:

for minutes in range(60):
for seconds in range(60):
print(minutes, ': ', seconds)
Для того чтобы сделать модель часов законченной, можно добавить еще одну переменную
для подсчета часов:

for hours in range(24):
for minutes in range(60):
for seconds in range(60):
print(hours, ': ', minutes,

.

1. 1

' seconds)

Вывод этого фрагмента кода будет таким:

0:0:0
0:0:1
0:0:2
(Программа подсчитает все секунды в

24

часах.)

23:59:59
Самый внутренний цикл сделает
цикл сделает

60

60

итераций для каждой итерации среднего цикла. Средний

итераций для каждой итерации самого внешнего цикла. Когда самый внеш­

ний цикл сделает
цикл сделает

24 итерации, средний цикл сделает 1440 итераций, и самый внутренний
86 400 итераций! На рис. 4.8 представлена блок-схема законченной программы

имитационной модели часов, которая была показана ранее.
Пример имитационной модели часов подводит нас к нескольким моментам, имеющим от­
ношение к вложенным циклам:

+ внутренний цикл выполняет все свои итерации для каждой отдельной итерации внешнего
цикла;

+ внутренние циклы завершают свои итерации быстрее, чем внешние циклы;
+ для того чтобы получить общее количество итераций вложенного цикла, надо перемно­
жить количество итераций всех циклов.

Глава 4. Структуры с повторением

208

Начало

Истина
часов есть еще одно

значение?

Присвоить следующее

Ложь

значение в сnиске часов

nеременной

hour

Конец

Истина

Присвоить следующее
Ложь

значение в сnиске минут

nеременной

minute

Истина

Присвоить следующее
значение в сnиске

Ложь

секунд переменной

second

print(hours, ':',
minutes, ':', seconds)

РИС.

4.8.

Блок-схема имитационной модели часов

В программе

4.17

приведен еще один пример. Эта программа может использоваться учите­

лем для получения среднего балла каждого студента. Инструкция в строке
у пользователя количество студентов, а инструкция в строке
чете на студента. Цикл

for,

каждой оценки.

запрашивает

8 - количество оценок в рас­
11, повторяется один раз для
17-21 повторяется один раз для

который начинается в строке

каждого студента. Вложенный внутренний цикл в строках

5

Глава 4. Структуры с повторением

1

Программа 4.17
1 #
2 #

Эта

1

(test_score_averages.py)

програ!v!Ма усредняет оценки.

студентов и количество

Она

запрашивает количество

оценок в расчете

на

студента.

3

4 # Получить количество студентов.
5 num_students = int(input('Cкoлькo

у

вас

студентов?

'))

6

7 # Получить количество оценок в расчете на студента.
8 num test scores
int(input('Cкoлькo оценок в расчете

на

студента?

9

10 # Определить средний балл каждого студента.
11 for student in range(num_students):
12
# Инициализировать накопитель оценок.
13
total = О.О
14
# Получить оценки за лабораторные работы.
15
print ('Номер студента', student + 1)
print('----------------')
16
17
for test num in range(num_test scores):
18
print('Hoмep лабораторной работы', test num + 1, end=' ')
19
score = float(input(': '))
20
# Прибавить оценку в накопитель.
21
total += score
22
# Рассчитать средний балл этого студента.
23
24
average = total / num test scores
25

26
27
28
29

#

Показать

средний балл.

рrint('Средний балл
'составляет:

студента

номер',

student + 1,

', average)

print ()

Вывод nроrраммы (вводимые данные выделены жирным шрифтом)

Сколько у вас студентов? З

IEnterl

Сколько оценок в расчете на студента? З
Номер студента

IEnterl

1

Номер лабораторной работы

1 : 4 IEnterl
2 : 4 IEnterl
Номер лабораторной работы 3 : 5 IEnterl
Средний балл студента номер 1 составляет : 4 . 3
Номер лабораторной работы

Номер студента

2

---------------Номер лабораторной

работы

з

1:

1Enterl

Номер лабораторной работы

2 : 4 1Enterl

Номер лабораторной работы

3 : 5 1Enter 1

Средний балл студента номер

2

составляет :

4.0

'))

209

21 О

Глава 4. Структуры с повторением

Номер студента

З

Номер лабораторной работы

1 : 5 1Enter 1

Номер лабораторной работы

2 : 5 1Enter 1

Номер лаборатор ной работы

3 : 4 1Enter 1
3 составляет : 4 . 6

Средний балл студента номер

В

ЕН

я

Применение вложенных циклов для печати комбинаций символов
Один интересный способ узнать о вложенных циклах состоит в их использовании для выво­

да на экран комбинаций символов. Давайте взглянем на один простой пример. Предполо­
жим, что мы хотим напечатать на экране звездочки в приведенной ниже прямоугольной

комбинации:

******

******
******
******
******
******
******
******
Если представить эту комбинацию как строки и столбцы, то вы увидите, что у нее восемь

строк, и в каждой строке шесть столбцов. Приведенный ниже фрагмент кода можно исполь­
зовать для вывода одной строки звездочек:

for col in range(б):
print ( '*', end=' ')
Если исполнить этот фрагмент кода в программе или в интерактивном режиме, то он произ­
ведет приведенный ниже результат:

******
Для того чтобы завершить всю комбинацию, нам нужно исполнить этот цикл восемь раз.
Мы можем поместить этот цикл в еще один цикл, который делает восемь итераций, как
показано ниже:

1 for row in range(8):
2
for col in range(б):
З
print('*', end='')
4
print ()
Внешний цикл делает восемь итераций. Во время каждой итерации этого цикла внутренний

цикл делает

6

итераций. (Обратите внимание, что в строке

4

после того, как все строки были

напечатаны, мы вызываем функцию print (). Мы должны это сделать, чтобы в конце каждой
строки продвинуть экранный курсор на следующую строку. Без этой инструкции все звез­

дочки будут напечатаны на экране в виде одной длинной строки.)

Глава 4. Структуры с повторением

211

Легко можно написать программу, которая предлагает пользователю ввести количество

строк и столбцов, как показано в программе

Программа 4.18
1
2
3
4

#

J

4.18.

(гectangular_pattern.py)

Эта программа

выводит прямоугольную комбинацию

# звездочек.
rows = int(input('Cкoлькo
cols = int(input('Cкoлькo

строк?

'))

столбцов?

'))

5

6 for r in range(rows):
7
for с in range(cols):
8
print ( '*' , end=' ')
9
print ()
Вывод программы (вводимые данные выделены жирным шрифтом)

Сколько строк?

5 IEnter l
10 JEnter l

Сколько столбцов?

**********
******** *
*** * ******
**********

*'***'*****
Давайте рассмотрим еще один пример. Предположим, что вы хотите напечатать звездочки
в комбинации, которая похожа на приведенный ниже треугольник:

*

**
***

****
*****
******
*******
********
И снова представьте эту комбинацию звездочек, как сочетание строк и столбцов. В этой

комбинации всего восемь строк. В первой строке один столбец. Во второй строке
столбца. В третьей строке

столбцов. В программе

4.19

4.19

(triangle_pattern.py)

1 # Эта программа
2 BASE SIZE = 8

выводит треугольную комбинацию.

3

4 for r in range(BASE_SIZE):
5
for с in range(r + 1):

два

представлен соответствующий код, который производит эту

комбинацию.
Программа

-

три. И так продолжается до восьмой строки, в которой восемь

Глава 4. Структуры с повторением

212
j

6
7

print ( '*', end=' ')
print()

Вывод программы

*
**
***

****
*****
******

*******
********
Сначала давайте взглянем на внешний цикл. В строке

дает

итерируемый

объект,

содержащий

4

приведенную

выражение range (BASE _ SIZE) соз­

ниже

последовательность

целых

чисел:

1, 2, 3, 4, 5, 6, 7

О,

Как результат, во время выполнения внешнего цикла переменной
от О до

7.

Выражение range во внутреннем цикле в строке

r

присваиваются значения

записано как range (r

5

+ 1).

Внутренний цикл выполняется следующим образом.

+ Во

время первой итерации внешнего цикла переменной

r

присваивается значение О.

Выражение range (r + 1) побуждает внутренний цикл сделать одну итерацию, напечатав
одну звездочку.

+ Во

время второй итерации внешнего цикла переменной

Выражение range (r

+ 1)

r

присваивается значение

1.

побуждает внутренний цикл сделать две итерации, напечатав

две звездочки.

+ Во

время третьей итерации внешнего цикла переменной

r

присваивается значение

2.

Выражение range (r + 1) побуждает внутренний цикл сделать три итерации, напечатав
три звездочки и т. д.

Давайте взглянем на еще один пример. Предположим, что вы хотите вывести приведенную
ниже ступенчатую комбинацию:

#
#
#
#
#
#
В этой комбинации шесть строк. В целом можно описать каждую строку как ряд пробелов,
после которых следует символ #.Вот построчное описание:
Первая строка:

О пробелов, после которых идет символ

Вторая строка:

1 пробел, после которых идет символ #.
2 пробела, после которых идет символ #.
3 пробела, после которых идет символ #.

Третья строка:

Четвертая строка:

#.

Глава 4. Структуры с повторением
Пятая строка:

213

4 пробела, после которых идет символ #.
5 пробелов, после которых идет символ #.

Шестая строка:

Для того чтобы вывести эту комбинацию, можно написать код с парой вложенных циклов,
которые работают следующим образом.

+ Внешний цикл делает шесть итераций. Каждая итерация будет делать следующее:


внутренний цикл поочередно выведет правильное количество пробелов;



затем будет выведен символ#.

В программе

Программа

1 #
2

4.20

Python.

(stair_step_pattern.py)

STEPS = 6

for

6
7

представлен соответствующий код

Эта программа выводит ступенчатую комбинацию.

NUМ

3
4 for r in
5

4.20

range(NUМ_STEPS):
с

in range(r):

print ('

', end=' ')

print ( '#')

Вывод программы

В строке

4

выражение range (NUМ_STEPS) создает итерируемый объект, содержащий приве­

денную ниже последовательность целых чисел:

О,

1, 2, 3, 4, 5

Как результат, внешний цикл делает

6

итераций. Во время выполнения внешнего цикла

переменной r присваиваются значения от О до

5.

Внутренний цикл выполняется следующим

образом.

+ Во время первой итерации внешнего цикла переменной r
имеет вид

присваивается значение О. Цикл

for с in range (0) : и повторяется ноль раз, поэтому внутренний цикл не вы­

полняется.

+ Во время второй итерации внешнего цикла переменной r
имеет вид

присваивается значение

1.

Цикл

for с in range (1): и повторяется один раз, поэтому внутренний цикл делает

одну итерацию, печатая один пробел.

+ Во

время третьей итерации внешнего цикла переменной r присваивается значение

2.

Цикл имеет вид for с in range (2): и повторяется два раза, поэтому внутренний цикл
делает две итерации, печатая два пробела и т. д.

Глава 4. Структуры с повторением

214
11111111111

4.8

Черепашья графика:

..-.i п
L

именение циклов для рисования узоров

КЛЮЧЕВЫЕ ПОЛОЖЕНИЯ
Циклы можно применять для рисования графических изображений, которые различаются

по сложности от простых фигур до изощренных узоров.
Циклы с черепахой применяются для рисования как простых фигур, так и довольно слож­
ных узоров. Например, приведенный ниже цикл
вать квадрат шириной

for

in range(4):
turtle.forward(lOO)
turtle.right(90)

зан на рис.

РИС.

4.9.

делает четыре итерации, чтобы нарисо­

х

А здесь цикл

for

for

100 пикселов:

for

делает восемь итераций, чтобы нарисовать восьмиугольник, который пока­

4.9:

in range(8):
turtle.forward(lOO)
turtle.right(45)

х

Восьмиугольник

В программе

РИС.

4.21

4.10.

Концентрические круги

приведен пример, в котором применяется цикл для рисования концентри­

ческих кругов 1 • Вывод этой программы показан на рис.
Программа

4.21

4.10.

(concentric_clrcles.py)

1 # Концентрические
2 import turtle

круги.

3

4 # Именованные константы.
5 NUМ CIRCLES
20

1 Концентрические

круги -

это круги с общим центром. - Прим. ред.

Глава 4. Структуры с повторением

215

6 STARTING RADIUS
20
7 OFFSET = 10
8 ANIМATION SPEED = О
9

10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32

#

Настроить черепаху.

turtle.speed(ANIМATION_SPEED)

turtle.hideturtle()
# Задать радиус первого круга.
radius = STARTING RADIUS
#Нарисовать

круги.

for count in range(NUМ_CIRCLES):
# Нарисовать круг.
turtle.circle(radius)
#

Получить

х =
у=

координаты следующего круга.

turtle.xcor()
turtle.ycor() - OFFSET

# Вычислить радиус следующего
radius = radius + OFFSET
# Позиция черепахи
turtle.penup()
turtle.goto(x, у)
turtle.pendown()

круга.

для следующего круга.

Используя черепаху для неоднократного начертания простой фигуры, наклоняя ее под слег­
ка отличающимся углом всякий раз, когда она рисует фигуру, можно создать целый ряд
интересных узоров. Например, узор на рис.

РИС.

4.11.

Узор, созданный с использованием кругов

4.11

бьm создан путем нанесения

36

кругов при

Глава 4. Структуры с повторением

216

помощи цикла. После начертания круга черепаха наклоняется влево на

ме

4.22

Программа

4.22

10°.

В програм­

приведен соответствующий код, который создал этот узор.

(spiral_circles.py)

1 # Эта программа
2 import turtle

рисует узор,

используя повторяющиеся круги.

з

4 # Именованные константы.
5 NUМ CIRCLES = 36
# Количество рисуемых кругов.
6 RADIUS = 100
# Радиус каждого круга.
7 ANGLE = 10
# Угол поворота.
8 ANIМATION SPEED
О
# Скорость анимации.
9

10
11
12
13
14
15
16
17

#

Задать

скорость

анимации.

turtle.speed(ANIМATION_SPEED)

#

Нарисовать

кругов,

наклоняя черепаху на

градусов после того,

# 10

for

36

как каждый круг был нарисован.

in range(NUМ_CIRCLES):
turtle.circle(RADIUS)
turtle.left(ANGLE)
х

Программа

4.23

демонстрирует еще один пример. Она рисует последовательность

мых линий для создания узора, который показан на рис.
Программа

4.23

(spiral_lines.py)

1 # Эта программа
2 import turtle

рисует узор,

используя повторяющиеся линии.

3

4 # Именованные константы
5 START Х = -200
# Стартовая координата Х.
6 START У = О
# Стартовая координата У.
7 NUМ LINES = 36
# Количество рисуемых линий.
8 LINE LENGTH = 400
# Длина каждой линии.
9 ANGLE = 170
# Угол поворота.
10 ANIМATION SPEED
о
# Скорость анимации.
11

12
13
14
15
16
17
18
19
20

#

Переместить черепаху в начальную позицию.

turtle.hideturtle()
turtle.penup()
turtle.goto(START_X, START_Y)
turtle.pendown()
#

4.12.

Задать скорость

анимации.

turtle.speed(ANIМATION_SPEED)

36

пря­

Глава 4. Структуры с повторением

!

21 # Нарисовать 36 кругов, наклоняя черепаху на
22 # 170 градусов после того, как каждая линия была
23 for х in range(NUМ_LINES):
24
turtle.forward(LINE_LENGTH)

217

нарисована.

L2s ___t_u:t_1_e_._1e~_t_(_AN_GL_E~---------- ______

РИС.

в

4.12.

Узор, созданный программой

росы для

4.23

ия

ов

Множественный выбор

1.

Цикл с

использует логическое условие со значениями истина/ложь для

управления количеством раз, которые он повторяется.

2.

3.

а)

булевым выражением;

б)

условием повторения;

в)

принятием решения;

г)

счетчиком повторений.

Цикл с

повторяется заданное количество раз.

а)

булевым выражением;

б)

условием повторения;

в)

принятием решения;

г)

счетчиком повторений.

Каждое повторение цикла называется
а)

циклом;

б)

полным оборотом;

в)

орбитой;

г)

итерацией.

_____

218

Глава 4. Структуры с повторением

4.

Цикл while -

это вид цикла - - - - -

а)

с предусловием;

б)

без условия;

в)

с предварительной оценкой;

г)

с постусловием.
цикл не имеет возможности завершиться и повторяется до тех пор, пока

5.

программа не будет прервана.

6.

а)

неопределенный;

б)

не завершающийся;

в)

бесконечный;

г)

вечный.

Оператор -= является примером оператора
а)

сравнения;

б)

расширенного присваивания;

в)

составного присваивания;

г)

обратного присваивания.

_ _ _ __

переменная содержит нарастающий итог.

7.
а)

сигнальная;

б)

суммарная;

в)

итоговая;

г)

накапливающая.

8.

-

это специальное значение, которое сигнализирует, когда в списке больше

не осталось значений. Оно не должно быть ошибочно принято за значение из списка.

9.

1О.

а)

сигнальная метка;

б)

флаг;

в)

сигнал;

г)

накопитель.

Аббревиатура

GIGO

обозначает

_ _ __

а)

отличное значение на входе, отличное значение на выходе;

б)

мусор заложишь, мусор получишь;

в)

ГИГ Агерцовую производительность;

г)

ГИГ Абайтную операцию.

Целостность данных на выходе хороша лишь настолько, насколько хороша целостность
ее

-----

а)

компилятора;

б)

языка программирования;

в)

данных на входе;

г)

отладчика.

Глава 4. Структуры с повторением

11.

Входная операция, которая выполняется непосредственно перед циклом валидации данных, называется

12.

219

_____

а)

предвалидационным чтением;

б)

изначальным чтением;

в)

инициализационным чтением;

г)

первичным чтением.

Циклы валидации данных также называются
а)

ловушками ошибок;

б)

циклами Судного дня;

в)

циклами предотвращения ошибок;

г)

защитными циклами.

-----

Истина или ложь

1.

Цикл с условием повторения всегда повторяется заданное количество раз.

2.

Цикл while -

3.

Следующее утверждение вычитает

4.

Накапливающие переменные не нужно инициализировать.

5.

Во вложенном цикле внутренний цикл выполняет все свои итерации для каждой итера­

это цикл с предусловием.

1 из

х: х = х

- 1.

ции внешнего цикла.

6.

Для того чтобы вычислить общее количество итераций вложенного цикла, следует сло­
жить число итераций всех циклов.

7.

Процесс валидации входного значения работает следующим образом: когда пользователь
программы вводит недопустимое значение, программа должна спросить: "Вы уверены,
что хотели ввести именно это?". Если пользователь отвечает "да", то программа должна
принять данные.

Короткий ответ

1.

Что такое цикл с условием повторения?

2.

Что такое цикл со счетчиком повторений?

3.

Что такое бесконечный цикл? Напишите программный код для бесконечного цикла.

4.

Почему соответствующая инициализация накапливающих переменных имеет критически
важное значение?

5.

В чем преимущество применения сигнальной метки?

6.

Почему значение, применяемое в качестве сигнальной метки, следует тщательно отби­
рать?

7.

Что означает выражение "мусор заложишь, мусор получишь"?

8.

Дайте общее описание процесса валидации входных данных.

Глава 4. Структуры с повторением

220

Алгоритмический тренажер

1.

Напишите цикл

while, который позволяет пользователю ввести число. Число должно
1О, и результат присвоен переменной с именем product. Цикл должен

быть умножено на

повторяться до тех пор, пока product меньше

2.

100.

Напишите цикл while, который просит пользователя ввести два числа. Числа должны
быть сложены, и показана сумма. Цикл должен запрашивать у пользователя, желает ли он
выполнить операцию еще раз. Если да, то цикл должен повториться, в противном случае
он должен завершиться .

3.

Напишите цикл for, который выводит приведенный ниже ряд чисел:
О,

10, 20, 30, 40, 50, ... , 1000

4.

Напишите цикл, который просит пользователя ввести число. Цикл должен выполнить
1О итераций и вести учет нарастающего итога введенных чисел.

5.

Напишите цикл, который вычисляет сумму приведенного ниже числового ряда:

1
30

2

3

30

29

28

1

-+-+-+."+-.
6.

Перепишите приведенные ниже инструкции с использованием операторов расширенного
присваивания.

7.

а)

х

=

х

+ 1·

б)

х

=

х

* 2·

в)

х

=

х

/ 10;

г)

х

=

х

'

'

100.

Напишите серию вложенных циклов, которые выводят

строке должно быть

8.

15

10

строк символов

#. В каждой

символов #.

Напишите программный код, который предлагает пользователю ввести положительное
ненулевое число и выполняет проверку допустимости входного значения.

9.

Напишите программный код, который предлагает пользователю ввести число в диапазоне

от

Зад

1 до 100 и
п

1.

ог

проверяет допустимость введенного значения.

а

ва

Сборщик ошибок. Сборщик ошибок собирает ошибки каждый день в течение пяти дней .
Напишите программу, которая ведет учет нарастающего итога ошибок, собранных в те­
чение пяти дней. Цикл должен запрашивать количество ошибок, собираемых в течение
каждого дня, и когда цикл завершается, программа должна вывести общее количество
собранных ошибок.

Bui'I

п ~апиrь Gоорщик ошибок" (Т/1Р

2.

R11g

r.nflpr.fГJr РrоЫет)

Сожженные калории. Бег на беговой дорожке позволяет сжигать

4,2

калорий в минуту.

Напишите программу, которая применяет цикл для вывода количества калорий, сожжен­
ных после

3.

10, 15, 20, 25

и

30 минут бега.

Анализ бюджета. Напишите программу, которая просит пользователя ввести сумму,
выделенную им на один месяц. Затем цикл должен предложить пользователю ввести
суммы отдельных статей его расходов за месяц и подсчитать их нарастающим итогом. По

Глава 4. Структуры с повторением

221

завершению цикла программа должна вывести сэкономленную или перерасходованную
сумму.

4.

Пройденное расстояние. Пройденное транспортным средством расстояние можно вы­

числить следующим образом:
расстояние

= скорость

Например, если поезд движется со скоростью
ное расстояние составит

270

90

х время.

км/ч в течение трех часов, то пройден­

км. Напишите программу, которая запрашивает у пользова­

теля скорость транспортного средства (в км/ч) и количество часов, которое оно двига­
лось. Затем она должна применить цикл для вывода расстояния, пройденного транспорт­

ным

средством для каждого

часа этого

периода времени.

Вот пример требуемого

результата:

Какая скорость транспортного средства в км/ч?
Сколько часов оно двигалось?
Час

5.

40 IEnterl

3 IEnterl

Пройденное расстояние

1

40

2
3

80
120

Средняя толщина дождевых осадков. Напишите программу, которая применяет вло­

женные циклы для сбора данных и вычисления средней толщины дождевых осадков за
ряд лет. Программа должна сначала запросить количество лет. Внешний цикл будет вы­

полнять одну итерацию для каждого года. Внутренний цикл будет делать двенадцать
итераций, одну для каждого месяца. Каждая итерация внутреннего цикла запрашивает

у пользователя миллиметры дождевых осадков в течение этого месяца. После всех итера­
ций программа должна вывести количество месяцев, общее количество миллиметров до­
ждевых осадков и среднюю толщину дождевых осадков в месяц в течение всего периода.

6.

Таблица соответствия между градусами Цельсия и градусами Фаренгейта. Напиши­

те программу, которая выводит таблицу температур по шкале Цельсия от О до

20

и их

эквиваленты по Фаренгейту. Формула преобразования температуры из шкалы Цельсия
в шкалу Фаренгейта:

9

F=-C+32,
5
где

F-

это температура по шкале Фаренгейта; С

-

температура по шкале Цельсия. Для

вывода этой таблицы ваша программа должна применить цикл.

7.

Мелкая монета для зарплаты. Напишите программу, которая вычисляет сумму денег,
которую человек заработает в течение периода времени, если в первый день его зарплата

составит одну копейку, во второй день две копейки и каждый последующий день будет
удваиваться. Программа должна запросить у пользователя количество дней, вывести

таблицу, показывающую зарплату за каждый день, и затем показать заработную плату до
налоговых и прочих удержаний в конце периода. Итоговый результат должен быть выве­
ден в рублях, а не в количестве копеек.

8.

Сумма чисел. Напишите программу с циклом, которая просит пользователя ввести ряд
положительных чисел. Пользователь должен ввести отрицательное число в качестве

сигнала конца числового ряда. После того как все положительные числа будут введены,
программа должна вывести их сумму.

222

Глава 4. Структуры с повторением

9.

Уровень океана. Допустим, что уровень океана в настоящее время повышается пример­

но на

1,6

мм в год. С учетом этого создайте приложение, которое выводит количество

миллиметров, на которые океан будет подниматься каждый год в течение следующих

25
1О.

лет.

Рост платы за обучение. В заданном университете обучение студента-очника составля­

ет

45 ООО рублей в семестр. Было объявлено, что плата за
3% каждый год в течение следующих 5 лет. Напишите

обучение будет повышаться на
программу с циклом, который

выводит плановую сумму за обучение в семестр в течение следующих

11.

5 лет.

Потеря массы. Если умеренно активный человек будет сокращать свое потребление
в калориях на

1,5

500

калорий в день, то, как правило, он может похудеть примерно на

кг в месяц. Напишите программу, которая позволяет пользователю ввести его исход­

ную массу и затем создает и выводит таблицу, показывающую, каким будет его ожидае­
мая масса в конце каждого месяца в течение следующих

6 месяцев,

если он останется на

этой диете.

12.

Вычисление факториала числа. В математике запись в форме п! обозначает факториал
неотрицательного целого числа п. Факториал п

ных целых чисел от

1 доп.

это произведение всех неотрицатель­

-

Например,

7!

=

1х 2

х

3

х

4

х

5

х

6

х

7 = 5040

и

4!

= 1 х 2 х 3 х 4 = 24.

Напишите программу, которая позволяет пользователю ввести неотрицательное целое

число и затем применяет цикл для вычисления факториала этого числа и показывает

факториал.

13.

Популяция. Напишите программу, которая предсказывает приблизительный размер по­
пуляции организмов. Приложение должно использовать текстовые поля, чтобы дать
пользователю

ввести

стартовое

количество

организмов,

среднесуточное

увеличение

популяции (как процент) и количество дней, которые организмам будет дано на размно­
жение. Например, допустим, что пользователь вводит приведенные ниже значения:



стартовое количество:



среднесуточное увеличение:



количество дней для размножения:

2;
30%;
1О.

Программа должна вывести показанную ниже таблицу данных:
День

Популяция

1
2
3
4
5
6
7
8
9
10

2
2,6
3,38
4,394
5, 7122
7,42586
9,653619
12,5497
16,31462
21,209

Глава 4. Структуры с повторением

14.

223

Напишите программу, которая применяет вложенные циклы для рисования этого узора:

*******
******
*****
****
***
**

*
15.

Напишите программу, которая применяет вложенные циклы для рисования этого узора:
н

# #
# #
#
#
#
#
#
#

16.

Черепашья графика: повторение квадратов. В этой главе вы увидели пример цикла,

который рисует квадрат. Напишите программу черепашьей графики, которая применяет
вложенные циклы для рисования
рис.

РИС.

100

квадратов, чтобы создать узор, показанный на

4.13.

4.13. Повторяющиеся квадраты

17.

Черепашья графика: звезд очный узор. Примените цикл с библиотекой черепашьей
графики, чтобы нарисовать узор, показанный на рис.

РИС.

4.14.

Звеэдочный узор

4.14.

Глава 4. Структуры с повторением

224

18.

Черепашья rрафика: rипнотический узор. Примените цикл с библиотекой черепашь­
ей графики, чтобы нарисовать узор, показанный на рис.

4.15.

r

[i]
1

РИС.

4.15.

Гипнотический узор

19.

Черепашья rрафика: знак

STOP.

В этой главе вы увидели пример цикла, который ри­

сует восьмиугольник. Напишите программу, которая применяет цикл для рисования

восьмиугольника со словом

STOP,

нарисованным в его центре. Знак

центрирован в графическом окне (рис.

4.16).

STOP

РИС.

4.16.

Знак

STOP

STOP

должен быть

11111111111

5.1

ение в

нкции

~ КЛЮЧЕВЫЕ ПОЛОЖЕНИЯ
Функция

-

это группа инструкций, которая существует внутри программы с целью

выполнения определенной задачи.

В главе

2

мы описали простой алгоритм вычисления заработной платы сотрудника. В нем

число отработанных часов умножается на почасовую ставку оплаты труда. Между тем,
более реалистический алгоритм расчета заработной платы делал бы намного больше, чем
этот. В реальном приложении полная задача расчета заработной платы сотрудника состояла
бы из нескольких подзадач, в частности:

+ получение почасовой ставки оплаты труда сотрудника;
+ получение числа отработанных часов;
+ расчет заработной платы сотрудника до удержаний;
+ расчет оплаты сверхурочных часов;
+ расчет налоговых и прочих удержаний;
+ расчет чистой заработной платы;
+ печать ведомости на получение заработной платы.
Большинство программ выполняет задачи, которые настолько крупные, что их приходится
разбивать на несколько подзадач. Поэтому программисты обычно подразделяют свои про­

граммы на небольшие приемлемые порции, которые называются функциями. Функция

-

это

группа инструкций, которая существует внутри программы с целью выполнения конкретной
задачи. Вместо того чтобы писать большую программу как одну длинную последователь­

ность инструкций, программист создает несколько небольших функций, каждая из которых

выполняет определенную часть задачи. Эти небольшие функции затем могут быть исполне­
ны в нужном порядке для выполнения общей задачи.
Такой подход иногда называется методом "разделяй и властвуй", потому что большая задача
подразделяется на несколько меньших задач, которые легко выполнить. На рис.

5.1

иллюст­

рируется эта идея путем сравнения двух программ: в одной из них для выполнения задачи
используется длинная сложная последовательность инструкций, в другой задача подразде­

ляется на меньшие по объему задачи, каждая из которых выполняется отдельной функцией.
При использовании в программе функций каждая подзадача обычно выносится в собствен­

ную функцию. Например, реальная программа расчета заработной платы могла бы иметь
такие функции:

Глава 5. Функции

226

+ функцию получения почасовой ставки оплаты труда сотрудника;
+ функцию получения количества часов;
+ функцию расчета заработной платы сотрудника до удержаний;
+ функцию расчета оплаты сверхурочных часов;
+ функцию расчета налоговых и прочих удержаний;
+ функцию расчета чистой заработной платы;
+ функцию печати ведомости на получение заработной платы.
Программа, которую пишут так, что каждая подзадача помещается в свою функцию, назы­
вается модуляризованной программой.

Эта программа является одной длинной и сложной
последовательностью инструкций

Инструкция
Инструкция

В этой программе задача была подразделена на
меньшие задачи, каждая из которых выполняется

отдельной функцией

def function1():
Инструкция

Инструкция

Инструкция

Инструкция

функция

Инструкция

Инструкция
Инструкция
Инструкция

def function2():
Инструкция

Инструкция

Инструкция

Инструкция

Инструкция

Инструкция

Инструкция
Инструкция
Инструкция
Инструкция
Инструкция
Инструкция
Инструкция
Инструкция
Инструкция
Инструкция
РИС.

5.1.

функция

def

functionЗ():
Инструкция
Инструкция

функция

Инструкция

def function4():
Инструкция
Инструкция

функция

Инструкция

Использование функций для разбиения задачи по методу "разделяй и властвуй"

Преимущества модуляризации программы

на основе функций
В результате разбиения программы на функции она получает следующие преимущества.

+ Более

простой код. Когда код программы разбит на функции, он проще и легче для

понимания. Несколько небольших функций намного легче читать, чем одну длинную
последовательность инструкций.

+ Повторное

использование кода. Функции также уменьшают дублирование программ­

ного кода в программе. Если определенная операция в программе выполняется в не­

скольких местах, то для выполнения этой операции можно один раз написать функцию и

Глава 5. Функции

227

затем ее исполнять в любое время, когда она понадобится. Это преимущество функций

называется повторным использованием кода.

+ Более простое тестирование. Когда каждая задача в программе содержится в собствен­
ной функции, процессы тестирования и отладки становятся проще. Программисты могут
индивидуально

протестировать

каждую

функцию

в

программе

и

определить,

выполняет ли она свою задачу правильно. Это упрощает процесс изолирования и исправ­

ления ошибок.

+ Более

быстрая разработка. Предположим, что программист или команда программи­

стов разрабатывают многочисленные программы. Они обнаруживают, что каждая про­
грамма выполняет несколько общих задач, таких как выяснение имени пользователя и
пароля, вывод текущего времени и т. д. Многократно писать программный код для всех
этих задач не имеет никакого смысла. Вместо этого для часто встречающихся задач пи­
шут функции, и эти функции могут быть включены в состав любой программы, которая
в них нуждается.

+

Упрощение

командной

работы. Функции также упрощают программистам работу

в командах. Когда программа разрабатывается как набор функций, каждая из которых
выполняет отдельную задачу, в этом случае разным программистам может быть поручено
написание различных функций.

Функции без возврата значения и с возвратом значения
В этой главе вы научитесь писать два типа функций: функции без возврата значения, или
пустые функции

(void function),

и функции с возвратом значения. Когда вызывается функция

без возврата значения, она просто исполняет содержащиеся в ней инструкции и затем за­
вершается. Когда вызывается функция с возвратом значения, она исполняет содержащиеся
в ней инструкции и возвращает значение в ту инструкцию, которая ее вызвала. Функция

input является примером функции с возвратом значения. При вызове функции input она
получает данные,

которые

пользователь

вводит

на

клавиатуре,

в качестве строкового значения. Функции int () и float () -

и

возвращает

эти

данные

тоже примеры функций с воз­

вратом значения. Вы передаете аргумент функции int (), и она возвращает значение этого
аргумента, преобразованное в целое число. Аналогичным образом вы передаете аргумент
функции float (), и она возвращает значение этого аргумента, преобразованное в число
с плавающей точкой.

Функция без возврата значения

-

это первый тип функции, которую вы научитесь писать.

Контрольная точка

5.1.

Что такое функция?

5.2.

Что означает фраза "разделяй и властвуй"?

5.3.

Каким образом функции помогают повторно использовать программный код?

5.4.

Каким образом функции ускоряют разработку многочисленных программ?

5.5.

Каким образом функции упрощают разработку программ командами программистов?

Глава 5. Функции

228
~

еление и вызов функции без возврата зна ения

5.2

~ КЛЮЧЕВЫЕ ПОЛОЖЕНИЯ
Программный код функции называется определением функции. Для исполнения функции
пишется инструкция, которая ее вызывает.

Прежде чем мы рассмотрим процесс создания и применения функций, следует упомянуть
несколько вещей об именах функций. Имена функциям назначаются точно так же, как
назначаются имена используемым в программе переменным. Имя функции должно быть
достаточно описательным, чтобы любой читающий ваш код мог обоснованно догадаться,

что именно функция делает.

Python

требует, чтобы вы соблюдали такие же правила, которые вы соблюдаете при имено­

вании переменных:

+

в качестве имени функции нельзя использовать одно из ключевых слов
табл.

1.2

Python

(см.

со списком ключевых слов);

+ имя функции не может содержать пробелы;
+ первый символ должен быть одной из букв от а до z, от А до Z либо символом подчерки­
вания

U;

+ после первого символа можно использовать буквы от а до z или от А до Z, цифры от О
до

9 либо

символы подчеркивания;

+ символы в верхнем и нижнем регистрах различаются.
Поскольку

функции

выполняют

действия,

большинство

программистов

предпочитает

в именах функций использовать глаголы. Например, функцию, которая вычисляет заработ­
ную плату до удержаний, можно было бы назвать calculate _gross _рау (рассчитать зара­
ботную плату до удержаний). Любому читающему программный код такое имя становится

очевидным, что функция что-то вычисляет. И что же она вычисляет? Разумеется, заработ­
ную плату до налоговых и прочих удержаний. Другими примерами хороших имен функций
будут get_hours (получить часы), get_pay_rate (получить ставку оплаты труда}, calculate_

overtime (рассчитать сверхурочные), print_check (напечатать чек) и т. д. Каждое приведен­
ное выше имя функции дает описание того, что функция делает.

Определение и вызов функции
811 Pn~;:irтucь "()nnPiiPлeнuP

11

~1-.1зов функциuп

(Defmmg and

Cпll

nCJ

д

l=unr-lionl

Для того чтобы создать функцию, пишут ее определение. Вот общий формат определения
функции в

def

Python:

имя_функции():
инструкция
инструкция

Первая строка называется заголовком функции. Он отмечает начало определения функции.
Заголовок функции начинается с ключевого слова def, после которого идет имя_функции,
затем круглые скобки и потом двоеточие.

Глава

229

5. Функции

Начиная со следующей строки идет набор инструкций, который называется блоком. Блок

-

это просто набор инструкций, которые составляют одно целое. Эти инструкции исполняют­
ся всякий раз, когда функция вызывается. Обратите внимание, что в приведенном выше об­

щем формате все инструкции в блоке выделены отступом для того, чтобы интерпретатор

Python использовал

их для определения начала и конца блока.

Давайте обратимся к примеру функции. Следует иметь в виду, что это не полная программа.
Мы покажем полный текст программы чуть позже.

def rnessage () :
print ('Я - Артур, ')
print ('король британцев. ' )
Этот фрагмент кода определяет функцию с именем rnessage. Она содержит блок с двумя
инструкциями. Исполнение функции приведет к исполнению этих инструкций.

Вызов функции
Определение функции говорит о том, что именно функция делает, но оно не исполняет
функцию. Для того чтобы функцию исполнить, ее необходимо вызвать. Вот как вызывается
функция rnessage:

rnessage ()
Когда функция вызвана, интерпретатор перескакивает к этой функции и исполняет инструк­
ции в ее блоке. Затем, когда достигнут конец блока, интерпретатор перескакивает назад
к той части программы, которая вызвала эту функцию, и программа возобновляет исполне­

ние в этой точке. Когда это происходит, мы говорим, что функция вернулась. Для того чтобы
полностью продемонстрировать, как работает вызов функции, мы обратимся к програм­
ме

5.1.

Программа 5.1

J

(function_demo.py)

1 #

Эта программа демонстрирует функцию.

2 #

Сначала мы определяем функцию с именем

3 def rnessage () :
print ('Я 4

Артур,

print

('король

Вызвать

функцию

5

rnessage.

')

британцев.')

6
7 #

rnessage.

8 rnessage ()
Вывод программы
Я

-

Артур ,

король

британцев .

Давайте разберем эту программу шаг за шагом и исследуем, что происходит, когда она ра­
ботает. Сначала интерпретатор игнорирует комментарии, которые появляются в строках
и

2.

Затем он читает инструкцию def в строке

3.

1

Она приводит к тому, что в оперативной

памяти создается функция под названием rnessage с блоком инструкций в строках

4

и

5.

(На­

помним, что определение функции создает функцию, но оно не исполняет ее.) Далее интер-

Глава 5. Функции

230

претатор встречает комментарий в строке

струкцию в строке

8,

к исполнению функции
рис.

5.2

7,

который игнорируется. Затем он исполняет ин­

которая представляет собой вызов функции. Эта инструкция приводит

message,

которая печатает две строки выходных значений. На

проиллюстрированы части этой программы.
Эти инструкции приводят к тому,
что создается функция

message
#Эта программа демонстрирует функцию.

#Сначала мы определяем функцию с именем

message.

def message():
ргiпt('Я - Артур,')
ргiпt('король британцев.')

# Вызвать функцию message
- - - - - - - - message()
Эта инструкция вызывает функцию

message,
РИС.

5.2.

приводя к ееисполнению

Определение и вызов функции

Программа

5.1

имеет всего одну функцию, однако в коде можно определять много функций.

Нередко программа имеет главную функцию
запускается. Функция

main

что функция
В

1

(two_functions.py)

1 # Эта программа имеет две функции.
2 # Сначала мы определяем главную функцию.
З def main () :
print ('У меня для вас известие. ')
4
5
message ()
6
print ( 'До свидания! ')
7

8 # Затем мы определяем функцию message.
9 def message():
10
print ('Я - Артур, ')
11
print ('король британцев.')
12
Вызвать

главную функцию

14 main ()

Вывод программы
У меня для
Я

-

до

вас известие .

Артур ,

король

которая вызывается, когда программа

main содержит стержневую логику программы, т. е. общую логику программы.
программе 5.2 приведен пример кода с двумя функциями: main и message.

Программа 5.2

13 #

main,

по мере надобности вызывает другие функции. Часто говорится,

британцев .

свидания!

Глава
Определение функции main расположено в строках
в строках
цию

9-11.

Как показано на рис.

5.3,

3--6,

5. Функции

231

а определение функции message -

инструкция в строке

14

вызывает главную функ­

main.

# Эта программа имеет две функции.
# Сначала мы определяем главную функцию.
def maiп():
ргiпt('У меня для вас известие')

message()
Интерпретатор перескакивает к
функции

main и

ргiпt('До свидания!')

начинает

исполнять инструкции в ее блоке

# Затем мы определяем функцию message.
def message():
ргiпt('Я -Артур)

ргiпt('король британцев.')

# Вызвать главную функцию
maiп()
РИС.

5.3.

Вызов главной функции

В функции main первая инструкция в строке
строковое значение 'У меня для

4

вызывает функцию print. Она показывает

вас известие.

'. Затем инструкция в строке 5 вызывает

функцию message, и интерпретатор перепрыгивает к функции message (рис.

5.4).

После того

как инструкции в функции message исполнены, интерпретатор возвращается в функцию main

и возобновляет работу инструкцией, которая следует сразу за вызовом функции. Это инст­
рукция, которая показывает строковое значение 'до свидания!
рис.

5.6,

' (рис. 5.5). Как показано на

это конец функции main, поэтому функция возвращается. Инструкций для исполне­

ния больше не осталось, и поэтому программа заканчивается.

()

ПРИМЕЧАНИЕ
Когда программа вызывает функцию, программисты обычно говорят, что поток управления про­

граммы передается в эту функцию. Это просто означает, что функция берет исполнение про­
граммы под свой контроль.

# Эта программа имеет две функции.
# Сначала мы определяем главную функцию.
def main():
print('Y меня для вас известие.')

~~~~~~е~видания!')

Интерпретатор перескакивает к

функции

message и

начинает

исполнять инструкции в его блоке

[
#Затем мы определяем функцию

def message():
print('Я - Артур,')
ргint('король британцев.')

# Вызвать главную функцию.
main()
РИС.

5.4.

Вызов функции

message

message.

Глава 5. Функции

232

# Эта программа имеет две функции.
# Сначала мы определяем главную функцию.
def maiп():
ргiпt('У меня для вас известие.')

message()
Когда функция

message

ргiпt('До свидания!')

заканчивается, интерпретатор

перескакивает назад к той части

# Затем мы определяем
def message():
ргiпt('Я - Артур,')

программы, которая ее вызвала,

и возобновляет исполнение с
этой точки

функцию

message.

ргiпt('король британцев.')

# Вызвать

главную функцию.

maiп()
РИС.

5.5.

Функция

message

возвращается

# Эта программа имеет две функции.
# Сначала мы определяем главную функцию.
def maiп():
priпt('Y меня для вас известие.')

message()
ргiпt('До свидания!')
Когда функция maiп

#Затем мы определяем функцию

заканчивается, интерпретатор

перескакивает назад к той части

message.

def message():
ргiпt('Я - Артур,')

программы, которая ее вызвала.

Инструкций больше не осталось,

ргiпt('король британцев.')

и поэтому программа
заканчивается

# Вызвать главную функцию.
maiп()

РИС.

5.6.

Функция

main

возвращается

Выделение отступом в
В

Python

Python

каждая строка в блоке должна быть выделена отсrупом. Последняя выделенная

отступом строка после заголовка функции является последней строкой в блоке функции
(рис.

5.7).
Последняя выделенная
отступом строка

-

это

последняя строка в блоке

def

gгeetiпg():
ргiпt('Доброе утро!')

~-----•

Эти инструкции
не находятся в блоке
РИС.

5.7.

ргiпt('Сегодня мы будем изучать функции.')

- { ргiпt('Я вызову функцию приветствия.')
gгeetiпg()

Все инструкции в блоке выделены отступом

Глава 5. Функции

233

Когда строки выделяются отступом, следует убедиться, что каждая строка начинается

с одинакового количества пробелов. В противном случае произойдет ошибка. Например,
приведенное ниже определение функции вызовет ошибку, потому что все строки выделены
разным количеством пробелов:

def my_function():
print ( 'А

теперь')

('что-то

print

print

совершенно')

('другое.')

В редакторе существует два способа выделить строку отступом: во-первых, нажатием кла­

виши в начале строки либо, во-вторых, при помощи клавиши для вставки
пробелов в начале строки. При выделении строк отступом в блоке можно использовать либо

табуляцию, либо пробелы, но не оба способа одновременно. В противном случае это может
запутать интерпретатор

Среда

IDLE,

Python

и вызвать ошибку.

а также большинство других редакторов

Python

автоматически выделяют стро­

ки блока отступом. При наборе двоеточия в конце заголовка функции все строки, набирае­
мые позже, будут автоматически выделяться отступом. Для того чтобы выйти из автомати­

ческого выделения отступом, следует после набора последней строки блока нажать клавишу

.
СОВЕТ
Для выделения строк блока отступом программисты Pythoп обычно используют четыре пробела.
Вы можете использовать любое количество пробелов по вашему выбору, коль скоро все строки
в блоке расположены с соразмерным отступом.

ПРИМЕЧАНИЕ
Пустые строки, которые появляются в блоке, игнорируются.

Контрольная точка

5.6.

Из каких двух частей состоит определение функции?

5.7.

Что означает фраза "вызвать функцию"?

5.8.

Что происходит, когда во время исполнения функции достигнут конец ее блока инст­
рукций?

5.9.

Почему необходимо выделять отступом инструкции в блоке?

111111111111

роекти

5.3
~

ование программы

с использование

Функций

L КЛЮЧЕВЫЕ ПОЛОЖЕНИЯ
Для разбиения алгоритма на функции программисты обычно пользуются приемом, кото­
рый называется нисходящей разработкой алгоритма.

Глава 5. Функции

234

Составление блок-схемы программы
с использованием функций
В главе

2

мы представили блок-схемы как инструмент разработки программ. В блок-схеме

вызов функции изображается прямоугольником, у которого с каждой стороны имеются вер­
тикальные полосы (рис.
веденный на рис.

5.8

5.8).

Имя вызываемой функции пишут на прямоугольнике. При­

пример показывает, как представить в блок-схеме вызов функции

message.

message()
11
РИС.

5.8.

11

Символ блок-схемы для вызова функции

Программисты, как правило, составляют отдельную блок-схему для каждой функции в про­

грамме. Например, на рис.

в программе

5.2.

5.9

показано, как будут изображены функции main и message

При составлении блок-схемы функции начальный терминальный символ

обычно показывает имя функции, а конечный терминальный символ обычно содержит слово
Возврат.

message()

maiп()

Показать 'У меня

Показать

для вас известие'

'Я -Артур'

message()

Показать
'король британцев'

Показать

'До свидания''

Возврат

Возврат

РИС.

5.9.

Блок-схема программы

5.2

Нисходящая разработка алгоритма
Мы рассмотрели и продемонстрировали работу функций. Вы увидели, как при вызове функ­

ции поток управления программы передается в функцию и затем при завершении функции
возвращается в ту часть программы, которая вызвала функцию. В этих механических аспек­

тах функций очень важно хорошо разобраться.

Глава 5. Функции

235

Не меньшее значение, чем понимание того, как работают функции, имеет понимание того,
как разрабатывать программу, которая использует функции. Программисты чаще всего при­
меняют метод под названием нисходящей разработки, который позволяет разбивать алго­
ритм на функции. Процесс нисходящей разработки алгоритма выполняется следующим об­
разом:

1.
2.

Полная задача, которую должна выполнить программа, разбивается на серию подзадач.
Каждая подзадача исследуется с целью установления, можно ли ее разложить дальше на

другие подзадачи. Этот шаг повторяется до тех пор, пока больше ни одной подзадачи
невозможно идентифицировать.

3.

После того как все подзадачи были идентифицированы, их пишут в программном коде.

Этот процесс называется нисходящей разработкой, потому что программист начинает с то­

го, что обращается к самому верхнему уровню выполняемых задач и затем разбивает эти
задачи на подзадачи более низкого уровня.

Иерархические схемы
Блок-схемы являются хорошими инструментами графического изображения потока логики

внутри функции, но они не обеспечивают визуального представления связей между функ­
циями. Для этой цели программисты чаще всего используют иерархические схемы. Иерар­

хическая схема, которая также называется структурной схемой, показывает каждую функ­
цию в программе в виде прямоугольников. Прямоугольники соединены таким образом, что
они иллюстрируют функции, вызываемые каждой функцией. На рис.

5.10

представлен при­

мер иерархической схемы гипотетической программы расчета заработной платы.

main()

get_input()

get_hours_worked()

РИС.

5.10.

calc_gross_pay()

get_hourly_rate()

calc_overtime

calc_withholdings

calc_taxes()

calc_net_pay()

calc_benets()

Иерархическая схема

Приведенная на рис.

5.1 О

схема показывает функцию main как самую верхнюю функцию

в иерархии. Функция main вызывает пять других функций: get _ input (получить входные
данные),

calc_gross_pay

(рассчитать заработную плату до удержаний),

calc_overtime

(рассчитать сверхурочные), calc_ withholdings (рассчитать удержания) и calc_ net _рау (рас­

считать зарплату на руки). Функция get input вызывает две дополнительные функции:

get_hours_worked (получить отработанные часы) и get_hourly_rate (получить ставку опла­
ты труда). Функция calc _ wi thholdings тоже вызывает две функции: calc _ taxes (рассчитать
налоги) и calc_benefits (рассчитать пособия).
Обратите внимание, что иерархическая схема не показывает шаги, которые предпринимают­
ся внутри функции, и поэтому не заменяет блок-схему или псевдокод.

Глава 5. Функции

236

Определение и вызов функций
Компания "Профессиональный техсервис" предлагает услуги по техобслуживанию и ремон­
ту бытовой техники. Владелец компании хочет предоставить каждому техническому спе­
циалисту компании небольшой карманный компьютер, который показывает пошаговые ин­
струкции для многих выполняемых ремонтных работ. Для того чтобы увидеть, как это могло
бы работать, владелец попросил вас разработать программу, которая выводит приведенные

ниже инструкции по разборке сушилки белья фирмы

Acme:

Шаг

1:

отключить сушилку и отодвинуть ее от стены.

Шаг

2:

удалить шесть винтов с задней стороны сушилки.

Шаг

3:

удалить заднюю панель сушилки.

Шаг

4:

вынуть верхний блок сушилки.

Во время вашего интервью с владельцем вы решаете, что программа должна показывать ша­

ги по очереди. Вы решаете, что после того, как выведены все шаги, пользователю будет
предложено нажать клавишу

,

чтобы увидеть следующий шаг. Вот алгоритм в псев­

докоде:

Показать

стартовое

сообщение

с объяснением,

,
1.
Попросить пользова теля нажать ,
Показа ть инструкции для шага 2 .
Попросить пользователя нажать ,
Показать инструкции для шага 3.
Попросить пользователя нажать ,
Показать инструкции для шага 4.
Попросить пользователя нажать

что программа делает.

чтобы увидеть шаг

1.

Показать инструкции для шага

чтобы увидеть

следующий шаг.

чтобы увидеть

следуюilJИЙ шаг.

чтобы увидеть

следуюilJИЙ шаг.

Этот алгоритм перечисляет задачи верхнего уровня, которые программа должна выполнить ;

они становятся основой главной функции программы. На рис.

5.11

показана структура про­

граммы на иерархической схеме.

main()

startup_message()
РИС.

5.11.

step1()

stepЗ()

step2()

step4()

Иерархическая схема программы

Как видно из иерархической схемы, главная функция rna in вызовет несколько других функ­
ций. Вот краткое описание этих функций:

+ startup_ rnessage -

функция выводит стартовое сообщение, которое говорит техниче­

скому специалисту, что именно делает программа;

+

step l -

функция выводит инструкции для шага

1;

Глава 5. Функции

237

+ step2 - функция выводит инструкции для шага 2;
+ step3- функция выводит инструкции для шага 3;
+ step4 - функция выводит инструкции для шага 4.
Между вызовами этих функций функция main будет подсказывать пользователю нажимать
клавишу, чтобы увидеть следующий шаг инструкций. В программе
вующий код.

Программа 5.3
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26

1

(acme_dryer.py)

# Эта программа показывает пошаговые инструкции
# для разборки бельевой сушилки фирмы Acme.
# Главная функция выполняет основную логику программы.
def main () :
# Показать стартовое сообщение.
startup_message()
input('Haжaть Enter, чтобы увидеть шаг 1. ')
# Показать шаг 1.
stepl ()
input('Haжaть Enter, чтобы увидеть шаг 2. ')
# Показать шаг 2.
step2 ()
input('Haжaть Enter, чтобы увидеть шаг 3. ')
# Показать шаг 3.
step3 ()
input('Haжaть Enter, чтобы увидеть шаг 4.')
#Показать шаг 4.
step4 ()
# Функция startup_message показывает
# первоначальное сообщение программы
def startup_message():
print('Этa

на экране.

программа дает рекомендации')

print('пo разборке

print ('Данный
print()

бельевой сушилки фирмы АСМЕ.')

процесс

состоит из

4

шагов.')

27

28
29
30
31
32
33
34
35
36
37
38

# Функция stepl показывает инструкции
# для шага 1.
def stepl () :
print ('Шаг 1: отключить сушилку и')
print ('отодвинуть ее от стены. ')
print ()
# Функция step2 показывает инструкции
# для шага 2.
def step2 () :
print ('Шаг 2: удалить шесть винтов')

5.3

приведен соответст­

Глава 5. Функции

238
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56

print ('с
print ()

задней стороны сушилки.')

# Функция step3
# для шага 3.
def step3 () :

показывает инструкции

3: удалить
print ('сушилки.')
print ()

print('Шaг

заднюю панель')

step4 показывает инструкции
для шага 4.
def step4 () :
print ('Шаг 4: вынуть верхний блок')
print ('сушилки.')
#
#

Функция

#

Вызвать

главную функцию,

чтобы начать

программу.

main ()

Вывод программы
Эта

программа дает рекомендации

по разборке

бельевой сушилки фирмы АСМЕ .

Данный процесс состоит из

Enter ,

Нажмите
Шаг

1:

Enter ,

Нажмите
Шаг

2:

ее

шагов.

чтобы увидеть шаг

отключить

отодвинуть

4

от

1.

сушилку и
стены .

чтобы увидеть шаг

2.

удалить шесть винтов

с задней стороны сушилки .

Enter,

Нажмите
Шаг

3:

удалить

чтобы увидеть шаг З .
задНКЖ> панель

сушилки .

Enter ,

Нажмите
Шаг

4:

вынуть

чтобы увидеть шаг

4.

верхний блок

сушилки .

Приостановка исполнения до тех пор,

пока пользователь не нажмет клавишу



Иногда требуется· приостановить работу программы, чтобы пользователь мог прочесть ин­
формацию, которая была выведена на экран. Когда пользователь будет готов к тому, чтобы

программа продолжила исполнение, он нажимает клавишу

,

и программа возобнов-

5. Функции

239

ляет работу. Для того чтобы программа приостановила работу до нажатия клавиши

,

Глава

в

Python

можно применять функцию

input. Строка 7 в программе 5.3 является таким при­

мером:

inрut('Нажмите

Enter,

чтобы увидеть

шаг

1. ')

Эта инструкция выводит подсказку 'Нажмите

Enter,

чтобы увидеть шаг

ливает работу до тех пор, пока пользователь не нажмет клавишу

пользует этот прием повторно в строках

1О, 13

и

1. '

.

и приостанав­

Программа ис­

16.

~

5.4
ьные пе еменные
~ КЛЮЧЕВЫЕ П~ЛОЖЕНИЯ
Локальная переменная создается внутри функции. Инструкции, которые находятся за
пределами функции, к ней доступа не имеют. Разные функции могут иметь локальные
переменные с одинаковыми именами, потому что функции не видят локальные перемен­
ные друг друга.

Всякий раз, когда переменной внутри функции присваивается значение, в результате созда­

ется локальная переменная. Она принадлежит функции, в которой создается, и к такой пере­
менной могут получать доступ только инструкции в этой функции. (Термин "локальный"
указывает на то обстоятельство, что переменная может использоваться лишь локально внут­

ри функции, в которой она создается.)
Если инструкция в одной функции попытается обратиться к локальной переменной, которая
принадлежит другой функции, то произойдет ошибка. Например, взгляните на програм­
му

Программа

5.4.
5.4

(bad_local.py)

1 # Определение главной функции.
2 def main () :
3
get _ name ()
4
рrint('Привет, ', name) #Это

вызовет ошибку!

5

6 # Определение функции get_name.
7 def get name():
8
name = input ( 'Введите свое имя: ' )
9

10 # Вызвать
11 main ()

главную функцию.

В этой программе есть две функции:

main

и

get_ name.

В строке

8

переменной

name

присваи­

вается значение, которое вводится пользователем. Эта инструкция находится в функции

get _ name,

поэтому переменная

к переменной

name

name

является для этой функции локальной. Это означает, что

не могут обращаться инструкции, находящиеся за пределами функции

get_name.
Функция

main

вызывает функцию

ся обратиться к переменной

get_name в строке 3. Затем инструкция в строке 4 пытает­
name. Это приводит к ошибке, потому что переменная name

Глава 5. Функции

240

локальна для функции

get _name,

и инструкции в функции

main

получить к ней доступ не

могут.

Область действия и локальные переменные
Область действия переменной

-

это часть программы, в которой можно обращаться к пе­

ременной. Переменная видима только инструкциям в области действия переменной. Об­
ластью действия переменной является функция, в которой переменная создается. Как было

продемонстрировано в программе

5.4,

никакая инструкция за пределами функции не может

обращаться к такой переменной.
К локальной переменной не может обращаться программный код, который появляется внут­
ри функции в точке до того, как переменная была создана. Например, взгляните на приве­
денную ниже функцию. Она вызовет ошибку, потому что функция

print пытается обратить­
val, но эта инструкция появляется до того, как переменная val была созда­
переместить инструкцию присваивания в строку перед инструкцией print, то

ся к переменной
на. Если

ошибка будет исправлена.

def bad_function():
рrint('Значение равно',

val

=

val)

#Это вызовет ошибку!

99

Поскольку локальные переменные функции скрыты от других функций, другие функции
могут иметь собственные локальные переменные с одинаковым именем. Например, взгляни­

те на программу
и

5.5. Помимо функции main эта программа имеет две другие функции: texas
california. В каждой из этих двух функций есть локальная переменная с именем Ьirds.

Программа

1 #
2 #

5.5

(blrds.py)

Эта программ демонстрирует две функции,
имеют локальные переменные с

которые

одинаковыми именами.

3
4 def main():
5
# Вызвать
6
7
8

9
10
11
12
13
14
15
16
17
18
19

функцию texas.
texas ()
# Вызвать функцию california.
california ()

# Определение функции texas. Она создает
# локальную переменную с именем Ьirds.
def texas():
Ьirds = 5000
print ('В Техасе обитает', Ьirds, 'птиц.')
# Определение функции california. Она тоже
# создает локальную переменную с именем Ьirds.
def california():
Ьirds = 8000

Глава 5. Функции

20

print('B

Калифорнии обитает',

Ьirds,

241

'птиц.')

21

22 # Вызвать
23 main()

главную функцию.

Вывод программы
В Техасе обитает

5000

В Калифорнии обитает

птиц.

птиц.

8000

Несмотря на то что в этой программе есть две отдельные переменные с именами Ьi rds,

только одна из них видима одновременно, потому что они находятся в разных функциях.
Это проиллюстрировано на рис.

5.12.

Когда выполняется функция texas, видима та пере­

менная Ьirds, которая создается в строке

13.

Когда выполняется функция california, види­

ма та переменная Ьirds, которая создается в строке

def texas():
Ьirds = 5000

def

РИС.

5.12.

califorпia():
Ьirds

1

5000

=8000

priпt('B Калифорнии обитает', Ьirds, 'птиц.')

priпt('B Техасе обитает', Ьirds, 'птиц.')

Ьirds -

19.

Ьirds -

1

1

8000

1

В каждой функции есть собственная переменная Ьirds

Контрольная точка

5.10.

Что такое локальная переменная? Каким образом ограничивается доступ к локальной
переменной?

5.11.

Что такое область действия переменной?

5.12.

Разрешается ли, чтобы локальная переменная в одной функции имела одинаковое имя,
что и у локальной переменной в другой функции?

11111111111

5.5

ментов в функцию

ача а

~ КЛЮЧЕВЫЕ ПОЛОЖЕНИЯ
Аргумент

-

вызывается.

это любая порция данных, которая передается в функцию, когда функция
Параметр-

это

переменная,

которая

получает

аргумент,

переданный

в функцию.

n ::inu

Г/

v

vментов в d:Jvн11цию'

Pdssmq Arqumentc; to

d F-1юrt1 п

Иногда полезно не только вызвать функцию, но и отправить одну или более порций данных
в функцию. Порции данных, которые отправляются в функцию, называются аргу,нентаwu.
Функция может использовать свои аргументы в вычислениях или других операциях.

242

Глава 5. Функции
Если требуется, чтобы функция получала аргументы, когда она вызывается, то необходимо
оборудовать эту функцию одной или несколькими параметрическими переменными. Пара­
метрическая переменная,

часто

именуемая

просто пара.метром,

-

это

специальная

пере­

менная, которой присваивается значение аргумента, когда функция вызывается. Вот пример
функции с параметрической переменной:

def

show_douЬle(numЬer):

result = numЬer * 2
print(result)
Эта функция имеет имя

show_ douЫe.

Ее цель состоит в том, чтобы принять число numЬer

в качестве аргумента и показать удвоенное значение этого числа. Взгляните на заголовок

функции и обратите внимание на слово numЬer, которые появляется внутри круглых скобок.
Это имя параметрической переменной. Ей будет присвоено значение аргумента, когда
функция будет вызвана. Программа

5.6

демонстрирует эту функцию в законченной про­

грамме.

Программа 5.6
1 #
2 #

(pass_arg.py)

1

Это программа демонстрирует аргумент,

nередаваемьп1 в функцию.

3

4 def main () :
5
value = 5
6
show_douЬle(value)
7

8 # Функция show_douЫe принимает аргумент
9 # и показывает его удвоенное значение.
10 def show_douЬle(numЬer):
11
result = numЬer * 2
12
print(result)
13

14 # Вызвать
15 main ()

главную функцию.

Вывод nроrраммы

10
Когда эта программа выполняется, в строке
строка

5

15

вызывается функция

создает локальную переменную с именем

приведенная ниже инструкция в строке

value,

main. В функции main

присваивая ей значение

5.

Затем

6 вызывает функцию show_ douЫe:

show_douЬle(value)

Обратите внимание, что

value появляется в круглых скобках. Это означает, что value пере­
show_ douЫe в качестве аргумента (рис. 5.13). Во время исполнения этой
инструкции будет вызвана функция show_ douЫe, и параметру numЬer будет присвоено то же
самое значение, что и в переменной value. Это показано на рис. 5.14.

дается в функцию

Давайте разберем функцию

show

douЫe шаг за шагом. Одновременно с этим следует

учесть, что параметрической переменной numЬer будет присвоено значение, которое было
передано ей в качестве аргумента. В программе это число равняется

5.

Глава 5. Функции

def main():
value = 5

def main():
value = 5
show_douЬle(value)

show_douЫe(value)

def

l

show_douЫe(number):

def

result = number * 2
print(result)
РИС.

5.13.

Переменная

value

243

передана в качестве

РИС.

аргумента

5.14.

show_douЫe(number):

result =number * 2
print(result)

Переменная

value

и параметр nurnЬer

ссылаются на одно и то же значение

Строка

ll

присваивает локальной

переменной

nurnЬer*2. Поскольку nurnЬer ссылается на значение
рующей переменной

с

5,

именем

resul t

значение

выражения

эта инструкция присваивает результи­

result значение 10. Строка 12 показывает переменную result.

Приведенная ниже инструкция показывает, как функция show douЫe вызывается с число­
вым литералом, переданным в качестве аргумента:

show_ douЫe ( 50)
Эта инструкция исполняет функцию show_ douЫe, присваивая

50

параметру nurnЬer. Функция

show douЫe напечатает l 00.

Область действия параметрической переменной
Ранее в этой главе вы узнали, что областью действия переменной является часть программы,

в которой можно обращаться к этой переменной. Переменная видима только инструкциям
в области действия переменной. Областью действия параметрической переменной является
функция, в которой этот параметр используется. К параметрической переменной могут по­
лучать доступ все инструкции внутри функции, и ни одна инструкция за пределами этой
функции к ней доступ получить не может.

Передача аргумента в функцию
Ваш друг Майкл управляет кейтеринговой компанией. Некоторые ингредиенты, которые
необходимы для его рецептов, измеряются в чашках. Однако когда он приходит в продукто­
вый магазин, чтобы приобрести эти ингредиенты, они реализуются только в жидких унциях.

Он попросил вас написать простую программу, которая преобразует количество, выражен­
ное в чашках, в количество в жидких унциях.

Вы разрабатываете приведенный ниже алгоритм:
Вывести вводный экран,
Получить

количество

Преобразовать

который объясняет,

что программа делает.

чашек.

количество

чашек в жидкие

унции и показать результат.

Этот алгоритм перечисляет выполняемые программой задачи верхнего уровня, которые ста­
новятся основой главной функции программы. На рис.
граммы на иерархической схеме.

5.15

показана структура этой про­

Глава 5. Функции

244

main()

intro()
РИС.

5.15.

cups_to_ounces(cups)

Иерархическая схема программы

Как показано на иерархической схеме, функция

main вызывает две других функции.

Вот краткое описание этих функций:

+

функция будет выводить сообщение на экран с объяснением того, что програм­

intro -

ма делает;

+

cups _ to_ ounces -

функция будет принимать в качестве аргумента количество чашек,

вычислять и показывать эквивалентное количество жидких унций.

Функция
передано

Программа

1 #

5.7

main также попросит пользователя ввести количество чашек. Это значение будет
в функцию cups to ounces. Соответствующий код показан в программе 5.7.
(cups_to_ounces.py)

Эта программа

конвертирует количество чашек в жидкие унции.

2

3 def main () :
# Показать вводное окно.
4
5
intro ()
6
# Получить количество чашек.
7
cups_needed = int(input('Bвeдитe
8

#

Конвертировать

количество

количество чашек:

чашек в унции.

9
cups_to_ounces(cups_needed)
10
11 # Функция intro показывает вводное окно.
12 def intro():
13
print('Этa программа конвертирует замеры')
14
print('в чашках в жидкие унции. Дпя')
15
print ('справки приводим формулу:')
16
print (' 1 чашка = 8 жидких унций')
17
print ()
18

19 # Функция cups_to_ounces принимает количество чашек
20 # и показывает эквивалентное количество унций.
21 def cups to_ounces(cups):
22
ounces = cups * 8
23
print('Этo конвертируется в', ounces,
'унции(й). ')
24
25 # Вызвать главную функцию.
26main()

'))

Глава 5. Функции

245

Вывод программь1 (вводимые данные выделены жирным шрифтом )
Эта
в

программа

чашках

в

конвертирует замеры

жидкие

унции .

Для

справки приводим формулу :

1

чашка =

8

жидких унций

Введите количество чашек :
Это конвертируется в

32

4

I Enter l

унции(й) .

Передача многочисленных аргументов
Часто имеет смысл писать функции, которые могут принимать многочисленные аргументы.

В программа

5.8

показана функция

show_sum, которая принимает два аргумента, складывает

их и показывает сумму.

Программа

1 #
2 #

5.8

(multiple_args.py)

Эта программа демонстрирует функцию,
два

которая

принимает

аргумента.

3

4 def main():
5
print('Cyммa чисел 12
6
show_sum(l2, 45)

и

45

равняется')

7

8 # Функция show_sum принимает
9 # и показывает их сумму.
10 def show_sum(numl, num2):
11
result = numl + num2
12
print(result)

два аргумента

13

1

14 # Вызвать
15 main ()

главную функцию.

Вывод программы
Сумма чисел

12

и

45

равняется

57
Обратите внимание на присутствие внутри круглых скобок в заголовке функции
двух параметрических переменных с именами

numl

и

num2.

show_sum

Это то, что часто именуется

списком параметров. Также обратите внимание, что имена переменных отделены запятой.

Инструкция в строке

6

вызывает функцию

show sum и передает два аргумента: 12 и 45. Эти

аргументы передаются в соответствующие параметрические переменные функции по пози­

циu. Другими словами, первый аргумент передается первой параметрической переменной,
второй аргумент

12

параметру

второй параметрической переменной. Поэтому инструкция присваивает

-

numl

и

45

параметру

num2

(рис.

5.16).

Глава 5. Функции

246

def main():
print('Cyммa чисел

12 и 45 равняется')

show_sum(12, 45)

~~

def show_sum(num1, num2):
result =num1 + num2
print(result)

num1~
num2~
РИС.

5.16. Два

аргумента переданы в два параметра

Предположим, что нам пришлось инвертировать порядок, в котором аргументы перечисле­

ны в вызове функции так:

show_surn(45, 12)
Это приведет к тому, что параметру

nurnl будет передано 45, параметру nurn2 передано 12.

Приведенный ниже фрагмент кода показывает еще один пример. На этот раз в качестве
аргументов мы передаем переменные.

valuel = 2
value2 = 3
show_surn(valuel, value2)
Во время исполнения функции
параметру

show surn в результате выполнения этого программного кода
nurnl будет присвоено значение 2, параметру nurn2 - значение 3.

В программе

5.9

приведен еще один пример. В качестве аргументов функции эта программа

передает два строковых значения.

Программа

1 #
2 #

5.9

(string_args.py)

Эта программа демонстрирует передачу в

функцию двух

строковых аргументов.

3

4 def main () :
5
first name = inрut('Введите свое имя: ')
6
last _ name = input ( 'Введите свою фамилию: ' )
7

print('Baшe

имя

в

обратном порядке')

8

reverse_name(first_name, last_name)

9

10 def reverse_name(first, last):
11
print(last, first)
12
13 # Вызвать главную функцию.
14 main ()

Глава 5. Функции

247

Вывод программы (вводимые данные выделены жирным шрифтом)

Введите свое имя : М:эт 1Enter 1
Введите свою фамилию : Хойл 1Enter 1
Ваше имя

в обратном порядке

Хойл Мэт

Внесение изменений в параметры
Когда аргумент передается в функцию

Python,

параметрическая переменная функции будет

ссылаться на значение этого аргумента. Однако любые изменения, которые вносятся в пара­
метрическую переменную, не будут влиять на аргумент. Для того чтобы это продемонстри­
ровать, взгляните на программу

Программа 5.10
1 #
2 #

1

5.1 О.

(chaпge_me.py)

Эта программа демонстрирует,

что происходит,

когда

вы

изменяете значение параметра.

3

4
5
6
7
8
9
10
11
12
13
14
15
16

def main () :
value = 99
print ('Значение равно', value)
change_me(value)
print('Пocлe

возвращения в функцию

def change_me(arg):
print ('Я изменяю
arg = О
print('Teпepь

# Вызвать
main ()

main

значение равно',

value)

значение.')

значение равно',

arg)

главную функцию.

Вывод программы
Значение равно

99

Я изменяю значение .

Теперь значение равно О
После возвращения в функцию

В строке
значение

5 функция main
99. Инструкция

переменная
в функции
рис.

main

значение равно

99

создает локальную переменную с именем
в строке

6

показывает 'Значение

value, присваивая ей
99 '. Затем в строке 7
change me. Это означает, что

равно

value передается в качестве аргумента в функцию
change me параметр arg будет тоже ссылаться на значение 99.

Это показано на

5.17.

Внутри функции

change_me

в строке

вторное присваивание изменяет

arg,

12

параметру

arg

присваивается значение О. Это по­

но оно не влияет на переменную

value

в функции

main.

Глава 5. Функции

248

def main():
value = 99
рrint('Значение равняется',

value)
value

change_me(value)
ргint('Вернувшись в функцию

main, значение равняется', value)

def change_me(arg):
arg

print('Я изменяю значение.')

arg =О
print('Тenepь значение равняется',
РИС.

5.17.

Переменная

val ue

arg)

передается в функцию

Как показано на рис.

5 .18,

change_ rne

эти две переменные теперь ссылаются в оперативной памяти на

разные значения. Инструкция в строке

13

показывает 'Теперь значение равно О', и функ­

ция заканчивается.

Поток управления программы теперь возвращается в функцию rnain. Следующая исполняе­
мая инструкция находится в строке

8.

Эта инструкция показывает

'После

возвращения

в функцию rnain значение равно 99 '. Это доказывает, что хотя в функции change me пара­
метрическая переменная arg была изменена, аргумент (переменная value в функции main) не
изменился.

def main():
value = 99
ргint('Значение равняется',

value)
value

change_me(value)
рrint('Вернувшись в функцию

main, значение равняется', value)

def change_me(arg):

arg

print('Я изменяю значение.')

arg



print('Тenepь значение равняется',
РИС.

5.18.

Переменная

--c::o::J

value

Используемая в

arg)

передается в функцию

Python

change_ rne.

Переменная

arg

изменена

форма передачи аргументов, в которой функция не может изменять

значение переданного ей аргумента, обычно называется передачей по значению. Эта форма
показывает, как одна функция может связываться с другой функцией. Между тем, канал
связи работает только в одном направлении: вызывающая функция может связываться
с вызванной функцией, но вызванная функция не может использовать аргумент для связи

с вызывающей функцией. Позже в этой главе вы узнаете, как написать функцию, которая
может связываться с частью программы, которая ее вызвала, путем возврата значения.

Именованные аргументы
Программы

5.8

и

5.9

демонстрируют, как аргументы передаются в параметрические пере­

менные функции по позиции. Большинство языков программирования таким путем сопос­

тавляют аргументы и параметры функции. В дополнение к этой стандартной форме переда-

Глава 5. Функции
чи параметров язык

Python

249

позволяет писать аргумент в приведенном ниже формате, чтобы

указывать, какой параметрической переменной аргумент должен быть передан:
имя_параметра

=

значение

В таком формате имя_ параметра -

это имя параметрической переменной, а значение -

зна­

чение, передаваемое в этот параметр. Аргумент, написанный в соответствии с этой синтак­
сической конструкцией, называется именованным аргументом.

Программа
с именем

5.11

демонстрирует

show_ interest,

ленного банковским

именованные

аргументы.

Здесь

используется

функция

которая показывает сумму простого процентного дохода, накоп­

счетом

в течение ряда периодов.

Функция принимает аргументы

principal (основная сумма на счете), rate (процентная ставка за период) и periods (количе­
ство периодов). Когда функция вызывается в строке

7,

аргументы передаются как именован­

ные аргументы.

Программа 5.11
1 #

] (keyword_args.py)

Эта программа демонстрирует именованные

аргументы.

2

3 def main():
4
# Показать сумму простого процентного дохода, используя
5
# 0.01 как процентной ставки за период, 10 как количество
6
# периодов и $10 ООО как основную сумму на счете.
7
show_interest(rate=0.01, periods=lO, principal=l0000.0)
8

9
10
11
12
13
14
15
16

show_interest

#
#

Функция

#

за период и количество

дохода для

показывает

сумму простого

заданной основной суммы,

процентной

процентного
ставки

периодов.

def show_interest(principal, rate, periods):
interest = principal * rate * periods
print('Пpocтoй процентный доход составит$',

format (interest, '.2f'),
sep=' ')

17

18
19 # Вызвать
20 main ()

главную функцию.

Вывод программы

Простой процентный доход составит

$1000 . 00

Обратите внимание, что в строке

7

порядок следования именованных аргументов не совпа­

дает с порядком следования параметров в заголовке функции в строке

13.

Поскольку имено­

ванный аргумент определяет, в какой параметр этот аргумент должен быть передан, его
позиция в вызове функции не имеет значения.
В программе

5.12

приведен еще один пример.

Это видоизмененная версия программы

string_args (см. программу 5.9). Эта версия использует
функции reverse name (переставить имя и фамилию).

именованные аргументы для вызова

250

Глава 5. Функции

Программа 5.12
1 #
2 #

1

(keyword_string_args.py)

Эта программа демонстрирует
строковых значений в

передачу в функцию двух

качестве именованных аргументов.

3

4 def rnain () :
first narne = inрut('Введите свое имя: ')
6
last_narne = inрut('Введите свою фамилию: ')

5
7

print('Baшe имя в обратном порядке')

8

reverse_narne(last=last_narne, first=first_narne)

9

10 def reverse_narne(first, last):
11
print(last, first)
12

13 # Вызвать
14 rnain ()

главную функцию.

Вывод программы (вводимые данные выделены жирным шрифтом)

Введите свое имя : Мэт 1Enter 1
Введите свою фамилию : Хойл 1Enter 1
Ваше имя в обратном порядке

Хойл Мэт

Смешивание именованных и позиционных аргументов
В вызове функции имеется возможность смешивать позиционные и именованные аргумен­
ты, но при этом позиционные аргументы должны стоять первыми, после которых идут име­

нованные аргументы. В противном случае произойдет ошибка. Вот пример того, как можно
было бы вызвать функцию

show interest

в программе

5.1 О

с помощью позиционных и име­

нованных аргументов:

show_interest(lOOOO.O, rate=0.01, periods=lO)
В этой инструкции первый аргумент,

10 ООО.О,

передается в параметр

principal

по его по­

зиции. Второй и третий аргументы передаются в качестве именованных аргументов. Однако
приведенный ниже вызов функции вызовет ошибку, потому что неименованный аргумент
следует за именованным:

#

Это вызовет ОШИБКУ!

show_interest(lOOO.O, rate=0.01, 10)

~ Контрольная точка
5.13.

Как называются порции данных, которые передаются в вызываемую функцию?

5.14.

Как называются переменные, которые получают порции данных в вызванной функции?

5.15.

Что такое область действия параметрической переменной?

5.16.

Влияет ли изменение параметра на аргумент, который был передан в параметр?

Глава 5. Функции

5.17.

Приведенные ниже инструкции вызывают функцию с именем

show data.

251

Какая инст­

рукция передает позиционные аргументы и какая именованные аргументы:

а)

show_data (name=' Кэтрин', age=25);

б)

show_ data

('Кэтрин',

25)?

~

5.6

Глобальные пе еменные и глобальные константы

~ КЛЮЧЕВЫЕ ПОЛОЖЕНИЯ
Глобальная переменная доступна для всех функций в программном файле.
Вы узнали, что во время создания переменной при помощи инструкции присваивания внут­

ри функции эта переменная является локальной для этой функции. Следовательно, к ней
могут обращаться только инструкции внутри функции, которая ее создала. Когда перемен­
ная создается инструкцией присваивания, написанной за пределами всех функций в про­
граммном файле, эта переменная является глобШ1ьной переменной. К глобальной переменной

может обращаться любая инструкция в программном файле, включая инструкции в любой
функции. Например, взгляните на программу

1

Проrрамма 5.13

1

5.13.

(global1.py)

1 # Создать глобальную
2 my_value = 10

переменную.

3

4 # Функция show_value печатает
5 # значение глобальной переменной.
6 def show_value():
7
print(my_value)
8

9 # Вызвать функцию show value.
10 show_ value ()
Вывод программы

10
Инструкция присваивания в строке

2 создает переменную

с именем

my_ val ue.

Поскольку эта

инструкция находится за пределами любой функции, она является глобальной. Во время
исполнения функции
ссылается переменная

show_ value
my_ val ue.

инструкция в строке

7

напечатает значение, на которое

Если нужно, чтобы инструкция внутри функции присваивала значение глобальной перемен­
ной, то требуется дополнительный шаг. В этом случае, как показано в программе

бальная переменная должна быть объявлена внутри функции.

Программа~

(global2.py)

1 # Создать глобальную
2 numЬer = О
3

переменную.

5.14,

гло­

252

Глава5. Функции

4 def main():

5

global

6

nшnЬer =

7

show_ numЬer ()

nшnЬer
int(input('Bвeдитe

число:

'))

8
9 def show_numЬer():
10
print ('Вы ввели число',
11
12 # Вызвать главную функцию.
13 main ()

numЬer)

Вывод программы (вводимые данные выделены жирным шрифтом)

Введите число :
Вы ввели число

55 1Enter1
55

Инструкция присваивания в строке

2

создает глобальную переменную с именем numЬer. Об­

ратите внимание, что внутри функции main строка

5

использует ключевое слово global,

чтобы объявить переменную numЬer. Эта инструкция сообщает интерпретатору, что функция

main намеревается присвоить значение глобальной переменной numЬer. Это как раз то, что
происходит в строке

6.

Введенное

пользователем

значение присваивается

переменной

numЬer.

Большинство программистов соглашаются, что следует ограничить использование глобаль­
ных переменных либо не использовать их вообще. Причины следующие.



Глобальные переменные затрудняют отладку программы. Значение глобальной перемен­
ной может быть изменено любой инструкцией в программном файле. Если обнаружится,
что в глобальной переменной хранится неверное значение, то придется отыскать все ин­
струкции, которые к ней обращаются, чтобы определить, откуда поступает плохое значе­
ние. В программе с тысячами строк программного кода такая работа может быть сопря­
жена с большими трудностями.



Функции, которые используют глобальные переменные, обычно зависят от этих пере­
менных. Если возникнет необходимость применить такую функцию в другой программе,
то скорее всего придется эту функцию перепроектировать, чтобы она не опиралась на
глобальную переменную.



Глобальные переменные затрудняют понимание программы. Глобальная переменная мо­
жет быть модифицирована любой инструкцией в программе. Если возникнет необходи­
мость разобраться в какой-то части программы, которая использует глобальную пере­
менную, то придется узнать обо всех других частях программы, которые обращаются
к этой глобальной переменной.

В большинстве случаев следует создавать переменные локально и передавать их в качестве
аргументов в функции, которым нужно к ним обратиться.

Глобальные константы
Хотя вам следует стараться избегать использования глобальных переменных, в программе
допускается применение глобальных констант. Глоба.аьная константа

-

это глобальное

имя, ссылающееся на значение, которое нельзя изменить. Поскольку значение глобальной

Глава 5. Функции

253

константы не может быть изменено во время исполнения программы, вам не приходится

беспокоиться о многих потенциальных опасностях, которые обычно связаны с использова­
нием глобальных переменных.
Несмотря на то, что язык

Python

не позволяет создавать настоящие глобальные константы,

их можно имитировать при помощи глобальных переменных. Если глобальная переменная
не объявляется с использованием ключевого слова

global

внутри функции, то присвоенное

ей значение невозможно изменить внутри этой функции. В рубрике "В центре внимания"
продемонстрировано, как глобальные переменные могут применяться в

Python для

имитиро­

вания глобальных констант.

Применение глобальных констант
Мэрилин работает на "Интегрированные системы", компанию-разработчика программного
обеспечения, которая имеет хорошую репутацию за превосходные дополнительные пособия
своим сотрудникам. Одним из таких пособий является ежеквартальная премия, которая вы­
плачивается всем сотрудникам. Еще одним пособием является пенсионная программа для

каждого сотрудника. Компания вносит

5%

от заработной платы и премий каждого сотруд­

ника на их пенсионный счет. Мэрилин планирует написать программу, которая вычисляет

взнос компании на пенсионный счет сотрудника за год. Она хочет, чтобы программа по
отдельности показывала сумму взноса исходя из заработной платы и сумму взноса исходя из
премий сотрудника. Вот алгоритм этой программы:
Получить

ежегодную заработную плату сотрудника до удержаний.

Получить

сумму выплаченных сотруднику премий.

Рассчитать

и показать

Рассчитать и показать

взнос исходя из

зарплаты.

взнос исходя из премий.

Соответствующий код приведен в программе

Программа

5.15

5.15.

(retirement.py)

1 # Используем глобальную константу
2 # Ставка взноса компании.
3 CONTRIBUTION RATE = 0.05
4

5
6
7
8
9
10
11
12
13
14
15

def main () :
gross_pay = float(input('Bвeдитe заработную плату: '))
bonus = float(input('Bвeдитe сумму премий: '))
show_pay_contrib(gross_pay)
show_bonus_contrib(bonus)
# Функция show_pay_contrib принимает заработную
# плату в качестве аргумента и показывает взнос
# в пенсионные накопления исходя из этого размера
def show_pay_contrib(gross):
contrib = gross * CONTRIBUTION RATE

оплаты.

Глава 5. Функции

254
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30

print ('Взнос исходя из заработной
format(contrib, '.2f'),
sep=' ')

платы:

$',

# Функция show bonus contrib принимает сумму премий
# в качестве аргумента и показывает взнос
# в пенсионное накопление исходя из этой суммы оплаты.
def show_bonus_contrib(bonus):
contrib = bonus * CONTRIBUTION RATE
print('Bзнoc исходя из суммы премий:

format(contrib,
sep=' ')
# Вызвать
main ()

$',

'.2f'),

главную функцию.

Вывод программы (вводимые данные выделены жирным шрифтом)

Введите заработную плату :

80000 JEnter J
20000 JEnter l
заработной платы : $4000 . 00
суммы премий : $1000 . 00

Введите сумму премий :
Взнос исходя из
Взнос исходя из

Прежде всего, обратите внимание на глобальное объявление в строке

3:

CONTRIBUTION RATE = 0.05
CONTRIBUTION_ RATE

будет использоваться в качестве глобальной константы и представлять

процентную долю зарплаты сотрудника, которую компания вносит на пенсионный счет.

Написание имени константы прописными буквами является общепринятой практикой. Это
служит напоминанием о том, что значение, на которое ссылается это имя, в программе не
должно изменяться.

Константа

contrib)

CONTRIBUTION_ RATE

и еще раз в строке

24

используется в расчетах в строке
(в функции

15

(в функции

show

рау

show_bonus_contrib).

Мэрилин решила применить эту глобальную константу, чтобы представить 5-процентную
ставку взноса по двум причинам:

+ это облегчает чтение программы:

когда смотришь на расчеты в строках

15

и

24,

стано­

вится очевидным, что происходит;

+ временами ставка взноса изменяется: когда это произойдет в следующий раз, не составит
труда обновить программу, изменив инструкцию присваивания в строке

~

3.

Контрольная точка
5.18.

Какова область действия глобальной переменной?

5.19.

Приведите одну серьезную причину, почему в программе не следует использовать гло­

бальные переменные.

5.20.

Что такое глобальная константа? Допускается ли применение в программе глобальных
констант?

Глава 5. Функции

255

11111111111

Введение в функции с возвра ом значения:

5.7

-llllj

L

г~

и ование ел чайных чисел

КЛЮЧЕВЫЕ ПОЛОЖЕНИЯ
Функция с возвратом значения

-

это функция, которая возвращает значение обратно

в ту часть программы, которая ее вызвала.

Python,

а также большинство друтих языков

программирования, предоставляет библиотеку заранее написанных функций, которые

выполняют часто требующиеся задачи. Эти библиотеки, как правило, содержат функцию,
которая генерирует случайные числа.

Вы уже узнали о функциях без возврата значения. Функция без возврата значения

-

это

группа инструкций, которая присутствует в программе с целью выполнения определенной

задачи. Когда нужно, чтобы функция выполнила свою задачу, эта функция вызывается.
В результате внутри функции исполняются инструкции. Когда функция завершается, поток
управления

программы

возвращается

к

инструкции,

которая

располагается

сразу

после

вызова функции.
Функция с возвратом З1-1ачения

это особый тип функций. Она похожа на функцию без

-

возврата значения следующим образом:

+ это группа инструкций, которая выполняет определенную задачу;
+ когда нужно выполнить функцию, ее вызывают.
Однако когда функция с возвратом значения завершается, она возвращает значение назад
в ту часть программы, которая ее вызвала. Возвращаемое из функции значение используется
как любое другое значение: оно может быть присвоено переменной, выведено на экран, ис­

пользовано в математическом выражении (если оно является числом) и т. д.

Функции стандартной библиотеки и инструкция

Python,

import

а также большинство языков программирования поставляются вместе со стандарт­

ной библиотекой функций, которые были уже написаны за вас. Эти функции, так называе­
мые библиотечные функции, упрощают работу программиста, потому что с их помощью

решаются многие задачи. На самом деле, вы уже применяли несколько библиотечных функ­
ций

Python.

Вот некоторые из них: print, input и range. В

Python

имеется множество других

библиотечных функций. Хотя в этой книге мы не сможем охватить их все, тем не менее, мы

обсудим библиотечные функции, которые выполняют фундаментальные операции.
Некоторые библиотечные функции

Python

встроены в интерпретатор

Python.

Если требуется

применить в программе одну из таких встроенных функций, нужно просто вызвать эту
функцию. Это относится, например, к функциям print, input, range и другим, с которыми
вы уже познакомились. Однако многие функции стандартной библиотеки хранятся в файлах,
которые называются модулями. Эти модули копируются на ваш компьютер при установке

языка

Python

и помогают систематизировать функции стандартной библиотеки. Например,

все функции для выполнения математических операций хранятся вместе в одном модуле,
функции для работы с файлами

-

в другом модуле и т. д.

Для того чтобы вызвать функцию, которая хранится в модуле, нужно вверху программы на­
писать инструкцию импорта import. Она сообщает интерпретатору имя модуля, который

содержит функцию. Например, один из стандартных модулей

Python

называется math. В нем

256

Глава 5. Функции
содержатся различные математические функции, которые работают с числами с плавающей
точкой. Если требуется применить в программе какую-либо функцию из модуля math, необ­
ходимо вверху программы написать инструкцию импорта:

import math
Эта инструкция приводит к загрузке интерпретатором содержимого математического моду­
ля math в оперативную память и в результате все функции модуля math становятся доступ­
ными в программе.

Поскольку внутреннее устройство библиотечных функций невидимо, многие программисты
их рассматривают как черные ящики. Термин "черный ящик" используется для описания

любого механизма, который принимает нечто на входе, выполняет с полученным на входе
некоторую работу (которую невозможно наблюдать) и производит результат на выходе
(рис.

5.19).

Выход

Вход

РИС.

5.19. Библиотечная функция в виде черного ящика
Далее мы продемонстрируем работу функций с возвратом значения, сперва обратившись
к функциям стандартной библиотеки, которые генерируют случайные числа, и некоторым
интересным программам, которые можно написать на их основе. Затем вы научитесь писать

собственные функции с возвратом значения и создавать свои модули. Последний раздел

этой главы возвращается к теме библиотечных функций и обращается к некоторым другим
полезным функциям стандартной библиотеки

Python.

Генерирование случайных чисел
Случайные числа широко используются в большом количестве различных задач программи­
рования. Далее перечислено всего несколько таких примеров.

+ Случайные числа обычно используются в играх. Например, компьютерным играм, кото­
рые позволяют игроку подбрасывать игральный кубик, нужны случайные числа для

представления значений кубика. Программы, которые раскрывают игральные карты,
вынимаемые из перетасованной колоды, используют случайные числа для представления
достоинства карт.

+ Случайные

числа широко применяются в программах имитационного моделирования.

В некоторых симуляциях компьютер должен случайным образом решить, как будет вести
себя человек, животное, насекомое или другое живое существо. Нередко конструируются
формулы, в которых случайное число используется для определения различных действий
и событий, происходящих в программе.

+ Случайные

числа распространены в статистических программах, которые должны слу­

чайным образом отбирать данные для анализа.

+ Случайные числа обычно используются в компьютерной безопасности для шифрования
уязвимых данных.

Python

предлагает несколько библиотечных функций для работы со случайными числами.

Эти функции хранятся в модуле random в стандартной библиотеке. Для того чтобы приме-

Глава 5. Функции

257

нить любую из этих функций, сначала вверху программы нужно написать вот эту инструк­
цию импорта:

import random
Данная инструкция приводит к загрузке интерпретатором содержимого модуля

random

в оперативную память. В результате все функции модуля random становятся доступными

в вашей программе 1 •
Первая функция генерации случайного числа, которую мы обсудим, называется randint.
Поскольку функция randint находится в модуле random, для обращения к ней в нашей про­
грамме потребуется применить специальную форму записи через точку. В форме записи

через точку именем функции будет random. randint. С левой стороны от точки
жено имя модуля, с правой стороны

-

(.)

располо­

имя функции.

Вот пример вызова функции randint:
nшnЬer =

random.randint(l, 100)

Часть инструкции, которая представлена выражением

random.randint(l,

100), является

вызовом функции randint. Обратите внимание на два аргумента, которые расположены
в круглых скобках:
зоне от

1 до 100

1 и 100.

Они поручают функции выдать случайное целое число в диапа­

(оба значения включены в диапазон). На рис.

5.20

проиллюстрирована эта

часть инструкции.

.~~~-- Арrументы

number =random.randint(1, 100)
Вызов функции
РИС.

5.20.

Инструкция, которая вызывает функцию

randint

Обратите внимание, что вызов к функции randint появляется на правой стороне от операто­
ра

=. Когда функция будет вызвана, она сгенерирует случайное число в диапазоне от 1
100 и затем вернет его. Возвращенное число будет присвоено переменной nшnЬer
(рис. 5.21).

до

Некое число

~

number =random.randint(1, 100)
Случайное число в диапазоне

от 1до100 будет присвоено переменной пumber
РИС.

5.21.

Функция

1

randint

возвращает значение

В Python имеется несколько способов написания инструкции import, и каждый вариант работает немного

по-другому. Многие программисты

Python

соглашаются, что предпочтительным способом импортирования

модуля является тот, который представлен в этой книге.

258

Глава 5. Функции
В программе

представлен законченный код, в котором применяется функция randint.

5.16

Инструкция в строке

2 генерирует

случайное число в диапазоне от

1 до 1О

и присваивает его

переменной numЬer. (Вывод программы показывает, что было сгенерировано число

7,

но это

значение случайное. Если бы это была действующая программа, то она могла бы показать
любое число от 1до10.)

Программа 5.16
1 #
2 #

1

(random_numbeгs.py)

Эта программа

показывает

из диапазона от

до

1

случайное число

10.

3 import random
4
5 def main () :
6
# Получить случайное число.
7
numЬer = random.randint(l, 10)
8
# Показать число.
9
print ('Число равняется', numЬer)
10
11 # Вызвать главную функцию.
12 main ()
Вывод программы
Число равняется

7

В программе

5.17

показан еще один пример. Здесь используется цикл for, выполняющий

пять итераций. Внутри цикла инструкция в строке
ции случайного числа из диапазона от

Программа 5.17
1
2
3
4
5
6
7
8
9
10
11
12
13

#

1

Эта программа показывает пять

7

16
41
12

от

1

до

случайных

100.

def main () :
for count in range(5):
Получить

numЬer

#

=

случайное число.

random.randint(l, 100)

Показать

число.

print(numЬer)

# Вызвать
main ()

главную функцию.

Вывод программы

89

(гandom_numbeгs2.py)

# чисел из диапазона
import random

#

1 до 100.

8

вызывает функцию randint для генера­

Глава 5. Функции
Программы

5.16

и

5.17

вызывают функцию

randint

259

и присваивают возвращаемое ею значе­

ние переменной nшnЬer. Если требуется просто показать случайное число, то нет необходи­
мости присваивать случайное число переменной. Можно отправить значение, возвращаемое

из функции модуля

random, непосредственно в функцию print:

print(random.randint(l, 10))
Во время исполнения этой инструкции вызывается функция
рирует случайное число из диапазона от

в функцию

print.

1

до

1О,

randint.

Данная функция гене­

которое возвращается и отправляется

В результате случайное число будет выведено на экран (рис.

5.22).

Некое число

~

print (random.randint(1, 100))

Будет nоказано случайное
число в диаnазоне от

РИС.

5.22.

1 до 1О

Вывод случайного числа на экран

Программа5.18 демонстрирует, каким образом можно упростить программу

5.17.

тоже выводятся пять случайных чисел, но они не сохраняются в переменной. В строке

вращаемое из функции

Программа 5.18

1

(random_numbersЗ.py)

4

5 def main () :
6
for count in range(S):
7
print(random.randint(l, 100))
8
главную функцию.

Вывод программы

89
7

16
41
12

воз­

randint значение отправляется непосредственно в функцию print.

1 # Эта программа показывает пять случайных
2 # чисел из диапазона от 1 до 100.
З import random

9 # Вызвать
10 main ()

Здесь

7

260

Глава 5. Функции

Эксперименты с использованием случайных чисел
в интерактивном режиме
Для того чтобы почувствовать, как функция

randint работает с разными аргументами,

можно с ней поэкспериментировать в интерактивном режиме. Взгляните на приведенный
интерактивный сеанс, который демонстрирует, как это делается. (Для удобства добавлены
номера строк.)

1
2
3
4

>>> import random [Enter]
>>> random.randint(l, 10) [ Enter j
5

>>> random.randint(l, 100) [ Ent'йJ
5 98
6 >>> random.randint(lOO, 200) [ Enter]

7 181
8 >>>
Давайте взглянем на каждую строку в интерактивном сеансе поближе.

+

Инструкция в строке

1 импортирует

модуль

random. (В интерактивном режиме необходи­
import.)

мо также написать соответствующие инструкции

+ Инструкция в строке 2 вызывает функцию

randint, передавая ей 1 и 1О в качестве аргу­

ментов. В результате функция возвращает случайное число в диапазоне от
рое выводится в строке

1 до 1О,

кото­

3.

+ Инструкция в строке 4 вызывает функцию randint, передавая ей в качестве аргументов 1
и

100.

В результате функция возвращает случайное число в диапазоне от

рое выводится в строке

+ Инструкция в строке 6 вызывает функцию
100

и

200.

1 до 100,

кото­

5.
randint, передавая ей в качестве аргументов

В результате функция возвращает случайное число в диапазоне от

которое выводится в строке

100

до

200,

7.

Применение случайных чисел
Доктор Кимура преподает вводный курс статистики и попросил вас написать программу,
которую он мог бы использовать на занятиях для имитации бросания игральных кубиков.

Программа должна случайным образом генерировать два числа в диапазоне от

1 до 6

и пока­

зывать их. В интервью с доктором Кимура вы выясняете, что он хотел бы использовать про­

грамму для имитации нескольких поочередных бросаний кубика. Вот псевдокод программы:
До

тех пор,

пока

пользователь

Показать

случайное

Показать

еще одно

Спросить

пользователя,

хочет бросить

число в диапазоне
случайное

от

кубики:

1

до

число в диапазоне

хочет ли он бросить

6
от

1

до

6

кубики еще раз

Вы пишете цикл while, который имитирует один бросок кубиков и затем спрашивает поль­
зователя, следует ли сделать еще один бросок. Этот цикл повторяется до тех пор, пока поль­

зователь отвечает "да", набирая букву "д". В программе
КОД.

5.19

приведен соответствующий

Глава 5. Функции

Программа 5.19

1

261

(dice.py)

1 # Эта программа
2 irnport randorn

"бросает"

кубики.

3

4 # Константы
5 MIN = 1

для минимального и максимального случайных чисел

бМАХ=б

7

8 def rnain () :
9
# Создать переменную,
10
again = 'д'

которая управляет циклом.

11

12
13
14
15
16
17

#

Имитировать

бросание кубиков.

while again == 'д' or again == 'д':
print ('Бросаем кубики ... ')
print ('Значения граней:')
print(randorn.randint(MIN, МАХ))
print(randorn.randiпt(MIN,

МАХ))

18

# Сделать еще один бросок кубиков?
again = input ('Бросить кубики еще раз?

19

20

21
22 # Вызвать
23 rnain ()

(д =

да):

')

главную функцию.

Вывод nроrраммы (вводимые данные выделены жирным шрифтом)
Бросаем кубики
Значения

. ..

граней :

3
1
Бросить

кубики еще раз?

Бросаем кубики



=

да)

: д 1Enter l



=

да)

: д 1Enter l

(д =

да}

:

...

Значения граней :

1
1
Бросить

кубики еще раз?

Бросаем кубики

...

Значения граней :

5
6
Бросить

кубики еще

Функция

раз?

randint

н 1Enter \

возвращает целочисленное значение, поэтому ее вызов можно записать

везде, где используется целое число. Вы уже видели примеры, где возвращаемое из функции
значение присваивается переменной или отправляется в функцию

print.

Для того чтобы

Глава 5. Функции

262

более наглядно проиллюстрировать этот момент, вот инструкция, которая применяет функ­
цию

randint

х =

randorn.randint(l, 10) * 2

в математическом выражении:

В этой инструкции генерируется случайное число в диапазоне от
на

2.

Результатом является случайное четное число от

2

до

20,

1 до 1О

и затем умножается

которое присваивается пере­

менной х. Как продемонстрировано в следующей далее рубрике "В центре внимания", воз­

вращаемое из этой функции значение можно также проверить при помощи инструкции if.

Применение случайных чисел для представления других значений
Доктор Кимура был так доволен симулятором бросания кубиков, который вы ему написали,

что попросил вас разработать еще одну программу. Он хотел бы иметь симулятор десяти­
кратного поочередного подбрасывания монеты. Всякий раз, когда программа имитирует

подбрасывание монеты, она должна случайным образом показывать "орла" или "решку".
Вы решаете, что сможете сымитировать бросание монеты путем генерации случайного чис­
ла в диапазоне от

1 до 2. Вы напишете инструкцию if, которая показывает "орла",
1, или "решку" в противном случае. Соответствующий код

чайное число равняется
в программе

Программа 5.20

1

5.20.

(coin_toss.py)

1 # Эта программа
2 irnport randorn

имитирует

10

бросков монеты.

3

4
5
6
7

# Константы.
HEADS = 1
TAILS = 2
TOSSES = 10

#
#
#

Орел.

Решка.
Количество бросков.

8

9 def rnain () :
10
for toss in range(TOSSES):
11
# Имитировать бросание монеты.
12
if randorn.randint(HEADS, TAILS)
13
print ('Орел')
14
else:
15
print ('Решка')
16
17 #Вызвать главную функцию.
18 rnain ()
Вывод программы
Решка

Решка

HEADS:

если слу­

приведен

Глава 5. Функции

263

Орел

Орел
Решка
Орел
Решка
Орел
Решка
Орел

Функции

randrange, random

и

uniform

Модуль random стандартной библиотеки содержит многочисленные функции для работы со
случайными числами. Помимо функции randint, возможно, окажутся полезными функции

randrange, random и uniform. (Для того чтобы применить любую из этих функций, необхо­
димо вверху программы написать инструкцию import random.)
Если вы помните, как применять функцию range (которую мы рассмотрели в главе

4),

то

почувствуете себя непринужденно с функцией randrange. Функция randrange принимает

такие же аргументы, что и функция range. Различие состоит в том, что функция randrange
не возвращает список значений. Вместо этого она возвращает случайно отобранное значение
из последовательности значений. Например, приведенная ниже инструкция присваивает пе­

ременной nшnЬer случайное число в диапазоне от О до
nшnЬer =

9:

random.randrange(lO)

Аргумент



задает конечный предел последовательности значений. Функция возвратит

случайно отобранное число из последовательности значений от О до конечного предела, но
исключая сам предел. Приведенная ниже инструкция задает начальное значение и конечный
предел последовательности:

numЬer =

random.randrange(S,10)

Во время исполнения этой инструкции случайное число в диапазоне от
своено переменной

numЬer.

Приведенная

5

до

9

будет при­

ниже инструкция задает начальное значение,

конечный предел и величину шага:
numЬer =

random.randrange(O, 101, 10)

В этой инструкции функция randrange возвращает случайно отобранное значение из приве­
денной ниже последовательности чисел:
[О,

10, 20, 30, 40, 50, 60, 70, 80, 90, 100)

Функции randint и randrange возвращают целое число. А вот функция random возвращает
случайное число с плавающей точкой. В функцию random никаких аргументов не переда­
ется. Во время ее вызова она возвращает случайное число с плавающей точкой в диапазоне
от О.О до
nшnЬer

=

Функция

1.0 (но

исключая

1.0).

Вот пример:

random. random ()
uniform тоже возвращает случайное число с плавающей точкой, но при этом она

позволяет задавать диапазон значений, из которого следует отбирать значения. Вот пример:
nшnЬer =

random.uniform(l.O, 10.0)

264

Глава 5. Функции
В этой инструкции функция uniform возвращает случайное число с плавающей точкой
в диапазоне от

1.0 до 1О.О

и присваивает его переменной numЬer.

Начальные значения случайного числа
Числа, которые генерируются функциями модуля random, не являются подлинно случайны­
ми. Несмотря на то что мы обычно называем их случайными числами, они являются псевдо­

случайными числами, которые вычисляются на основе формулы. Формула, которая генери­
рует случайные числа, должна быть инициализирована начальным значением. Оно исполь­
зуется в вычислении, которое возвращает следующее случайное число в ряду. Когда модуль

random

импортируется, он получает системное время из внутреннего генератора тактовых

импульсов компьютера и использует его как начальное значение. Системное время является
целым числом, которое представляет текущую дату и время вплоть до одной сотой секунды.

Если бы всегда использовалось одно и то же начальное значение, то функции генерации
случайных чисел всегда бы возвращали один и тот же ряд псевдослучайных чисел. Посколь­
ку системное время меняется каждую сотую долю секунды, можно без опасений утверждать,
что всякий раз, когда импортируется модуль random, будет сгенерирована отличающаяся
последовательность случайных чисел. Вместе с тем, могут иметься некоторые приложения,

в которых потребуется всегда генерировать одну и ту же последовательность случайных

чисел. При необходимости для этого можно вызвать функцию random. seed, задав начальное
значение. Вот пример:

random. seed (10)
В этом примере в качестве начального значения задано

1О.

Если при каждом выполнении

программы она вызывает функцию random. seed, передавая одинаковое значение в качестве
аргумента, то она всегда будет порождать одинаковую последовательность псевдослучай­
ных чисел. Взгляните на приведенные ниже интерактивные сеансы. (Для удобства добавле­

ны номера строк.)

1 >>> import random IEnterl
2 >>> random. seed (10) IEnterl
3 >>> random.randint(l, 100) IEnterl
4 58
5 >>> random.randint(l, 100) IEnterl
6 43
7 >>> random.randint(l, 100) [Enter 1
8 58
9 >>> random.randint(l, 100) 1Enter1
10 21

11 >>>
В строке

1 мы импортируем модуль random. В строке 2 мы вызываем функцию random. seed,
10 в качестве начального значения. В строках 3, 5, 7 и 9 мы вызываем функцию
random. randint, чтобы получить псевдослучайные числа в диапазоне от 1 до 100. Как види­
те, функция выдала числа 58, 43, 58 и 21. Если запустить новый интерактивный сеанс и по­
передав

вторить эти инструкции, то мы получим ту же самую последовательность псевдослучайных
чисел, как показано ниже:

1 >>> import random IEnterl
2 >>> random.seed(lO) IEnterl

Глава 5. Функции

265

3 >>> random.randint(l, 100) 1Enter1
4 58

5 >>> random.randint(l, 100) 1Enter1
6 43
7

>>> random.randint(l, 100) 1Enter1

8 58
9 >>> random.randint(l, 100) [lilterl
10 21
11 >>>

~

Контрольная точка

5.21. Чем

отличается функция с возвратом значения от функций без возврата значения?

5.22.

Что такое библиотечная функция?

5.23.

Почему библиотечные функции похожи на "черные ящики"?

5.24.

Что делает приведенная ниже инструкция?
х =

5.25.

random.randint(l, 100)

Что делает приведенная ниже инструкция?

print(random.randint(l, 20))

5.26.

Что делает приведенная ниже инструкция?

print(random.random(lO, 20))

5.27.

Что делает приведенная ниже инструкция?

print(random.random())

5.28.

Что делает приведенная ниже инструкция?

print(random.uniform(0.1, 0.5))

5.29.

Для чего импортированный модуль random при генерации случайных чисел использует
начальное значение?

5.30.

Что произойдет, если для генерации случайных чисел всегда использовать одинаковое
начальное значение?

~

5.8

сание сЬ нк ии с возвратом значения

~ КЛЮЧЕВЫЕ ПОЛОЖЕНИЯ
Функция с возвратом значения имеет инструкцию

return, которая возвращает значение

в ту часть программы, которая ее вызвала.

Видеозапись 'Написание функции с возвратом значении" (111/пtmg а Value-Ret1JГnmg

Function)

Функцию с возвратом значения пишут точно так же, как и функцию без возврата значения,
но с одним исключением: функция с возвратом значения должна иметь инструкцию return.
Вот общий формат определения функции с возвратом значения в

Python:

Глава

266

def

5. Функции

имя_функции()

:

инструкция
инструкция

return

выражение

Одной из инструкций в функции должна быть инструкция

return, которая принимает при­

веденную ниже форму:

return

выражение

Значение выражения, которое следует за ключевым словом

return, будет отправлено в ту

часть программы, которая вызвала функцию. Это может быть любое значение, переменная
либо выражение, которые имеют значение (к примеру, математическое выражение).
Вот простой пример функции с возвратом значения:

def sum(numl, num2):
result = num 1 + num 2
return result
На рис.

5.23

показаны различные части функции.
Имя функции

num1

-

sum

и

num2-

этo параметры

г i

+

def sum(num1, num2):
result = num1 + num2
return result
-----

Эта функция возвращает
значение, на которое ссылается

переменная

РИС.

5.23.

result

Составные части функции

Задача этой функции состоит в том, чтобы принять два целочисленных значения в качестве
аргументов и вернуть их сумму. Рассмотрим ее работу. Первая инструкция в блоке функции
присваивает значение

numl

+

num2 переменной resul t. Затем исполняется инструкция

return, которая приводит к завершению исполнения функции и отправляет значение, на ко­
result, назад в ту часть программы, которая вызвала эту функ­

торое ссылается переменная
цию. Программа
Программа

1 #

Эта

5.21

5.21

демонстрирует эту функцию.

(total_ages.py)

программа использует

возвращаемое

значение

функции.

def main () :
# Получить возраст пользователя.
first age = int(input('Bвeдитe свой

возраст:

'))

2
З

4
5
6

7
8
9

#

Получить

second_age

возраст лучшего друга

=

int(input("Bвeдитe

пользователя.
возраст

своего лучшего друга:

"))

Глава 5. Функции

10
11

267

# Получить сумму обоих возрастов.
total = sum(first_age, second_age)

12

13
# Показать общий возраст.
14
print('Bмecтe вам', total,
'лет.')
15
16 # Функция sum принимает два числовых аргумента
17 #и возвращает сумму этих аргументов.
18 def sum(numl, num2):
result = numl + num2
19
20
return result
' 21
22 #
1

Вызвать

главную функцию.

23 main ()
Вывод программы (вводимые данные выделены жирным шрифтом)

Введите свой возраст :

22 IEnter l

Введите возраст своего лучшего друга :
Вместе вам

46

24 IEnter l

лет .

В функции

main программа получает от пользователя два значения и сохраняет их в пере­
first_age и second_age. Инструкция в строке 11 вызывает функцию sum, передавая
first_age и second_age в качестве аргументов. Значение, которое возвращается из функции
sum, присваивается переменной total. В данном случае функция вернет 46. На рис. 5.24 по­

менных

казано, как аргументы передаются в функцию и как значение возвращается назад из функ­
ции.

total = sum(first_age, second_age)



def sum(num1, num2):
result = num1 + num2
return result
РИС.

5.24.

Аргументы передаются в функцию

sum,

а затем возвращается значение

Использование инструкции
Взгляните еще раз на функцию

return

по максимуму

sum, представленную в программе 5.21:

def sum(numl, num2):
result = num 1 + num 2
return result
Обратите внимание, что внутри этой функции происходят две вещи: во-первых, переменной

resul t присваивается значение выражения numl + num2, и во-вторых, значение переменной
resul t возвращается. Хотя эта функция хорошо справляется с поставленной перед ней зада-

268

Глава 5. Функции
чей, ее можно упростить. Поскольку инструкция

переменную

return

возвращает значение выражения,

resul t можно устранить и переписать функцию так:

def sum(numl, num2):
return num 1 + num 2
Эта версия функции не сохраняет значение

numl + num2 в переменной. Вместо этого она
return. Эта версия функции

сразу возвращает значение выражения с помощью инструкции

делает то же самое, что и предыдущая версия, но только за один шаг.

Как использовать функции с возвратом значения?
Функции с возвратом значения предоставляют многие из тех же преимуществ, что имеются
у функций без возврата значения: они упрощают программный код, уменьшают дублирова­
ние кода, улучшают ваши возможности по тестированию кода, увеличивают скорость разра­

ботки и способствуют совместной работе в команде.
Поскольку функции с возвратом значения возвращают значение, они могут быть полезными.
Например, можно использовать такую функцию для запроса у пользователя входных дан­
ных, и затем она может вернуть введенное пользователем значение. Предположим, что вас

попросили разработать программу, которая вычисляет отпускную цену товара в розничной
торговле. Для того чтобы это сделать, программе потребуется получить от пользователя

обычную цену товара. Вот функция, которую можно было бы определить для этой цели:

def get_regular_price():
price = float(input("Bвeдитe
return price

обычную цену товара:

"))

Затем в другом месте программы эту функцию можно вызвать:

#

обычную цену товара.

Получить

reg_price

get regular_price()

=

Во время исполнения этой инструкции вызывается функция

get _ regular _price, которая

получает значение от пользователя и возвращает его. Это значение затем присваивается
переменной

reg_price.

Такие функции можно применять для упрощения сложных математических выражений. На­
пример, вычисление отпускной цены товара на первый взгляд выглядит простой задачей:
вычисляется скидка, которая затем вычитается из обычной цены. Однако, как показано
в приведенном далее примере, инструкция, выполняющая эти расчеты в программе, не такая

прямолинейная. (Допустим, что

DISCOUNT_PERCENTAGE- это глобальная константа, которая

определена в программе, и она задает процент скидки.)

sale_price

=

reg_price -

(reg_price * DISCOUNT_PERCENTAGE)

С первого взгляда видно, что эту инструкцию трудно понять, потому что она выполняет

очень много шагов: она вычисляет сумму скидки, вычитает ее значение из обычной цены

reg_price

и присваивает результат переменной

sale_price.

Данную инструкцию можно

упростить, вычленив часть математического выражения и поместив ее в функцию. Вот
функuия с именем

discount, которая принимает в качестве аргумента цену товара и возвра­

щает сумму скидки:

def discount(price):
return price * DISCOUNT PERCENTAGE

Глава 5. Функции

269

Затем эту функцию можно вызывать в своих расчетах:

sale_price = reg_price - discount(reg_price)
Эта инструкция читается легче, чем показанная ранее, и становится понятнее, что из обыч­
ной цены вычитается скидка. В программе

5.22

показан законченный код вычисления отпу­

скной цены с использованием функций, которые были только что описаны.

Программа 5.22
1 #
2 #

1

(sale_prlce.py)

Эта программа

вычисляет

отпускную цену

розничого товара.

3

4 # DISCOUNT PERCENTAGE используется в качестве
5 # глобальной константы для процента скидки.
6 DISCOUNT PERCENTAGE = 0.20
7

8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34

#

Главная функция.

def main () :
# Получить обычную цену товара.
reg_price = get_regular_price()
#

Рассчитать

отпускную цену.

sale_price = reg_price - discount(reg_price)
#

Показать

отпускную цену.

рrint('Отпускная цена

составляет$',

format(sale_price, '.2f'), sep=' ')

#

Функция

#

ввести обычную цену товара и возвращает

get_regular_price

предлагает пользователю

# это значение.
def get_regular_price():
price = float(input("Bвeдитe
return price
#

Функция

#
#

аргумента и возвращает

discount

обычную цену товара:

принимает цену товара в качестве
сумму скидки,

DISCOUNT_PERCENTAGE.
def discount(price):
return price * DISCOUNT PERCENTAGE
указанную в

# Вызвать
main ()

главную функцию.

Вывод программы (вводимые данные выделены жирным шрифтом)

Введите обычную цену товара :
Отпускная цена

составляет

100 \ En

$80 . 00

erl

"))

Глава 5. Функции

270

Использование таблиц "ввод-обработка-вывод"
Таблица "ввод-обработка-вывод" является простым, но эффективным инструментом, кото­
рый программисты иногда используют для разработки и документирования функций. Такая
таблица описывает ввод, обработку и вывод функции. Эти элементы обычно размещаются

в столбцах: столбец "Ввод" описывает данные, которые передаются в функцию в качестве
аргументов; столбец "Обработка" показывает описание процесса, который функция выпол­
няет; столбец "Вывод" описывает данные, которые возвращаются из функции. Например,
на рис.

5.25

показана такая таблица для функций

видели в программе

Для функции get_гegulaг_price

Ввод
Отсутствует

get_regular_price и discount, которые вы

5.22.

Обработка

Для функции
Вывод

disoount
Обработка

Ввод

Вывод

Предлагает пользователю

Розничная

Розничная

Вычисляет товарную

Товарную

ввести розничную цену

цена товара

цена товара

скидку nутем умножения

скидка

розничной цены на

товара

глобальную константу

РИС.

5.25.

Таблицы "ввод-обработка-вывод" для функций

get regular_price

и

discount

Обратите внимание, что таблицы "ввод-обработка-вывод" дают лишь краткие описания
входных данных, процесса обработки и выходных данных функции и не показывают кон­
кретные шаги, предпринимаемые в функции. Во многих случаях, однако, таблицы "ввод­
обработка-вывод" содержат достаточный объем информации и поэтому могут использовать­
ся вместо блок-схем. Решение об использовании таблицы "ввод-обработка-вывод", блок­
схемы либо обоих инструментов часто оставляется на личное усмотрение программиста.

Модуляризация функций
Хал владеет предприятием под названием "Делай свою музыку", которая продает гитары,

барабаны, банджо, синтезаторы и другие музыкальные инструменты. Сотрудники отдела
продаж работают строго на комиссионном вознаграждении. В конце месяца комиссионные
каждого продавца вычисляются согласно табл.
Таблица

5.1. Ставки комиссионного вознаграждения

Продажи в этом месяце, долларов

Меньше

5.1.



ООО

Ставка комиссионных,

10

10 000-14 999

12

15 000-1 7 999

14

18 000-21 999

16

22 ООО

18

или больше

%

Глава 5. Функции
Например, продавец с месячными продажами в размере
центные

18

комиссионные

(2240

долларов).

Другой

16

дажами в

30 ООО долларов заработает

ООО долларов заработает 14-про­

продавец

ООО долларов заработает 16-процентные комиссионные

271

(2880

с

месячными

продажами

долларов). Человек с про­

18-процентные комиссионные

(5400 долларов).

Поскольку персонал получает выплату один раз в месяц, Хал позволяет каждому сотруднику

брать до

долларов в месяц авансом. Когда комиссионные с продаж рассчитаны, авансо­

2000

вая выплата каждому сотруднику вычитается из его комиссионных. Если комиссионные

какого-либо продавца оказываются меньше суммы авансовой выплаты, то он должен воз­
местить Халу разницу. Для вычисления месячной выплаты продавцу Хал использует фор­
мулу:
выплата

=

продажи х ставка комиссионных

-

выплата авансом.

Хал попросил вас написать программу, которая делает эти расчеты за него. Приведенный
ниже общий алгоритм дает краткое описание шагов, которые должна делать программа.
Получить месячные продажи продавца.

Получить

сумму авансовой выплаты.

Применить

сумму месячных продаж для определения ставки комиссионных.

Рассчитать выплату продавцу с использованием ранее показанной формулы.
отрицательная,

Впрограмме

то

5.23

указать,

что

продавец

должен

возместить

компании

Если сумма

разницу.

представлен соответствующий код, который написан с использованием

нескольких функций. Вместо представления сразу всей программы, давайте сначала иссле­
дуем главную функцию
Программа

5.23

main и затем каждую функцию в отдельности.

(commission_rate.py).

Главная функция

1 # Эта программа вычисляет выплату
2 #в компании 'Делай свою музыку'.
3 def main () :
4
# Получить сумму продаж.
5
sales = get sales()

продавцу

6

7
8

# Получить сумму авансовой оплаты.
advanced_pay = get_advanced_pay()

9

10
11
12
13
14
15

# Определить ставку комиссионных.
comm_rate = determine_comm_rate(sales)
#

Рассчитать

рау

оплату.

= sales * comm_rate - advanced_pay

16

#

17
18
19
20
21
22
23

рrint('Выплата

Показать

сумму вьmлаты.

# Определить,
if рау < О:

составляет$',

'.2f'), sep='')

является ли выплата отрицательной.

рrint('Продавец должен

print

format(pay,

('компании.')

возместить

разницу')

Глава 5. Функции

272

Строка

5

вызывает функцию

get _ sales,

которая получает от пользователя сумму продаж и

возвращает это значение. Возвращенное из функции значение присваивается переменной

sales. Строка 8 вызывает функцию get_advanced_pay, которая получает от пользователя
сумму авансовой выплаты и возвращает это значение. Возвращенное из функции значение
присваивается переменной
Строка

advanced_pay.

вызывает функцию

11

determine_comm_rate,

передавая

sales

в качестве аргумента.

Эта функция возвращает ставку комиссионных для суммы продаж. Это значение присваива­

ется переменной comm_ ra te. Строка

сумму выплаты, а затем строка

вает эту сумму. Инструкция i f в

определяет, является ли выплата отрица­

14 вычисляет
строках 20-22

17

показы­

тельной, и если это так, то выводит сообщение, указывающее, что продавец должен возмес­
тить компании разницу. Следующим идет определение функции

Программа

5.23

(продолжение). Функция

get _ sales.

get_sales

24 # Функция get_sales получает от пользователя
25 # месячные продажи продавца и возвращает это значение.
26 def get_sales():
27
# Получить сумму месячных продаж.
28
monthly_sales = float(input('Bвeдитe сумму месячных

продаж:

'))

29

30
31

#

Вернуть

введенную сумму.

return monthly_sales

32

Задача функции

get_ sales состоит в том, чтобы предложить пользователю ввести сумму

продаж продавца и вернуть эту сумму. Строка

28

предлагает пользователю ввести сумму

продаж и сохраняет введенное пользователем значение в переменной для месячных продаж

monthly_sales. Строка 31 возвращает эту сумму в переменную monthly_sales. Далее идет
определение функции get_advanced_pay.
Программа

33
34
35
36
37
38
39
40
41
42
43
44

5.23

(продолжение). Функция

get_advanced_pay

get_advanced_pay

#

Функция

#

авансовой вьmлаты конкретному продавцу

получает

сумму

# и возвращает эту сумму.
def get_advanced_pay():
#

Получить

сумму авансовой вьmлаты.

рrint('Введите

сумму авансовой вьmлаты либо')

print ('введите О, если такой вьmлаты не было. ')
advanced = float(input('Aвaнcoвaя вьmлата: '))

# Вернуть введенную
return advanced

сумму.

Глава 5. Функции

Задача функции

get _ advanced_pay

273

состоит в том, чтобы предложить пользователю ввести

сумму авансовой выплаты продавцу и вернуть эту сумму. Строки

38

и

39

просят пользова­

теля ввести сумму авансовой выплаты (либо О, если такая выплата не была предоставлена).
Строка

получает введенное пользователем значение и сохраняет его в переменной

40

advanced.

Строка

43

ределение функции

возвращает сумму в переменную для авансового платежа

advanced.

Оп­

determine - comm- rate идет следующим.

~грамма 5.23 ] (окончание). Функция determine_comm_rate
#
#

Функция

#

ставку комиссионных.

в

determine_comm_rate

принимает

сумму продаж

качестве аргумента и возвращает подходящую

48 def determine_comm_rate{sales):
49
# Определить ставку КОМИССИОННЬIХ.
if sales < 10000.00:
50
51
rate = 0.10
52
elif sales >= 10000 and sales = 15000 and sales = 18000 and sales >> print(numЬers[l:8:2]) IEnterl

1 >>>
2 >>>

numЬers

=

5 [2, 4, 6, 8]
6 >>>
В выражении среза в строке

4 третье

число внутри скобок является величиной шага. Приме­

ненная в этом примере величина шага

2

приводит к тому, что срез содержит каждый второй

элемент из заданного диапазона в списке.

В качестве индексов в выражениях среза также можно использовать отрицательные числа,

чтобы ссылаться на позиции относительно конца списка.

Python

прибавляет отрицательный

индекс к длине списка, чтобы ссылаться на позицию по этому индексу. Приведенный ниже
сеанс интерактивного режима показывает пример:

1 >>> nшnЬers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 1Enter1
2 >>> print(nшnЬers) IEnterl
3 [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
4 >>>

print(numЬers[-5:])

l§terl

5 [ 6, 7, 8, 9, 10]
6 >>>

()

ПРИМЕЧАНИЕ
Недопустимые индексы в выражении среза исключений не вызывают. Например:
если индекс конца задает позицию за пределами конца списка, то Pythoп вместо него будет
использовать длину списка;



если индекс начала задает позицию до начала списка,



если индекс начала будет больше индекса конца, то выражение среза вернет пустой список.

~ Контрольная точка
7.9.

Что покажет приведенный ниже фрагмент кода?
numЬers = [1, 2, 3, 4, 5]
my_list = numЬers[l:3]
print (my_list)

7.10.

Что покажет приведенный ниже фрагмент кода?
numЬers

=

[1, 2, 3, 4, 5]

my_list = numЬers[l:]
print (my_list)

Python

вместо него будет использовать О;

372

Глава 7. Списки и кортежи

7.11. Что покажет приведенный

ниже фрагмент кода?

numЬers = [1, 2, 3, 4, 5]
my_list = numЬers[:l]
print (my_list)

7.12. Что покажет приведенный
numЬers =

ниже фрагмент кода?

[1, 2, 3, 4, 5]

my_list = numЬers[:]
print (my_list)

7.13. Что покажет приведенный
numЬers =

ниже фрагмент кода?

[1, 2, 3, 4, 5]

my_list = numЬers[-3:]
print (my_list)
11111111111

7.4

Поиск значений в списках при помощи инструкции

in

11111111(__ КЛЮЧЕВЫЕ ПОЛОЖЕНИЯ
Поиск значения в списке выполняется при помощи оператора

В

Python

оператор

in.

in применяется для определения, содержится ли значение в списке. Вот
in для поиска значения в списке:

общий формат выражения с оператором
зна чение

in

список

В данном формате значение- это искомое значение, список- список, в котором выполня­
ется поиск. Это выражение возвращает истину, если значение в списке найдено, и ложь
в противном случае. В программе

Программа

1 #
2 #

7.2

7.2 приведен пример.

(in_llst.py)

Эта программа демонс трирует операт ор

in

применительно к списку.

3

4 def main () :
5

#

6

prod_nums

Созда ть

список номеров изделий.

=

['V4 75 ', 'F98 7 ', ' Q143 ', 'R688']

7

8
9
10
11
12
13
14
15
16

# Получить искомьМ номер изделия.
search = inрut('Введите номер изделия: ')
#

Определить ,

что номер изделия имеет с я в

if search in p rod_nums:
pri nt( search, 'найде н в с писке .')
else:
print( s earch, 'не н айден в списке.')

с пис ке.

Глава 7. Списки и кортежи

1

373

17 # Вызвать главную функцию.
18 main ()
Вывод

программы (вводимые данные выделены жирным шрифтом)

1

Введите

Q143

номер

найден в

Вывод

2

изделия :

Ql43 1 Enter 1

списке .

программы (вводимые данные выделены жирным шрифтом)
номер изделия :

Введите

ВООО

IEnter l

ВООО не найден в списке .

В строке

9

программа получает от пользователя номер изделия и присваивает его перемен­

ной

search. Инструкция i f в строке 12 определяет, находится ли значение search в списке
prod_nurns.
Для того чтобы определить, не находится ли значение в списке, можно применить оператор

not in. Вот пример соответствующего фрагмента кода:
if search not in prod_nurns:
print(search, 'не найден в списке.')
else:
print(search, 'найден в списке.')

~

Контрольная точка
7.14.

Что покажет приведенный ниже фрагмент кода?

names = [ 'Джим', 'Джилл', 'Джон' , 'Джасмин' ]
if 'Джасмин' not in names:
print ('Не могу найти Джасмин. ')
else:
print("Ceмья Джасмин:")

print (names)

111111111

7.5

Спи ковые мето

ы и полезные встроенные функции

~ КЛЮЧЕВЫЕ ПОЛОЖЕНИЯ
Списки имеют многочисленные методы, которые позволяют работать с содержащимися
в них значениями.

Python

также предлагает несколько встроенных функций, которые

широко используются для работы со списками.
Списки имеют многочисленные методы, которые позволяют добавлять, удалять, переупоря­

дочивать значения и т. д. Мы обратимся к нескольким таким методам' (табл.

1

7.1).

В этой книге мы не охватим все списковые методы. Описание всех методов списка см. в документации Python

на сайте

www.python.org.

Глава 7. Списки и кортежи

374
Таблица

7.1. Списковые методы

Метод

Описание

арреnd(значение)

Добавляет значение в конец списка

index (значение)

Возвращает индекс первого элемента, значение которого равняется

значению. Если значение в списке не найдено, то вызывается исключение

ValueError
insert (индекс,

значение)

Вставляет значение в заданную индексную позицию в списке. Когда значение вставляется в список, список расширяется в размере, чтобы разместить
новое значение. Значение, которое ранее находилось в заданной индексной
позиции, и все элементы после него сдвигаются на одну позицию к концу

списка. Если указан недопустимый индекс, то исключение не происходит.

Если задан индекс за пределами конца списка, то значение будет добавлено
в конец списка. Если применен отрицательный индекс, который указывает
на недопустимую позицию, то значение будет вставлено в начало списка

sort ()

Сортирует значения в списке, в результате чего они появляются в возрас-

тающем порядке (начиная с наименьшего значения до наибольшего)
rеmоvе(значение)

Удаляет из списка первое появление значения. Если значение в списке
не найдено, то вызывается исключение

reverse ()

ValueError

Инвертирует порядок следования значений в списке, т. е. меняет его
на противоположное

Метод
Метод

append()

append ( ) обычно применяется для добавления значений в список. Значение, которое

передается в качестве аргумента, добавляется в конец существующих элементов списка.
В программе

Программа

l #
2 #

7.3

7.3

приведен соответствующий пример.

(list_append.py)

Эта программа демонстрирует применение метода
дпя добавления

значениi1 в список.

3

4 def main () :
# Сначала создать
5
6
name list = [)

пустой список.

7

8
9
10
11
12
13
14
15

#

Создать

again

=

переменнную дпя управления циклом.

'д'

# Добавить в список несколько имен.
while again == 'д':
# Получить от пользователя имя.
name = inpu t ( 'Введите имя : ' )

append

Глава 7. Списки и кортежи

16
17
18
19

#

375

Добавить имя в конец списка.

narne_list.append(narne)
# Добавить еще одно?
print ('Желаете добавить еще одно имя?')
again = input('д =да, все остальное= нет: ')
print()

20

21
22

23
24

#

25

print

Показать

введенные имена.

('Вот имена,

которые бьu~и введены.')

26

for name in narne list:
print(narne)

27

28
29

30 # Вызвать
31 main ()

главную функцию.

Вывод программы (вводимые данные выделены жирным шрифтом)

Введите имя : Кэтрин 1Enter 1
Желаете добавить

д

=

да ,

Введите имя

Введите имя

:

д

IEnterl

еще

одно имя?

IEnter l

еще одно имя?

все остальное= нет : д IEnter l

Введите имя : Рене

Вот

нет :

Кении 1Enter 1

Желаете добавить

д = да ,

=

все остальное = нет : д

Желаете добавить

д =да ,

одно имя?

: :крис 1Enter 1

Желаете добавить

д = да ,

еще

все остальное

1

Enter 1

еще одно имя?

все остальное

имена ,

=

которые были

нет : и

IEnterl

введены .

Кэтрин
Крис
Кенни
Рене

Обратите внимание на инструкцию в строке

name list

=

6:

[]

Эта инструкция создает пустой список (список без элементов) и присваивает его переменной

narne _ list.

Внутри цикла метод

append ()

вызывается для создания списка. Во время первого

вызова метода переданный в него аргумент станет элементом О. Во время второго вызова
метода переданный в него аргумент станет элементом
пользователь не выйдет из цикла.

1.

Это продолжается до тех пор, пока

376

Глава 7. Списки и кортежи

Метод

indexO

Ранее вы познакомились с тем, как оператор

in

можно применять для определения, находит­

ся ли значение в списке. Иногда необходимо знать не только, что значение находится в спи­
ске, но и где оно расположено. Метод
В метод

index ()

используется как раз для таких случаев.

передается аргумент, и он возвращает индекс первого элемента в списке,

index ()

который содержит это значение аргумента. Если значение в списке не найдено, то метод вы­

зывает исключение

Программа 7.4
1 #
2 #
3 #

Эта

1

(index_list.py)

программа демонстрирует,

как получить

индексную позицию значения в

заменить

food

=

список

[ 'Пицца'

8
9
10

print('Boт

11

print (food)

#

списке и затем

это значение новым.

4
5 def main () :
6
# Создать
7

ValueError. Программа 7.4 демонстрирует метод index ().

Показать

,

с несколькими значениями.
'Бургеры'

,

'Чипсы'

]

список.
значения списка продуктов

питания:')

12
13
# Получить значение, подлежащее изменению.
14
item = input('Kaкoe значение следует изменить? ')
15
16
try:
17
# Получить индексную позицию значения в списке.
18
item index = food.index(item)
19
20
# Получить значение, на которое следует заменить.
21
new item = inрut('Введите новое значение: ')
22
23
# Заменить старое значение новым.
24
food[item_index]
new item
25
26
# Показать список.
27
print('Boт пересмотренный список:')
28
print(food)
29
except ValueError:
30
print('Этo значение в списке не найдено.')
31
32 # Вызвать главную функцию.
33 main ()
Вывод программы ( вводимые данные выделены жирным шрифтом)
Вот

значения

[ ' Пицца ' ,

списка

' Бургеры '

продуктов

,

' Чипсы '

]

питания :

Глава 7. Списки и кортежи

377

Какое значение следует изменить? Бурrеры IEnterl
Введите новое значение : Сопеные orypцw

IEnterl

Вот пересмотренный список :
[ ' Пицца ',

' Соленые огурцы ',

Элементы списка

' Чипсы ' ]

food

выводятся в строке

11,

в строке

брать значение, подлежащее изменению. Строка

индекса значения. Строка

21

18

14

пользователю предлагается вы­

вызывает метод

index ()

для получения

получает от пользователя новое значение, а строка

24

присваи­

вает его элементу, содержащему старое значение.

Метод

insert()

Метод

insert () позволяет вставлять значение в список в заданной позиции.
insert () передается два аргумента: индекс, задающий место вставки значения, и

которое требуется вставить. В программе

Программа 7.5
1 #

1

7.5

(insert_list.py)

Это программа

демонстрирует метод

insert.

2

3 def main () :
4
# Создать список с
5
names = [ 'Джеймс' ,

несколькими именами.
'Кэтрин'

,

'Билл'

6

7
8
9

# Показать список.
print ('Список перед
print(names)

вставкой:')

10

11
12

# Вставить новое имя в
names.insert(O, 'Джо')

элемент О.

13

14
15
16

#

Показать

список еще раз.

print ('Список
print(names)

после

вставки:')

17

18 # Вызвать
19 main ()

главную функцию.

Вывод программы
Список перед вставкой :

[ ' Джеймс ' , ' Кэтрин ' , ' Билл ' ]
Список

['Джо ',

после

вставки :

' Джеймс ',

' Кэтрин ',

' Билл ' ]

)

показан пример.

В метод
значение,

378

Глава 7. Списки и кортежи

Метод
Метод

sort()

sort ()

перестраивает элементы списка таким образом, что их значения появляются

в возрастающем порядке (от самого малого значения до самого большого). Вот соответст­
вующий пример:

my_list = [9, 1, О, 2, 8, 6, 7, 4, 5, 3]
print ('Первоначальный порядок:', my_list)
my_list. sort ()
рrint('Отсортированный порядок:', my_list)
Во время исполнения этого фрагмента кода он покажет следующее:
Первоначальный порядок:
Отсортированный порядок:

[9, 1, О, 2, 8, 6, 7, 4, 5, 3]
[О, 1, 2, 3, 4, 5, 6, 7, 8, 9]

Вот еще один пример:

my_list = ['бета', 'альфа', 'дельта', 'гамма']
print ('Первоначальный порядок:', my_list)
my_list.sort()
print ('Отсортированный порядок:', my_list)
Во время исполнения этого фрагмента кода он покажет следующее:
Первоначальный порядок:
Отсортированный порядок:

Метод
Метод

['бета',

'альфа',

['альфа',

'дельта',

'бета',

'гамма',

'гамма']
'дельта']

remove()

remove ()

удаляет значение из списка. Методу в качестве аргумента передается значе­

ние, и первый элемент, который содержит это значение, удаляется. Метод уменьшает размер
списка на один элемент. Все элементы после удаленного элемента смещаются на одну пози­
цию к началу списка.

ValueError.
Программа

7.6

Программа

Если элемент в списке не найден, то вызывается

7.6 демонстрирует этот метод.

(remove_item.py)

1 # Эта программа демонстрирует применение метода
2 # remove для удаления значения из списка.
3

4 def main () :
5
# Создать список
6
food = ['Пицца',

с несколькими значениями.
'Бургеры',

'Чипсы']

7

8
9
10

#

Показать

список.

print('Boт значения списка продуктов питания:')

print(food)

11

12
13
14

# Получить значения, подлежащее удалению.
item = input('Kaкoe значение следует удалить? ')

исключение

Глава 7. Списки и кортежи

15
16
17

379

try:
Удалить

#

значение.

food.rernove(itern)

18

19
# Показать список.
20
print ('Вот пересмотренный список:')
21
print(food)
22
23
except ValueError:
24
print('Этo значение в списке не найдено.')
25
26 # Вызвать главную функцию.
27 rnain ()
Вывод программы (вводимые данные выделены жирным шрифтом)
Вот

значения

списка

продуктов

( ' Пицца ' , ' Бургеры ' ,

' Чипсы '

питания :

]

Какое значение следует удалить? Бyprepw IEnter l
Вот пересмотренный список :

[ ' П~;щца ' ,

' Чипсы '

Метод
Метод

]

reverse()

reverse ()

просто инвертирует порядок следования значений в списке. Вот пример:

rny_list = [1, 2, 3, 4, 5]
print ('Первоначальный порядок:', rny_list)
rny_list.reverse()
print ('Инвертированный порядок:', rny_list)
Этот фрагмент кода покажет следующее:
Первоначальный порядок:
Инвертированный порядок:

(1, 2, 3, 4, 5]
[5, 4, 3, 2, 1]

Инструкция

de/

Метод

который вы видели ранее, удаляет заданное значение из списка, если это

rernove () ,

значение находится в списке. Некоторые ситуации могут потребовать удалить элемент из
заданной индексной позиции, независимо от значения, которое хранится в этой индексной

позиции. Это может быть выполнено при помощи инструкции
ния инструкции

del:

rny_list = [1, 2, 3, 4, 5]
print ('Перед удалением:', rny_list)
del rny_list[2]
print ('После удаления:', rny_list)

del.

Вот пример использова­

380

Глава 7. Списки и кортежи
Этот фрагмент кода выведет на экран следующее:
Перед удалением:
После

удаления:

Функции

[1, 2, 3, 4, 5)
[1, 2, 4, 5)

min

и

max

имеет две встроенные функции,

Python

ми. Функция

rnin

rnin

и

rnax,

которые работают с последовательностя­

принимает в качестве аргумента последовательность, в частности список, и

возвращает элемент, который имеет минимальное значение в последовательности. Вот при­
мер:

rny_list

[5, 4, 3, 2, 50, 40, 30)

=

рrint('Минимальное

значение равняется',

rnin(rny_list))

Этот фрагмент кода выведет следующее:
Минимальное

Функция

значение равняется

rnax

2

принимает в качестве аргумента последовательность, в частности список,

и возвращает элемент, который имеет максимальное значение в последовательности. Вот
пример:

rny_list

[5, 4, 3, 2, 50, 40, 30)

=

рrint('Максимальное

значение

равняется',

rnax(rny_list))

Этот фрагмент кода выведет на экран следующее:
Максимальное значение равняется

"J

50

Контрольная точка
7.15.

В чем разница между вызовом спискового метода

ции

del

rernove ()

и применением инструк­

для удаления элемента?

7.16.

Как найти минимальное и максимальное значения в списке?

7.17.

Допустим, что в программе появляется следующая инструкция:

narnes

=

[]

Какую из приведенных ниже инструкций следует применить для добавления в список

в индексную позицию О строкового значения 'Вэнди'? Почему вы выбрали именно эту
инструкцию вместо другой?

7.18.

а)

narnes[OJ

б)

narnes. append ( 'Вэнди' ) .

=

'Вэнди';

Опишите приведенные ниже списковые методы:
а)

index ();

б)

insert ();

в)

sort ();

г)

reverse ().

Глава 7. Списки и кортежи

381

111111111111

7.6

ование списков

~ КЛЮЧЕВЫЕ ПОЛОЖЕНИЯ
Для создания копии списка необходимо скопировать элементы списка.

Вспомните, что в

Python

в результате присваивания одной переменной другой переменной

обе переменных ссылаются на один и тот же объект в оперативной памяти. Например,
взгляните на приведенный ниже фрагмент кода:

#

Создать

listl

#

=

список.

[1, 2, 3, 4]

Присвоить

list2

=

список переменной

list2.

listl

После исполнения этого фрагмента кода обе переменные listl и list2 будут ссылаться на
один и тот же список в оперативной памяти (рис.

list1

-----

2

7.4).

з

4

list2 ______.РИС.

7.4.

Переменные

listl

и

list2

ссылаются на один и тот же список

Для того чтобы это продемонстрировать, взгляните на приведенный ниже интерактивный
сеанс:

1 >>> listl = (1, 2, 3, 4] 1Enter1
2 >>> list2 = listl IEnterl
3 >>> print (listl) IEnterl
4 [1, 2, 3, 4]
5 >>> print(list2) 1Enter1
6 (1, 2, 3, 4]
7 >>> listl [О] = 99 1Enter1
8 >>> print (listl) IEnterl
9 [99, 2, 3, 4]
10 >>> print(list2) 1Enter1
11 [99, 2, 3, 4]
12 >>>
Рассмотрим каждую строку.

+ В строке 1 мы создаем список целых чисел и присваиваем этот список переменной listl.
+ В строке 2 мы присваиваем переменную listl переменной list2. После этого listl
и list2 ссылаются на один и тот же список в оперативной памяти.

+ В строке 3 мы печатаем список, на который ссылается
выводится в строке

4.

+ В строке 5 мы печатаем список, на который ссылается
выводится в строке
в строке

listl. Результат функции print

6.

list2. Результат функции print

Обратите внимание, что он совпадает с выводом, показанным

4.

+ В строке 7 мы меняем значение listl [OJ

на

99.

382

Глава 7. Списки и кортежи



строке

функции
равняется



строке

функции
равняется

8 мы печатаем список, на который ссылается переменная listl. Результат
print выводится в строке 9. Обратите внимание, что первый элемент теперь
99.
10

мы печатаем список, на который ссылается переменная

list2.

Результат

print выводится в строке 11. Обратите внимание, что первый элемент тоже

99.

В этом интерактивном сеансе переменные

listl

и

list2

ссылаются на один и тот же список

в оперативной памяти.
Предположим, что вы хотите сделать копию списка, чтобы переменные

listl

и

list2

ссы­

лались на два отдельных, но идентичных списка. Один из способов это сделать предполагает
применение цикла, который копирует каждый элемент списка. Вот пример:

# Создать список со значениями.
listl = [1, 2, 3, 4]
#

Создать

пустой список.

list2 = []
# Скопировать элементы
for item in listl:
list2.append(item)

списка

listl

После исполнения этого фрагмента кода

в

list2.

listl и list2 будут ссылаться на два отдельных, но

идентичных списка. Более простой и более изящный способ выполнить ту же самую задачу
состоит в том, чтобы применить оператор конкатенации, как показано ниже:

# Создать список со значениями.
listl = [1, 2, 3, 4]
# Создать копию списка listl.
list2 = [] + listl
Последняя инструкция в этом фрагменте кода присоединяет к пустому списку список
и присваивает получившийся список переменной

listl
list2. В результате listl и list2 будут

ссылаться на два отдельных, но идентичных списка.

р б тка списко
На данный момент вы изучили большое разнообразие методов работы со списками. Теперь
рассмотрим ряд способов, которыми программы могут обрабатывать данные, хранящиеся

в списке. Далее в рубрике "В центре внимания" показано, как элементы списка можно
использовать в вычислениях.

Применение элементов списка в математическом выражении
Меган владеет небольшим кафе, и у нее работают шесть сотрудников в качестве барменов

и официантов. У всех сотрудников одинаковая почасовая ставка оплаты труда. Меган
попросила вас разработать программу, которая позволит ей вводить количество часов, отра-

Глава 7. Списки и кортежи

383

ботанных каждым сотрудником, и затем будет показывать суммы заработной платы всех
сотрудников до удержаний. Вы решаете, что программа должна выполнять следующие
шаги:

+ для каждого сотрудника получить количество отработанных часов и сохранить его в эле­
менте списка;

+ для каждого элемента списка использовать сохраненное в элементе значение для вычис­
ления общей заработной платы сотрудника до удержаний. Показать сумму заработной
платы.

В программе

Программа 7.7

1

7. 7 приведен

соответствующий код.

(barista_pay.py)

1 #

Эта программа вычисляет

2 #

для

заработную плату

каждого сотрудника Меган.

3

4 # NUМ_EMPLOYEES применяется
5 # для размера списка.
6 NUМ EMPLOYEES = 6

как константа

7

8 def main () :
9
# Создать список, который будет
10
hours = [О] * NUМ EMPLOYEES

содержать

отработанные часы.

11

12
13
14
15
16
17
18
19

# Получить часы, отработанные каждым
for index in range(NUМ_EMPLOYEES):
рrint('Введите

количество

сотрудником.

отработанных часов

сотрудником

index + 1, ' : ' , sep=' ' , end= ' ' )
hours[index] = float(input())
#

Получить

почасовую ставку оплаты.

pay_rate =

float(input('Bвeдитe

почасовую ставку оплаты:

20

21
# Показать заработную плату каждого сотрудника.
22
for index in range(NUМ_EМPLOYEES):
23
gross_pay = hours[index] * pay_rate
24
print ('Зарплата сотрудника ', index + 1, ' · $' ,
25
format (gross_pay, '.2f'), sep=' ')
26
27 # Вызвать главную функцию.
28 main ()
Вывод программы (вводимые данные выделены жирным шрифтом)
Введите

количество

отработанных

часов

сотрудником

Введите

количество

отработанных

часов

сотрудником

Введите

количество

отработанных

часов

сотрудником

Введите

количество

отработанных

часов

сотрудником

1:
2:
3:
4:

10
20
15
40

'))

384

Глава

Введите

7.

Списки и кортежи

отработанных

часов

сотрудником

Введите количество отработанных

количество

часов

сотрудником

Введите

почасовую

ставку

оплаты :

Зарплата

сотрудника

1 : $127.50

Зарплата

сотрудника

2 : $255 . 00
3 : $191 . 25
4 : $510 . 00
5 : $255 . 00
6 : $229 . 50

Зарплата

сотрудника

Зарплата

сотрудника

Зарплата

сотрудника

Зарплата

сотрудника

()

5: 20
6: 18

12.75

ПРИМЕЧАНИЕ
Предположим. что предприятие Меган расширяется, и она нанимает двух дополнительных со­
трудников. Для этого потребуется, чтобы вы изменили программу так, чтобы она обрабатывала
восемь сотрудников вместо шести. Поскольку для размера списка вы использовали константу,
эта задача сводится к простой модификации

вы просто изменяете инструкцию в строке

-

6,

ко­

торая теперь читается:

NUМ

EMPLOYEES = 8

Поскольку константа NUМ_ EMPLOYEES в строке
ска

hours



используется для создания списка, размер спи­

автоматически будет равняться восьми. Кроме того, поскольку для управления итера­

циями цикла в строках



и

22

вы использовали константу NUМ_ EMPLOYEES, циклы автоматически

будут делать восемь итераций, одну для каждого сотрудника.
Представьте, насколько труднее будет эта модификация, если для определения размера списка
не использовать константу. В программе придется изменить каждую отдельную инструкцию,
которая относится к размеру списка. Мало того, что это потребует гораздо большего объема
работы, но и к тому же откроет возможность для проникновения ошибок. Если пропустить какую­
либо из инструкций, которые относятся к размеру списка, то произойдет ошибка.

Суммирование значений в списке
Допустим, что список содержит числовые значения, тогда для вычисления суммы этих зна­
чений применяется цикл с накапливающей переменной. Цикл последовательно обходит спи­
сок, добавляя значение каждого элемента в накопитель. Программа
ветствующий алгоритм со списком numЬers.

Программа

1 #
2 #

7.8

(total_list.py)

Эта программа

вычисляет сумму значений

в списке.

3
4 def main () :
# Создать

5
6

numЬers

=

список.

[2, 4, 6, 8, 10]

7

8

#

9

total

10

Создать
=

О

переменную для применения

в качестве накопителя.

7 .8

демонстрирует соот­

Глава 7. Списки и кортежи

11
12
13
14
15
16

#

Вычислить

сумму значений элементов

385

списка.

for value in nшnЬers:
total += value
#

Показать

сумму значений элементов списка.

print('Cyммa

элементов

составляет',

total)

17

18 # Вызвать
19 main ()

главную функцию.

Вывод программы
Сумма элементов составляет

30

Усреднение значений в списке
Первый шаг в вычислении среднего арифметического значения в списке состоит в получе­
нии суммы значений. В предыдущем разделе вы увидели, как это делается в цикле. Второй

шаг заключается в том, чтобы разделить полученную сумму на количество элементов в спи­
ске. Программа
Программа

1 #
2 #

7.9

7.9 демонстрирует соответствующий

алгоритм.

(average_list.py)

Эта программа вычисляет
значение в

списке

среднее арифметическое

значений.

3

4 def main () :
# Создать список.
5
6
scores = [2.5, 7.3, 6.5, 4.0, 5.2]
7

8
9

# Создать переменную
total = О.О

для применения в качестве накопителя.

10

11
12
13
14
15
16

#

Вычислить

сумму значений в

списке.

for value in scores:
total += value
#

Вычислить

average

=

среднее арифметическое элементов.

total / len(scores)

17

18
19

#

Показать

среднее значение

print('Cpeднee

значение

в

списке

элементов

20
1

21 # Вызвать
22 main ()

главную функцию.

Вывод программы
Среднее значение элементов составляет

5.1

значений.

составляет',

average)

Глава 7. Списки и кортежи

386

Передача списка в функцию в качестве аргумента
Из главы

5

известно, что по мере того как программа становится все больше и сложнее, ее

следует разбивать на функции, каждая из которых выполняет определенную подзадачу. Это
делает программу более доступной для понимания и сопровождения.

Список можно легко передавать в функцию в качестве аргумента. Это дает возможность
объединить много операций, которые выполняются над списком, в одной функции. Когда
необходимо вызвать эту функцию, список можно передать в качестве аргумента.
В программе

7 .1 О

показан пример соответствующего кода, в котором применена такая

функция. В этой программе функция принимает список в качестве аргумента и возвращает
сумму значений элементов списка.

Программа 7.10
1 #
2 #

1

(total_function.py)

Эта программа применяет функцию для вычисления
суммы значений в

списке.

3
4 def main () :
# Создать
5

список.

6

(2, 4, 6, 8, 10]

numЬers

=

7

8
9
10
11
12
13
14
15
16
17
18
19
20

#

Показать

сумму значений элементов

print('Cyммa

составляет',

списка.

get_total(numЬers))

# Функция get_total принимает список в качестве
# аргумента и возвращает сумму значений
# в списке.
def get_total(value_list):
#

Создать

total

=

переменную для применения

в

качестве накопителя.

О

# Вычислить сумму значений
for num in value list:
total += num

элементов

списка.

21
22
# Вернуть сумму.
23
return total
24
25 # Вызвать главную функцию.
26 main ()
Вывод программы
Сумма составляет

30

Возвращение списка из функции
Функция может возвращать ссылку на список. Это дает возможность написать функцию,
которая создает список, добавляет в него элементы и затем возвращает ссылку на этот спи­

сок, чтобы другие части программы могли с ним работать. Код в программе

7.11

демонстри-

Глава 7. Списки и кортежи
рует такой пример. Здесь используется функция

get _ values, которая получает от пользова­

теля ряд значений, сохраняет их в списке и затем возвращает ссылку на этот список.

Программа 7.11
1 #
2 #

Эта

j

(return_list.py)

программа применяет функцию для создания списка.

Указанная функция

возвращает ссЫJiку на список.

3

4 def main () :
#

5
6

Получить

numЬers

список с хранящимися в нем значениями.

= get_values()

7

8
9
10

#

Показать

print

значения в

списке.

('Числа в списке:

')

print(numЬers)

11

12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32

#
#
#

Функция

get_values

получает от пользователя

ряд чисел и сохраняет их в
Эта

функция

возвращает

списке.

ссЫJiку на список.

def get_values():
#

Создать

пустой список.

values = []

# Создать переменную
again = 'д'

для управления циклом.

# Получить значения от пользователя
# и добавить их в список.
while again == 'д':
#

Получить число и добавить его в список.

num = int(input('Bвeдитe
values.append(num)
#

Желаете

проделать

число:

'))

это еще раз?

print ('Желаете добавить еще одно число?')
again = input('д =да, все остальное= нет: ')
print ()

33

34
# Вернуть список.
35
return values
36
37 # Вызвать главную функцию.
38 main ()
Вывод программы (вводимые данные выделены жирным шрифтом)
Введите число :

1

Желаете добавить
д

=

да ,

все

еще

остальное

одно

=

число?

нет:

д

387

Глава 7. Списки и кортежи

388

Введите число :

2

Желаете добавить
д

=

да ,

все

еще

остальное

Введите число :

=

да ,

все

еще

=

да ,

все

еще

=

да ,

Числа в

все

число?

нет :

д

=

нет :

д

5

Желаете добавить
д

=

одно число?

остальное

Введите число :

д

4

Желаете добавить
д

нет :

одно

остальное

Введите число :

=

число?

З

Желаете добавить
д

одно

еще

одно число?

остальное

=

нет :

и

списке :

(1 , 2 , 3 , 4 , 5)

Обработка списка
Доктор Лаклэр в течение семестра проводит серию лабораторных работ по химии. В конце
семестра перед тем, как усреднить оценки за лабораторные работы, она отбрасывает самую
низкую оценку каждого студента. Она попросила вас разработать программу, которая на
входе читает оценки студента и вычисляет среднюю оценку, отбрасывая самую низкую. Вот
алгоритм, который вам следует разработать:
Получить

оценки студента.

Вычислить

сумму оценок.

Найти минимальную оценку.
Вычесть минимальную оценку из

Разделить

суммы оценок.

скорректированную сумму на

Это дает

скорректированную

количество оценок минус

1.

Это

сумму.

средняя

оценка.

Показать

среднюю

В программе

7.12

оценку.

приведен соответствующий код, который разделен на три функции.

Вместо того чтобы приводить всю программу сразу, сначала разберем главную функцию, а
затем каждую дополнительную функцию в отдельности.
Программа

1 #
2 #
3 #
4

7.12.

(drop_lowest_score.py)

Эта программа получает
работы и вычисляет

отбрасывая

Главная функция

серию оценок за лабораторные

среднюю оценку,

самую низкую.

Глава 7. Списки и кортежи

5 def main () :
# Получить от пользователя
6
7
scores = get_scores()

389

оценки.

8

9
10

# Получить сумму оценок.
total = get_total(scores)

11

12
13
14
15
16
17
18
19
20
21
22
23
24
25

# Получить самую низкую
lowest = min(scores)
# Вычесть самую
total -= lowest

оценку.

низкую оценку из суммы.

# Вычислить среднее значение. Обратите внимание, что
# мы делим на количество оценок минус 1, потому что
# самая низкая оценка бьmа отброшена.
average = total / (len(scores) - 1)
#

Показать

среднее значение.

рrint('Средняя оценка

с учетом отброшенной',

'самой низкой оценкой составляет:',

average)

26

Строка

7

вызывает функцию

get scores, которая получает от пользователя оценки за лабо­

раторные работы и возвращает ссылку на список с этими оценками. Список присваивается
переменной

Строка



scores.

вызывает функцию

get total,

передавая список оценок в качестве аргумента. Эта

функция возвращает сумму значений в списке, которая присваивается переменной
Строка

13

вызывает встроенную функцию

min,

передавая список оценок

scores

total.
в качестве

аргумента. Эта функция возвращает минимальное значение в списке, которое присваивается
переменной

Строка

lowest.

вычитает самую низкую оценку из переменной

16

total. Затем строка 21 вычисляет
len (scores) -1. (Программа

среднее арифметическое значение путем деления суммы на
делит на
Строки

len (scores) -1,

24

и

25

Далее следует функция

Программа

27
28
29
30
31
32
33

7.12

потому что самая низкая экзаменационная оценка была отброшена.)

показывают среднюю оценку.

get scores.

(продолжение). Функция

get_scores

# Функция get_scores получает от пользователя
# серию оценок и сохраняет их в списке.
# Указанная функция возвращает ссьтку на список.
def get scores():
# Создать пустой список.
test scores = []

Глава 7. Списки и кортежи

390
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51

#

Создать

again =

переменную для управления циклом.

'д'

# Получить от пользователя оценки и добавить их
# в список.
while again == 'д':
# Получить оценку и добавить ее в список.
value = float(input('Bвeдитe оценку: '))
test scores.append(value)
# Желаете проделать это еще раз?
print ('Желаете добавить еще одну оценку?')
again = input('д =да, все остальное= нет: ')
print ()
#

Вернуть

список.

return test scores

Функция

get_ scores

предлагает пользователю ввести серию оценок за лабораторные рабо­

ты. По мере ввода каждой оценки она добавляется в список. Список возвращается в стро­
ке

50.

Далее следует функция

Программа 7.12

52
53
54
55
56
57

get_ total.

(окончание). ФункЦия get_total

get_total

принимает список в качестве

#

Функция

#

аргумента и возвращает сумму значений

# в списке.
def get_total(value_list):
#

Создать переменную для применения в качестве накопителя.

total =

О.О

58
# Вычислить сумму значений
59
for nшn in value list:
60
total += nшn
61
62
# Вернуть сумму.
63
return total
64
65
66 # Вызвать главную функцию.
67 main ()

элементов

списка.

Эта функция принимает список в качестве аргумента. Для вычисления суммы значений
в списке она применяет накопитель и цикл. Строка

64

возвращает сумму.

Глава 7. Списки и кортежи

391

Вывод программы (вводимые данные выделены жирным шрифтом)

Введите оценку :

92 [Enterl

Желаете добавить

д = да ,

еще

все остальное

Введите оценку :

=

оценку?

нет :

А

еще

одну оценку?

все остальное = нет: д

Введите оценку :

[Enter[

75 1Enter 1

Желаете добавить

д = да ,

[Enter[

67 IEnter l

Желаете добавить

д = да,

одну

еще одну

оценку?

все остальное = нет : А

Введите оценку :

[Enter[

88 1Enter 1

Желаете добавить еще одну оценку?

=

д

да,

все

остальное

Средняя оценка

нет : н

[ Enter

1

с учетом отброшенной самой низкой оценки :

85 . 0 .

Работа со списками и файлами
Некоторые задачи могут потребовать сохранения содержимого списка в файле с тем, чтобы
данные можно было использовать позднее. Аналогичным образом, некоторые ситуации мо­

гут потребовать чтения данных из файла в список. Например, предположим, что у вас есть
файл, содержащий ряд значений, которые расположены в произвольном порядке, и вы хоти­
те отсортировать эти значения. Один из приемов сортировки значений в файле состоит
в том, чтобы прочитать их в список, вызвать метод сортировки списка

sort

и затем записать

значения в списке назад в файл.
Процедура сохранения содержимого списка в файл является достаточно прямолинейной. На

самом деле, файловые объекты

Python

имеют метод

writelines (), который записывает весь

список в файл. Однако недостаток этого метода состоит в том, что он автоматически не по­
мещает в конец каждого элемента символ новой строки
записывается в одну длинную строку в файле.
Программа

1 #
2 #

7.13

(' \n '). В результате каждый элемент
Программа 7.13 демонстрирует этот метод.

(writelines.py)

Эта программа применяет метод

writelines

для сохранения

списка строковых значений в файл.

3
4 def rnain () :

5
6

# Создать
cities =

список строковых значений.

['Нью-Йорк',

'Бостон',

'Атланта',

7

8
9
10

#

Открыть файл для

outfile

=

записи.

open('cities.txt', 'w')

'Даллас']

392

Глава 7. Списки и кортежи

11
# Записать список в файл.
12
outfile.writelines(cities)
13
14
# Закрыть файл.
15
outfile.close()
16
17 # Вызвать главную функцию.
18 main ()
После исполнения этойпрограммы файл

cities.txt будет содержать

следующую строку':

Нью-ЙоркБостонАтлантаДаллас

Альтернативный подход состоит в использовании цикла

for

для последовательного обхода

списка и записи каждого элемента вместе с завершающим символом новой строки. В про­
грамме
Программа

1 #

7 .14 приведен

7.14

пример.

(write_list.py)

Эта программа

сохраняет список строковых значений в файл.

2

3 def main():
4
# Создать
5
cities =

список строковых значений.

['Нью-Йорк',

'Бостон',

'Атланта',

'Даллас']

6
7

8

# Открыть файл для записи.
outfile = open('cities.txt', 'w')

9

10
# Записать список в файл.
11
for item in cities:
12
outfile.write(item + '\n')
13
14
# Закрыть файл.
15
outfile.close()
16
17 #Вызвать главную функцию.
18 main ()
После исполнения этой программы файл

cities.txt будет содержать приведенные ниже строки:

Нью-Йорк
Бостон
Атланта
Даллас



некоторых версиях Windows полученная строка может отображаться некорректно (как Кью ... оркSостонj

тланта/аллас). Один из приемов, который позволяет решить эту проблему, состоит в размещении в самом верху
программы следующей инструкции:

#-*- coding:

ср1251

-*-

с указанием кириллической кодировки.

-

Прим. пер.

Глава 7. Списки и кортежи
Файловые объекты в

Python

393

имеют метод readlines (), который возвращает содержимое

файла как список строковых значений. Каждая строка в файле будет значением в списке.
Каждое значение в списке будет включать завершающий символ новой строки, который во
многих случаях вы захотите удалить. В программе

в строке

8

7.15

представлен пример. Инструкция

считывает содержимое файла в список, а цикл в строках

довательный обход списка, удаляя из каждого элемента символ

Программа 7.15

15-17

выполняет после­

'\n'.

(read_list.py)

1

1 # Эта программа считывает содержимое
2
3 def main () :
# Открыть файл для чтения.
4
5
infile = open('cities.txt', 'r')

файла в список.

6

7
8

# Прочитать содержимое файла
cities = infile.readlines()

в

список.

9

10
11

# Закрыть файл.
infile.close()

12

13
14
15
16
17

18
19
20

#

Удалить из каждого элемента символ

\n.

index = О
while index < len(cities):
cities[index] = cities[index] .rstrip('\n')
index += 1

# Напечатать содержимое
print(cities)

списка.

21

22 # Вызвать
23 main ()

главную функцию.

Вывод программы

[ ' Нью-Йорк ',

' Бостон ',

Программа

7.16

' Атланта ',

' Даллас ' ]

приводит еще один пример записи списка в файл. В этом примере записы­

вается список чисел. Обратите внимание, что в строке
функции
Программа

1 #

7.16

(write_number_list.py)

Эта программа сохраняет список чисел в файл.

2

3 def main () :

4

#

5

numЬers

6

12

каждое значение при помощи

str преобразуется в строковый тип, и затем в него добавляется символ '\n'.

Создать

=

список чисел.

(1, 2, 3, 4, 5, 6, 7)

394
7
8

Глава 7. Списки и кортежи

# Открыть
outfile

файл для

записи.

open('numЬerlist.txt',

'w')

9

10
# Записать список в файл.
11
for item in numЬers:
12
outfile.write(str(item) + '\n')
13
14
# Закрыть файл.
15
outfile.close()
16
17 #Вызвать главную функцию.
18 main ()

Когда из файла считываются в список числа, они должны быть конвертированы из строко­
вого типа в числовой. В программе

Программа 7.17

7 .17

приведен соответствующий пример.

] (read_number_list.py)

1 # Эта программа считывает числа из файла в
2
3 def main () :
4
# Открыть файл для чтения.
5
infile = open('numЬerlist.txt', 'r')
6
7
# Прочитать содержимое файла в список.
8
numЬers = infile.readlines()

список.

9

10
# Закрыть файл.
11
infile.close()
12
13
# Конвертировать каждый элемент в тип int.
14
index = О
15
while index < len(numЬers):
16
numЬers[index] = int(numЬers[index])
17
index += 1
18
19
# Напечатать содержимое списка.
20
print(numЬers)
21
22 # Вызвать главную функцию.
23 main ()
Вывод программы

(1 , 2 , 3 , 4 , 5 , 6 , 7]

Глава

7. Списки и кортежи

395

1111111111

7.8

е

ные списки

~ КЛЮЧЕВЫЕ ПОЛОЖЕНИЯ
Двумерный список

-

это список, который в качестве своих элементов содержит другие

списки.

Элементы списка могут быть практически чем угодно, включая другие списки. Для того

чтобы это продемонстрировать, взгляните на приведенный ниже интерактивный сеанс:

1 >>> students =[['Джо', 'Ким'],
2 >>> print(students) [Enter[
З

[ [ 'Джо ' , 'Ким' ] , [ 'Сэм' , ' Сью' ] ,
4 >>> print(students[O]) [Enterj
5 ['Джо', 'Ким']

['Сэм',

'Сью'],

[ ' Келли' ,

['Келли',

'Крис']]

[Enter[

' Крис ' ] ]

6 >>> print(students[l]) [Enter[
7 ['Сэм', 'Сью']
8 >>> print(students[2]) [Enter[
9 [ ' Келли' ,
10 »>

' Крис ' ]

Давайте взглянем на каждую строку поближе.

+ Строка 1 создает список и присваивает его переменной

students. Список имеет три эле­
мента, и каждый элемент тоже является списком. Элементом students [о J является
['Джо',

'Ким']

Элементом students [ 1] является
['Сэм',

'Сью']

Элементом students [2] является
['Келли',

+ Строка
в строке

+ Строка

2 распечатывает
3.

распечатывает элемент

students [о J. Результат функции print выводится

6
строке 7.

распечатывает элемент

students [ 1]. Результат функции print выводится

распечатывает элемент

students [ 2 J. Результат функции print выводится

Строка
в

весь список students. Результат функции print выводится

4
5.

в строке

+

'Крис']

+ Строка
в строке

8
9.

Списки списков также называются вложенными списками, или двумерными списками. Об­
щепринято представлять двумерный список в виде строк и столбцов элементов. Так, на
рис.

7.5

показан двумерный список, который был создан в предыдущем интерактивном

сеансе, с тремя строками и двумя столбцами. Обратите внимание, что строки нумеруются

О,

1 и 2,

а столбцы

-

О и

1.

В этом списке в общей сложности шесть элементов.

Двумерные списки полезны для работы с множественными наборами данных. Например,
предположим, что вы пишете для преподавателя программу усреднения оценок. У препода­

вателя учатся три студента, и каждый студент в течение семестра сдает три экзамена. Один

Глава 7. Списки и кортежи

396

Столбец О

РИС.

7.5.

Столбец

Строка О

Джо

Ким

Строка

1

Сэм

Сью

Строка

2

Келли

Крис

1

Двумерный список

подход

может

состоять

в

создании трех

отдельных

списков,

один для

каждого

студента.

Каждый из этих списков будет иметь три элемента, один для каждой экзаменационной
оценки. Однако такой подход будет громоздким, потому что вам придется отдельно обраба­

тывать каждый список. Лучший подход состоит в том, чтобы применить двумерный список
с тремя строками (один для каждого студента) и тремя столбцами (один для каждой экзаме­
национной оценки), как показано на рис.

7.6.

Этот столбец

Этот столбец

содержит

содержит

содержит

экзаменационную

экзаменационную

экзаменационную

оценку

1

i
Столбец О

РИС.

7.6.

Эта строка для студента

1 -

Строка О

Эта строка для студента

2 -----+

Строка

1

Эта строка для студента

3 -

Строка

2

оценку

Этот столбец

2

i
Столбец

оценку

3

!
1

Столбец2

Двумерный список с тремя строками и тремя столбцами

Во время обработки данных в двумерном списке вам нужны два индекса: один для строк и
один для столбцов. Например, предположим, что при помощи приведенной ниже инструк­
ции мы создаем двумерный список:

scores

=

[[О,

О,

0],

[О,

О,

О],

[О,

О,

0]]

Доступ к элементам в строке О можно получить следующим образом:

scores

[О] [О]

scores

[О]

[1]

scores

[О]

[2]

Доступ к элементам в строке

scores[l]

[О]

scores [1] [1]
scores [1] [2]

1 можно

получить следующим образом:

Глава 7. Списки и кортежи
Доступ к элементам в строке

2 можно

397

получить следующим образом:

scores [2] [О]
scores [2] (1]
scores[2] (2]
На рис.

РИС.

7.7.

7. 7 представлен двумерный список с

индексами, показанными для каждого элемента.

Столбец О

Столбец

Строка О

scores[O][O]

scores[0)[1)

scores[0][2)

Строка

1

scores[1][0]

scores[1)[1)

scores[1 )[2)

Строка

2

scores[2][0]

scores[2)[1)

scores[2][2)

Индексы для каждого элемента слиска оценок

1

Столбец

2

scores

Программы, которые обрабатывают двумерные списки, как правило, делают это при помо­

щи вложенных циклов. Давайте рассмотрим пример. Программа
список и присваивает каждому его элементу случайные числа.

Проrрамма

7.18

(random_numbers.py)

1 # Эта программа присваивает
2 # двумерному списку.
3 import random

случайные числа

4

5 # Константы
6 ROWS
3
7 COLS = 4

для

строк и столбцов

8
9 def main () :

10
11

# Создать двумерный
values = [ (0, О, О,

список.
О],

,

12

[о,

о,

о,

о]

13

(0,

О,

О,

О]]

14
15
# Заполнить список случайными числами.
16
for r in range(ROWS):
for с in range(COLS):
17
18
values[r] [с] = random.randint(l, 100)
19
20
# Показать случайные числа.
21
print(values)
22
23 # Вызвать главную функцию.
24 main ()

7.18

создает двумерный

398

Глава 7. Списки и кортежи

Вывод программы

((4 , 17 , 34 , 24] ,

(46 , 21 , 54 , 10] ,

(54 , 92 , 20 , 100] ]

Рассмотрим программу подробнее.

+
+

Строки
Строки

6

и

7 создают

глобальные константы для количества строк и столбцов.

создают двумерный список и присваивают его переменной values. Этот

11-13

список можно представить, как таблицу с тремя строками и четырьмя столбцами. Каж­
дому элементу присваивается значение О.

+ Строки 16-18 являются набором вложенных циклов for. Внешний цикл делает одну ите­
рацию для каждой строки и присваивает переменной

r

значения от О до

2.

Внутренний

цикл делает одну итерацию для каждого столбца и присваивает переменной с значения от
О до

3.

Инструкция в строке

18

исполняется один раз для каждого элемента списка, при­

сваивая ему случайное целое число в диапазоне от

l

до

100.

+ Строка 21 показывает содержимое списка.
Обратите внимание, что инструкция в строке

21

передает в функцию print в качестве аргу­

мента список значений; в результате весь список выводится на экран. Допустим, что нам не

нравится то, как функция print выводит список, заключая его в скобки и то же самое делая
с каждым вложенным списком. Например, предположим, что мы хотим показать каждый
элемент списка на отдельной строке вот так:

4

17
34
24
46
и т. д. Для того чтобы этого добиться, можно написать набор вложенных циклов, в част­
ности:

for r in range(ROWS):
for

с

in range(COLS):

print(values[r]

[с])

Контрольная точка

7.19.

Взгляните на приведенный ниже интерактивный сеанс, в котором создается двумер­
ный список. Сколько строк и столбцов находится в списке?
numЬers

7.20.

=

[

[1, 2],

[10, 20],

[100, 200],

[1000, 2000]]

Напишите инструкцию, которая создает двумерный список с тремя строками и четырьмя
столбцами. Каждому элементу нужно присвоить значение О.

7.21.

Напишите набор вложенных циклов, которые выводят на экран содержимое списка

чисел, приведенного в задании

7.19.

Глава 7. Списки и кортежи

399

.....
7.9

ежи

~ КЛЮЧЕВЫЕ ПОЛОЖЕНИЯ
Кортеж

это немутирующая последовательность; под этим подразумевается, что его

-

содержимое невозможно изменить.

Кортеж

это последовательность, которая очень напоминает список. Главная разница

-

между кортежами и списками состоит в том, что кортежи являются немутирующими после­

довательностями. Это означает, что после того как кортеж создан, его невозможно изменить.

Как показано в приведенном ниже интерактивном сеансе, во время создания кортежа его
элементы заключаются в круглые скобки:

>>> my_tuple

=

(1, 2, 3, 4, 5) IEnterl

>>> print(my_tuple) IEnterl
(1, 2, 3, 4, 5)
>>>
Первая инструкция создает кортеж, содержащий элементы
переменной
цию

pr int,

my_tuple.

1, 2, 3, 4

my_tuple

и

5,

и присваивает его

в качестве аргумента в функ­

которая показывает его элементы. Приведенный ниже сеанс демонстрирует при­

менение цикла

>>> names

Вторая инструкция отправляет

=

for для выполнения последовательного перебора элементов кортежа:

('Холли',

'Уоррен',

'Эшпи') 1Enter1

>>> for n in names: IEnterl

print(n) IEnterl IEnterl
Холли
Уоррен

Эшпи

>>>
Подобно спискам кортежи поддерживают индексацию, как показано в приведенном ниже
сеансе:

>>> names

=

('Холли',

'Уоррен',

'Эшnи')

IEnterl

>>> for i in range(len(names)): IEnterl

print(names[i]) IEnterl IEnterl
Холли
Уоррен

Эшпи

>>>
По сути дела, кортежи поддерживают все те же самые операции, что и списки, за исклю­
чением тех, которые изменяют содержимое списка. Кортежи поддерживают следующие
операции:

+ доступ к элементу по индексу (только для получения значений элементов);
+ методы, в частности index ( ) ;
+ встроенные функции, в частности len, min и max;
+ выражения среза;
+ оператор in;
+ операторы + и *.

400

Глава 7. Списки и кортежи
Кортежи не поддерживают такие методы, как

append (), remove (), insert (), reverse ()

и

sort ().
ПРИМЕЧАНИЕ
Если необходимо создать кортеж всего с одним элементом, то после значения элемента следует
написать замыкающую запятую :

my_tuple

(1,)

=

#Создает кортеж всего с одним элементом .

Если запятая будет пропущена, то кортеж создан не будет. Например , приведенная инструкция
просто присваивает переменной value целочисленное значение 1:

value

=

(1)

#

Со здает целочисленн ое значение.

В чем их смысл?
Если единственным различием между списками и кортежами является их способность изме­
нять свои значения, т. е . мутируемость, то вы можете задаться вопросом: зачем нужны кор­

тежи? Одной из причин, почему существуют кортежи, является производительность. Обра­
ботка кортежа выполняется быстрее, чем обработка списка, и поэтому кортежи
ший вариант,

когда обрабатывается

большой объем данных,

-

и эти данные

это хоро­
не будут

изменяться. Еще одна причина состоит в том, что кортежи безопасны . Поскольку содержи­
мое кортежа изменять нельзя , в нем можно хранить данные, оставаясь в уверенности, что

они не будут (случайно или каким-либо иным образом) изменены в программе.

Кроме того, в

Python

существуют определенные операции, которые требуют применения

кортежа. По мере освоения языка

Python,

вы будете чаще сталкиваться с кортежами.

Преобразование между списками и кортежами
Встроенная функция
а встроенная функция

list () может применяться для преобразования кортежа в список,
t uple () - для преобразования списка в кортеж. Приведенный ниже

интерактивный сеанс это демонстрирует :

1 >>>
2 >>>
3 >>>

nшnЬer_tuple =

numЬer_list =

(1, 2, 3) IEnt erl
list(nшnЬer_tuple)

print(nшnЬer_lis t )

IEnte r l

("Enter1

4 [ 1 , 2 , 3]

5
6
7
8
9

[' один',

>>> s tr l i s t =
>>> s t r_tuple

=

'два ',

'три ' ]

[fnter l

t up le( str _ l i s t ) IEnterl

>>> print(str_tuple ) IEnterl
'два

( ' один ' ,

' , ' три ' )

>>>

Вот краткое описание инструкций.




Строка

1 создает кортеж и присваивает его переменной

Строка

2

передает nшnЬer_ tuple в функцию

держащий
nшnЬe r

те

list.

же

значения,

что

и

в

nшnЬer_ tuple.

list () . Эта функция возвращает список, со­
uple, и присваивает его переменной

riшnЬer_ t

Глава 7. Списки и кортежи

+ Строка 3 передает список numЬer
в строке

401

list в функцию print. Результат функции выводится

4.

+ Строка 5 создает список строковых значений и присваивает его переменной str list.
+ Строка 6 передает список str_ list в функцию tuple (). Эта функция возвращает кортеж,
содержащий те же значения, что и в str_ list, и присваивает его переменной str_ tuple.

+

Строка

7 передает
8.

кортеж str_tuple в функцию print. Результат функции выводится

в строке

'1J

Контрольная точка
7.22.

В чем главное различие между списком и кортежем?

7.23.

Приведите причины существования кортежей.

7.24.

Допустим, что переменная my_list ссылается на список. Напишите инструкцию, кото­
рая преобразует его в кортеж.

7.25.

Допустим, что переменная my_tuple ссылается на кортеж. Напишите инструкцию,

которая преобразует его в список.

111111111111

7.10
11111111111

Построение графиков с данными списков
п

и помощи пак та

Пакет matplotlib -

matp/otlib

это библиотека, предназначенная для построения двумерных диаграмм

и графиков. Она не является частью стандартной библиотеки

Python,

и поэтому этот пакет

необходимо установить отдельно после того, как в операционной системе установлен

Python.

Для того чтобы установить пакет matplotlib в системе

Windows,

откройте окно

командной оболочки и введите команду:

pip install matplotlib
В операционной системе Мае

OS

Х или

Linux

откройте окно терминала и введите приведен­

ную ниже команду:

sudo

рiрЗ

install matplotlib

СОВЕТ
Для получения более подробной информации о пакетах и менеджере пакетов
к приложению

pip обратитесь

6.

После ввода этой команды менеджер пакетов pip начнет загружать и устанавливать пакет.
Когда этот процесс будет завершен, можно проверить правильность установки пакета,
запустив среду

IDLE

и введя команду:

>>> import matplotlib
Если сообщение об ошибке не появится, то можно считать, что пакет был успешно установ­
лен.

402

Глава 7. Списки и кортежи

Импорт модуля
Пакет

pyplot

matplotlib содержит модуль pyplot, который необходимо импортировать для созда­

ния всех графиков, которые мы продемонстрируем в этой главе. Имеется несколько разных
методов импортирования данного модуля. Возможно, самый прямолинейный метод таков:

import matplotlib.pyplot
В модуле pyplot есть несколько функций, которые вызываются для построения и отображе­
ния графиков. Когда используется эта форма инструкции import, каждый вызов функции

придется снабжать префиксом matplotlib.pyplot. Например, есть функция под названием

plot, которая вызывается для создания линейных графиков, и функцию plot вызывать при­
дется вот так:

matplotlib.pyplot.plot(apгyмeнты ...

)

Необходимость набирать matplotlib.pyplot перед именем каждой функции может стать
утомительной, поэтому для импорта модуля мы будем применять немного другой подход.

Мы будем использовать инструкцию import, которая создает для модуля matplotlib.pyplot
псевдоним:

import matplotlib.pyplot as plt
Эта инструкция импортирует модуль matplotlib.pyplot и создает для модуля псевдоним
с именем pl t, который позволяет использовать префикс pl t для вызова любой функции
в модуле ma tplotl ib. pyplot. Например, функцию plot можно вызвать вот так:

plt .plot (аргументы ... )

СОВЕТ
Для получения дополнительной информации об инструкции

import обратитесь к приложению 5.

Построение линейного графика
Функция plot используется для создания линейного графика, который соединяет серию
точек данных отрезками прямой. Линейный график имеет горизонтальную ось х и верти­

кальную ось у. Каждая точка данных на графике имеет координаты (Х, У).
Для того чтобы создать линейный график, сначала необходимо создать два списка: один
с координатами Х каждой точки данных и другой с координатами У каждой точки данных.

Например, предположим у нас есть пять точек данных, расположенных в приведенных ниже
координатах:

(0, 0)
(l, 3)
(2, 1)
(3 , 5)

(4, 2)
Мы создаем два списка, которые будут содержать эти координаты:
х

coords
y_coords

=

(0, 1, 2, 3, 4)
[О, 3, 1, 5, 2)

Глава 7. Списки и кортежи

403

Затем вызываем функцию plot для построения графика, передавая списки в качестве аргу­
ментов. Вот пример:

plt.plot(x_coords, y_coords)
Функция plot создает линейный график в оперативной памяти, но его на экран не выводит.
Для того чтобы показать график, нужно вызвать функцию show:

plt. show ()
В программе

7 .19

приведен законченный пример. Во время выполнения программы откроет­

ся графическое окно, которое показано на рис.
Программа

1 #

7.19

7.8.

(line_graph1.py)

Эта программа

выводит простой линейный график.

2 import matplotlib.pyplot as plt
3

4 def main():

5

#

Создать

6

х

coords

7

y_coords

списки для координат Х и У каждой точки данных.

=

[О,

1, 2, 3, 4]

[О,

3, 1, 5, 2]

8

9

# Построить линейный график.
plt.plot(x_coords, y_coords)

10
11

12

# Показать
plt. show ()

13

линейный график.

14

15 #

Вызвать

главную функцию.

16 main ()

4

3

2

о
О.О
РИС.

7.8.

Вывод программы

7.19

0.5

1.0

1.5

2.0

2.5

3.0

3.5

4.0

404

Глава 7. Списки и кортежи

Добавление заголовка, меток осей и сетки
При помощи функции ti tle можно добавлять в график заголовок. Эта функция просто
вызывается со строковым литералом, который требуется отобразить в качестве заголовка.
Заголовок будет выведен чуть выше графика. Кроме того, при помощи функций

ylabel и

xlabel можно также добавить описательные метки на оси х и у. Эти функции вызываются со
строковым литералом, который требуется отобразить вдоль осей. В график можно добавить
сетку, вызвав для этого функцию

ме

7.20

grid

и передав

True

приведен пример, график представлен на рис.

в качестве аргумента. В програм­

7.9.

Образец данных

4

>.

з

.J>
....,
о

...

о

......

о

4
Это ось х

РИС.

1

7.9.

Вывод программы

Программа 7.20
1 #

Эта

J

7.20

(line_graph2.py)

программа

выводит

простой линейный график.

2 import matplotlib.pyplot as plt
3

4 def main () :
Создать

5

#

6

coords
y_coords

7

списки для координат

х

=

[О,

1, 2, 3, 4]

[О,

3, 1, 5, 2]

8

9
10

#

Построить линейный

график.

plt.plot(x_coords, y_coords)

11

12
13

114

#

Добавить

plt. title

заголовок.

('Образец данных')

Х и У каждой точки данных.

Глава 7. Списки и кортежи

15
16
17
18
19
20
21
22

#

Добавить

на оси описательные метки.

plt.xlabel('Этo ось

х')

ось

у')

plt.ylabel('Этo

#

Добавить

405

сетку.

plt.grid(True)
#

Показать линейный график.

plt. show ()
24
25 # Вызвать главную
26 rnain ()

23

функцию.

Индивидуализация настроек осей х и у
По умолчанию ось х начинается в самой нижней координате Х в вашем наборе точек данных
и заканчивается в самой верхней координате Х набора точек данных. Например, обратите

самая нижняя координата Х равняется О, а самая верхняя

внимание, что в программе

7 .20

координата Х равняется

Теперь взгляните на вывод программы на рис.

4.

внимание, что ось х начинается в О и заканчивается в

7.9

и обратите

4.

Ось у по умолчанию сконфигурирована таким же образом. Она начинается в самой нижней
координате У в вашем наборе точек данных и заканчивается в самой верхней координате У
набора точек данных. Еще раз взгляните на программу

7 .20

и обратите внимание, что самая

нижняя координата У равняется О, а самая верхняя координата У равняется
граммы ось у начинается в О и заканчивается в

5.

В выводе про­

5.

ylirn и xlirn. Вот
xlirn с использованием именованных аргументов для установки

Нижние и верхние границы осей х и у можно изменить, вызвав функции

пример вызова функции

нижней и верхней границ оси х:

plt.xlirn(xrnin=l, xrnax=lOO)
Эта инструкция конфигурирует ось х так, чтобы она начиналась в значении
лась в значении

100.

Вот пример вызова функции

1

и заканчива­

ylirn с использованием именованных

аргументов для установки нижней и верхней границ оси у:

plt.ylirn(yrnin=lO, yrnax=50)
Эта инструкция конфигурирует ось у так, чтобы она начиналась в значении
лась в значении

50.

В программе

и заканчивалась в

сконфигурирована так, чтобы она начиналась

и заканчивалась в

Программа

7.21

-1
в -1

7 .1 О.

{line_graphЗ.py)

1 # Эта программа выводит простой
2 irnport rnatplotlib.pyplot as plt



и заканчива­

20 ось х
10. В строке 21 ось у
6. Вывод программы

представлен законченный пример. В строке

сконфигурирована так, чтобы она начиналась в
показан на рис.

3

7.21

линейный график.

Глава 7. Списки и кортежи

406

4 def main () :
# Создать списки дтIЯ координат
5
6
х coords
(0, 1, 2, 3, 4]
y_coords = (0, 3, 1, 5, 2]
7
8
9
# Построить линейный график.
10
plt.plot(x_coords, y_coords)
11
12
# Добавить заголовок.
13
plt. title ('Образец данных' )
14
15
# Добавить на оси описательные
16
plt.xlabel ('Это ось х')
17
plt.ylabel ('Это ось у')
18
19
# Задать границы осей.
20
plt.xlim(xmin=-1, xmax=lO)
21
plt.ylim(ymin=-1, ymax=6)
22
# Добавить сетку.
23
24
plt.grid(True)
25
26
# Показать линейный график.
27
plt.show()
28
29 # Вызвать главную функцию.
30 main ()

Х и У каждой точки данных.

метки.

Образец данных

о

2

4
Это ось х

РИС.

7.10.

Вывод программы

7.21

6

8

10

Глава 7. Списки и кортежи

407

Каждую подпись метки деления можно индивидуально настроить при помощи функций
и

yticks
мент

Эти функции в качестве аргументов принимают два списка. Первый аргу­

xticks.

это список позиций меток, а второй аргумент

-

-

список подписей для вывода в ука­

занных позициях. Вот пример с использованием функции xticks:

plt.xticks([O, 1, 2],

['Бейсбол',

'Баскетбол',

'Футбол'])

В этом примере подпись 'Бейсбол' будет выведена в метке деления О, 'Баскетбол' ке



'Футбол'

в метке

-

2.

plt.yticks([O, 1, 2, 3],

Вот пример с использованием функции

['Ноль', 'Четверть', 'Половина', 'Три четверти'])

В этом примере подпись 'Ноль
'Половина'

в метке

-

В программе

7 .22



в мет­

yticks:

' будет выведена в метке деления О, 'Четверть ' - в метке 3.

в метке

1,

'Три четверти'

приведен законченный пример. В выводе программы подписи меток деле­

ний на оси х показывают годы, а подписи меток на оси у - объем продаж в миллионах дол­
ларов. Инструкция в строках 20 и 21 вызывает функцию xticks для настройки оси х сле­
дующим образом:

+ подпись
+ подпись
+ подпись
+ подпись
+ подпись

'2016' будет выведена в метке О;
'2017' будет выведена в метке

1;

'201в' будет выведена в метке

2;

'2019' будет выведена в метке

3;

'2020' будет выведена в метке

4.

Затем инструкция в строках

22

и

23

вызывает функцию

yticks для настройки оси у следую­

щим образом:

+ '$От' будет выведена в метке О;
+ ' $ lm' будет выведена в метке 1;
+ '$2m' будет выведена в метке 2;
+ '$3m' будет выведена в метке 3;
+ '$4m' будет выведена в метке 4;
+ '$5m' будет выведена в метке 5.
Вывод программы показан на рис.
Программа

7.22

7 .11.

(line_graph4.py)

1 # Эта программа выводит простой
2 import matplotlib.pyplot as plt

линейный график.

3

4 def main () :
5

#

6

х

7

Создать

coords
y_coords

списки для координат Х и У каждой точки данных.

=

[О,

1, 2, 3, 4]

[О,

3, 1, 5, 2]

в

9

10
11

# Построить линейный график.
plt.plot(x_coords, y_coords)

Глава 7. Списки и кортежи

408

Добавить

заголовок.

12

#

13

plt.title('Пpoдaжи с разбивкой по годам')

14
Добавить

на оси описательные метки.

15

#

16

plt.xlabel

('Год')

17

plt.ylabel

('Объем продаж')

18
19

#

20

plt.xticks

Настроить метки делений.
([О,

1, 2, 3, 4],

21

['2016',

22

plt.yticks ( (0, 1, 2, 3, 4, 5],

'2017',

23

[ '$0m',

'$lm',

'2018',

'$2m',

'2019',

'$3m',

'2020'])

'$4m',

'$5m'])

24
25

#

26

plt.grid(True)

Добавить

сетку.

27
28

#

29

plt. show ()

30
31 #

Показать

Вызвать

линейный график.

главную функцию.

32 main ()

Продажи с разбивкой по годам
$Sm

$4m
:1Е

"'~

$3m

С>.
с:

....::i::


\Q
о

$2m

$1m

$Dm

2016

2017

2018

2019

2020

Год
РИС.

7.11. Вывод программы 7.22

Вывод маркеров в точках данных
В каждой точке данных на линейной диаграмме можно вывести круглую метку в качестве
маркера, применяя функцию plot вместе с именованным аргументом mar ker=' о'. В про­

грамме

7.23

приведен пример. Вывод программы показан на рис.

7.12.

Глава 7. Списки и кортежи

Продажи с разбивкой по годам
$5m

$4m
:iE

"'
~

$3m

о.

i:::


~ $2m

ID
о

$1m

$0m

2016

2017

2018

2019

Год
РИС.

7.12.

Вывод программы

Программа

7.23

7.23

(line_graph5.py)

1 # Эта программа выводит простой линейный
2 import matplotlib.pyplot as plt
3
4 def main():
5
# Создать списки для координат Х и У
[О, 1, 2, 3, 4]
6
х coords
7
y_coords = [О, 3, 1, 5, 2]

8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27

график.

каждой точки данных.

# Построить линейный график.
plt.plot(x_coords, y_coords, marker='o')

#

Добавить

заголовок.

plt.title('Пpoдaжи с разбивкой по годам')

#

Добавить

plt.xlabel
plt.ylabel

на оси описательные метки.
('Год')
('Объем продаж')

# Настроить метки делений.
plt.xticks ( (0, 1, 2, 3, 4],
['2016', '2017', '2018',
plt.yticks ([О, 1, 2, 3, 4, 5],
[ '$0m''

#

Добавить

сетку.

plt.grid(True)

'$lm''

'$2m''

'2019',

'$3m''

'2020'])

'$4m''

'$5m'])

2020

409

410
28
29

Глава 7. Списки и кортежи

#

Показать линейный график.

plt. show ()

30

31 # Вызвать
32 main ()

главную функцию.

Помимо круглых меток можно выводить другие типы маркерных символов. В табл.
перечислены несколько общепринятых аргументов
Таблица

7.2.

7.2

marker=.

Некоторые символы маркеров

marker=Apryмeнт

Результат

markerS='o'

Показывает круглые точки

markerS='s'

Показывает квадраты

marker5='*'

Показывает звездочки

marker5='D'

Показывает ромбы

markerS='л'

Показывает восходящие треугольники

markerS='v'

Показывает нисходящие треугольники

marker5='>'

Показывает левые треугольники

marker5='молоко>стряпня>яблочный пирог>мороженое'

Напишите инструкцию, которая разбивает это строковое значение, создавая приведен­
ный ниже список:
['пирожки',

'молоко',

Зад

ми

1.

'стряпня',

'яблочный: пирог',

'мороженое']

ованию

Инициалы. Напишите программу, которая получает строковое значение, содержащее
имя, отчество и фамилию человека и показывает инициалы. Например, если пользователь
вводит Михаил Иванович Кузнецов, то программа должна вывести М.И.К.

2.

Сумма цифр в строке. Напишите программу, которая просит пользователя ввести ряд
однозначных чисел без разделителей. Программа должна вывести на экран сумму всех
однозначных чисел в строковом значении. Например, если пользователь вводит

этот метод должен вернуть значение

3.

12, которое является

суммой

2514,

то

2, 5, 1 и 4.

Принтер дат. Напишите программу, которая считывает от пользователя строковое зна­
чение, содержащее дату в формате дд/мм/гггг. Она должна напечатать дату в формате

12

марта

2018

г.

Глава В. Подробнее о строковых данных

4.

455

Конвертер азбуки Морзе. Азбука Морзе представляет собой кодировку, где каждая
буква алфавита, каждая цифра и различные знаки препинания представлены серией точек
и тире. В табл.

8.4

и

8.5

показана часть этой азбуки.

Напишите программу, которая просит пользователя ввести строковое значение и затем
преобразует это строковое значение в кодировку азбукой Морзе.
Таблица

8.4.

Азбука Морзе (интернациональная)

Символ

Код

Символ

пробел

пробел

6

-

....

G

запятая

-

..-

7

-

...

н

....

R

-

точка

---

8

---

..

1

"

s

."

знак вопроса

..- -..

9

----

J

т

-

о

-----

А

-

к

1

----

в

-

".

L

2

..- - -

с

--

3

...- -

D

4

....-

Е

5

.....

F

Таблица

8.5.

Код

-

"

"

-

Символ

Код

Символ

Q

-

---

u
-

м

"

--

N

-

-

"

у

...-

w

--

х

о

---

у

р

--

z

-

"

-

--

..

Азбука Морзе (русские буквы)

Символ

Код

Символ

Код

А

-

и

"

Б

- ".

й

в

--

к

г

--

л

д

-

м

"

Е,Ё

н

Код

Символ

Код

р

-

ш

----

с

...

щ

т

-

ъ

..

у

..-

ы

--

ф

-

ь

- "-

х

....

э

"

---

-

-

Символ

"

ж

". -

о

---

ц

--

ю

3

- -..

п

--

ч

---

я

5.

Код

"

-

"

--

Алфавитный переводчик номера телефона. Многие компании используют телефонные
номера наподобие

555-GET-FOOD,

чтобы клиентам было легче запоминать эти номера.

На стандартном телефоне буквам алфавита поставлены в соответствие числа следующим
образом:
А,В иС=2
D,ЕиF=З

G,

Ни

1=4

456

Глава 8. Подробнее о строковых данных

J,

К и

L= 5

М,Nи0=6

P,Q,



S=7

Т, UиV=8

W,X,

УиZ=9

Напишите программу, которая просит пользователя ввести 10-символьный номер теле­
фона в формате ХХХ-ХХХ-ХХХХ. Приложение должно показать номер телефона, в ко­
тором все буквенные символы в оригинале переведены в их числовой эквивалент.
Например, если пользователь вводит

555-GET-FOOD,

то приложение должно вывести

555-438-3663.
6.

Среднее количество слов. Среди исходного кода главы
"Решений задач

text.txt.

по

программированию"

8,

а также в подпапке

соответствующей главы

data

вы найдете файл

В нем в каждой строке хранится одно предложение. Напишите программу, кото­

рая читает содержимое файла и вычисляет среднее количество слов в расчете на пред­
ложение.

7.

Анализ символов. Среди исходного кода главы

8,

а также в подпапке

дач по программированию" соответствующей главы вы найдете файл

data "Решений за­
text.txt. Напишите

программу, которая читает содержимое файла и определяет:

8.



количество букв в файле в верхнем регистре;



количество букв в файле в нижнем регистре;



количество цифр в файле;



количество пробельных символов в файле.

Корректор предложений. Напишите программу с функцией, принимающей в качестве
аргумента строковое значение и возвращающей его копию, в котором первый символ
каждого предложения написан в верхнем регистре. Например, если аргументом является

"привет! меня зовут джо. а как твое имя?", то эта функция должна вернуть строковое
значение 'Привет!

Меня

зовут Джо.

А как твое имя?'. Программа должна предоста­

вить пользователю возможность ввести строковое значение и затем передать его в функ­
цию. Модифицированное строковое значение должно быть выведено на экран.

9.

Гласные и согласные. Напишите программу с функцией, которая в качестве аргумента
принимает строковое значение и возвращает количество содержащихся в нем гласных.

Приложение должно иметь еще одну функцию, которая в качестве аргумента принимает
строковое значение и возвращает количество содержащихся в нем согласных. Приложе­
ние должно предоставить пользователю возможность ввести строковое значение и пока­
зать содержащееся в нем количество гласных и согласных.

Видеозапись "Задача о гласных и согласных" (Т/1е

10.

Vowels and

Consonaпts ргоЫот)

Самый частотный символ. Напишите программу, которая предоставляет пользователю
возможность ввести строковое значение и выводит на экран символ, который появляется

в нем наиболее часто.

11.

Разделитель слов. Напишите программу, которая на входе принимает предложение,

в котором все слова написаны без пробелов, но первая буква каждого слова находится
в верхнем регистре. Преобразуйте предложение в строковое значение, в котором слова

Глава В. Подробнее о строковых данных

457

отделены пробелами, и только первое слово начинается с буквы в верхнем регистре. На­
"ОстановисьИПочувствуйЗапахРоз" будет преобразовано

пример, строковое значение

запах ро з".

в "Остановись и почувствуй

12.

Молодежный жаргон. Напишите программу, которая на входе принимает предложение

и преобразует каждое его слово в "молодежный жаргон" . В одной из его версий во время
преобразования слова в молодежный жаргон первая буква удаляется и ставится в конец
слова. Затем в конец слова добавляется слог "ки". Вот пример.
Русский язык: ПРОСПАЛ ПОЧТИ ВСЮ НОЧЬ
Молодежный жаргон: РОСПАЛПКИ ОЧТИПКИ СЮВКИ ОЧЬНКИ

13.

Лотерея

PowerBall.

PowerBall, покупают билет,
"PowerBall" в диапазоне от 1 до 26.

Для того чтобы сыграть в лотерею

тором имеется пять чисел от

1 до 69

и число

в ко­
(Эти

числа можно выбрать самому либо дать билетному автомату их выбрать за вас случай­
ным образом.) Затем в заданный день автомат случайным образом отбирает выигрыш­
ный ряд чисел. Если первые пять чисел совпадают с первыми пятью выигрышными чис­

лами в любом порядке, и ваше число

PowerBall, то

PowerBall

соответствует выигрышному числу

вы выигрываете джекпот, который составляет очень крупную сумму денег.

Если ваши числа совпадают лишь с некоторыми выигрышными числами, то вы выигры­
ваете меньшую сумму в зависимости от того, сколько выигрышных номеров совпало .

Среди исходного кода главы

8,

а также в подпапке

data

"Решений задач по программиро­

ванию" соответствующей главы вы найдете файл с именем

выигрышные номера

2016

(файл содержит

pbnumbers.txt, содержащий
3 февраля 201 О и 11 мая
8.6 показывает пример пер­

которые были отобраны между

PowerBall,
654 наборов

выигрышных чисел). Рис.

вых нескольких строк содержимого этого файла. Каждая строка в файле содержит набор
из шести чисел, которые были выбраны в заданную дату. Числа отделены пробелом,

PowerBall для этого дня. Например,
первая строка в файле показывает числа за 3 февраля 201 О, которые равнялись 17, 22, 36,
37, 52, и число PowerBall, равное 24.
и последнее число в каждой строке является числом

pbnumbers.txt - №tep~d
File

Edit

17 22
14 22
05 08
10 14
07 08
13 27
04 17

36
52
29
30
19
37
35

Form~t

37
54
37
40
26
41
50

52
59
38
51
36
54
57

о

х

iew Help

-------

24
04
34
01
15
32
12

"
ln 1, Col 1

РИС .

8.6. Файл pbnumbers.txt
Напишите одну или несколько программ, которые работают с этим файлом и показы­
вают:





наиболее распространенных чисел, упорядоченных по частоте;





наименее распространенных чисел, упорядоченных по частоте;

Глава В. Подробнее о строковых данных

458



10

наиболее "созревших" чисел (чисел, которые не использовались долгое время),

упорядоченных от наиболее созревших до наименее созревших;


14.

частоту каждого числа от

1 до 69

и частоту каждого

Цены на бензин. Среди исходного кода главы

PowerBall

числа от

1 до 26.

data "Решений за­
дач по программированию" соответствующей главы, вы найдете файл GasPrices.txt. Этот
файл содержит еженедельные средние цены за галлон бензина в США, начиная 5 апреля
1993 года и заканчивая 26 августа 2013 года. На рис. 8.7 показан пример первых не­
8,

а также в подпапке

скольких строк данного файла.

G~sPrkes .ьt

File

Edit

о

- Notep~d

Forma

',"! е,,.,,

х

Help

~4 - 05-1993:1 . 068

04-12-1993: 1. 079
04 -19 -1993:1 . 079
04-26- 1993:1 . 086
05 -03 -1993:1 . 086
05-10-1993:1 . 097
05 -17 -1993:1 . 106

"
Ln 1, Col

РИС.

8.7.

Файл

GasPrices.txt
Каждая строка в файле содержит среднюю цену за галлон бензина в указанный день
и отформатирована следующим образом:
ММ-дц-ГГГГ:Цена

где мм

Цена

-

-

двухзначный месяц; дц

-

двухзначный день; гггг

-

четырехзначный год;

это средняя цена галлона бензина в указанный день.

В рамках этого задания необходимо написать одну или несколько программ, которые

считывают содержимое данного файла и выполняют приведенные ниже вычисления.



Средняя цена за год: вычисляет среднюю цену бензина за год для каждого года
в файле. (Данные файла начинаются апрелем

1993 и заканчиваются августом 2013.
1993 по 2013 годы.)

Используйте данные, предоставленные за период с



Средняя цена за месяц: вычисляет среднюю цену в каждом месяце в файле.



Наибольшая и наименьшая цены в году: в течение каждого года в файле опреде­
ляет дату и величину самой низкой и самой высокой цены.



Список цен, упорядоченный по возрастанию: генерирует текстовый файл, в кото­
ром даты и цены отсортирован~~ в возрастающем порядке.



Список цен, упорядоченный по увеличению: генерирует текстовый файл, в кото­
ром даты и цены отсортированы в убывающем порядке.

Для выполнения всех этих вычислений можно написать одну программу или несколько
разных программ, одну для каждого вычисления.

111111111111

9.1

а

1111111(__ КЛЮЧЕВЫЕ ПОЛОЖЕНИЯ
Словарь

-

это объект-контейнер, который хранит коллекцию данных. Каждый элемент

в словаре имеет две части: ключ и значение. Ключ используется, чтобы установить
местонахождение конкретного значения.

Buдf п Rn сь 'Введещ ев cлnR.:J о' (Jпtmr111r:tron

to

D1ctronaпes

Когда вы слышите слово "словарь", то, вероятно, представляете толстую книгу, такую как
"Большой толковый словарь", содержащую словаи их определения. Если вы хотите узнать
значение конкретного слова, вы отыскиваете его в словаре и получаете его определение.

В

Python

словарь

-

это объект, который хранит коллекцию данных. Каждый хранящийся

в словаре элемент имеет две части: ключ и значение. На практике элементы словаря обычно

называются парами ключ/значение. Когда требуется получить из словаря конкретное значе­
ние, используется ключ, который связан с этим значением. Это подобно процессу поиска

слова в "Большом толковом словаре", где слова являются ключами, а определения

-

значе­

ниями.

Например, предположим, что каждый сотрудник компании имеет идентификационный но­
мер, и нам нужно написать программу, которая позволяет отыскивать имя сотрудника путем

ввода идентификационного номера сотрудника. В этом случае можно создать словарь,
в котором каждый элемент содержит идентификационный номер сотрудника в качестве
ключа, и имя этого сотрудника в качестве значения. Если известен идентификационный
номер сотрудника, то можно получить имя этого сотрудника.

Еще одним примером будет программа, которая позволяет вводить имя человека и предос­
тавляет его телефонный номер. Программа могла бы использовать словарь, в котором каж­
дый элемент содержит имя человека в качестве ключа и телефонный номер человека в каче­
стве значения. Если известно имя человека, то можно получить его телефонный номер.

ПРИМЕЧАНИЕ
Пары ключ/значение часто называются отображениями, потому что каждому ключу поставлено
в соответствие значение, т. е. каждый ключ как бы отображается на соответствующее ему зна­
чение.

460

Глава 9. Словари и множества

Создание словаря
Словарь создается путем заключения его элементов в фигурные скобки

( {J).

Элемент состо­

ит из ключа, затем двоеточия, после которого идет значение. Элементы словаря отделяются
запятыми. Приведенная ниже инструкция приводит пример определения словаря:

phonebook

=

{'Крис':

'555-1111',

'Джоанна'

'Кэти':

'555-2222',

:'555-3333'}

Эта инструкция создает словарь и присваивает его переменной phonebook (телефонная кни­
га). Словарь содержит приведенные ниже три элемента.



Первый элемент- 'Крис': '555-1111'. В этом элементе ключом является 'Крис', а зна­
чением-



Второй элемент- 'Кэти': '555-2222'. В этом элементе ключом является 'Кэти', а зна­
чением



'555-1111 '.

-

'555-2222 '.

Третий элемент
а значением

-

-

'Джоанна' : '555-3333 '. В этом элементе ключом является 'Джоанна',

'555-3333 '.

В этом примере ключами и значениями являются строковые объекты. Значения в словаре
могут быть объектами любого типа, но ключи должны быть немутирующими объектами.
Например, ключами могут быть строковые значения, целые числа, значения с плавающей

точкой или кортежи. Ключами не могут быть списки либо мутирующие объекты других
типов.

Получение значения из словаря
Элементы в словаре не хранятся в каком-то конкретном порядке. Например, взгляните на
приведенный ниже интерактивный сеанс, в котором создается словарь, и его элементы
выводятся на экран:

>>> phonebook
'Джоанна':

=

{ 'Крис':

'555-1111',

'Кэти':

'555-2222',

'555-3333'} IEnterl

>>> phonebook IEnterl
{'Джоанна':

'555-3333',

'Крис':

'555-1111',

'Кэти':

'555-2222'}

>>>
Обратите внимание, что порядок следования, в котором выводятся элементы, отличается от
порядка, в котором они создавались. Этот пример показывает, что словари не являются
последовательностями, как списки, кортежи и строковые значения. Как результат, невоз­
можно использовать числовой индекс для получения значения по его позиции в словаре.
Вместо этого для получения значения используется ключ.

Для того чтобы получить значение из словаря, просто пишут выражение в приведенном ни­
же общем формате:
имя_ словаря [ключ]

В данном формате имя_ словаря- это переменная, которая ссылается на словарь, ключ­
это применяемый ключ. Если ключ в словаре существует, то выражение возвращает связан­
ное с этим ключом значение. Если ключ не существует, то вызывается исключение

(ошибка ключа). Приведенный ниже интерактивный сеанс это демонстрирует:

KeyError

Глава 9. Словари и множества

1 >>> phonebook = {'Крис': '555-1111',
'Джоанна': '555-3333'} [Enter[
2 >>> phonebook [ 'Крис'] [ Enter J
3 '555-1111'
4 >>> phonebook ['Джоанна'] [ Enter [
5 '555-3333'

461

'Кэти':'555-2222',

6 > > > phonebook [ 'Кэти' ] [ Enter [

7 '555-2222'
8 >>> phoпebook ['Кэтрин'] [ Enter [
Traceback (most recent call last) :

File "", line 1, in
phonebook [ 'Кэтрин' )
KeyError: 'Кэтрин'
>>>
Рассмотрим этот сеанс подробнее.

+ Строка

1 создает

словарь, содержащий имена (в качестве ключей) и телефонные номера

(в качестве значений).



строке

2

выражение phonebook [ 'Крис'] возвращает из словаря phonebook значение,

которое связано с ключом 'Крис'. Это значение показано в строке

3.

+ В строке 4 выражение phonebook [ 'Джоанна' J возвращает из словаря phonebook значение,
которое связано с ключом 'Джоанна'. Это значение показано в строке



строке

6

выражение phonebook [ 'Кэти' J возвращает из словаря phonebook значение,

которое связано с ключом



строке

phonebook

5.

8

вводится

' Кэти' . Это

выражение

значение показано в строке

7.

phonebook [ 'Кэтрин' ] . Ключ 'Кэтрин'
KeyError.

в

словаре

отсутствует, и поэтому вызывается исключение

ПРИМЕЧАНИЕ
Напомним, что операции сравнения строковых значений регистрочувствительны. Выражение

phonebook [ 'кэти' J не обнаружит в словаре ключа 'Кэти'.

Применение операторов

in

и

not in

для проверки на наличие значения в словаре
Как продемонстрировано ранее, исключение KeyError вызывается при попытке получить из
словаря значение с использованием несуществующего ключа. Для того чтобы предотвратить
это исключение, можно применить оператор in, который определит наличие ключа перед
попыткой его использовать для получения значения. Приведенный ниже интерактивный
сеанс это демонстрирует:

1 >>> phonebook = {'Крис': '555-1111', 'Кэти': '555-2222',
'Джоанна': '555-3333'} ~ter!
2 >>> if 'Крис' in phonebook: [Enter[
3
print (phonebook [ 'Крис' ] ) [ Enter [ ! Enter [
4

5 555-1111
6 >>>

462

Глава 9. Словари и множества
Инструкция i f в строке

2

определяет, имеется ли ключ 'Крис' в словаре

имеется, то инструкция в строке

3 показывает значение,

phonebook.

Если он

которое связано с этим ключом.

Как продемонстрировано в приведенном ниже сеансе, чтобы определить, не существует ли
ключ, можно также применить оператор

not in:

1 >>> phonebook = {'Крис': '555-1111', 'Кэти': '555-2222'} [Enter[
2 >>> if 'Джоанна' not in phonebook: [Enter[
3 print ('Джоанна не найдена. ') [ Enter [ [ Enter [
4

5

Джоанна

не

найдена.

6 >>>

ПРИМЕЧАНИЕ
Следует иметь в виду, что сравнения строковых значений при помощи операторов

in

и

not in

регистрочувствительны.

Добавление элементов в существующий словарь
Словари являются мутирующими объектами. В словарь можно добавлять новые пары
ключ/значение, используя для этого инструкцию присваивания в приведенном ниже общем
формате:
имя_ словаря [ключ]

= значение

Здесь имя_ словаря- это переменная, которая ссылается на словарь, ключ- это применяе­
мый ключ. Если ключ уже в словаре существует, то присвоенное ему значение будет замене­
но значением. Если же ключ отсутствует, то он будет добавлен в словарь вместе со связан­
ным с ним значением. Приведенный ниже интерактивный сеанс это демонстрирует:

1 >>> phonebook

=

{'Крис'

:'555-1111',

'Кэти':

'555-2222',

'Джоанна':'555-3333'} [Enter[

2
3
4
5

>>> phonebook['Джo'] = '555-0123' [Enterl
>>> phonebook['Kpиc'] = '555-4444' [Enterl
>>> phonebook [Enter[

{ 'Крис': '555-4444',
'Кэти': '555-2222'}

'Джоанна':

'555-3333',

'Джо':

'555-0123',

6 >>>
Рассмотрим этот сеанс.

+ Строка 1 создает словарь, содержащий имена (в качестве ключей) и телефонные номера
(в качестве значений).

+ Инструкция

в строке

2

добавляет в словарь

phonebook

новую пару ключ/значение. По­

скольку ключа 'Джо' в словаре нет, эта инструкция добавляет ключ 'Джо' вместе со свя­
занным с ним значением

'555-0123 '.

+ Инструкция в строке 3 изменяет значение, которое было связано с существующим клю­
чом. Поскольку ключ 'Крис' в словаре
связанное с ним значение на

phonebook
'555-4444 '.

уже существует, эта инструкция меняет

+ Строка 4 выводит содержимое словаря phonebook. Результат показан в строке 5.

Глава 9. Словари и множества

463

ПРИМЕЧАНИЕ
В словаре нельзя иметь повторяющиеся ключи. Если присвоить значение существующему ключу,
то новое значение заменит существующее.

Удаление элементов
Существующую пару ключ/значение можно из словаря удалить при помощи инструкции

del. Вот общий формат:
del

имя_словаря[ключ]

В данном формате имя_ словаря- это переменная, которая ссылается на словарь, ключ­
это применяемый ключ. После исполнения этой инструкции ключ и связанное с ним значе­
ние будут из словаря удалены. Если ключ не существует, то будет вызвано исключение

KeyError. Приведенный ниже интерактивный сеанс это демонстрирует:
1 >>> phonebook
'Джоанна':

{ 'Крис':

=

'555-1111',

'Кэти'

:'555-2222',

'555-3333') [Enter[

2 >>> phonebook [Enter]
3 {'Chris':

'Джоанна':

'555-1111',

'555-3333',

'Кэти':

'555-2222')

4 >>> del phonebook [ 'Крис'] [ Enter [
5 >>> phonebook [Enter[
6

'555-3333',

{'Джоанна':

'555-2222')

'Кэти':

7 >>> del phonebook [ 'Крис'] [ Enter [
8 Traceback (most recent call last) :
9

File "", line 1, in

10

del phonebook [ 'Крис']

11 KeyError:

'Крис'

12 >>>
Рассмотрим этот сеанс.

+ Строка 1 создает словарь, а строка 2 показывает его содержимое.
+ Строка 4 удаляет элемент с ключом 'Крис', строка 5 показывает содержимое
В строке

+

Строка

6 можно

7

увидеть результат

словаря.

этот элемент в словаре больше не существует.

-

пытается снова удалить элемент с ключом

'Крис '. Поскольку этот элемент

больше не существует, вызывается исключение KeyError.
Для того чтобы предотвратить вызов исключения KeyError, следует применить оператор in,
который определит, имеется ли ключ в словаре, перед попыткой его удалить вместе со свя­
занным с ним значением. Приведенный ниже интерактивный сеанс это демонстрирует:

1 >>> phonebook
'Джоанна'

=

{ 'Крис':

:'555-3333')

'555-1111',

'Кэти':

[En~

2 >>> if

'Крис'

3

del phonebook [ 'Крис'] [ Enter

in phonebook: [Enter[
1

[

Enter [

4

5 >>> phonebook [Ente~
6

{'Джоанна':

7 >>>

'555-3333',

'Кэти':

'555-2222')

'555-2222',

464

Глава 9. Словари и множества

Получение количества элементов в словаре
Для того чтобы получить количество элементов в словаре, можно применить встроенную
функцию len. Приведенный ниже интерактивный сеанс это демонстрирует:
= {'Крис': '555-1111', 'Кэти' :'555-2222') IEnter]
>>> num_items = len(phonebook) ~ii]
>>> print(num_items) IEnterl

1 >>> phonebook
2
3
4
5

2

>>>

Вот краткое описание инструкций в этом сеансе.

+ Строка 1 создает словарь с двумя элементами и присваивает его переменной phonebook.
+ Строка 2 вызывает функцию len, передавая переменную phonebook в качестве аргумента.
Эта функция возвращает значение

+ Строка 3 передает переменню num
в строке

2,

которое присваивается переменной num_ i tems.

items в функцию print. Результат функции выводится

4.

Смешивание типов данных в словаре
Как уже упоминалось ранее, ключи в словаре должны быть немутирующими объектами,
однако связанные с ними значения могут быть объектами любого типа. Например, как про­
демонстрировано в приведенном ниже интерактивном сеансе, значения могут быть списка­
ми. В этом сеансе мы создаем словарь, в котором ключами являются имена студентов, а зна­
чениями

-

списки экзаменационных оценок.

1 >>> test scores
2
3

=

{

'Кейла'

:

'Луис'
'Софи'

[88, 92, 100], IEnterl
[95, 74, 81), IEnterl
[72, 88, 91], IEnterl

4
'Итен'
[70, 75, 78) } [[nterl
5 >>> test scores IEnterl
6 {'Кейла': [88, 92, 100), 'Софи': [72, 88, 91), 'Итен':
7 'Луис': (95, 74, 81)}

(70, 75, 78),

8 >>> test_scores['Coфи'] IEnterl
9 [72, 88, 91)
10
11
12
13

>>> kayla scores = test_scores['Keйлa'] IEnterl
>>> print(kayla_scores) Lful:tii.i]
(88, 92, 100)
>>>

Рассмотрим этот сеанс подробнее. Инструкция в строках

1~

создает словарь и присваивает

его переменной test_scores (экзаменационные оценки). Данный словарь содержит приве­
денные ниже четыре элемента.

+ Первый
ем

-

элемент- 'Кейла': [88,

список

+ Второй
список

+ Третий
список

92,

100). Здесь ключом является 'Кейла ', значени­

[88, 92, 100).

элемент

-

'Луис ' : [ 9 5,

74,

81 J • Здесь ключом является 'Луи с ' , значением

-

88,

91). Здесь ключом является 'Софи', значением

-

[95, 74, 81).
элемент- 'Софи': [72,

(72, 88, 91).

Глава

+ Четвертый
ем

-

элемент- 'Итен': [70,

список

75,

9. Словари и множества

465

78]. Здесь ключом является 'Итен', значени-

(70, 75, 78].

Вот краткое описание остальной части данного сеанса.

+ Строка 5 выводит содержимое словаря, как показано в строках 6-7.
+ Строка 8 получает значение, которое связано с ключом 'Софи'. Это значение выводится
в строке

9.

+ Строка 1О получает значение, которое связано с ключом

'Кейла' и присваивает его пере­

менной

kayla_ scores. После исполнения этой инструкции переменная kayla _ scores ссы­
на список (88, 92, 100].

лается

+ Строка

11

передает переменную kayla scores в функцию print. Вывод этой функции

показан в строке

12.

Значения, хранящиеся в одном словаре, могут иметь разные типы. Например, значение не­

которого элемента может быть строковым объектом, значение другого элемента
а значение еще одного элемента

-

списком,

целым числом. Ключи тоже могут иметь разные типы, но

-

они должны оставаться немутирующими. Приведенный ниже интерактивный сеанс демон­

стрирует, каким образом разные типы могут быть перемешаны в словаре:

1 >>> mixed_up

=

{ 'абв'

:1, 999:

2 >>> mixed_up [Enter[
3 { (3, 6, 9): [3, 6, 9],
4 >>>
Инструкция в строке

'тада тада',

1, 999:

'абв':

1 создает словарь

(3, 6, 9): (3, 6, 9]) [Enter[

'тада тада')

и присваивает его переменной mixed up (смесь). Этот

словарь содержит приведенные ниже элементы.

+ Первый

элемент

-

'абв', значением

+ Второй элемент значением

+ Третий

-

1.

999: 'тада тада'. В этом элементе ключом является целое число 999,
тада '.

строковое значение 'тада

элемент

(3, 6, 9),

'абв' : 1 '. В этом элементе ключом является строковый литерал
целое число

-

(3,

значением

-

6,

9): (3, 6, 9]. В этом элементе ключом является кортеж
[3, 6, 9].

список

Приведенный ниже интерактивный сеанс демонстрирует более практический пример. Он
создает словарь, который содержит различные порции данных о сотруднике:

1 >>> employee

=

{'фио': 'Кевин Смит',

2 >>> employee [Enter[
3 {'ИД': 12345, 'ставка': 25.75,
4 >>>
Инструкция в строке

1

'ИД':12345,

'фио':

'Кевин

'ставка'

:25.75) (Enter(

Смит')

создает словарь и присваивает его переменной employee. Данный

словарь содержит приведенные ниже элементы.

+ Первый
'фио

',

+ Второй
+

элемент

значением

-

'фио' : 'Кевин

Смит'. Здесь ключом является строковый литерал

строковое значение 'Кевин Смит'.

элемент- 'ид' :12345. В этом элементе ключом является строковый литерал

•ид •,значением -

целое число

Третий элемент

'ставка': 25. 75. Здесь ключом является строковый литерал 'ставка',

значением

-

-

12345.

число с плавающей точкой 25. 75.

466

Глава 9. Словари и множества

Создание пустого словаря
Иногда требуется создать пустой словарь и добавлять в него элементы по мере выполнения

программы. Для создания пустого словаря используются пустые фигурные скобки:

1
2
3
4
5
6

>>> phonebook = {) [Enter]
>>> phonebook['Kpиc']

=

>>> рhоnеЬооk['Кэти']

=

>>> рhоnеЬооk['Джоанна']

'555-1111' ]Enter]
'555-2222' ]Enter]
= '555-3333' ]Enter]

>>> phonebook ]Enter]

{ 'Крис' : '555-1111',

'Кэти'

: '555-2222',

'Джоанна'

: '555-3333' }

7 >>>
Инструкция в строке

Строки

2-4

создает пустой словарь и присваивает его переменной

добавляют пары ключ/значение в словарь, а инструкция в строке

phonebook.

5

выводит

содержимое словаря.

Для создания пустого словаря также можно воспользоваться встроенным методом

phonebook

=

dict () :

dict()

После исполнения этой инструкции переменная

phonebook будет ссылаться на пустой сло­

варь.

Применение цикла for
для последовательного обхода словаря
Для перебора всех ключей словаря применяется цикл

for

переменная

in

for:

словарь:

инструкция
инструкция

В данном формате переменная- это имя переменной, словарь -

имя словаря. Этот цикл

выполняет одну итерацию для каждого элемента в словаре. Во время каждой итерации цик­
ла переменной присваивается ключ. Приведенный ниже интерактивный сеанс это демонст­
рирует:

1 >>> phonebook = {'Крис': '555-1111', ]Enter]
2
'Кэти':'555-2222', ]Enter]
3
'Джоанна': '555-3333'} ]Enter]
4 >>> for key in phonebook: ]Enter]
print (key) ] Enter] ] Enter]
5
6

7
8

Крис

9

Кэти

10

Джоанна

11 >>> for key in phonebook: ]Enter]

12
13
14

print(key, phonebook [key]) ] Enter] ] Enter]

Глава 9. Словари и множества

467

15 Крис 555-1111
16 Кэти 555-2222
17 Джоанна 555-3333
18 >>>
Вот краткое описание инструкций в данном сеансе.

+ Строки

1-3

создают словарь

с

тремя

элементами

и

присваивают его

переменной

phonebook.

+ Строки 4-5 содержат цикл for, который выполняет одну итерацию для каждого элемента
словаря phonebook. Во время каждой итерации цикла переменной key присваивается
ключ. Строка

5

печатает значение переменной

key. Строки

8-10

показывают результат

работы цикла.

+ Строки

11-12

содержат еще один цикл for, который делает одну итерацию для каждого

элемента словаря phonebook, присваивая ключ переменной key. Строка
менную key и затем значение, которое связано с этим ключом. Строки

15 печатает пере­
15-17 показывают

результат работы цикла.

Несколько словарных методов
Объекты-словари имеют ряд методов. В этом разделе мы рассмотрим несколько наиболее
полезных из них, которые приведены в табл.
Таблица

9.1.

9.1.

Несколько словарных методов

Метод

Описание

clear ()

Очищает содержимое словаря

get ()

Получает значение, связанное с заданным ключом. Если ключ не найден, то этот метод
не вызывает исключение. Вместо этого он возвращает значение по умолчанию

items ()

Возвращает все ключи в словаре и связанные с ними значения в виде последовательности
кортежей

keys ()

Возвращает все ключи в словаре в виде последовательности кортежей

рор()

Возвращает из словаря значение, связанное с заданным ключом и удаляет эту пару

ключ/значение. Если ключ не найден, то этот метод возвращает значение по умолчанию

popitem()

Возвращает произвольно выбранную из словаря пару ключ/значение в виде кортежа
и удаляет эту пару ключ/значение из словаря

values ()

Возвращает все значения из словаря в виде последовательности кортежей

Метод

c/ear()

Метод clear () удаляет все элементы в словаре, оставляя словарь пустым. Общий формат
этого метода:

словарь.

clear ()

Приведенный ниже интерактивный сеанс демонстрирует работу этого метода:

1 >>> phonebook

=

{ 'Крис'

2 >>> phonebook IEnterl

: '555-1111',

'Кэти'

: '555-2222' } 1Enter1

468

Глава 9. Словари и множества

3 {'Крис': '555-1111', 'Кэти': '555-2222')
4 >>> phonebook.clear() IEnterl
5 >>> phonebook IEnterl
6 {)

7 >>>
Обратите внимание, что после исполнения инструкции в строке

4

словарь

phonebook больше

элементов не содержит.

Метод

getO

Для получения значения из словаря в качестве альтернативы оператору

зоваться методом

[J

можно восполь­

get ( J • Он не вызывает исключение, если заданный ключ не найден. Вот

общий формат этого метода:
словарь.gеt (ключ,

значение_по_умолчанию)

В данном формате словарь ние_ по_умолчанию -

это имя словаря, ключ- это искомый в словаре ключ, значе­

значение, которое возвращается, если ключ не найден. Когда этот метод

вызывается, он возвращает значение, которое связано с заданным ключом. Если заданный

ключ в словаре не найден, то этот метод возвращает значение_по_умолчанию. Приведенный
ниже интерактивный сеанс демонстрирует работу этого метода:

1 >>> phonebook

=

{'Крис':'555-1111',

2
3
4
5
6

>>> value = phonebook.get('Kэти',

7

Запись

'Кэти':

'555-2222') IEnterl

'Запись не найдена')

IEnterl

'Запись не найдена')

IEnter]

>>> print(value) IEnterl

555-2222
>>> value = phonebook.get('Энди',
>>> print(value) IEnterl
не

найдена

8 >>>
Рассмотрим этот сеанс.

+ Инструкция в строке 2 ищет в словаре phonebook ключ

'Кэти'. Этот ключ найден, поэто­

му возвращается связанное с ним значение, которое затем присваивается переменной

value.

+ Строка

3 передает
4.

переменную

value в функцию print. Результат функции выводится

в строке

+ Инструкция

в строке

поэтому переменной

+ Строка 6 передает
в строке

5

ищет в словаре

value

phonebook ключ 'Энди'. Этот ключ не найден,

присваивается строковый литерал 'Запись не найдена'.

переменную value в функцию print. Результат функции выводится

7.

Метод

itemsO

Метод i

tems ()

возвращает все ключи словаря и связанные с ними значения. Они возвраща­

ются в виде последовательности особого типа, которая называется словарным представле­
нием. Каждый элемент в словарном представлении является кортежем, и каждый кортеж

содержит ключ и связанное с ним значение. Например, предположим, что мы создали при­
веденный ниже словарь:

phonebook

=

{'Крис':'555-1111',

'Кэти':'555-2222',

'Джоанна':'555-3333')

Глава 9. Словари и множества
Если вызвать метод

phonebook. i terns (),

469

то он вернет приведенную ниже последователь­

ность:

[ ( 'Крис', '555-1111'),

('Кэти',

'555-2222'),

('Джоанна',

'555-3333')]

Обратие внимание на следующие моменты:

+ первым элементом в последовательности является кортеж ( 'Крис', '555-1111');
+ вторым элементом в последовательности является кортеж ('Кэти', '555-2222');
+ третьим элементом в последовательности является кортеж ('Джоанна', '555-3333').
Для того чтобы выполнить перебор кортежей в последовательности, можно применить цикл

for.

Вот пример:

1 >>> phonebook = {'Крис': '555-1111', IEnterl
2
'Кэти' : '555-2222', [ Enter [
3
'Джоанна': '555-3333'} IEnter[
4 >>> for key, value in phonebook.iterns(): IEnterl
5
print(key, value) [Enter[ [Enter[
6
7
В Крис 555-1111
9 Кэти 555-2222
10 Джоанна 555-3333
11 >»

Вот краткое описание инструкций в этом сеансе.

+ Строки

1-3

создают словарь

с

тремя

элементами

и

присваивают его

переменной

phonebook.

+

Цикл

for в строках 4-5 вызывает метод phonebook. i terns (), который возвращает после­

довательность кортежей, содержащих пары ключ/значение словаря. Данный цикл выпол­
няет одну итерацию для каждого кортежа в последовательности. Во время каждой итера­
ции цикла значения кортежа присваиваются переменным
значение переменной

key

и затем значение переменной

key и value. Строка 5 печатает
value. Строки 8-10 показывают

результат работы цикла.

Метод
Метод

keys()

keys () возвращает все ключи словаря в виде словарного представления, т. е. особого

типа последовательности. Каждый элемент в словарном представлении является ключом
словаря. Например, предположим, что мы создали такой словарь:

phonebook

=

{'Крис':'555-1111',

Если вызвать метод

[ ' Крис ' , ' Кэти' ,

'Кэти':'555-2222',

phonebook. keys (),

'Джоанна

'Джоанна':

'555-3333'}

то он вернет приведенную ниже последовательность:

']

Приведенный ниже интерактивный сеанс показывает, каким образом можно применить цикл

for

для обхода последовательности, которая возвращается из метода

1 >>> phonebook
2
3

=

{'Крис':'555-1111', [Enter[
'Кэти':

'555-2222', [Enterl
'555-3333'} IEnter[

'Джоанна':

keys () :

470

Глава 9. Словари и множества

4 >>> for key in phonebook.keys(): 1Enter1
print (key) 1Enter 1 1Enter 1
5
6
7

8

Крис

9

Кэти

10 Джоанна
11 >>>
Методрор()
Метод рор

()

возвращает значение, связанное с заданным ключом, и удаляет эту пару

ключ/значение из словаря. Если ключ не найден, то метод возвращает значение по умолча­

нию. Вот общий формат этого метода:
словарь.рор (ключ,

значение_ по_умолчанию)

В данном формате словарь -

это имя словаря, ключ- это искомый в словаре ключ, значе­

ние_ по_умолчанию- значение, которое возвращается, если ключ не найден. Когда этот метод
вызывается, он возвращает значение, которое связано с заданным ключом, и удаляет эту пару

ключ/значение из словаря. Если заданный ключ в словаре не найден, то метод возвращает
значение_по_умолчанию. Приведенный ниже интерактивный сеанс это демонстрирует:

1 >>> phonebook
2
3

=

{ 'Крис': '555-1111', 1Enter1
'Кэти' : '555-2222', 1Enter1
'Джоанна':' 555-3333'} 1Enter1

4 >>> phone_num = phonebook.pop('Kpиc', 'Запись
5 >>> phone_num IEnterl
6 '555-1111'
7 >>> phonebook IEnterl
8 {'Кэти': '555-2222', 'Джоанна': '555-3333'}
9 >>> phone_num = рhоnеЬооk.рор('Энди', 'Запись
10 >>> phone_num IEnterl
11 Запись не найдена
12 >>> phonebook IEnterl
13 {'Кэти': '555-2222', 'Джоанна': '555-3333'}
14 >>>

не найдена') IEnterl

не найдена') IEnterl

Вот краткое описание инструкций в этом сеансе.

+ Строки

1-3

создают словарь

с

тремя

элементами

и

присваивают его

переменной

phonebook.

+ Строка 4 вызывает метод phonebook. рор (),
Связанное

phone_ num.

с

ключом

' Крис '

значение

передавая 'Крис' в качестве ключа поиска.

возвращается

и

присваивается

переменной

Пара ключ/значение, содержащая ключ 'Крис ', удаляется из словаря.

+ Строка 5 показывает значение, присвоенное переменной phone_ num. Результат выводится
в строке

6.

Обратите внимание, что он представляет собой значение, которое было связа­

но С ключом 'Крис'.

+ Строка 7 показывает содержимое словаря phonebook. Результат показан в строке 8. Обра­
тите внимание, что пара ключ/значение, которая содержала ключ
варе не существует.

' Крис ' ,

больше в сло­

Глава 9. Словари и множества

+ Строка 9 вызывает метод phonebook. рор () , передавая

471

'Энди' в качестве ключа поиска.

Данный ключ не найден, поэтому переменной phone _ nurn присваивается строковый лите­
рал 'Запись

+ Строка
в строке

не найдена'.

1О показывает
11.

значение, присвоенное переменной phone_ nurn. Вывод показан

+ Строка 12 показывает содержимое словаря phonebook. Результат показан в строке 13.
Метод

popitem()

Метод popi tem () возвращает произвольно выбранную пару ключ/значение и удаляет эту
пару из словаря. Пара ключ/значение возвращается в виде кортежа. Вот общий формат этого
метода:

словарь.

popi tem ()

Для того чтобы присвоить возвращаемый ключ и значение отдельным переменным, инст­
рукция присваивания применяется в приведенном ниже общем формате:

k, v =

словарь.рорitеm()

Этот тип присваивания называется кратным присваиванием, потому что значения присваи­

ваются сразу нескольким переменным. В приведенном выше общем формате k и

v-

это

переменные. После исполнения этой инструкции переменной k присваивается произвольно

выбранный из словаря ключ, а переменной v -

значение, связанное с этим ключом. Пара

ключ/значение удаляется из словаря.
Приведенный ниже интерактивный сеанс это демонстрирует:

1 >>> phonebook
2

('Крис':

=

'Кэти'

'555-1111', IEnterl

: '555-2222', 1Enter1
555-3333'} 1Enter1

'Джоанна':'

3

4 >>> phonebook IEnterl
5 ( 'Крис': '555-1111', 'Кэти': '555-2222', 'Джоанна':
6 >>> key, value = phonebook.popitem() IEnterl

'555-3333'}

7 >>> print(key, value) IEnterl
В Крис 555-1111
9 >>> phonebook IEnterl
10 ('Кэти': '555-2222',
11 >>>

'Джоанна':

'555-3333'}

Вот краткое описание инструкций в этом сеансе.

+ Строки

1-3

создают словарь

с

тремя

элементами

и

присваивают

его

переменной

phonebook.

+ Строка 4 выводит содержимое словаря, которое показано в строке 5.
+ Строка 6 вызывает метод phonebook. popi tem () . Возвращаемые из этого

метода ключ и

значение присваиваются переменным key и value. Пара ключ/значение удаляется из сло­
варя.

+

в

+

7 выводит
строке 8.

Строка

Строка

9

значения, присвоенные переменным key и value. Результат показан

выводит содержимое словаря. Результат показан в строке

ние, что в строке

6

10.

Обратите внима­

возвращенная из метода popi tem () пара ключ/значение была удалена.

472

Глава 9. Словари и множества

Следует иметь в виду, что если метод
вает исключение

Метод
Метод

popitem () вызывается с пустым словарем, то он вызы­

KeyError.

va/uesO
возвращает все значения словаря (без своих ключей) в виде словарного

values ()

представления, т. е. особого типа последовательности. Каждый элемент в словарном пред­
ставлении является значением из словаря. Например, предположим, что мы создали приве­
денный ниже словарь:

phonebook

=

{ 'Крис':

Если вызвать метод

[ '555-1111',

1

'555-1111',

'Кэти':

phonebook. values

555-2222',

1

'555-2222',

'Джоанна':

'555-3333')

(),то он вернет такую последовательность:

555-3333 1 ]

Приведенный ниже интерактивный сеанс показывает, каким образом можно применить цикл

for для обхода последовательности, которая возвращается из метода values ():
1 >>> phonebook = ('Крис' :'555-1111', [EnterJ
2
'Кэти':'555-2222', [Enter[
3
'Джоанна':'555-3333') [Enter[
4 >>> for val in phonebook.values(): rEnter[
5
print(val) [Ente!] [Enter[
6

7
8 555-1111

9 555-3333
10 555-2222

11 >>>

Применение словаря для имитации карточной колоды
В некоторых играх, связанных с игральными картами, картам присваиваются числовые зна­
чения. Например в игре блек-джек картам даются числовые значения:

+ числовым картам присваивается значение, которое на них напечатано. Например, двойка
пик равняется

2,

а пятерка бубей равняется

5;

+ валетам, дамам и королям назначается значение 1О;
+ тузам назначается 1 либо 11 в зависимости от выбора игрока.
В этой рубрике мы рассмотрим программу, которая применяет словарь для имитирования
стандартной колоды игральных карт, где картам присваиваются числовые значения, подоб­
ные тем, которые используются в игре блек-джек. (В этой программе мы присваиваем всем

тузам значение

1.)

В парах ключ/значение достоинство карты используется в качестве клю­

ча, а числовое значение карты
дамы червей будет такой:
'Дама червей'

: 1О

-

в качестве значения. Например, пара ключ/значение для

Глава 9. Словари и множества

473

А пара ключ/значение для восьмерки бубей будет такой:

'8

бубей':

8

Программа предлагает пользователю ввести количество карт, которые нужно раздать, и
произвольным образом раздает на руки это количество карт из колоды. Затем выводятся
достоинства розданных карт, а также сумма их достоинств. В программе

ветствующий код. Программа разделена на три функции:
дать колоду) и

deal _ cards

1 #

9.1

(card_dealer.py).

приведен соот­

(раздать карты). Вместо того чтобы представлять всю программу

целиком, давайте сначала рассмотрим главную функцию

Программа

9.1

main (главная), create_deck (соз­

main.

Главная функция

Эта программа применяет словарь

в качестве колоды карт.

2
3 def main () :
# Создать колоду карт.
4
5
deck = create_deck()
6

7
8

# Получить количество карт для
num cards = int(input('Cкoлькo

раздачи.
карт раздать?

'))

9

10
11
12

# Раздать карты.
deal cards(deck, num_cards)

Строка

вызывает

5

функцию

create_deck.

Она

создает

словарь,

содержащий

пары

ключ/значение для колоды карт, и возвращает ссылку на словарь. Ссылка присваивается
переменной
Строка

8

deck

(колода).

предлагает пользователю ввести количество карт для раздачи. Введенное значение

конвертируется в целочисленный тип

Строка

deck

и

11

9.1

и присваивается переменной

num_ cards.

вызывает функцию deal _ cards, передавая ей в качестве аргументов переменные

num_ cards.

Функция

Далее идет функция
Программа

int

deal _ cards

раздает заданное количество карт из колоды.

create deck.

(продолжение). Функция

crea te_ deck

13 # Функция create_deck возвращает словарь,
14 # представляющий колоду карт.
15 def create_deck():
16
# Создать словарь, в котором каждая карта и
17
# хранятся в виде пар ключ/значение.
18
deck = {'Туз пик' :1, '2 пик' :2, '3 пик' :3,
19
'4 пик' :4, '5 пик' :5, '6 пик' :6,
'7 пик':7, '8 пик':8, '9 пик':9,
20
21
' 1 О пик ' : 1 О, 'Валет пик' : 1 О,
22
'Дама пик' :10,
'Король пик': 10,
23

ее значение

474

Глава 9. Словари и множества

24
25

' Туз червей' : 1, ' 2 червей' : 2, ' 3 червей' : 3,
'4 червей' :4, '5 червей' :5, '6 червей' :6,

26
27
28

' 7 червей' : 7, ' 8 червей' : 8, ' 9 червей' : 9,
'10 червей': 10, 'Валет червей': 10,
'Дама червей'

29
30
31
32
33
34
35
36
37
38
39

'Король червей':

:10,

10,

' Туз треф' : 1, ' 2 треф ' : 2, ' 3 треф' : 3,
' 4 треф' : 4, ' 5 треф' : 5, ' 6 треф' : 6,
' 7 треф' : 7, ' 8 треф' : 8, ' 9 треф' : 9,
'10 треф' :10, 'Валет треф' :10,
'Дама треф

' Туз
'4

' : 1 О,

бубей'

бубей'

' Король
бубей'

: 1, ' 2

: 4,

'5

бубей'

треф'

: 2,

: 5,

: 1 О,

'3

'6

бубей'

бубей'

: 3,

: 6,

' 7 бубей' : 7, ' 8 бубей' : 8, ' 9 бубей' : 9,
' 1 О бубей' : 1 О, 'Валет бубей' : 1 О,
'Дама бубей'

40

: 1 О,

' Король

бубей'

: 1О )

41
42
43

# Вернуть колоду.
return deck

44

Программный код в строках

18-40

создает словарь с парами ключ/значение, представляю­

щими карты стандартной игральной колоды. (Пустые строки

22, 29

было легче читать программный код.)
Строка

43

возвращает ссылку на словарь.

Далее идет функция deal cards.

Программа

45 #
46 #

(окончание). Функция

9.1

Функция

deal cards

deal_cards

раздает заданное количество

карт

ИЗ КОЛОДЫ.

47
48 def deal_cards(deck, numЬer):
49
# Инициализировать накопитель для количества
50
hand value = О
51
52
# Убедиться, что количество карт для раздачи
53
# не больше количества карт в колоде.
54
if numЬer > len(deck):
55
numЬer = len(deck)
56
57
# Раздать карты и накопить их значения.
58
for count in range(numЬer):
59
card, value = deck.popitem()

карт на руках.

и

35

вставлены, чтобы

Глава 9. Словари и множества

475

print(card)
hand value += value

60

61
62

Показать

величину карт на руках.

63

#

64

print ('Величина

карт

на руках:

', hand_ value)

65
66 #

Вызвать

главную функцию.

67 main ()

Функция

deal _ cards

которой

они

hand_value

принимает два аргумента: количество карт для раздачи и колоду, из

раздаются.

Строка

50

инициализирует

накапливающую

переменную

(сумма достоинств карт на руках) значением О. Инструкция i f в строке

54

опре­

деляет, не превышает ли количество карт, подлежащих раздаче, количество карт в колоде.

Если это так, то строка

55

задает количество раздаваемых карт равным количеству карт

в колоде.

Цикл

for,

который начинается в строке

58,

выполняет одну итерацию для каждой раздавае­

мой карты. Внутри цикла инструкция в строке

59

вызывает метод

popi tem (),

который воз­

вращает из словаря

deck произвольную пару ключ/значение и удаляет эту пару из словаря 1 •
Ключ присваивается переменной card, а значение- переменной value. Строка 60 показы­
вает достоинство карты, строка 61 прибавляет значение карты в накопитель hand_ val ue.
После завершения цикла строка

64

показывает сумму достоинств комбинации карт на руках.

Вывод программы (вводимые данные выделены жирным шрифтом)

Сколько карт раздать?

8
5
5

бубей
червей

Дама

10

5 I Enter l

червей

треф

пик

Величина карт на руках:

38

WL

В ЦЕНТРЕ ВНИМАНИЯ
Хранение имен и дней рождения в словаре
В этой рубрике мы рассмотрим программу, которая хранит в словаре имена ваших друзей
и дни их рождения. Каждая запись в словаре использует имя друга в качестве ключа, а его
день рождения в качестве значения. Эту программу можно использовать для поиска дней
рождения друзей по вводимому имени.

1 Для

произвольного отбора элементов без удаления их из словаря следует использовать метод random (). -

Прим.ред.

476

Глава 9. Словари и множества
Программа показывает меню, которое позволяет пользователю выбрать один из приведен­
ных ниже вариантов действий:

1.

Отыскать день рождения.

2.

Добавить новый день рождения.

3.

Изменить день рождения.

4.

Удалить день рождения.

5.

Выйти из программы.

Программа первоначально начинает работу с пустого словаря, поэтому вам нужно выбрать
из меню пункт

2,

но выбрать пункт

чтобы добавить новую запись. Когда вы добавите несколько записей, мож­

1,

чтобы отыскать день рождения определенного человека, пункт

изменить существующий день рождения в словаре, пункт

из словаря, или пункт
В программе

9.2

5, чтобы

4,

3,

чтобы

чтобы удалить день рождения

выйти из программы.

приведен соответствующий код. Программа разделена на шесть функций:

main (главная), get _ menu_ choice (получить пункт меню), look_up (отыскать), add (добавить),
change (изменить) и delete (удалить). Вместо того чтобы приводить всю программу цели­
ком, давайте сначала исследуем глобальные константы и главную функцию main.
Программа

1 #
2 #

9.2

(blrthdays.py).

Эта программа

Главная функция

применяет словарь для хранения

имен и дней рождения друзей.

3

4 # Глобальные
5 LOOK UP = 1
6 ADD = 2
3
7 CНANGE
8 DELETE
4
9 QUIT = 5

константы для пунктов меню

10

11 # Главная функция.
12 def main():
13
# Создать пустой словарь.
14
birthdays = {)
15
16
# Инициализировать переменную для выбора пользователя.
17
choice = О
18
19
while choice != QUIT:
20
# Получить выбранный пользователем пункт меню.
21
choice = get_menu_choice()
22
23
# Обработать выбранный вариант действий.
24
if choice == LOOK UP:
25
look_up(birthdays)
26
elif choice == ADD:
27
add (Ьirthdays)

Глава 9. Словари и множества

elif choice

28
29
30
31
32

477

== CНANGE:

change(birthdays)
elif choice == DELETE:
delete(birthdays)

Глобальные константы, объявленные в строках

5-9,

используются для проверки выбранного

пользователем пункта меню. В главной функции строка
рый ссылается переменная Ьirthdays. Строка

17

14

создает пустой словарь, на кото­

инициализирует переменную choice значе­

нием О. Эта переменная содержит выбранный пользователем пункт меню.
Цикл while, который начинается в строке

примет решение

выйти

из

программы.

19,

повторяется до тех пор, пока пользователь не

Внутри

цикла строка

21

вызывает

функцию

get_ menu_ choice. Функция get_ menu _ choice выводит меню и возвращает сделанный пользо­
вателем выбор. Возвращенное значение присваивается переменной choice.
Инструкция if-elif в строках

24-31 обрабатывает выбранный пользователем пункт меню.
1, то строка 25 вызывает функцию look_ up. Если пользо­
ватель выбирает пункт 2, то строка 27 вызывает функцию add. Если пользователь выбирает
пункт 3, то строка 29 вызывает функцию change. Если пользователь выбирает пункт 4, то
строка 31 вызывает функцию delete.
Если пользователь выбирает пункт

Далее идет функция get_menu_choice.
Программа

33 #
34 #

(продолжение). Функция

9.2

Функция

get_menu_choice

qet_menu_choice

выводит меню и получает

проверенный на допустимость

выбранный пользователем пункт.

35 def get_menu_choice():
36
print ()
37

print

38

print('------------------------ 1 )

39
40

print('l.
print ( '2.

41
42
43

print('3.
print('4.
print ( '5.

44
45
46
47

print()

48
49
50
51
52
53
54
55

('Друзья и их

дни рождения')

Найти день рождения')
Добавить

новый день рождения')

Изменить

день рождения')

Удалить день

рождения')

Выйти из программы')

# Получить выбранный пользователем пункт.
choice = int ( input ( 'Введите выбранный пункт:

#

Проверить

выбранный пункт на допустимость.

while choice < LOOK UP or choice > QUIT:
choice = int(input('Bвeдитe выбранный

#

Вернуть

'))

выбранный пользователем пункт.

return choice

пункт:

'))

Глава 9. Словари и множества

478

Инструкции в строках

выводят на экран меню. Строка

36-44

47

предлагает пользователю

ввести выбранный пункт. Введенное значение приводится к типу

int и присваивается пере­
choice. Цикл while в строках 50-51 проверяет введенное пользователем значение

менной

на допустимость и при необходимости предлагает пользователю ввести выбранный пункт
повторно. Как только вводится допустимый пункт меню, он возвращается из функции
в строке

54.

Далее идет функция
Программа

look up.

(продолжение). Функция

9.2

look_up

56 # Функция look_up о'lыскивает имя
57 # в словаре birthdays.
58 def look_up(birthdays):
59
# Получить искомое имя.
60
name = input ('Введите имя: ')

61
62
63
64

# Отыскать его в словаре.
print(birthdays.get(name,

Задача функции

'Не

найдено.'))

look up состоит в том, чтобы позволить пользователю отыскать день рож­

дения друга. В качестве аргумента она принимает словарь. Строка

телю ввести имя, строка

63

60

предлагает пользова­

передает это имя в словарную функцию get в качестве аргумен­

та. Если имя найдено, то возвращается связанное с ним значение (день рождения друга),
которое затем выводится на экран. Если имя не найдено, то выводится строковый литерал

' Не

найдено

. '.

Далее идет функция

1

Программа 9.2
65#

1

add.

(продолжение). Функция add

add добавляет
birthdays.

Функция

66 # в
67 def

add(Ьirthdays):

68
69
70

name
bday

новую запись

словарь

#

Получить

=

имя и день

input
input

рождения.

('Введите

имя:

('Введите

день

')
рождения:

')

71

72
73
74
75
76

# Если имя не существует, то
if name not in Ьirthdays:
Ьirthdays[name] = bday
else:
print('Этa

запись

уже

его добавить.

существует.')

77

Задача функции

add состоит в том, чтобы позволить пользователю добавить в словарь новый

день рождения. В качестве аргумента она принимает словарь. Строки
пользователю ввести имя и день рождения. Инструкция

if

в строке

73

69

и

70

предлагают

определяет, есть ли

Глава 9. Словари и множества

это имя в словаре. Если его нет, то строка

варь. В противном случае в строке

76

74

479

добавляет новое имя и день рождения в сло­

печатается сообщение о том, что запись уже сущест­

вует.

Далее идет функция
Программа

9.2

change.

(продолжение). Функция

chanqe

78 # Функция change изменяет существующую
79 # запись в словаре birthdays.
80 def change(birthdays):
81
# Получить искомое имя.
82
name = input ( 'Введите имя: ')
83

84
85
86
87
88
89
90
91
92

if name in birthdays:
# Получить новый день
bday = input ('Введите

рождения.
новый день

рождения:

')

# Обновить запись.
birthdays[name] = bday
else:
print ('Это имя не найдено. ')

Задача функции

change состоит в том, чтобы позволить пользователю изменить сущест­

вующий день рождения в словаре. В качестве аргумента она принимает словарь. Строка

получает от пользователя имя. Инструкция i f в строке
Если да, то строка

86

ние.

Программа

93
94
95
96
97
98
99
100
101
102
103
104
105
106

9.2

delete.

(окончание). Функция

delete

# Функция delete удаляет запись из
# словаря birthdays.
def delete(birthdays):
# Получить искомое имя.
name = input ('Введите имя: ')
# Если имя найдено, то удалить эту
if name in birthdays:
del birthdays[name]
else:
print ('Это имя не найдено.')
# Вызвать
main ()

главную функцию.

запись.

91

82

определяет, есть ли имя в словаре.

получает новый день рождения, а строка

дения в словаре. Если имени в словаре нет, то строка
Далее идет функция

84

89

сохраняет этот день рож­

печатает соответствующее сообще­

Глава 9. Словари и множества

480

Задача функции delete состоит в том, чтобы позволить пользователю удалить существую­
щий день рождения из словаря. В качестве аргумента она принимает словарь. Строка
получает от пользователя имя. Инструкция i f в строке
варе. Если да, то строка

101

Вывод программы (вводимые данные выделены жирным шрифтом)

1.
2.
3.
4.
5.

и их

дни рождения

Найти день рождения

Добавить

новый день рождения

Изменить день рождения
Удалить день рождения
Выйти из программы

Введите вЬl(5ранный пункт :

2 1Enter 1

Введите имя : Кзмерои 1Enter 1

Введите день рождения :
Друзья и их

1.
2.
3.
4.
5.

10/12/1990 I Enter l

дни рождения

Найти день рождения

Добавить новый день рождения
Изменить день рождения
Удалить день рождения
Выйти из программы

Введите выбранный пункт:

2 IEnter l

Введите имя : Кэтрин 1Enter 1
Введите день рождения:

Друзья

1.
2.
3.
4.
5.

и их

5/7/1989 ! Enter l

дни рождения

Найти день рождения
Добавить

новый день рождения

Изменить день рождения
Удалить день

рождения

Выйти из программы

Введите выбранный пункт :

1 1Enter 1

Введите имя : Кзнерон 1 Enter 1

10/12/1990
Друзья

1.
2.

и их

дни рождения

Найти день рождения
Добавить

новый день

рождения

97

определяет, есть ли имя в сло­

его удаляет. Если имени в словаре нет, то строка

соответствующее сообщение.

Друзья

100

103

печатает

Глава 9. Словари и множества

3.
4.
5.

Изменить день рождения
Удалить день рождения
Выйти из программы

Введите выбранный пункт : 1 I Enterl
Введите имя : Кэтрин [ Enter [

5/7/1989
Друзья и их дни рождения

1.
2.
3.
4.
5.

Найти день рождения
Добавить

новый день рождения

Изменить

день рождения

Удалить

день

рождения

Выйти из программы

Введите выбранный пункт :
Введите имя:

3 IEnterl

Кэтрин 1Enter 1

Введите новый день рождения:
Друзья

1.
2.
3.
4.
5.

и их

5/7/1988 IEnterl

дни рождения

Найти день рождения
Добавить

новый день рождения

Изменить день рождения
Уда.лить день рождения

Выйти из программы

Введите выбранный пункт :

1 1Enter 1

Введите имя : Кэ':l!рин 1Enter 1

5/7/1988
Друзья

1.
2.
3.
4.
5.

и их

дни рождения

Найти день
Добавить

рождения

новый день

рождения

Изменить день рождения
Удалить день рождения
Выйти из программы

Введите выбранный пункт :

Введите имя : Кэмероя
Друзья и их

1.
2.
3.

J

4 1Enter 1

Enter 1

дни рождения

Найти день рождения
Добавить новый день рождения

Изменить день рождения

481

Глава 9. Словари и множества

482
4.
5.

Удалить день рождения
Выйти из программы

Введите выбранный пункт : 1 IEnter l
Введите имя : Кэнерои 1Enter 1
Не

найдено .

Друзья

и их дни рождения

1.
2.

Добавить новый день рождения

3.

Изменить день рождения

4.

Удалить день рождения

5.

Выйти из программы

Найти день рождения

Введите выбранный пункт:

5 IEnte r l

~ Контрольная точка
9.1.

Элемент в словаре имеет две части. Как они называются?

9.2.

Какая часть элемента словаря должна быть немутирующей?

9.3.

Предположим, что 'старт'

: 14 7 2

является элементом словаря. Что является ключом?

И что является значением?

9.4.

Предположим, что создан словарь с именем employee. Что делает приведенная ниже
инструкция?

employee['id']

9.5.

=

54321

Что покажет приведенный ниже фрагмент кода?

stuff

=

{1:

'ааа',

2:

'ббб',

3:

'ввв'}

print(stuff[3])

9.6.

Как определить, существует ли пара ключ/значение в словаре?

9.7.

Предположим, что существует словарь inventory. Что делает приведенная ниже инст­
рукция?

del inventory[654]

9.8.

Что покажет приведенный ниже фрагмент кода?

stuff

=

{1:

'ааа',

2:

'ббб',

3:

'ввв'}

print(len(stuff))

9.9.

Что покажет приведенный ниже фрагмент кода?

stuff

=

{

1:

'ааа',

2:

'ббб',

3:

'ввв'

}

for k in stuff:
print (k)

9.10.

В чем разница между словарными методами рор

()

и popi tem

()?

Глава 9. Словари и множества

9.11.

Что возвращает метод

items ()?

9.12.

Что возвращает метод

keys

9.13.

Что возвращает метод

values

483

()?
()?

11111111111

9.2

ества

111111111(__ КЛЮЧЕВЫЕ ПОЛОЖЕНИЯ
Множество

-

это объект-контейнер уникальных значений, который работает как мате­

матическое множество .

Виде,.,з~пись "Введение в м1= amount:
self. balance -= amount
else:
рrint('Ошибка:

недостаточно средств')

26

get_balance

27

#

Метод

28

возвращает

#

остаток средств на счете.

def get_balance(self):
return self. balance
Обратите внимание, что метод
и

bal.

Параметр

В строке



bal

_ init_ ()

имеет две параметрические переменные:

self

в качестве аргумента принимает начальный остаток на расчетом счете.

сумма параметра

bal присваивается атрибуту _ balance объекта.

Метод

deposit () расположен в строках 15-16. Он имеет две параметрические переменные:
self и amount. При вызове этого метода вносимая на счет сумма передается в параметр
amount, значение которого затем прибавляется к атрибуту_balance в строке 16.

Метод

wi thdraw () расположен в строках 21-25. Он имеет две параметрические переменные:
amount. При вызове этого метода снимаемая с банковского счета сумма передается
в параметр amount. Инструкция if, которая начинается в строке 22, определяет, достаточна
ли величина остатка для снятия средств с банковского счета. Если да, то сумма amount вычи­
self

и

тается из остатка в строке
недостаточно

23.

В противном случае строка

25

выводит сообщение 'Ошибка:

средств'.

Метод

get _ balance () расположен в строках 30-31. Он возвращает значение атрибута
balance.

Программа

Программа

1 #

10.8

10.8 демонстрирует

применение этого класса.

(account_test.py)

Эта программа демонстрирует класс

BankAccount.

2

3 import bankaccount
4

5 def main () :
6
# Получить начальный остаток.
7
start bal = float(input('Bвeдитe

свой начальный остаток:

'))

в

9
10

# Создать объект BankAccount.
savings = bankaccount.BankAccount(start_bal)

11

12
13
14
15
16

#

Внести на

рау =

счет

зарплату пользователя.

float(input('Cкoлькo Вы получили на этой неделе?

print ('Вношу эту сумму
savings.deposit(pay)

на Ваш счет.

')

'))

Глава 10. Классы и объектно-ориентированное программирование

530
17
18
19
20
21
22
23
24
25

#

Показать

остаток.

print('Baш остаток на банковском счете составляет$',

format(savings.get_balance(), '.2f'),
sep=' ')
#

Получить

cash =

сумму дпя снятия с банковского счета.

float(input('Kaкyю сумму Вы желаете снять

со

счета?

'))

рrint('Снимаю эту сумму с Вашего банковского счета.')

savings.withdraw(cash)

26

27
# Показать остаток.
28
print('Baш остаток на банковском счете составляет$',
29
format(savings.get_balance(), '.2f'),
30
sep=' ')
31
32 # Вызвать главную функцию.
33 main ()
Вывод

1 программы

(вводимые данные выделены жирным шрифтом )

Введите свой начальный остаток :

1000 IEnterl
500 IEnter l

Сколько Вы получили на этой неделе?
Вношу эту сумму на Ваш счет .

$1500 . 00
1200 1Enter 1

Ваш остаток на банковском счете составляет

Какую сумму Вы желаете снять со счета?

Снимаю эту сумму с Вашего банковского счета.

Ваш остаток на банковском счете составляет
Вывод

2

$300 . 00

программы (вводимые данные выделены жирным шрифтом )

Введите свой начальный остаток :
Сколько Вы получили на этой

1000 IEnter l
неделе? 500 IEnter l

Вношу эту сумму на Ваш счет .

$1500.00
2000 1Enter 1

Ваш остаток на банковском счете составляет

Какую сумму Вы желаете снять со счета?

Снимаю эту сумму с вашего банковского счета .
ОимС>ка :

недостаточно средств

Ваш остаток на банковском счете составляет

Строка

7

$1500.00

получает от пользователя начальный остаток счета и присваивает его переменной

start_bal. Строка 10 создает
savings (сбережения):

экземпляр класса

BankAccount

и присваивает его переменной

savings = bankaccount.BankAccount(start_bal)
Обратите внимание, что переменная
переменная

_ ini t _ ()
Строка

start_bal

start_ bal помещена в круглые скобки. В результате
_init_ (). В методе
параметр bal.

передается в качестве аргумента в метод

она будет передана в

13 получает сумму заработной платы пользователя и присваивает ее переменной рау.
15 вызывается метод savings .deposit (),передавая ему переменную рау в качестве

В строке

аргумента. В методе

deposit () она будет передана в параметр amount.

Глава 10. Классы и объектно-ориентированное программирование

Инструкция в строках

18-20

23

показывает остаток на банковском счете. Она выводит значе­

savings.get_ balance () .

ние, возвращаемое из метода

Строка

531

получает сумму, которую пользователь хочет снять, и присваивает ее переменной

cash (наличные). В строке 25 вызывается метод savings. wi thdraw (), передавая переменную
cash в качестве аргумента. В методе wi thdraw () она будет передана в параметр arnount.
Инструкция в строках

Метод

28-30

показывает конечный астата.к на банковском счете.

_str_()

Довольно часто возникает необходимость вывести сообщение, которое показывает состоя­
ние объекта. Состояние объекта

-

это просто значения атрибутов объекта в тот или иной

конкретный момент. Например, вспомните, что класс

ных:

_ balance.

BankAccount

имеет один атрибут дан­

В любой конкретный момент атрибут _balance объекта BankAccount будет

ссылаться на какое-то значение. Значение атрибута

_balance представляет состояние объ­

екта в этот момент. Приведенный ниже фрагмент кода является примером вывода состояния
объекта

BankAccount:

account = bankaccount.BankAccount(lS00.0)
print('Ocтaтoк составляет$', format(savings.get_balance(),
sep=' ')
Первая инструкция создает объект

1500.0.

'.2f'),

BankAccount, передавая в метод
ini t
() значение
account будет ссылаться на объект

После исполнения этой инструкции переменная

BankAccount. Вторая строка выводит строковое значение, показывающее значение атрибута
_balance данного объекта. Результат работы этой инструкции будет выглядеть так:
Остаток составляет

$1500.00

Вывод на экран состояния объекта является широко распространенной задачей. Она на­
столько распространена, что многие программисты оснащают свои классы методом, кото­

рый возвращает строковое значение, содержащее состояние объекта. В
присвоено специальное имя

Python

этому методу

_str_. В программе 10.9 представлен класс BankAccount с до­
бавленным в него методом _ str _ () , который расположен в строках 36--3 7. Он возвращает
строковое значение, сообщающее остаток на банковском счете.
Программа

1 #

10.9

Класс

(bankaccount2.py)

BankAccount

имитирует

банковский счет.

2

3 class BankAccount:
4

5
6
7

#
#
#

Метод

init

принимает

Он присваивается атрибуту

8
9

def

10

init (self, bal):
self. balance = bal

11

12
13
14

#
#

аргумент

с остатком на счете.

Метод
на

deposit

счет вклад.

вносит

balance.

532
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37

Глава 10. Классы и объектно-ориентированное программирование

def deposit(self, amount):
self. balance += amount

#
#

withdraw

Метод

снимает сумму

со счета.

def withdraw(self, amount):
if self. balance >= amount:
self. balance -= amount
else:
рrint('Ошибка:

get_balance

#

Метод

#

остаток средств

недостаточно средств')

возвращает

на счете.

def get_balance(self):
return self. balance
str

#

Метод

#

значение,

def

возвращает

сообщающее

str (self):
return 'Остаток

Метод

_ str_ ()

строковое

о состоянии объекта.

составляет$'

+ format(self._balance,

'.2f')

вызывается не напрямую, а автоматически во время передачи объекта

в качестве аргумента в функцию

print.

В программе

10.10

приведен соответствующий при­

мер.

Программа

1 #
2 #

10.10

(account_test2.py)

Эта программа демонстрирует класс
с добавленным в него методом

BankAccount

str

3

4 import bankaccount2
5

6 def main () :
# Получить начальный остаток.
7
8
start bal = float(input('Bвeдитe

свой начальный остаток:

'))

9

10
11
12
13
14
15
16
17

# Создать объект BankAccount.
savings = bankaccount2.BankAccount(start_bal)
#

Внести на счет зарплату пользователя.

рау =

float(input('Cкoлькo Вы получили на

print ('Вношу эту сумму
savings.deposit(pay)

на Ваш счет.')

этой неделе?

'))

Глава 10. Классы и объектно-ориентированное программирование

533

18
# Показать остаток.
19
print(savings)
20
21
# Получить сумму для снятия с банковского счета.
22
cash = float(input('Kaкyю сумму Вы желаете снять со счета? '))
23
рrint('Снимаю эту сумму с Вашего банковского счета.')
24
savings.withdraw(cash)
25
# Показать остаток.
26
27
print(savings)
28
29 # Вызвать главную функцию.
30 main ()
Вывод программы (вводимые данные выделены жирным шрифтом)

Введите свой начальный остаток :

1000 IEnterl
500 IEnterl

Сколько Вы получили на этой неделе?
Вношу эту сумму на

Ваш счет .

Остаток составляет

$1500 . 00

Какую сумму Вы желаете снять со счета?

1200 IEnterl

Снимаю эту сумму с Вашего банковского счета .

Остаток составляет

Имя объекта,
ется метод
возвращается

Метод

str

$300 . 00
savings, передается в функцию print в строках 19 и 27. В результате вызыва­
str () класса BankAccount. Затем выводится строковое значение, которое
из метода _ str_ ().
()

также вызывается автоматически, когда объект передается в качестве

аргумента во встроенную функцию

str.

Вот пример:

account = bankaccount2.BankAccount(l500.0)
message = str(account)
print(message)
Во второй инструкции объект

account

В результате вызывается метод

_ str_ ()

чение присваивается переменной

передается в качестве аргумента в функцию
класса

message

BankAccount.

str.

Возвращаемое строковое зна­

и затем в третьей строке выводится функцией

print.

~

Контрольная точка
10.5.

Вы слышите, что кто-то высказывает следующий комментарий: "Проект- это дизайн
дома. Плотник использует проект для возведения дома. Если плотник пожелает, он
может построить несколько идентичных домов на основе одного и того же проекта".

Представьте это, как метафору для классов и объектов. Этот проект представляет класс
или же он представляет объект?

10.6.

В данной главе с целью описания классов и объектов мы используем метафору с фор­
мой и печеньем, которые изготавливаются при помощи формы. В этой метафоре объ­
екты представлены формой или же печеньем?

Глава 10. Классы и объектно-ориентированное программирование

534

10.7.

Какова задача метода

10.8.

Какова задача параметра

self

10.9.

Каким образом в классе

Python

init

()?И когда он исполняется?
в методе?
атрибут скрывается от программного кода, находяще­

гося за пределами класса?

10.10.

Какова задача метода

10.11.

Каким образом происходит вызов метода_ str _

str

()?
()?

111111111111

10.3

Работа с экземпля ами

11111111(__ КЛЮЧЕВЫЕ ПОЛОЖЕНИЯ
Каждый экземпляр класса имеет собственный набор атрибутов данных.
При использовании методом параметра

self

для создания атрибута этот атрибут принадле­

жит конкретному объекту, на который ссылается параметр

self.

Мы называем такие атрибу­

ты атрибута.ми экземпляра, потому что они принадлежат конкретному экземпляру класса.
В программе можно создавать многочисленные экземпляры одного и того же класса. И каж­

дый экземпляр будет иметь собственный набор атрибутов. Например, взгляните на про­
грамму

10.11.

В ней создаются три экземпляра класса

Coin.

Каждый экземпляр имеет собст­

венный атрибут_ sideup.

Программа

1 #
2 #

10.11

(coin_demo5.py)

Эта программа импортирует имитационный модуль
и создает три экземпляра класса

Coin.

3

4 import coin
5

6 def main () :
# Создать три объекта
7
8
coinl
coin.Coin()
9
coin2
coin. Coin ()
10
coinЗ
coin. Coin ()

класса

Coin.

11

12
13
14
15
16
17
18
19
20
21
22

#

Показать

повернутую вверх сторону каждой монеты.

print('Boт три монеты,

у которых эти стороны обращены вверх:')

print(coinl.get_sideup())
print(coin2.get_sideup())
print(coinЗ.get_sideup())

print ()
#

Подбросить монету.

print ('Подбрасываю
print ()
coinl.toss()

все три монеты ...

')

Глава 10. Классы и объектно-ориентированное программирование

23

coin2.toss()

24

coin3.toss()

535

25

26

#

27

print

28

print(coinl.get_sideup())

29

print(coin2.get_sideup())

30

print(coinЗ.get_sideup())

31

print ()

Показать

повернутую вверх

('Теперь

сторону каждой монеты.

обращены вверх вот

эти

стороны:

')

32
33 #

Вызвать

главную функцию.

34 main ()
Вывод программы
Вот

три монеты ,

у

которых эти

стороны обращены вверх :

Орел
Орел
Орел

Подбрасываю все три монеты

Теперь

...

обращены вверх

вот эти стороны :

В строках

приведенные ниже инструкции создают три объекта, каждый из которых

Ре~ш

качестве

Переместить

п

качестве

- 1

колец со

временного

стержень

сделать

С с использованием

следующее.

стержня А на

- 1

колец

временного

стержень В,

используя стержень

С

стержня.

оставшееся кольцо

Переместить п
в

стержня А на

необходимо

О:

Переместить
в

колец со

качестве временного,

со

со

стержня А на

стержня В на

стержень

стержень

С,

С.

используя стержень А

стержня.

Базовый случай для этого алгоритма достигается, когда больше не останется колец, под­
лежащих перемещению. Приведенный ниже фрагмент кода показывает функцию, которая
реализует этот алгоритм. Эта функция практически ничего не перемещает. Она лишь содер­
жит инструкции с указанием всех ходов, которые нужно сделать, чтобы переместить кольца.

def move_discs(num, from_peg, to_peg,
if num > О:
move_discs(num - 1, from_peg,
print ( 'Move а disc from peg',
move_discs(num - 1, temp_peg,

temp_peg):
temp peg, to_peg)
from_peg, 'to peg', to_peg)
to_peg, from_peg)

Данная функция принимает аргументы в следующие ниже параметры:

+ num - количество перемещаемых колец;
+ from_peg - стержень, с которого взять кольцо;
+ to_peg - стержень, на который переложить кольцо;
+ temp_peg - стержень, используемый в качестве временного.
Если

num

больше О, то это означает, что есть кольца, которые следует переместить. Первый

рекурсивный вызов будет таким:

move_discs(num - 1, from_peg, temp_peg, to_peg)
Эта инструкция содержит указание, что все кольца, кроме одного, нужно переместить со
стержня

from_peg

на стержень

temp_peg,

используя стержень

to_peg

в качестве временного.

Далее идет инструкция:

print

('Переложить

кольцо

from_peg,

с',

'на',

to_peg)

Эта инструкция просто выводит сообщение о том, что кольцо должно быть перемещено со
стержня

from_peg

на стержень

to_peg.

Далее идет еще один рекурсивный вызов, который

исполняется следующим образом:

move-discs(num - 1, temp_peg, to_peg, from_peg)
Эта инструкция содержит указание, что все кольца, кроме одного, нужно переместить со
стержня

temp_peg

Программе

на стержень

to_peg,

12. 7 демонстрирует

ских башнях.

используя стержень

from_peg

в качестве временного.

данную функцию, показывая решение головоломки о ханой­

Глава 12. Рекурсия

614

Проrрамма 12.7

1

(towers_of_hanoi.py)

1 # Эта программа имитирует головоломку 'Ханойские
2
3 def main():
4
# Задать несколько исходных значений.
5
nurn discs = 3
6
from_peg = 1
7
to_peg = 3
8
temp_peg = 2

башни'.

9

10
11
12

# Решить головоломку.
move_discs(nurn_discs, from_peg, to_peg, temp_peg)
print ('Все кольца перемещены!')

13

14
15
16
17
18
19
20
21
22
23
24

#

Функция

#колец в

moveDiscs

показывает процесс перемещения

головоломке

'Ханойские башни'.

# Параметры функции:
# nurn: количество перемещаемых колец.
# from_peg: стержень, с которого взять кольцо.
# to_peg: стержень, на который переложить кольцо.
# temp_peg: временный стержень.
def move_discs(nurn, from_peg, to_peg, temp_peg):
if nurn > О:
move_discs(nurn - 1, from_peg, temp_peg, to_peg)
рrint('Переложить кольцо с', from_peg,
'на', to_peg)
25
move_discs(nurn - 1, temp_peg, to_peg, from_peg)
26

27 # Вызвать
28 main ()

главную функцию.

Вывод программы
Переложить

кольцо

с

1

на

3

Переложить

кольцо

с

1

на

Переложить

кольцо

с

3

на

2
2

Переложить

кольцо

с

1

на

3

Переложить

кольцо

с

на

1

Переложить

кольцо

с

2
2

на

3

Переложить

кольцо

с

1

на

з

Все

перемещены!

кольца

Рекурсия против циклов
Любой алгоритм, который может быть запрограммирован на основе рекурсии, может быть

запрограммирован на основе цикла. Оба этих подхода успешно выполняют повторения, но
какой из них использовать лучше всего?
Есть несколько причин, почему не следует использовать рекурсию. Вызовы рекурсивной

функции, разумеется, менее эффективны, чем циклы. При каждом вызове функции система

Глава 12. Рекурсия

615

несет накладные расходы, которые не требуются для цикла. Во многих случаях решение на
основе цикла более очевидное, чем рекурсивное . Практически подавляющая часть итераци­
онных задач программирования лучше всего решается на основе циклов .

Вместе с тем некоторые задачи легче решаются на основе рекурсии, чем на основе цикла.

Например, математическое определение формулы НОД хорошо укладывается в рекурсив­
ный подход. Если для определенной задачи рекурсивное решение является очевидным,
и рекурсивный алгоритм не сильно замедляет производительность системы, то рекурсия

будет хорошим проектным решением. Однако если задача легче решается на основе цикла,
то следует принять подход на основе цикла.

Вопросы для повторения
Множественный выбор

1.

2.

Рекурсивная функция

_ _ _ _ _ __

а)

вызывает другую функцию;

б)

аварийно останавливает программу;

в)

вызывает саму себя;

г)

может вызываться всего один раз.

Функция вызывается один раз из главной функции программы и затем вызывает саму
себя четыре раза. В этом случае глубина рекурсии будет равна

3.

а)

одному;

б)

четырем;

в)

пяти;

г)

девяти.

_______

Часть задачи, которая может быть решена без рекурсии, называется

_______

случаем.

4.

а)

базовым;

б)

разрешимым;

в)

известным;

г)

итеративным.

Часть задачи, которая может быть решена с использованием рекурсии, называется

_______

5.

случаем.

а)

базовым;

б)

итеративным;

в)

неизвестным;

г)

рекурсивным.

Когда функция явным образом саму себя вызывает, это называется
курсией.
а)

явной;

б)

модальной;

_______

ре-

616

Глава 12. Рекурсия

6.

в)

прямой;

г)

косвенной.

Когда функция А вызывает функцию в, которая вызывает функцию А, она называется

_ _ _ _ _ _ _ рекурсией.

7.

а)

имплицитной;

б)

модальной;

в)

прямой;

г)

косвенной.

Любая задача, которая может быть решена на основе рекурсии, может также быть реше­
на на основе

8.

-------

а)

структуры принятия решения;

б)

цикла;

в)

последовательной структуры;

г)

выбирающей структуры.

Действия,

такие

переменные,

9.

1О.

как

выделение

предпринимаемые

а)

накладными расходами;

б)

первоначальной настройкой;

в)

очисткой;

г)

синхронизацией.

оперативной

памяти

под

компьютером

при

вызове

Рекурсивный алгоритм в рекурсивном случае должен

параметры

и

локальные

называются

_____

а)

решить задачу без рекурсии;

б)

свести задачу к уменьшенному варианту исходной задачи;

в)

подтвердить, что произошла ошибка и прервать программу;

г)

свести задачу к увеличенному варианту исходной задачи.

Рекурсивный алгоритм в базовом случае должен

функции,

_ _ _ __

а)

решить задачу без рекурсии;

б)

свести задачу к уменьшенному варианту исходной задачи;

в)

подтвердить, что произошла ошибка и прервать программу;

г)

свести задачу к увеличенному варианту исходной задачи.

Истина или ложь

1.

Алгоритм, в котором применяется цикл, обычно будет работать быстрее, чем эквивалентный рекурсивный алгоритм.

2.

Некоторые задачи могут быть решены только на основе рекурсии.

3.

Не во всех рекурсивных алгоритмах обязательно должен иметься базовый случай.

4.

В базовом случае рекурсивный метод вызывает сам себя с уменьшенным вариантом
исходной задачи.

Глава 12. Рекурсия

617

Короткий ответ

1.

Каким является базовый случай функции

message из программы 12.2, представленной

ранее в этой главе?

2.

В этой главе правила вычисления факториала числа состояли в следующем.
Если п =О, то

factorial(n)

=

Если п >О, то

factorial(n)

= п х

1.
factorial(n - 1).

Каким будет базовый случай, если вы разрабатываете функцию на основе этих правил?
Каким будет рекурсивный случай?

3.

Всегда ли требуется рекурсия для решения задачи? Какой еще подход применяется для

решения повторяющейся по своей природе задачи?

4.

Почему при использовании рекурсии для решения задачи рекурсивная функция должна
вызывать саму себя для решения уменьшенного варианта исходной задачи?

5.

Каким образом рекурсивная функция уменьшает задачу?

Алгоритмический тренажер

1.

Что покажет приведенная ниже программа?

def main ():
num = О
show_me(num)
def show_me(arg):
i f arg < 10:
show_me(arg + 1)
else:
print(arg)
main()

2.

Что покажет приведенная ниже программа?

def main():
num = О
show_me(num)
def show_me(arg):
print (arg)
if arg 10:
show_me (arg + 1)
main()

3.

В приведенной ниже функции применен цикл. Перепишите ее как рекурсивную функ­
цию, которая выполняет ту же самую операцию.

def traffic sign(n):
while n > О:
print ('Не парковаться')
n = n > 1

618

Глава 12. Рекурсия

Задач

прог

1.

а

м

Рекурсивная печать. Разработайте рекурсивную функцию, которая принимает целочис­
ленный аргумент п и распечатывает числа от

2.

1 до

п.

Рекурсивное умножение.

Виоеп~а,"

·"

..J~d,.,чa u µекурсивном умножении·

Разработайте рекурсивную функцию, которая принимает два аргумента в параметры х
и у. Данная функция должна вернуть значение произведения х на у. При этом умножение
должно быть выполнено, как повторяющееся сложение, следующим образом:

7

х

4

=

4 + 4 + 4 + 4 + 4 + 4 + 4.

(Для того чтобы упростить функцию, исходите из того, что х и у будут всегда содержать
положительные ненулевые целые числа.)

3.

Рекурсивные строки. Напишите рекурсивную функцию, которая принимает целочис­
ленный аргумент п. Данная функция должна вывести на экран п строк, состоящих из
звездочек, при этом первая строка должна показать

1 звездочку,

вторая строка

-

2

звез­

дочки и так до п-й строки, которая должна показать п звездочек.

4.

Максимальное значение в списке. Разработайте функцию, которая принимает список
в качестве аргумента и возвращает самое большое значение в списке. В данной функции
для нахождения максимального значения должна использоваться рекурсия.

5.

Рекурсивная сумма списка. Разработайте функцию, которая принимает список чисел
в качестве аргумента. Она должна рекурсивно вычислить сумму всех чисел в списке
и вернуть это значение.

6.

Сумма чисел. Разработайте функцию, которая принимает целочисленный аргумент и
возвращает сумму всех целых чисел от

1

до числа, переданного в качестве аргумента.

Например, если в качестве аргумента передано
чисел

7.

1, 2, 3, 4, ... , 50.

50,

то данная функция вернет сумму

Для вычисления суммы примените рекурсию.

Рекурсивный метод возведения в степень. Разработайте функцию, в которой рекурсия
применяется для возведения числа в степень. Данная функция должна принимать два
аргумента: число, которое будет возведено в степень, и показатель степени. Исходите из
того, что показатель степени является неотрицательным целым числом.

8.

Функция

Аккермана.

Функция

Аккермана

является

рекурсивным

математическим

алгоритмом, который используется для проверки, насколько успешно система оптимизи­

рует свою производительность в случае рекурсии. Разработайте функцию ackermann (m,

n),

которая решает функцию Аккермана. Примените в своей функции следующую логику:
Если т

О,

Если п

=О,

Иначе

+ 1.
ackermann(m - 1, 1).
ackermann (т - 1, ackermann(m,

то вернуть п
то вернуть
вернуть

п

- 1)).

После того как вы разработаете свою функцию, протестируйте ее с использованием
небольших значений для т и п.

1111111111

13.1

г

еисыпользователя

ические инте

~ КЛЮЧЕВЫЕ ПОЛОЖЕНИЯ
Графический интерфейс пользователя позволяет взаимодействовать с операционной сис­

темой и другими программами с помощью графических элементов, таких как значки,
кнопки и диалоговые окна.

Интерфейс пользователя является частью компьютера, с которым пользователь взаимодей­
ствует. Аппаратная часть пользовательского интерфейса состоит из устройств, таких как
клавиатура и видеодисплей. Программная часть пользовательского интерфейса отвечает за
то, как операционная система компьютера принимает команды от пользователя. В течение

многих лет единственным способом, благодаря которому пользователь мог взаимодейство­
вать с операционной системой, являлся интерфейс командной строки (рис.

13 .1 ).

Интерфейс

командной строки обычно выводит на экран подсказку, и пользователь набирает команду,
которая затем исполняется.

rlll

С:\

'JINDO '!

с:\Топпу\I

о•

в ус

S} stem3

ages>d'r
se С

ройс

Серийн й номер

о

' cmd.e.xe

и~ее

о а:

ме ку

с:\ опnу\

РИС .

13.1.

Е~

0096-Е789

Содер имое папки с:\Тоnпу\

08.01.2018
08.01.2018

SYS

х

mages

09:41

09:41

0 а-лов
0
2 папо~ ;а 128 050 176

ба-т

бай

свобод о

mages>

Интерфейс командной строки

Многие компьютерные пользователи, в особенности новички, считают, что интерфейсы
командной строки сложно использовать. И причина тому

-

обилие команд, которые необ­

ходимо изучить, причем каждая команда имеет собственный синтаксис, во многом как

у программной инструкции. Если команда набрана неправильно, то она работать не будет.
В 1980-х годах в коммерческих операционных системах вошел в употребление новый тип

интерфейса, именуемый графическим интерфейсом пользователя. Графический интерфейс

620

Глава 13. Программирование графического пользовательского интерфейса
пользователя

на английском эта аббревиатура произносится

(graphical user interface, GUI -

как "rуи") позволяет пользователю взаимодействовать с операционной системой и другими
программами через графические элементы на экране.

GUI

также популяризировали исполь­

зование мыши как устройства ввода данных. Вместо того чтобы требовать от пользователя,

чтобы он набирал команды на клавиатуре,

GUI

позволяют ему указывать на графические

элементы и щелкать кнопкой мыши для их активации .

Значительная часть взаимодействия с

GUI

выполняется через диалоговые окна, т. е. неболь­

шие окна, которые выводят информацию и позволяют пользователю выполнять действия.
На рис. 13.2 показан пример диалогового окна в операционной системе Windows, которое
позволяет пользователю вносить изменения в интернет-настройки системы. Вместо того
чтобы набирать команды в соответствии с заданным синтаксисом, пользователь взаимодей­

ствует с графическими элементами

значками, кнопками и полосами прокрутки.

-

?

С аойстаг: Интернет
~

По.аключения

Доnолкпе~

КОНФИ.ае~ь

~3оnасность

Мест1-111я
инт~сеть

х

На.аежные

Оn401ые

~i1ты

с.а~1ты

11нтернет

Зоt;а для !!еб-а11iтое, не !JКЛ!ОЧеttНЫХ 11 3ОНЫ
1-111.Dежных и оrм01ых са'!~

lаЬе14
РИС.

рамке

13.9).

Ьottom_frame

lаЬеlб

lаЬе15

13.9. Расположение элементов интерфейса
Строки

48

и

49

вызывают метод pack () элемента интерфейса Frame, который делает види­

мыми элемент интерфейса Frame. Строка

52

выполняет функцию mainloop модуля tkinter.

~

13.5
~

L

Элементы интерфейса

Button

и и формационные диалоговые окна

КЛЮЧЕВЫЕ ПОЛОЖЕНИЯ
Элемент интерфейса Button используется для создания в окне стандартной кнопки. Когда

пользователь нажимает кнопку, вызывается заданная функция или метод.
Информационное диалоговое окно

-

это простое окно, оно выводит пользователю

сообщение и содержит кнопку ОК, которая закрывает диалоговое окно. Для вывода

информационного диалогового окна используется функция showinfo модуля tkinter.

messagebox.
Видеозапись "Реагирование на нажатие клавиш"

Button -

(Responding to Button Clicks)

это элемент интерфейса, который пользователь может нажать, чтобы вызвать

выполнение действия. При создании элемента интерфейса Button можно определить текст,

который должен появиться на поверхности кнопки, и имя функции обратного вызова. Функ­
ция обратного вызова
нажимает кнопку.

-

это функция или метод, который исполняется, когда пользователь

Глава 13. Программирование графического пользовательского интерфейса

()

631

ПРИМЕЧАНИЕ
Функция обратного вызова таюке называется обработчиком события, потому что она обрабаты­

вает событие, которое происходит, когда пользователь нажимает кнопку.

Для того чтобы продемонстрировать работу этого элемента, мы рассмотрим программу
Она выводит на экран окно, показанное на рис.

13.10.

13.7.

Когда пользователь нажимает кнопку,

программа выводит на экран отдельное информационное диалоговое окно (рис.

13 .11 ).

Для

вывода информационного диалогового окна используется функция showinfo, которая нахо­
дится в модуле tkinter .messagebox. (Для того чтобы использовать функцию showinfo, не­
обходимо импортировать модуль

tkinter .messagebox.) Вот общий формат вызова функции

showinfo:
tkinter.messagebox.showinfo(зaгoлoвoк,

В данном формате заголовок -

сообщение)

это строковый литерал, который выводится на экран в об­

ласти заголовка диалогового окна, сообщение

-

это строковый литерал с информационным

сообщением, которое выводится на экран в основной части диалогового окна.
Программа

1 #
2 #
3 #

13.7

(button_demo.py)

Эта программа демонстрирует элемент интерфейса
Когда пользователь

нажимает кнопку

Button.

Button,

на экран выводится информационное диалоговое окно.

4

5 import tkinter
6 import tkinter.messagebox
7

8 class MyGUI:
9
def
init (self):
10
# Создать элемент интерфейса главного окна.
11
self.main_window = tkinter.Tk()
12
13
# Создать элемент интерфейса Button widget.
14
# На кнопке должен появиться текст 'Нажми меня!'.
15
# Когда пользователь нажимает кнопку,
16
# должен быть исполнен метод do_something.
17
self.my_button
tkinter.Button(self.main_window,
18
tехt='Нажми меня!',
19
command=self.do_something)
20

21
22
23
24
25

# Упаковать элемент интерфейса Button.
self.my_button.pack()
# Войти в главный цикл tkinter.
tkinter.mainloop()

26

27
28
29

#
#

Метод

do something

вызова для

является

функцией обратного

элемента интерфейса

Button.

632
30

31

Глава 13. Программирование графического пользовательского интерфейса

def do_something(self):
# Показать информационное

диалоговое окно.

tkinter.messagebox.showinfo('Peaкция',

32
33

'Благодарю,

34
35 # Создать экземпляр
36 my_gui = MyGUI ()

класса

что нажали кнопку.

')

MyGUI.

х

О Di1aroдapю, что нажал11 кнопку.
х

о

ок

Нажмн мен.я!

РИС . 13. 10. Гпавное окно, выводимое на экран

РИС.13.11. Информационное диалоговое окно,

программой

выводимое на экран программой

13.7

Строка

5

импортирует модуль

13.7

tkinter, а строка 6 - модуль tkinter .messagebox. Строка 11
main window.

создает корневой элемент интерфейса и присваивает его переменной
Инструкция в строках

17-19

создает элемент интерфейса

Button. Первым аргументом внут­

sel f . main _ window является родительский элемент интерфейса. Аргумент
' определяет, что строковый литерал 'Нажми меня! ' должен появиться на
кнопки. Аргумент command=' self. do_ some thing' задает метод do_ something ()

ри круглых скобок

t e xt =' Нажми
поверхности

меня !

класса в качестве функции обратного вызова. Когда пользователь нажмет кнопку, исполнит­
ся метод

do_ something () .

do_ something ( > расположен в строках 30-33. Он просто вызывает функцию
tkinter. messagebox . showinfo для вывода информационного окна, показанного на рис. 13.11.

Метод

Для того чтобы закрыть это диалоговое окно, пользователь должен нажать кнопку ОК.

Создание кнопки выхода из программы
Программы с

GUI

обычно имеют кнопку Выйти (или кнопку Отмена), которая закрывает

программу, когда пользователь ее нажимает. Для того чтобы создать кнопку Выйти в про­
Python, нужно просто создать элемент интерфейса Button, который в качестве функ­

грамме

ции обратного вызова вызывает метод
ма

13.8

программы
Проrрамма

1 #
2 #

13.8

13.7,

в которую добавлен второй элемент

(qult_button.py)

Эта про грамма содержит кнопку

'Выйти',

при ее нажатии вызывает метод

de s troy

3

4 import tkinter
5 import tkinter.messagebox
6

destroy () корневого элемента интерфейса. Програм­

демонстрирует, как это делается. Она представляет собой видоизмененную версию

которая
клас са

Tk.

Button (рис. 13.12).

Глава 13. Программирование графического пользовательского интерфейса

7 class MyGUI:
8
def
init (self) :
9
# Создать элемент интерфейса главного окна.
10
self.main window = tkinter.Tk()
11
12
# Создать элемент интерфейса Button widget.
13
#На кнопке должен появиться текст 'Нажми меня!'.
14
# Когда пользователь нажимает кнопку,
15
# должен быть исполнен метод do_something.
self.my_button
tkinter.Button(self.main_window,
16
17
tехt='Нажми меня!',
command=self.do
something)
18
19
20
# Создать кнопку 'Выйти'. При нажатии этой кнопки вызывается
21
# метод destroy корневого элемента интерфейса (переменная
# main_window ссылается на корневой элемент, поэтому функцией
22
23
# обратного вызова является self.main_window.destroy.)
24
self.quit_button
tkinter.Button(self.main_window,
25
tехt='Выйти',
26
command=self.main_window.destroy)
27
28
29
# Упаковать элементы интерфейса Button.
30
self.my_button.pack()
31
self.quit_button.pack()
32
33
# Войти в главный цикл tkinter.
34
tkinter.mainloop()
35
36
# Метод do something является функцией обратного
37
# вызова для элемента интерфейса Button.
38
39
def do_something(self):
40
# Показать информационное диалоговое окно.
41
tkinter.messagebox.showinfo('Peaкция',
42
'Благодарю, что нажали кнопку. ')
43
44 # Создать экземпляр класса MyGUI.
45 my_gui = MyGUI ()

о
Н

х

111 меня!

Выйти

РИС.

13.12.

Информационное диалоговое окно, выводимое на экран программой

13.8

633

Глава 13.Программирование графического пользовательского интерфейса

634

Инструкция

в строках

24-26

создает кнопку

Выйти.

Обратите

внимание,

что

метод

self. main_ window. destroy () используется в качестве функции обратного вызова. Когда
пользователь нажимает кнопку, вызывается этот метод, и программа завершает работу.

~

олу ение входных данных

13.6
~

омощи элемента интерфейса

n

Entry

КЛЮЧЕВЫЕ ПОЛОЖЕНИЯ

L

Элемент интерфейса Entry -

это прямоугольная область, в которую пользователь может

вводить входные данные. Для извлечения данных, введенных в элемент интерфейса

Entry,

используется его метод

Элемент интерфейса Entry -

get ().

это прямоугольная область, в которую пользователь может

вводить текст. Его используют для сбора входных данных в программе с

GUI.

Как правило,

программа будет иметь в окне один или несколько элементов Entry вместе с кнопкой, кото­
рую пользователь нажимает для передачи данных, введенных в элементе

Entry. Функция

обратного вызова кнопки получает данные из элемента Entry окна и обрабатывает их.

Для извлечения данных, введенных пользователем в элемент интерфейса Entry, применяется
его метод get () . Метод возвращает строковое значение, поэтому такое значение необходимо
привести к надлежащему типу данных, если, к примеру, элемент интерфейса Entry исполь­
зуется для ввода чисел.

Для того чтобы продемонстрировать его работу, мы рассмотрим программу, которая пре­

доставляет возможность пользователю вводить в элемент интерфейса Entry расстояние
в километрах и затем нажимать кнопку, чтобы увидеть это расстояние, преобразованное
в мили. Вот формула преобразования километров в мили:
мили = километры х

На рис.

13.13

0.6214.

представлено окно, которое эта программа выводит на экран. Для того чтобы

расположить элементы интерфейса в позициях, показанных на рисунке, мы разместим их

в двух рамках (рис.

Выводящий подсказку элемент Label и элемент Entry будут рас­

13.14).

положены в верхней рамке top _ frame, и их методы pack () будут вызываться с аргументом

side=' left'. В результате этого они появятся в рамке горизонтально. Кнопка Преобразо­
bottom_ frame, и их методы
pack () будут тоже вызываться с аргументом side=' left'.
вать и кнопка Выйти будут расположены в нижней рамке

о

t lc

В11едите расстояние в к~tлометрах:
Преобра3овать

РИС.

13.13.

Окно программы

В программе

kilo_converter

Ьottom_frame

РИС.

13.14.

Окно, сформированное рамками

приведен соответствующий код, а на рис.

когда пользователь вводит в элемент интерфейса
образовать.

х

top_frame

1

Выйти

13.9

о

х

Frame

13.15 показано, что происходит,
Entry число 1ООО и нажимает кнопку Пре­

Глава 13. Программирование графического пользовательского интерфейса

0

(:;'\ Пользователь вводит в элемент Entry

\..J число 1ООО и нажимает кнопку

В результате выводится это
информационное диалоговое окно

Преобразовать
о
В11~ите рассrоян 1е

11 кило

1етра

Х

Ре3уль а

1

l

ПреобраJ01111n. вы11т1, j



1000.0

1

о ·~трое' 81183МКТНО 621 . IИ/IЯ 1
о

РИС.

13.15.

Информационное диалоговое окно

Программа

1 #
2 #
3 #

13.9

(kilo_converter.py)

Эта программа конвертирует расстояния в километрах
в мили.

Полученньп1 результат выводится

в информационном диало г о вом окне .

4

5 irnport tkinter
6 irnport tkinter.rnessagebox
7

8 class KiloConverterGUI:
init (self) :
de f
9
10
Создать

главное окно.

11

#

12

self.rnain window

tkinter.Tk()

13

14
15
16

#

Создать две рамки,

чтобы сгруппиро вать

элементы интерфейса.

self.top_frarne = tkinter.Frarne( s elf . rnain_window)
self.bottorn frarne = tkinter.Frarne(self .rnain_window)

17
Создать элементы интерфейса для верхней рамки.

18

#

19
20

self.prornpt_ label = tkinter . Label(self.top_frarne,

21

s elf . kilo_entry

tехt='Введите

22

расстояние

в

километрах:')

tkinter.Ent ry(self.top_frarne,
width=lO)

23

24
25

26

# Упаковать элементы верхней рамки.
self.prornpt_ label.pack(side='left')
self.kilo_entry.pac k(side='left ')

27
Со здать

Button для нижней рамки.
tkinter.Button(self.bottorn_frarne,

элеме нты ин терфейса

28

#

29

self.calc button

30

tехt='Преобразовать',

31

c ornrnand=self. convert)

635

636

Глава 13. Программирование графического пользовательского интерфейса

self .quit_button

32
33

34
35
36
37

tkinter.Button(self.bottom_frame,
text=' Выйти',
command=self.main_window.destroy)

# Упаковать кнопки.
self.calc_button.pack(side='left')
self.quit_button.pack(side='left')

38

# Упаковать рамки.
self.top_frame.pack()
self.bottom_frame.pack()

39

40
41
42
43
44
45
46
47

# Войти в главный цикл tkinter.
tkinter.mainloop()
#

Метод

#для

convert

кнопки

является функцией обратного вызова

'Преобразовать'.

48

49
50
51
52
53
54
55
56
57
58

def convert(self):
# Получить значение, введенное пользователем
# в элемент интерфейса kilo_entry.
kilo = float(self.kilo_entry.get())
# Конвертировать километры
miles = kilo * 0.6214
#

Показать

результаты в

в мили.

информационном диалоговом окне.

tkinter.messagebox.showinfo('Peзyльтaты',

str(kilo) +
60
' километров эквивалентно ' +
61
str (miles) + ' милям.')
62
63 # Создать экземпляр класса KiloConverterGUI.
64 kilo conv = KiloConverterGUI()

59

Метод

convert (), показанный в строках 49-60, является функцией обратного вызова кнопки
52 вызывает метод get () элемента kilo_ entry, чтобы

Преобразовать. Инструкция в строке

извлечь данные, которые были введены в этот элемент интерфейса. Полученное значение
приводится к вещественному типу
ние в строке

менной

55

float

и затем присваивается переменной

kilo.

Вычисле­

выполняет преобразование, и полученный результат присваивается пере­

miles. Затем инструкция в строках 58-61 выводит информационное диалоговое окно

с сообщением, которое показывает преобразованное значение.

Глава 13. Программирование графического пользовательского интерфейса

637

~

енение элементов

13.7

Label

в качестве полей вывода

111111111(__ КЛЮЧЕВЫЕ ПОЛОЖЕНИЯ
Когда объект

StringVar связан с элементом интерфейса Label, элемент интерфейса Label
StringVar.

выводит на экран любые данные, которые хранятся в объекте

Ранее вы видели применение информационного диалогового окна для отображения выход­
ных данных. Если вы не хотите показывать отдельное диалоговое окно для выходных

данных своей программы, то для динамического отображения выходных данных имеется
возможность использовать элемент интерфейса
случае в главном окне просто создаются пустые

Label в главном окне программы. В этом
элементы Label и затем пишется программ­

ный код, который при нажатии кнопки выводит в этих элементах требуемые данные.
Модуль

tkinter предоставляет класс StringVar, который может использоваться вместе
интерфейса Label для вывода данных. Сначала нужно создать объект
StringVar. Затем создать элемент интерфейса Label и связать его с объектом StringVar.
С этого момента любое значение, которое потом сохраняется в объекте StringVar, будет
автоматически выводиться на экран в элемент Label.
с

элементом

Программа

13.10

демонстрирует, как это сделается. Она представляет собой видоизменен­

ную версию программы

kilo_converter,

которую вы видели в программе

13.9.

Вместо

вывода информационного диалогового окна данная версия программы выводит количество
миль в элемент

r Программа 1з.1:о::J

Label

в главном окне.

(kilo_converter2.py)

! 1 # Эта программа конвертирует расстояния в километрах
1

!

1

2 #
3 #

в мили.

Полученный результат выводится

в элемент

Label

в главном окне.

1

1

.

1

1

1

:

import tkinter

6

7 class KiloConverterGUI:
8
def
init (self) :
9
10
# Создать главное окно.
self.main_window
= tkinter.Tk()
11
12

13
14
15
16

# Создать три рамки, чтобы сгруппировать
self.top_frame = tkinter.Frame()
self.mid_frame = tkinter.Frame()
self.bottom_frame = tkinter.Frame()

элементы интерфейса.

17

18
19
20
21

22
23

#

Создать

элементы интерфейса для верхней рамки.

self.prompt_laЬel

= tkinter.Label(self.top_frame,

tехt='Введите расстояние в километрах:')

self.kilo_entry

tkinter.Entry(self.top_frame,
width=lO)

638

Глава 13. Программирование графического пользовательского интерфейса

# Упаковать элементы верхней рамки.
self.prompt_label.pack(side='left')
self.kilo_entry.pack(side='left')

24
25
26
27
28
29
30
31
32
33
34

# Создать элементы интерфейса для средней рамки.
self.descr_label = tkinter.Label(self.mid_frame,
tехt='Преобразовано

в мили:')

# Объект StringVar нужен для того, чтобы его связать
# с выходной надписью. Дпя сохранения последовательности
# пробелов используется метод set данного объекта.
self.value = tkinter.StringVar()

35

36
37

# Создать надпись Label и связать ее с объектом
# StringVar. Любые значения, хранящиеся
# в объекте StringVar, будут автоматически
# выводиться в надписи Label.
self.miles_label = tkinter.Label(self.mid_frame,

38

39
40

41
42
43
44
45
46
47

textvariaЬle=self.value)

# Создать элементы интерфейса для средней
self.descr_label.pack(side='left')
self.miles_label.pack(side='left')

рамки.

# Создать элементы интерфейса Button для нижней рамки.
self.calc button
tkinter.Button(self .bottom_frame,

48

49

tехt='Преобразовать',

50

51

52

self.quit_button

53

54
55
56
57

command=self.convert)
tkinter.Button(self.bottom_frame,
text=' Выйти' ,
command=self.main_window.destroy)

# Упаковать кнопки.
self.calc_button.pack(side='left')
self.quit_button.pack(side='left')

58

59
60
61
62
63
64
65
66

# Упаковать рамки.
self.top_frame.pack()
self.mid_frame.pack()
self.bottom_frame.pack()
# Войти в главный цикл tkinter.
tkinter.mainloop()

67

68
69
70

#

Метод

#для

convert

кнопки

является функцией обратного вызова

'Преобразовать'.

Глава 13. Программирование графического пользовательского интерфейса

71

639

def convert(self):

72

73
74

#
#

Получить

#

Конвертировать

значение,

введенное пользователем

kilo_entry.
kilo = float(self.kilo_entry.get())
в элемент интерфейса

75

76
77

miles = kilo * 0.6214

78
79
80

#

Конвертировать мили в

#

и сохранить

81

километры в мили.

строковое значение

ее в объекте

miles_label
self.value.set(miles)
интерфейса

#

82
83

StringVar.

В результате элемент

будет автоматически обновлен.

84 # Создать экземпляр класса KiloConverterGUI.
85 kilo conv = KiloConverterGUI()

Во время запуска эта программа выводит окно, как на рис.
происходит, когда пользователь вводит

1000

13 .16.

На рис.

13 .17

чество миль выводится в главном окне в надписи

Label.
о

tk
Введите расстоян~1е в километрах:

Введите расстоян11е

Преобра3ое.ано в м~1Ли :
Преобра3овать

РИС.

11

километрах:

Преобра3011ано в мил~1 :

Выйти

Преобразовать

13.16. Окно, выводимое на экран

РИС.

13.17.

х

1

621.4

Выйт~1

Окно, показывающее результат

преобразования

при запуске программы

показано, что

км и нажимает кнопку Преобразовать. Коли­

1ООО км в мили

Давайте разберем этот программный код. Строки

13-16 создают три рамки: top_frame,
mid frame и bottom frame. Строки 19-26 создают элементы интерфейса для верхней рамки
и вызывают их метод pack () .

Строки

29-30

создают элемент интерфейса

присваивает его переменной

miles _ label,
в строке

42

13.16.
value. Строка 41

с текстом 'Преобразовано в мили:

', кото­
StringVar и
создает элемент интерфейса Label с именем

Label

рый вы видите в главном окне на рис.

Затем строка

35

создает объект

который мы будем использовать для вывода количества миль. Отметим, что

указан аргумент textvariaЫe=self. value. Он создает связь между элементом

интерфейса LaЬel и объектом
значение, которое хранится в

StringVar, на который ссылается переменная value. Любое
объекте StringVar, будет выведено на экран в этом элементе

LaЬel.

Строки

45

mid_frame.
ки

61-63

и

46

упаковывают два элемента интерфейса

Строки

49-58

создают элементы

упаковывают объекты

Frame.

Label, которые находятся в рамке
интерфейса Button и их упаковывают. Стро­

На рис.

13.18

показано, каким образом размещаются

различные элементы интерфейса в трех рамках этого окна.
Метод

convert () в строках 71-82 представляет собой функцию обратного вызова кнопки
74 вызывает метод get () элемента интерфейса

Преобразовать. Инструкция в строке

Глава 13. Программирование графического пользовательского интерфейса

640

kilo _ entry, чтобы извлечь значение, которое было введено в этот элемент интерфейса. Это
значение приводится к вещественному типу float и затем присваивается переменной kilo.

Выражение в строке

77

выполняет преобразование и присваивает полученный результат пе­

ременной miles. Затем инструкция в строке

82

вызывает метод set () объекта Str iпgVar,

передавая miles в качестве аргумента. В результате значение, на которое ссылается пере­
менная miles, сохраняется в объекте StringVar и одновременно выводится в элемент интер­

фейса miles _ label.

о
1 Введ

1
пе расстояние в
110 етрах: 1
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

top_frame
mid_frame

L _____ !]е:_о_б_р~о_в~!!~ ~ __ ~: :._ ~1..:.

______ ,

[~~~~~~-пр;об;~о~~;,,тв-~i~,I~~~~~]

Ьottom_frame

РИС.

х

r-------------------------------~

miles_laЬel
(невидима)

13.18. Макет главного окна программы kilo_converteг2

ЦЕ

ТРЕ ВНИМАНИЯ

Создание программы с
Кэтрин

GUI

преподаватель. В главе

-

3

мы подробно изучили разработку программы, которую

ее студенты могут применять для вычисления среднего балла из трех оценок за контрольные

работы. Программа предлагает студенту ввести все оценки и затем показывает средний балл.
Она попросила вас разработать программу с

GUI,

которая выполняет аналогичную работу.

Она хотела бы, чтобы программа имела три элемента интерфейса Entry, в которые могут
вводиться оценки, и кнопку, которая при ее нажатии выводит на экран средний балл.
Прежде чем начать писать программный код, будет полезно нарисовать эскиз окна програм­
мы (рис.

13.19).

Эскиз также показывает тип каждого элемента интерфейса. (Изображенные

на эскизе числа помогут при составлении списка всех элементов интерфейса.)

(:) Lаье1

Ввести экзаменационную оценку

1:

Enlгy

Q)Label

Ввести экзаменационную оценку

2:

Enlry

G) Label

Ввести э~gаменационную оценку

3:

Enlry

®
®
0

СреАНИЙ бann г······· · ··:

LaЬel

®

Q) Label

РИС.

13.19. Эскиз окна

·------·· ...

--.)

Button

Bullon

®

®

Глава 13. Программирование графического пользовательского интерфейса

641

Изучив этот эскиз, мы можем составить список элементов интерфейса, в которых нуждаемся
(табл.

При составлении списка мы включим краткое описание каждого элемента

13.2).

интерфейса и имя, которое мы присвоим каждому элементу при его создании.

Таблица

13.2.

Элементы интерфейса к задаче о среднем балле

№ элемента

Тип

на рис.

элемента

13.19

Описание

Имя

1

Label

Предлагает пользователю ввести оценку

1

testl - label

2

Label

Предлагает пользователю ввести оценку

2

test2 - label

3

Label

Предлагает пользователю ввести оценку

3

testЗ

4

Label

Идентифицирует средний балл, который впоследствии

·-

label

result- label

будет выведен к этой надписи

5

Eпtry

Место, где пользователь вводит оценку

1

testl_entry

6

Entry

Место, где пользователь вводит оценку

2

test2_entry

7

Entry

Место, где пользователь вводит оценку

3

testЗ_entry

8

Label

Программа покажет средний балл в этой надписи

avg_label

9

Button

При нажатии этой кнопки программа вычислит средний

calc- button

балл и покажет его в компоненте

Button

10

averageLabel

При нажатии этой кнопки программа завершит работу

quit_button

Из эскиза видно, что в окне имеется пять строк элементов интерфейса. Для их размещения
мы также создадим пять объектов

Frame. На рис. 13.20 представлено расположение элемен­
тов интерфейса в пяти объектах Frame.
Программа

13.11

содержит соответствующий код, а на рис.

13.21

показано окно с введенны­

ми пользователем данными.

.·!--.

i- ·~~~~~~-~~-~~~-~~-~~~~~~~-~-~~-~~~-~;-г4·
test1 Jrame
-- -- -- -- ------- -- -- ------- -- ---------- --- ----------- ----- ---- --.:
·----------------------------------------------------------------;
: Ввести экзаменационную оценку 2: 1
\...,j---test2_frame
\.

-.,..,..r_.rv_"V'.r.-.r.-.r.-.v.rJV,,,._-.r.-J

r.-.r.-.1".t'.t'.t"J'""-".l'V'.r.-.r.·.l'-"-"-".r-.r.r.r.-.r.-.---.r--.-.r.r.....- ....

:

Ввести экзаменационную оценку З:

1

D

•--testЗ_frame

\-;.:

c: : : ·: : : : : : : : : ~=: :~:~ ~ I:~: :~:~: : ~: ;: : : : : : : : : : : : : .:---.
avg_frarпe
Jj
._ __

§~

1

ВыйтиJ

РИС.

13.20.

Применение рамок

Frame для

2: 90

Средн11й балл : 95.О

....;e---button_fran1e

упорядочения

1: 100

Ваедите оцен ку

Введите оцен ку 3: 9~

-- ------------- --------· -- ---------------------- ·--- ----~---- _:

элементов интерфейса

Ваедите оцен ку

Х

Ус реднюь

РИС.

13.21.

Выйти

Окно программы

test_averages

642

Глава 13. Программирование графического пользовательского интерфейса

Программа

1 #
2 #

13.11

(test_averages.py)

Эта программа применяет
оценок и вывода

GUI

для получения трех

среднего балла.

3

4 irnport tkinter
5
6 class TestAvg:
7

8
9

def

init (self):
# Создать главное окно.
self.rnain window = tkinter.Tk()

10
11

12
13
14
15
16
17
18
19
20

21
22
23
24
25
26
27

28
29
30
31
32
33
34
35
36

37
38
39

40
41
42
43
44
45

# Создать пять рамок.
self.testl frarne
tkinter.Frarne(self.rnain_window)
self.test2 frarne = tkinter.Frarne(self.rnain_window)
self.test3 frarne = tkinter.Frarne(self.rnain_window)
self.avg_frarne = tkinter.Frarne(self.rnain window)
self.button frarne
tkinter.Frarne(self.rnain_window)
# Создать и упаковать элементы интерфейса для оценки 1.
self.testl label = tkinter.Label(self.testl frarne,
tехt='Введите

оценку

1: ')

self.testl_entry = tkinter.Entry(self.testl frarne,
width=lO)
self.testl label.pack(side='left')
self.testl_entry.pack(side='left')
# Создать и упаковать элементы интерфейса для оценки 2.
self.test2 label = tkinter.Label(self.test2 frarne,
tехt='Введите оценку 2: ')
self.test2_entry = tkinter.Entry(self .test2 frarne,
width=lO)
self.test2 label.pack(side='left')
self.test2_entry.pack(side='left')

# Создать и упаковать элементы интерфейса для оценки 3.
self.test3_label = tkinter.Label(self.test3 frarne,
tехt='Введите оценку 3:')
self.test3_entry = tkinter.Entry(self.test3 frarne,
width=lO)
self.test3 label.pack(side='left')
self.test3_entry.pack(side='left')
# Создать и упаковать элементы интерфейса для среднего
self.result_label = tkinter.Label(self.avg_frarne,

балла.

tехt='Средний балл:')

self.avg = tkinter.StringVar() #

Дпя

обновления

avg_label

Глава 13. Программирование графического пользовательского интерфейса

46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78

self.avg_label = tkinter.Label(self.avg_frame,
textvariaЫe=self.avg)

self.result label.pack(side='left')
self.avg_label.pack(side='left')
#

Создать

элементы интерфейса Button.
tkinter.Button(self.button_frame,

и упаковать

self.calc button

tехt='Усреднить',

command=self.calc_avg)
tkinter.Button(self.button_frame,
text=' Выйти' ,
command=self.main_window.destroy)
self.calc_button.pack(side='left')
self.quit_button.pack(side='left')
self.quit_button

# Упаковать рамки.
self.testl frame.pack()
self.test2_frame.pack()
self.test3_frame.pack()
self.avg_frame.pack()
self.button_frame.pack()
# Запустить главный
tkinter.mainloop()
#
#

Метод

calc_avg

цикл.

является функцией обратного вызова

для элемента интерфейса

calc button.

def calc_avg(self):
#
#

Получить

три оценки

и сохранить их в переменных.

self.testl
self.test2
self.test3

float(self.testl_entry.get())
float(self.test2_entry.get())
float(self.test3_entry.get())

79
80
# Вычислить средний балл.
81
self.average = (self.testl + self.test2 +
82
83
self.testЗ) / 3.0
84
85
# Обновить элемент интерфейса avg_label,
86
# сохранив значение self.average в объекте
87
# StringVar, на который ссылается avg.
self.avg.set(self.average)
88
89
90 # Создать экземпляр класса TestAvg.
91 test_avg = TestAvg()

643

Глава 13. Программирование графического пользовательского интерфейса

644
~

Контрольная точка
13.11.

Как извлечь данные из элемента интерфейса Entry?

13.12.

Какой тип данных имеет значение, извлекаемое из элемента интерфейса Entry?

13.13.

В каком модуле находится класс StringVar?

13.14.

Что позволяет достичь установление связи объекта StringVar с элементом интерфей­
са Label?

~

13.8

окнопки и

лаговые кнопки

~ КЛЮЧЕВЫЕ ПОЛОЖЕНИЯ
Радиокнопки обычно появляются в группах из двух или нескольких кнопок и позволяют

пользователю выбирать один из нескольких возможных вариантов. Флаговые кнопки,
которые могут появляться самостоятельно или в группах, обеспечивают выбор в формате
да/нет или включено/выключено.

Радио кнопки
Радиокнопки, или просто переключатели, полезны, когда нужно, чтобы пользователь выбрал
один из нескольких возможных вариантов. На рис.

13.22

показано окно, содержащее группу

радиокнопок. Каждая радиокнопка имеет кружок и может иметь два состояния: быть вы­

бранной или невыбранной. Когда радиокнопка выбрана, кружок заполнен, а когда радио­
кнопка не выбрана, он пустой.

13.22.

х

r.
r

Вар11ант

1

Вар11ант

2

r

Вар11ант

3

О

РИС.

о

Выйти

Группа радиокнопок

Для того чтобы создать элементы интерфейса Radiobutton, используется класс Radiobutton

модуля

tkinter.

Одновременно

можно

выбрать

только

один

элемент

интерфейса

Radiobutton в контейнере, в частности в рамке Frame. Нажатие на Radiobutton его выбирает
и автоматически снимает выбор любого другого элемента Radiobutton в том же контейнере.
Поскольку в контейнере одновременно можно выбрать только один элемент Radiobutton,
нередко их называют взаимоисключающими.

()

ПРИМЕЧАНИЕ
Название "радиокнопка" имеет отношение к старым автомобильным радиоприемникам, в которых
имелись кнопки для выбора станций. В таких радиоприемниках за один раз можно было нажать
всего одну кнопку. При нажатии на кнопку он автоматически выталкивал любую другую нажатую
кнопку.

Глава 13. Программирование графического пользовательского интерфейса

645

tkinter предоставляет класс IntVar, который используется вместе с элементами
Radiobutton. При создании группы элементов Radiobutton все они связываются
с одним и тем же объектом IntVar. Помимо этого, каждому элементу интерфейса
Radiobutton необходимо присвоить уникальное целочисленное значение. Когда выбирается
один из элементов Radiobutton, он сохраняет свое уникальное целочисленное значение
в объекте IntVar.
Модуль

интерфейса

13.12 демонстрирует способ создания и применения элементов Radiobutton.
13.23, а представлено окно, которое эта программа выводит на экран. Когда пользо­

Программа
На рис.

ватель нажимает кнопку ОК, появляется информационное диалоговое окно с пояснением,
какой элемент

Radiobutton был выбран.

х

Выбор

х

о

r.

r
r

Вариант

1

Вар~1ант

2

Вариант

3

8

Выбран вариант

о

Вы>~ти

ок

б

а

РИС .

13.23. Окно,

1

выводимое на экран программой

13.12 (а),

и информационное диалоговое окно,

выводимое на экран при нажатии кнопки ОК (б)

Программа

13.12

(radiobutton_demo.py)

1 # Эта программа демонстрируе т
2 import tkinter
3 import tkinter.messagebox

группу элементов

Radiobutton.

4

5 class MyGUI:
init
def
6

(self) :

Создать

главное окно.

7

#

8
9

self.main window

10

11
12
13

=

tkinter.Tk()

Radiobutton
Button.
и еще одну для обычных элементов
self .top_ frame = t kinter.Frame(self .main_window)
self.bottom_frame = tkinter.Frame(self.main_window)
#
#

Создать две рамки:

одну для элементов

14
15

16
17
18
19
20

21

IntVar для использования
Radiobutton.
self .radio_var = t kinter.IntVar()
#
#

Создать

объект

с элементами

# Назначить объекту IntVar
self.radio_var.set(l)

значение

1.

646
22
23
24
25
26
27
28

Глава 13. Программирование графического пользовательского интерфейса

#

Создать

self.rЫ

элементы Radiobutton в рамке top_frarne.
= tkinter.Radiobutton(self.top_frarne,
tехt='Вариант 1',
variaЬle=self.radio_var,

self.rb2

value=l)
tkinter.Radiobutton(self .top_frarne,
tехt='Вариант 2',
variaЬle=self.radio_var,

29

30
31
32
33
34
35
36
37
38
39

40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58

self.rb3

value=2)
tkinter.Radiobutton(self .top_frame,
tехt='Вариант 3',
variaЬle=self.radio_var,

value=3)
# Упаковать элементы Radiobutton.
self. rЫ .pack ()
self. rb2. pack ()
self. rb3. pack ()
#Создать

кнопку

'ОК'

и кнопку

'Выйти'.

self.ok button

tkinter.Button(self.bottom_frame,
text='OK',
command=self.show_choice)
tkinter.Button(self .bottom_frarne,
self.quit_button
text= 'Выйти' ,
command=self.main_window.destroy)
# Упаковать элементы Button.
self.ok_button.pack(side='left')
self.quit_button.pack(side='left')
# Упаковать рамки.
self.top_frarne.pack()
self.bottom_frarne.pack()
# Запустить главный
tkinter.mainloop()

цикл.

59

60
# Метод show choice является функцией обратного вызова
61
# для кнопки ок.
62
def show_choice(self):
63
tkinter.messagebox.showinfo('Bыбop',
'Выбран вариант ' +
64
str(self.radio_var.get()))
65
66 # Создать экземпляр класса MyGUI.
67 my_gui = MyGUI ()

Глава 13. Программирование графического пользовательского интерфейса
Строка

17

создает объект IntVar с именем radio _ var. Строка

20

647

вызывает метод set ()

объекта radio _ var, чтобы в этом объекте сохранить целочисленное значение

1.

(Вы вскоре

увидите, зачем это нужно.)
Строки

23-26 создают первый элемент Radiobutton. Аргумент variaЫe=self. radio_ var
25) связывает элемент Radiobutton с объектом radio_var. Аргумент value=l
строке 26) присваивает этому элементу Radiobutton целое число 1. В результате всегда,

(в строке


когда этот элемент Radiobutton будет выбран, в объекте radio_var будет сохранено значе­
ние

1.

Строки 27-30 создают второй элемент Radiobutton. Обратите внимание, что этот элемент
Radiobutton тоже связан с объектом radio _ var. Аргумент value=2 (в строке 30) присваивает
этому элементу Radiobutton целое число 2. В результате всегда, когда этот элемент
Radiobut ton будет выбран, в объекте radio_ var будет сохранено значение 2.
Строки

31-34

создают третий элемент Radiobutton. Этот элемент Radiobutton тоже связан

с объектом radio_var. Аргумент value=З (в строке 34) присваивает этому элементу
Radiobutton целое число 3. В результате всегда, когда этот элемент Radiobutton будет вы­
бран, в объекте radio_ var будет сохранено значение 3.
Метод show_ choice () в строках

62-64

является функцией обратного вызова для кнопки ОК.

При выполнении этого метода он вызывает метод get () объекта radio _ var, чтобы извлечь
хранящееся в объекте значение. Это значение выводится на экран в информационном диало­
говом окне (рис.
Вы

заметили,

13.23,
что

б).

при

запуске

программы

первоначально

выбран

первый

элемент

Radiobutton? Это вызвано тем, что в строке 20 мы назначили объекту radio_var значение 1.
Объект radio _ var используется не только для определения, какой был выбран элемент
Radiobutton. Он также нужен для предварительного выбора определенного элемента
Radiobutton. Когда мы сохраняем значение определенного элемента Radiobutton в объекте
radio_var, этот элемент Radiobutton становится выбранным.

Использование функций обратного вызова
с радиокнопками
Прежде чем программа

13.12

определит, какой элемент Radiobutton бьm выбран, она ждет,

когда пользователь нажмет кнопку ОК. По своему усмотрению с элементами интерфейса

Radiobutton также можно определять функцию обратного вызова. Вот пример:
self.rЫ

= tkinter.Radiobutton(self.top_frame,
tехt='Вариант

1',

variaЬle=self.radio_var,

value=l,
command=self.my_method)
В этом фрагменте кода применен аргумент command=self .my_method, который сообщает, что
метод my_ method () является функцией обратного вызова. Метод my_ method () будет выпол­
нен сразу после того, как элемент Radiobutton будет выбран.

648

Глава 13. Программирование графического пользовательского интерфейса

Флаговые кнопки
Флаговая кнопка, или флажок, представляет из себя небольшое поле с надписью напротив
него. Окно, показанное на рис.

13.24,

имеет три флаговые кнопки.
о

х

Вар11ант

1

Г Вар11ант 2.
Г Вариант

011.
РИС.

13.24.

3

Выйr11

Группа флаговых кнопок

Подобно радиокнопкам, флаговые кнопки могут иметь два состояния: быть выбранными
либо невыбранными. При нажатии флаговой кнопки в соответствующем поле появляется
маленькая галочка. Несмотря на то, что флаговые кнопки нередко выводятся в группах, они
не используются для создания взаимоисключающих вариантов выбора. Вместо этого поль­

зователю разрешается выбрать любые флаговые кнопки, которые показаны в группе.
Для создания элементов интерфейса CheckЬutton нужен класс CheckЬutton модуля tkinter.
Как и с элементами Radiobutton, вместе с элементом интерфейса CheckЬutton используется
объект IntVar. Но в отличие от элемента Radiobutton, с каждым элементом CheckЬutton

связывается отдельный объект IntVar. При выборе элемента CheckЬutton связанный с ним
объект IntVar будет содержать значение

l.

При снятии галочки в поле элемента CheckЬutton

связанный с ним объект IntVar будет содержать значение О.
Программа
рис.

13.13 демонстрирует способ создания и применения элементов CheckЬutton. На
13.25, а показано окно, которое программа выводит на экран. Когда пользователь

нажимает кнопку ОК, появляется информационное диалоговое окно, сообщающее, какой из
элементов CheckЬutton был выбран.

1
о

х

"'

Вар11анr

(;;

Вариант 2

У Вар11ент
О

13.25.

Окно, выводимое программой

8

Х

Bi;

еыбрал11 .

1

2

3
о

Выйт11
а

РИС.

1

Выбор ,

13.13

б
(а), и информационное диалоговое окно, появляющееся на экране

при нажатии кнопки ОК (б)

Проrрамма

13.13

(checkbutton_demo.py)

1 # Эта программа демонстрирует
2 import tkinter
3 import tkinter.messagebox
4

группу элементов CheckЬutton.

Глава 13. Программирование графического пользовательского интерфейса

5 class MyGUI:
6
def
init (self):
7
# Создать главное окно.
self.rnain window = tkinter.Tk()
8
9

10

#

11

Button.
self.top_frarne = tkinter.Frarne(self.rnain_window)
self.bottorn frarne
tkinter.Frarne(self.rnain_window)

12
13
14
15
16
17
18
19
20
21
22
23
24
25

Создать

две рамки.

и еще

#

Создать

#

с элементами CheckЬutton.

одну для обычных элементов

три объекта

self.cb varl
self.cb var2
self.cb var3
#

Назначить

#

27
28

self.cЫ

объектам

Создать

39

40

41
42
43
44
45
46

47
48
49

IntVar

значения

элементы CheckЬutton

=

О.

в рамке

top_frarne.

tkinter.CheckЬutton(self.top_frarne,
tехt='Вариант

1',

variaЫe=self.cb_varl)

self.cb2

tkinter.CheckЬutton(self

.top_frarne,
2',

tехt='Вариант

variaЫe=self.cb_var2)

self.cЬЗ

.top_frarne,
tехt='Вариант 3',

tkinter.CheckЬutton(self

variaЫe=self.cb_var3)

35

38

для использования

tkinter.IntVar()
tkinter.IntVar()
tkinter. IntVar ()

29

36
37

IntVar

self.cb_varl.set(O)
self.cb_var2.set(0)
self.cb_var3.set(0)

26

30
31
32
33
34

Одну для элементов CheckЬutton

#

# Упаковать элементы
self. сЫ .pack ()
self. сЬ2 . pack ()
self. сЬ3. pack ()

CheckЬutton.

# Создать кнопку 'ОК' и кнопку 'Выйти'.
self.ok button
tkinter.Button(self .bottorn_frarne,
text='OK',
cornrnand=self.show_choice)
self.quit_button
tkinter.Button(self .bottorn_frarne,
tехt='Выйти',

cornrnand=self.rnain_window.destroy)

649

650

Глава 13. Программирование графического пользовательского интерфейса

50
# Упаковать элементы Button.
51
self.ok_button.pack(side='left')
52
self.quit_button.pack(side='left')
53
54
# Упаковать рамки.
55
self.top_frame.pack()
56
self.bottom_frame.pack()
57
58
# Запустить главный цикл.
59
tkinter.mainloop()
60
61
# Метод show choice является функцией обратного вызова
62
#для кнопки 'ОК'.
63
def show_choice(self):
64
65
# Создать строковое значение с сообщением.
66
self.message = 'Вы выбрали:\n'
67
68
# Определить, какие элементы CheckЬuttons бьmи выбраны,
69
# и составить соответствующее сообщение.
70
if self.cb_varl.get() == 1:
71
self.message = self.message + 'l\n'
72
if self.cb_var2.get() == 1:
73
self.message = self.message + '2\n'
74
if self.cb_var3.get() == 1:
75
self.message = self.message + '3\n'
76
# Вывести сообщение в информационном диалоговом окне.
77
78
tkinter.messagebox.showinfo('Bыбop', self.message)
79
80 # Создать экземпляр класса MyGUI.
81 my_gui = MyGUI()

Контрольная точка

13.15.

Вы хотите, чтобы пользователь мог выбирать только одно значение из группы значе­
ний. Какой тип компонента вы будете использовать для этих значений, радиокнопки

либо флаговые кнопки?

13.16.

Вы хотите, чтобы пользователь мог выбирать любое число значений из группы значе­
ний. Какой тип компонента вы будете использовать для этих значений, радиокнопки

либо флаговые кнопки?

13.17.

Каким образом используется объект IntVar для определения,
Radiobutton был выбран в группе элементов Radiobutton?

13.18.

Каким образом используется объект
CheckЬutton?

какой

элемент

IntVar для определения, был ли выбран элемент

Глава 13. Программирование графического пользовательского интерфейса

651

11111111111

13.9
~

Рисование ф

п

гур

омоши элемента интерфейса

Canvas

КЛЮЧЕВЫЕ ПОЛОЖЕНИЯ

L

Элемент интерфейса canvas предоставляет методы для рисования простых фигур, таких
как линии, прямоугольники, овалы, многоугольники и т. д.

Элемент интерфейса Canvas (Холст)- это незаполненная прямоугольная область, которая
позволяет рисовать на своей поверхности простые двумерные фигуры. В этом разделе мы
рассмотрим методы canvas для рисования отрезков прямой, прямоугольников, овалов, дуг,
многоугольников и текста. Однако прежде чем заняться изучением методов рисования этих

фигур, мы должны рассмотреть экранную систему координат. Экранная система координат
элемента интерфейса canvas используется для указания позиции графических объектов.

Экранная система координат элемента интерфейса

Canvas

Изображения, выводимые на компьютерный экран, состоят из крошечных точек, которые

называются

пикселами.

Экранная система координат используется для

идентификации

позиции каждого пиксела в окне приложения. Каждый пиксел имеет координаты Х и У.
Координата Х идентифицирует горизонтальную позицию пиксела, координата У -

ее верти­

кальную позицию. Координаты обычно пишутся в форме (Х, У).
В экранной системе координат элемента интерфейса canvas координаты пиксела в левом
верхнем углу экрана равняются (О, О). Это означает, что обе его координаты Х и У равняют­
ся О. Координата Х увеличивается слева направо, а координата У

- сверху вниз. В окне
640 и высотой 480 пикселов координаты пиксела в правом нижнем углу окна рав­
(639, 479). В том же окне координаты пиксела в центре окна равняются (319, 239).
13.26 показаны координаты разных пикселов в окне.

шириной
няются
На рис.

ПРИМЕЧАНИЕ
Экранная система координат элемента Canvas отличается от декартовой системы координат,
которая используется в библиотеке черепашьей графики. Вот эти отличия:



в элементе canvas точка (О, О) находится в левом верхнем углу окна, в черепашьей графике
точка (О, О) находится в центре окна;
в элементе canvas координаты У увеличиваются по мере перемещения вниз экрана, в чере­

пашьей графике координаты У уменьшаются по мере перемещения вниз экрана.

'-(о, О)
(319, 239) _____...

(639,479)~

РИС.

13.26.

Разные позиции пикселов в окне

640

на

480

пикселов

652

Глава 13. Программирование графического пользовательского интерфейса
Элемент интерфейса

Canvas имеет многочисленные методы для рисования графических

фигур на поверхности этого элемента. Мы обсудим методы:








create _ line ();
create rectangle();
create oval ();
create _ arc ();
create_polygon();
create_ text ().

13.14. В ней использует­
13.27 показано окно, которое

Прежде чем обсудить детали этих методов, рассмотрим программу
ся элемент интерфейса

Canvas для нанесения прямых. На рис.

программа выводит на экран.

r

РИС.

13.27.

Окно, выводимое на экран программой

Программа

13.14

D

tk

х

13.24

(draw_line.py)

1 # Эта программа
2 import tkinter

демонстрирует элемент интерфейса

Canvas.

3

4 class MyGUI:
init
def

5

(self) :

6

#

7

self.main_window = tkinter.Tk()

Создать главное окно.

8
9

10
11

12
13

14
15
16
17
18

элемент интерфейса

Canvas.
self.canvas = tkinter.Canvas(self .main_window,
width=200, height=200)
# Нарисовать две прямые.
self.canvas.create_line(O, О, 199, 199)
self.canvas.create line(l99, О, О, 199)
#

Создать

# Упаковать холст.
self.canvas.pack()

Глава 13. Программирование графического пользовательского интерфейса

#

19
20

Запустить

653

главный цикл.

tkinter.mainloop()

21

22 # Создать экземпляр
23 my_gui = MyGUI ()

класса

MyGUI.

Рассмотрим эту программу. Строки

создают элемент интерфейса canvas. Первый ар­

10--11

гумент внутри круглых скобок является ссылкой на self .main_ window, т. е. родительский

контейнер, в который мы добавляем этот элемент интерфейса. Аргументы width=200 и
задают размер элемента

height=200
Строка

canvas.

вызывает метод crea te _ l ine () элемента Canvas, чтобы начертить прямую линию.

13

Первый и второй аргументы являются координатами (Х, У) исходной точки прямой, третий

и четвертый аргументы

-

координатами (Х, У) конечной точки прямой. Таким образом, эта

инструкция чертит на элементе

Строка

14

canvas прямую от (О, О) до (199, 199).

тоже вызывает метод create_line () элемента Canvas, чтобы начертить вторую

прямую. Эта инструкция чертит на элементе Canvas прямую от
Строка

17 вызывает метод pack () элемента Canvas, который
Строка 20 исполняет функцию mainloop модуля tkinter.
Рисование прямых: метод
Метод

(199,

О) до (О,

199).

делает этот элемент видимым.

create_lineO

create _ line () чертит на холсте отрезки прямой между двумя или несколькими точ­

ками. Вот общий формат вызова этого метода для рисования отрезка прямой между двумя
точками:

имя_xoлcтa.create_line(xl,

Аргументы xl и yl -

у2,

опции ...

)

это координаты (Х, У) исходной точки прямой. Аргументы х2 и у2

конечной

точки

прямой.

В

приведенном

выше

(Х,

в

указывается несколько необязательных именованных аргументов, которые

можно передавать в этот метод. Некоторые из них мы рассмотрим в табл.
Вы видели примеры вызова метода create_line () в программе
ка

13

в этой программе чертит линию от (О, О) до

self.canvas.create_line(O,
В

качестве

аргументов

О,

13.14.

общем

-

координаты
опциях. . .

У)

х2,

yl,

формате

13.3.

Напомним, что стро­

(199, 199):

199, 199)

можно

передавать

многочисленные

наборы

координат.

Метод

create_line () начертит отрезки прямой, соединяющие эти точки. Программа 13.15 демон­
стрирует, как это делается. Инструкция в строке
ки

(10, 10), (189, 10) (100, 189)

и

(10, 10).

На рис.

13 чертит отрезки, соединяющие точ­
13.28 представлено окно, которое данная

программа выводит на экран.

Программа

13.15

(draw_multi_lines.py)

1 # Эта программа соединяет
2 import tkinter
3
4 class MyGUI:
def
init (self):
5

несколько точек отрезками прямой.

Глава 13. Программирование графического пользовательского интерфейса

654
6
7
8
9
10
11
12
13

# Создать главное окно.
self.main_window = tkinter.Tk()
# Создать элемент интерфейса Canvas.
self.canvas = tkinter.Canvas(self .main_window,
width=200, height=200)
# Начертить отрезки прямой, соединяющие несколько точек.
self.canvas.create_line(lO, 10, 189, 10, 100, 189, 10, 10)

14
# Упаковать холст.
self.canvas.pack()

15
16

17
# Запустить главный цикл.
18
tkinter.mainloop()
19
20
21 # Создать экземпляр класса MyGUI.
22 my_gui = MyGUI ()

,

РИС.

13.28. Окно,

выводимое программой

tk

о

х

13.15

В качестве аргумента также можно передать список или кортеж, содержащий координаты.

Например, в программе

13.15

можно было бы заменить строку

13

приведенным ниже фраг­

ментом кода и получить те же самые результаты:

points = (10, 10, 189, 10, 100, 189, 10, 10]
self.canvas.create_line(points)
В метод

create_ line () можно передавать несколько необязательных именованных аргумен­

тов. В табл.
Таблица

13.3.

13.3

приводятся некоторые наиболее часто используемые из них.

Несколько необязательных аргументов для метода

crea te _ line ()

Арrумент

Описание

аrrоw=значение

По умолчанию прямые линии не имеют стреловидных указателей, но этот

мент наносит стрелку на один или оба конца. Добавьте
сения указателя в начале прямой,

прямой или

arrow=tk. ВОТН для

arrow=tk. LAST для

apry-

arrow=tk. FIRST для

нане-

нанесения указателя в конце

нанесения указателей в обоих концах прямой

Глава 13. Программирование графического пользовательского интерфейса
Таблица

13.3

655

(окончание)

Аргумент

Описание

dаsh=значение

Этот аргумент превращает прямую в пунктирную линию. Его значением является
кортеж из целых чисел, который задает шаблон. Первое целое число задает коли-

- количество пропускаемых
dash= ( 5, 2) нарисует 5 пикселов, пропустит

чество рисуемых пикселов, второе целое число

пикселов и т. д. Например, аргумент

2

пиксела и будет повторяться до тех пор, пока не будет достигнут конец отрезка

прямой
fill=значение

Задает цвет прямой в виде строкового значения. Можно использовать самые

разные предопределенные имена цветов, и в приложении
список. Наиболее часто используемые из них:
и

'cyan'.

(Если опустить аргумент

fill,

4 приведен

'red', 'green ',

их полный

'Ыuе

', 'yellow'

то цвет прямой по умолчанию будет

черным.)
smооth=значение

По умолчанию аргумент

smooth равен False,

в результате чего данный метод

чертит прямые отрезки, соединяющие указанные точки. Если задать

smooth=True,

то будут нанесены изогнутые сплайны
width=значение

Задает ширину отрезка в пикселах. Например, аргумент
шириной

5 пикселов.

Рисование прямоугольников: метод
Метод

width=S

нанесет отрезок

По умолчанию отрезки прямой имеют ширину

1 пиксел

create_rectangleO

create_rectangle () чертит на холсте прямоугольник. Вот общий формат вызова

этого метода:

rectangle(xl, yl,

имя холста.сrеаtе

Аргументы xl и yl метры х2 и у2

-

х2,

у2,

опции ...

)

это координаты (Х, У) левого верхнего угла прямоугольника. Пара­

координаты (Х, У) правого нижнего угла прямоугольника. В приведенном

выше общем формате в опциях. . . указывается нескольконеобязательных именованных
аргументов, которые можно передавать в этот метод. Некоторые из них мы рассмотрим

в табл.

13.4.

Программа

13 .16 демонстрирует

метод

crea te _ rectang le () в строке 13. Левый верхний угол

прямоугольника находится в координате

(180, 180).
Программа

13.16

На рис.

13.29

(20, 20),

его правый нижний угол

(draw_square.py)

1 # Эта программа
2 import tkinter

чертит

прямоугольник на

элементе

Canvas.

3

4 class MyGUI:
5
def
init (self) :
# Создать главное окно.
б
7
self.main window = tkinter.Tk()
8
9

10
11

-

в координате

показано окно, которое данная программа выводит на экран.

# Создать элемент интерфейса Canvas.
self.canvas = tkinter.Canvas(self.main_window,
width=200, height=200)

Глава 13. Программирование графического пользовательского интерфейса

656

12
# Нарисовать прямоугольник.
13
self.canvas.create_rectangle(20, 20, 180, 180)
14
15
# Упаковать холст.
16
self.canvas.pack()
17
18
# Запустить главный цикл.
19
tkinter.rnainloop()
20
21 # Создать экземпляр класса MyGUI.
22 rny_gui = MyGUI ()

(

РИС.

13.29.

Окно, выводимое на экран программой

В метод

13.4.

х

13.16

create_rectangle () можно передавать несколько необязательных именованных

аргументов. В табл.
Таблица

о

tk

13.4 приведены

некоторые наиболее часто используемые из них.

Несколько необязательных аргументов для метода

crea te _ rectang le ()

Арrумент

Описание

dаsh=значение

Этот аргумент делает контур прямоугольника пунктирным. Его значением является кортеж из целых чисел, которые задают шаблон. Первое целое число задает
количество пропускае-

мых пикселов и т. д. Например, аргумент

нарисует

пропустит
fill=значение

dash= ( 5, 2)

количество рисуемых пикселов, второе целое число

2

5 пикселов,

пиксела и будет повторяться до тех пор, пока контур не замкнется

Задает цвет, которым прямоугольник может быть заполнен. Значением этого
аргумента является имя цвета в виде строкового значения. Можно использовать
самые разные предопределенные имена цветов, и в приложении

их полный список. Вот наиболее часто используемые:

'yellow'

и

'cyan'.

(Если опустить аргумент

fill,

4 приведен
'red', 'green', 'Ы ue ',

то прямоугольник останется

незаполненным.)
оutlinе=значение

Задает цвет контура прямоугольника в виде строкового значения. Можно
использовать самые разные предопределенные имена цветов, и в приложении

приведен их полный список. Вот наиболее часто используемые:
'Ыuе

', 'yellow'

и

'cyan'.

(Если опустить аргумент

прямоугольника по умолчанию будет черным.)

4

' red', 'green',

outline, то

цвет контура

Глава 13. Программирование графического пользовательского интерфейса
Таблица

13.4

(окончание)

Аргумент

Описание

width=значение

Задает ширину контура прямоугольника в пикселах. Например, аргумент

width=S

нанесет линию контура шириной

контура прямоугольника имеет ширину

Например, если изменить строку

13

в программе

5 пикселов.
1 пиксел

13.16 следующим

self.canvas.create rectangle(20, 20, 180, 180, dash=(S, 2),

По умолчанию линия

образом:
width=З)

то программа начертит прямоугольник с пунктирным контуром и шириной линии
Вывод программы в этом случае показан на рис.

1

РИС.

657

о

tk

3

пиксела.

13.30.
х

13.30. Пунктирный контур с шириной линии З пиксела

Рисование овалов: метод
Метод

create oval ()

create_ova/()

чертит овал, или эллипс. Вот общий формат вызова этого метода:

имя_холста.сrеаtе_оvаl(х1,

yl,

х2,

у2,

опции ...

)

Данный метод чертит овал, который строго укладывается в ограничивающий прямоуголь­
ник, заданный координатами, переданными в качестве аргументов. Координаты

(xl,

уl)­

это координаты левого верхнего угла прямоугольника, (х2, у2)- координаты правого ниж­
него угла прямоугольника (рис.

13.31).

В приведенном выше общем формате в опциях ...

указывается несколько необязательных именованных аргументов, которые можно переда­

вать в этот метод. Некоторые из них мы рассмотрим в табл.
(х1, у1)

13.5.

--=

~ - - - - -=--

1
1
1
1

~

- - - - -~-----=-·- - - - - _,__
--- (х2, у2)

РИС.

13.31.

Овал, ограничивающий четырехугольник

658

Глава 13. Программирование графического пользовательского интерфейса

Программа

13.17

демонстрирует метод

рый чертится в строке

нате

(20, 20)

create_oval ()в строках 13 и 14. Первый овал, кото­

задан прямоугольником со своим левым верхним углом в коорди­

и своим правым нижним углом в координате

чертится в строке

(100, 100)

13,

14,

и своим правым нижним углом в координате

(180, 130).

окно, которое данная программа выводит на экран.

Программа

13.17

(draw_ovals.py)

1 # Эта программа
2 import tkinter

чертит два овала на элементе

Canvas.

3

4 class MyGUI:
5
def
init (self):
# Создать главное окно.
6
7
self.main window = tkinter.Tk()
8
# Создать элемент интерфейса Canvas.
9
10
self.canvas
tkinter.Canvas(self.main_window,
width=200, height=200)
11
# Нарисовать два овала.
12
self.canvas.create_oval(20, 20, 70, 70)
13
14
self.canvas.create_oval(lOO, 100, 180, 130)
15
16
# Упаковать холст.
17
self.canvas.pack()
18
19
# Запустить главный цикл.
20
tkinter.mainloop()
21
22 # Создать экземпляр класса MyGUI.
23 my_gui = MyGUI ()

1

о

tk

о

РИС.

13.32.

(70, 70).

Второй овал, который

задан прямоугольником со своим левым верхним углом в координате

Окно, выводимое на экран программой

13.17

х

На рис.

13.32

показано

Глава 13. Программирование графического пользовательского интерфейса

659

В метод create _ oval () можно передавать несколько необязательных именованных аргумен­

тов. В табл.
Таблица

13.5.

13.5

приведены некоторые наиболее часто используемые.

Несколько необязательных аргументов для метода

create oval ()

Арrумент

Описание

dаsh=значение

Этот аргумент делает контур овала пунктирным. Его значением является кортеж
из целых чисел, которые задают шаблон. Первое целое число задает количество
рисуемых пикселов, второе целое число

и т. д. Например, аргумент

2

-

dash= (5, 2)

количество пропускаемых пикселов

нарисует

5 пикселов,

пропустит

пиксела и будет повторяться до тех пор, пока контур не замкнется

----·---

----

fill=значение

Задает цвет, которым овал может быть заполнен. Значением этого аргумента
является имя цвета в виде строкового значения. Можно использовать самые
разные предопределенные имена цветов, и в приложении

список. Вот наиболее часто используемые:
и
-

---

'cyan'.

(Если опустить аргумент

fill,

4 приведен их полный
'red', 'green ', 'Ыuе ', 'yellow'

то овал останется незаполненным.)
-

---·------·---

оutlinе=значение

Задает цвет контура овала в виде строкового значения. Можно использовать самые
разные предопределенные имена цветов, и в приложении

4

приведен их полный

список. Вот наиболее часто используемые:
и

'cyan '.(Если

опустить аргумент

'red', 'green', 'Ы ue', 'yellow'
outline, то цвет контура овала по умолчанию

будет черным.)
---

-

width=значение

I

Задает ширину контура овала в пикселах. Например, аргумент

. линию контура шириной 5 пикселов.
[ ширину 1 пиксел

width=S

нанесет

По умолчанию линия контура овала имеет

СОВЕТ
Для того чтобы нарисовать круг, следует вызвать метод

create_oval ()

и сделать все стороны

ограничивающего прямоугольника равной длины.

Рисование дуг: метод

create_arcO

Метод create arc () чертит дугу. Вот общий формат вызова этого метода:
имя_холста.сrеаtе

arc(xl,yl,

х2,у2,

start=yгoл,

ехtеnt=ширина,

опции ...

)

Данный метод чертит дугу, которая является частью овала. Овал строго укладывается
в ограничивающий прямоугольник, который задан координатами, переданными в качестве

аргументов. Координаты (х1,

yl) -

это координаты левого верхнего угла прямоугольника,

а координаты (х2, у2)- координаты правого нижнего угла прямоугольника. Аргумент
start=yгoл задает исходный угол, аргумент ехtеnt=ширина задает в виде угла протяжен­
ность дуги против часовой стрелки. Например, аргумент start=90 определяет, что дуга
начинается в
стрелки на

90°, аргумент extent=45
45° (рис. 13.33).

определяет, что дуга должна идти против часовой

В приведенном выше общем формате в опциях.

. . указывается несколько необязательных

именованных аргументов, которые можно передавать в этот метод. Некоторые из них мы

рассмотрим в табл.

13.6.

660

Глава 13. Программирование графического пользовательского интерфейса

Исходный угол

(х1,у1)~-----Дуга

=45 градусов

-.-;.--:._,,-----1
......

,...

1

1/

градусов

= 90

/

1

'

{

1

'1\1

~

/1

1 \.

1

/

'

/

1

1

~ - - ::-_-_""' - - -~ ~_:'_ - - _:._______ (х2, у2)

РИС.

13.33.

Свойства дуги

Программа

13.18

демонстрирует метод

create _ arc (). Дуга, нарисованная в строке 13, зада­

ется прямоугольником со своим левым верхним углом в координате
нижним углом в координате
рис.

13.34

(190, 190).

Дуга начинается в

45 °

( 1О, 1О)

показано окно, которое данная программа выводит на экран.
,

tk

D

х

р
РИС.

13.34.

Окно, выводимое на экран программой

Проrрамма

13.18

13.18

(draw_arc.py)

1 # Эта программа
2 import tkinter

чертит дугу на элементе

Canvas.

3

4 class MyGUI:
5
def
init (self):
6
# Создать главное окно.
7
self.main window = tkinter.Tk()
8
9

10
11
12
13
14
15
16
17

# Создать элемент интерфейса Canvas.
self.canvas = tkinter.Canvas(self.main_window,
width=200, height=200)
#

Нарисовать

дугу.

self.canvas.create_arc(lO, 10, 190, 190, start=45,

# Упаковать холст.
self.canvas.pack()

и своим правым

и простирается на

extent=ЗO)

30°.

На

Глава 13. Программирование графического пользовательского интерфейса

18
19

#

Запустить

661

главный цикл.

tkiпter.mainloop()

20
21 # Создать экземпляр
22 my_gui = MyGUI ()

класса

MyGUI.

В метод crea te _ arc () можно передавать несколько необязательных именованных аргумен­
тов. В табл.
Таблица

13.6.

13.6

приведены некоторые наиболее часто используемые из них.

Несколько необязательных аргументов для метода

create_arc ()

Аргумент

Описание

dаsh=значение

Этот аргумент делает контур дуги пунктирным. Его значением является кортеж
из целых чисел, которые задают шаблон. Первое целое число задает количество
рисуемых пикселов, второе целое число

и т. д. Например, аргумент

2 пиксела
fill=значение

-

dash= ( 5, 2)

количество пропускаемых пикселов

нарисует

5 пикселов,

пропустит

и будет повторяться до тех пор, пока контур не закончится

Задает цвет, которым дуга может быть заполнена. Значением этого аргумента
является имя цвета в виде строкового значения. Можно использовать самые
разные предопределенные имена цветов, и в приложении
список. Вот наиболее часто используемые:
и

оutlinе=значение

'cyan'.

(Если опустить аргумент

fill,

4

приведен их полный

'red', 'green ',

'Ы ue',

'yellow'

то овал останется незаполненным.)

Задает цвет контура дуги в виде строкового значения. Можно использовать
самые разные предопределенные имена цветов, и в приложении

4

приведен их

полный список. Вот наиболее часто используемые:

'yellow'

и

'cyan'.

(Если опустить аргумент

'red', 'green ', 'Ы ue ',
outline, то цвет контура дуги

по умолчанию будет черным.)
stуlе=значение

width=значение

Задает стиль дуги. Аргумент

style может иметь одно из трех значений:
tkinter. PIESLICE, tkinter .ARC или tkinter. CHORD (см. табл. 13.7)

Задает ширину контура дуги в пикселах. Например, аргумент
линию контура шириной
ширину

5 пикселов.

width=5

нанесет

По умолчанию линия контура дуги имеет

1 пиксел

Один из трех стилей (табл.

13.7)

рисуемой дуги задается аргументом stуlе=значение. (По

умолчанию используется тип tkinter. PIESLICE (сектор круга).) На рис.

13.35

показаны

примеры каждого типа дуги.

Таблица

13.7.

Аргумент

Типы дуг

style

style=tkinter.PIESLICE

Описание

Этот тип дуги задан по умолчанию. Из обеих конечных точек до центральной
точки дуги проводятся отрезки. В результате дуга будет сформирована как
сектор круга

style=tkinter.ARC

Отрезки, соединяющие конечные точки, отсутствуют. Изображается только
дуга

style=tkinter.CHORD

Из одной конечной точки дуги в другую ее конечную точку проводится

отрезок прямой (хорда)

662

Глава 13. Программирование графического пользоватэл~ского интерфейса

tkinterPIESLICE
РИС.

13.35.

tk1nter.CHORD

tk1nterARC

Типы дуг

В программе

13.19

приведен соответствующий пример, в котором дуги используются для

построения круговой диаграммы. Вывод программы показан на рис.

о

tk

РИС.

13.36.

Окно, выводимое на экран программой

Проrрамма

13.19

13.36.

х

13.19

(draw_piechart.py)

1 # Эта программа
2 import tkinter

чертит

круговую диаграмму на

элементе

Canvas.

3

4 class MyGUI:
5
def
init
self.
6
7
self.
self.
8
self.
9
10
self.
11
self.
12
self.
13
self.
14
self.
15
self.
16
self.
17
self.
18
self.
19
self.
20

(self):
CANVAS WIDTH = 320
# Ширина холста
CANVAS HEIGHT = 240
# Высота холста
Xl
60
# Левая верхняя координата х прямоугольника
Yl
20
# Левая верхняя координата у прямоугольника
Х2
260
# Нижняя правая координата х прямоугольника
У2
220
# Нижняя правая координата у прямоугольника
PIEl START
о
# Исходный угол сектора 1
PIEl WIDTH
45
# Протяженность сектора 1
PIE2 START
45
# Исходный угол сектора 2
PIE2 WIDTH
90
# Протяженность сектора 2
PIE3 START
135
# Исходный угол сектора 3
PIE3 WIDTH
120
# Протяженность сектора 3
PIE4 START
255
# Исходный угол сектора 4
105
PIE4 WIDTH
# Протяженность сектора 4

Глава 13. Программирование графического пользовательского интерфейса

21
22
23
24
25
26
27
28

# Создать главное окно.
self.main window = tkinter.Tk()

29

# Начертить сектор 1.
self.canvas.create arc(self._Xl, self. Yl, self._X2,
self. У2, start=self. PIEl START,
extent=self. PIEl_WIDTH,
fill=' red')

30
31
32

33
34
35
36
37
38

39
40
41
42
43
44
45

663

# Создать элемент интерфейса Canvas.
self.canvas = tkinter.Canvas(self.main_window,
width=self. CANVAS_WIDTH,
height=self._CANVAS_HEIGHT)

# Начертить сектор 2.
self.canvas.create arc(self._Xl, self. Yl, self._X2,
self. У2, start=self. PIE2_START,
extent=self. PIE2_WIDTH,
fill=' green')
# Начертить сектор 3.
self.canvas.create_arc(self._Xl, self. Yl, self._X2,
self._Y2, start=self. PIEЗ_START,
extent=self. PIEЗ_WIDTH,
fill='Ыack')

46

47
48

49
50
51
52
53
54
55

# Начертить сектор 4.
self.canvas.create_arc(self._Xl, self. Yl, self. Х2,
self. У2, start=self. PIE4 START,
extent=self. PIE4_WIDTH,
fill=' yellow')
# Упаковать холст.
self.canvas.pack()

# Запустить главный цикл.
57
tkinter.mainloop()
58
59 # Создать экземпляр класса MyGUI.
60 my_gui = MyGUI ()
56

---

Рассмотрим метод_ ini t _

---

----------------

() класса MyGUI в программе 13.19.

+ Строки 6 и 7 задают атрибуты ширины и высоты элемента интерфейса Canvas.
+ Строки 8-11 задают атрибуты координат левого верхнего и правого нижнего углов огра­
ничивающего прямоугольника, которые каждая дуга делит между собой.

664

Глава 13. Программирование графического пользовательского интерфейса

+ Строки 12-19 задают атрибуты каждого исходного угла и протяженности сектора круга.
+ Строка 22 создает главное окно, а строки 25-27 - элемент интерфейса canvas.
+ Строки 30-33 создают первый сектор круга, назначая ему красный цвет заливки.
+ Строки 36-39 создают второй сектор круга, назначая ему зеленый цвет.
+ Строки 42~5 создают третий сектор круга, назначая ему черный цвет заливки.
+ Строки 48-51 создают четвертый сектор круга, назначая ему желтый цвет заливки.
+ Строка 54 упаковывает элемент Canvas, делая видимым его содержимое, и строка 57
запускает функцию

модуля

mainloop

tkinter.

Рисование многоугольников: метод
Метод

create_po/ygon()

create_polygon (} чертит замкнутый многоугольник на элементе Canvas. Много­

угольник строится из многочисленных соединенных отрезков. Точка, где два отрезка соеди­
няются, называется вершиной. Вот общий формат вызова метода рисования многоугольника:
имя_xoлcтa.create_polygon(xl,

Аргументы xl и yl -

yl,

х2,

у2,

опции ...

)

это координаты (Х, У) первой вершины, х2 и у2 -

координаты (Х, У)

второй вершины и т. д. Данный метод автоматически замыкает многоугольник, проведя

отрезок из последней вершины в первую вершину. В приведенном выше общем формате
опциях. . . указывается несколько необязательных именованных аргументов, которые

в

можно передавать в этот метод. Некоторые из них мы рассмотрим в табл.
Программа

демонстрирует метод

13.20

create_polygon (}.

13.8.

Инструкция в строках

13

и

14

чертит многоугольник с восемью вершинами. Первая вершина находится в координате

(60, 20),

вторая вершина- в координате

и т. д. (рис.

(100, 20)

13.37).

На рис.

окно, которое данная программа выводит на экран.

Первая точка

Восьмая точка

-

-

(60, 20)

(100, 20) -

(20, 60)

Вторая точка

(140, 60) -

Третья точка

Метод cгeate_polygon()
автоматически замыкает

Седьмая точка

-

Шестая точка
РИС.

13.37.

многоугольник

(20, 100)

-

(60, 140)

(140, 100) -

(100, 140) -

Пятая точка

Точки каждой вершины в многоугольнике

Программа

13.20

(draw_polygon.py)

1 # Эта программа
2 import tkinter

чертит многоугольник на

3

4 class MyGUI:
5
def
init

(self) :

элементе

Canvas.

Четвертая точка

13.38

показано

Глава 13. Программирование графического пользовательского интерфейса

665

# Создать главное окно.
self.main window = tkinter.Tk()

6
7

8

17

# Создать элемент интерфейса Canvas.
self.canvas = tkinter.Canvas(self.main_window,
width=l60, height=l60)
многоугольник.
# Нарисовать
self.canvas.create_polygon(60, 20, 100, 20, 140, 60, 140,
100, 100, 140, 60, 140, 20, 100,
20, 60)
холст.
# Упаковать
self.canvas.pack()

18
19
20

# Запустить главный
tkinter.mainloop()

9

10
ll

12
13
14
15
16

цикл.

21

22 #Создать экземпляр
23 my_gui = MyGUI()

класса

MyGUI.

о

РИС.

13.38.

Окно, выводимое на экран программой

В метод

13.8.

13.20

create _polygon () можно передавать несколько необязательных именованных аргу­

ментов. В табл.
Таблица

х

13.8

приведены некоторые наиболее часто используемые из них.

Некоторые необязательные аргументы для метода

create _polygon ()

Арrумент

Описание

dаsh=значение

Этот аргумент делает контур многоугольника пунктирным. Его значением является кортеж из целых чисел, которые задают шаблон. Первое целое число задает
количество рисуемых пикселов, второе целое число

пикселов и т. д. Например, аргумент

тит
~

fill=значение

--

2

dash= (5, 2)

-

количество пропускаемых

нарисует

5 пикселов,

пропус-

пиксела и будет повторяться до тех пор, пока контур не замкнется

Задает цвет, которым многоугольник может быть заполнен. Значением этого
аргумента является имя цвета в виде строкового значения. Можно использовать
самые разные предопределенные имена цветов, и в приложении

их полный список. Вот наиболее часто используемые:

'yellow'

и

'cyan'.

(Если опустить аргумент

заполнен черным цветом.)

fill,

4

приведен

'red', 'green ',

'Ыuе

то многоугольник будет

',

666

Глава 13. Программирование графического пользовательского интерфейса

Таблица

13.8

(окончание)

Арrумент

Описание

оutlinе=значение

Задает цвет контура многоугольника в виде строкового значения. Можно
использовать самые разные предопределенные имена цветов, и в приложении

4

приводится их полный список. Вот наиболее часто используемые:

'green ',

'Ыuе

', 'yellow'

и

'cyan'.

(Если опустить аргумент

' red',
outline,

то цвет контура дуги по умолчанию будет черным.)
smооth=значение

По умолчанию аргумент

smooth равен False,

в результате чего данный метод

чертит прямые отрезки, соединяющие указанные точки. Если задать

smooth=True, то
width=значение

будут нанесены изогнутые сплайны

Задает ширину контура многоугольника в пикселах. Например, аргумент

width=S

нанесет линию контура шириной

контура многоугольника имеет ширину

Рисование текста: метод

l

5 пикселов.

По умолчанию линия

пиксел

create_text()

Для нанесения текста на элементе интерфейса

Canvas используется метод create text ().

Вот общий формат вызова этого метода:
имя_холста.сrеаtе_tехt(х,

у,

tехt=текст,

опции ...

)

Аргументы х и у- это координаты (Х, У) точки вставки текста, аргумент tехt=текст задает
наносимый текст. По умолчанию текст центрируется горизонтально и вертикально вокруг

точки вставки. В приведенном выше общем формате в опциях . .. указывается несколько не­
обязательных именованных аргументов, которые можно передавать в этот метод. Некоторые

из них мы рассмотрим в табл.
Программа

13 .21

текст 'Привет,

13. 9.

демонстрирует метод

crea te _ text () . Инструкция в строке 13 выводит

мир!' в центре окна в координатах

(100, 100).

окно.

Программа

13.21

(draw_text.py)

1 # Эта программа
2 import tkinter

наносит текст на элемент

Canvas.

3

4 class MyGUI:
5
def
init (self):
# Создать главное окно.
6
7
self.main_window = tkinter.Tk()
8
9

10
11

12
13
14

# Создать элемент интерфейса Canvas.
self.canvas = tkinter.Canvas(self.main_window,
width=200, height=200)
# Показать текст в центре окна.
self.canvas.create_text(lOO, 100, tехt='Привет, мир!')

На рис.

13.39

показано это

Глава 13. Программирование графического пользовательского интерфейса

667

# Упаковать холст.
self.canvas.pack()

15
16

17

# Запустить главный
tkinter.mainloop()

18
19

20
21 # Создать экземпляр
22 my_gui = MyGUI ()

класса

цикл.

MyGUI.

!/

о

tk

х

Привет, м~1р!

РИС.

13.39.

Окно, выводимое на экран программой

В метод

create_ text ( 1 можно передавать несколько необязательных именованных аргу­

ментов. В табл.
Таблица

13.21

13.9

приведены некоторые наиболее часто используемые из них.

13.9. Несколько необязательных аргументов для метода create_ text ()

Арrумент

Описание

аnсhоr=значение

Этот аргумент задает расположение текста относительно его точки вставки.
По умолчанию аргумент привязки

anchor равен tkinter. CENTER,

центрируя

текст вертикально и горизонтально вокруг точки вставки. Можно задать любое

из нескольких значений, перечисленных в табл.
fill=значение

13.10

Задает цвет, которым текст может быть нарисован. Значением этого аргумента
является имя цвета в виде строкового значения. Можно использовать самые
разные предопределенные имена цветов, и в приложении

список. Вот наиболее часто используемые:
и
fоnt=значение

'cyan'.

(Если опустить аргумент

fill,

4 приведен

'red', 'green ',

'Ыuе

их полный

', 'yellow'

то текст будет заполнен черным цветом.)

Для того чтобы изменить стандартный шрифт, следует создать объект

tkinter. font. Font и

передать его как значение аргумента

font

(применение

шрифтов см. в следующем разделе)
justify=знaчeниe

Если выводится несколько строк текста, то этот аргумент задает выравнивание
строк. Он может принимать значения:
По умолчанию используется значение

tk. LEFT, tk. CENTER или tk. RIGHT.
tk. LEFT

Глава 13. Программирование графического пользовательского интерфейса

668

Текст позиционируется относительно своей точки вставки девятью разными способами. Для
изменения позиционирования текста используется аргумент аnсhоr=значение. Разные значе­

ния данного аргумента перечислены в табл.

13.1 О.

По умолчанию используется значение

tkinter. CENTER.
Таблица

13.10.

Арrумент

Значения привязки

anchor

Описание

anchor=tkinter.CENTER

Позиционирует текст, центрированным вертикально и горизонтально вокруг

точки вставки. Этот вариант позиционирования используется по умолчанию

anchor=tkinter.NW

Позиционирует текст таким образом, что точка вставки находится в левом
верхнем углу текста (на северо-западе)

anchor=tkinter.N

Позиционирует текст таким образом, что точка вставки центрируется вдоль
верхнего края текста (на севере)

anchor=tkinter.NE

Позиционирует текст таким образом, что точка вставки находится в правом
верхнем углу текста (на северо-востоке)

anchor=tkinter.W

Позиционирует текст таким образом, что точка вставки находится с левого
края текста в середине (на западе)

anchor=tkinter.E

Позиционирует текст таким образом, что точка вставки находится с правого
края текста в середине (на востоке)
-

anchor=tkinter.SW

Позиционирует текст таким образом, что точка вставки находится в левом
нижнем углу текста (на юго-западе)

anchor=tkinter.S

Позиционирует текст таким образом, что точка вставки центрируется вдоль
нижнего края текста (на юге)

anchor=tkinter.SE

Позиционирует текст таким образом, что точка вставки находится в правом
нижнем углу текста (на юго-востоке)

На рис.

13.40

показаны различные позиции привязки. В каждой строке текста имеется точка,

которая представляет позицию точки вставки.

Этот текст испол~:оует

tkinter.CENTER

С:Зтот текст использует tkinter.NW
Этот текст исп8льзует tkinter.N
Этот текст использует tkinter.Ni:°
«Этот текст использует tkinter.W
Этот текст использует tkinter.Eo
дЭтот текст использует tkinter.SW
Этот текст испgльзует tkinter.S
Этот текст использует tkinter.SEc,
РИС.

13.40.

Результаты различных значений привязки

Глава 13. Программирование графического пользовательского интерфейса

669

Настройка шрифта
Используемый в методе

create text () шрифт задается путем создания объекта Font и его
font=. Класс Font находится в модуле tkinter. font, поэтому
в программу необходимо включить приведенную ниже инструкцию import:
передачи в качестве аргумента

import tkinter.font
Вот пример создания объекта

Font, который задает шрифт Helvetica размером 12 пунктов:

myfont = tkinter.font.Font(family='Helvetica', size='12')
При конструировании объекта

Font можно передавать значения для любого из именованных

аргументов, приведенных в табл.
Таблица

13.11.

13.11.

Именованные аргументы для класса

Font

Описание

Аргумент
fаmilу=значение

Этот аргумент является строковым значением, которым задается имя

семейства шрифтов, в частности
'Тimes

New Roman'

'Arial', 'Courier', 'Helvetica',

и т. д.

sizе=значение

Этот аргумент является целым числом, которым задается размер шрифта
в точках

-

---·-

wеight=значение

Этот аргумент задает толщину шрифта. Допустимыми строковыми
значениями являются

'bold'

и

'normal'

~------·-

slаnt=значение

Этот аргумент задает наклон шрифта. Для того чтобы шрифт выглядел
наклонным, следует задать значение

'i talic '.Для того
'roman'

чтобы шрифт

выглядел прямым, следует указать значение

underline=знaчeниe

Для того чтобы текст выглядел подчеркнутым, следует задать значение

1.

В противном случае следует указать значение О
-overstrike=знaчeниe

Для того чтобы текст выглядел перечеркнутым, следует задать значение

1.

В противном случае следует указать значение О

Доступные имена семейств шрифтов разнятся в зависимости от используемой операционной

системы. Для того чтобы получить список установленных вами семейств шрифтов, в обо­
лочке

Python

следует ввести приведенные ниже инструкции:

>>> import tkinter
>>> import tkinter.font
>>> tkinter.Tk()

>>> tkinter.font.families()
В программе

18
Программа

13.22

пунктов. На рис.

13.22

приведен пример вывода текста жирным шрифтом

13.41

(font_demo.py)

1 # Эта программа наносит
2 import tkinter
3 import tkinter.font
4

Helvetica

размером

показано окно, которое данная программа выводит на экран.

текст

на элемент

Canvas.

670

Глава 13. Программирование графического пользовательского интерфейса

5 class MyGUI:
6
def
init

(self):

Создать

главное окно.

7

#

8

self.main window = tkinter.Tk()

9

10

# Создать элемент интерфейса Canvas.
self.canvas = tkinter.Canvas(self.main_window, width=200,
height=200)
# Создать объект Font.
myfont = tkinter.font.Font(family='Helvetica', size=18,
weight= 'bold')

11

12
13
14

15
16

#

Показать

немного текста.

18

self.canvas.create text(lOO, 100, tехt='Привет,
font=myfont)

19

#

20

self.canvas.pack()

17

Упаковать

мир!',

холст.

21

22

#

23

tkinter.mainloop()

Запустить

главный цикл.

24

25 # Создать экземпляр
126 my_gui = MyGUI()

класса

MyGUI.

'1

о

tk

х

Привет, мир!

РИС.

13.41.

Окно, выводимое на экран программой

13.22

~ Контрольная точка
13.19.

Каковы координаты пиксела в левом верхнем углу окна в экранной системе коорди­

нат элемента интерфейса

13.20.

Canvas?

Каковы координаты пиксела в правом нижнем углу, если пользоваться экранной сис­
темой координат элемента интерфейса

480
13.21.

Canvas

с окном шириной

640

и высотой

canvas

от декарто­

пикселов?

Чем отличается экранная система координат элемента интерфейса

вой системы координат, используемой в библиотеке черепашьей графики?

Глава 13. Программирование графического пользовательского интерфейса

13.22.

671

Какие методы элемента интерфейса Canvas следует использовать д~
каждого из приведенных ниже типов фигур?
а)

круг;

б)

квадрат;

в)

прямоугольник;

г)

замкнутая шестигранная фигура;

д)

эллипс;

е)

дуга.

Вопросы для поет

ия

Множественный выбор
является частью компьютера, с которой взаимодействует пользователь.

1.

2.

а)

центральный процессор;

б)

пользовательский интерфейс;

в)

система управления;

г)

система интерактивности.

Прежде чем

GUI

стали популярными, чаще всего использовался

а)

интерфейс командной строки;

б)

интерфейс удаленного терминала;

в)

сенсорный интерфейс;

г)

событийно-управляемый интерфейс.

3.

-

_ _ _ __

это небольшое окно, которое выводит на экран информацию

и позволяет пользователю выполнять действия.

4.

5.

а)

меню;

б)

окно подтверждения;

в)

стартовый экран;

г)

диалоговое окно.

Эти типы программ являются событийно-управляемыми.
а)

консольная программа;

б)

текстоориентированная программа;

в)

программа с

г)

процедурная программа.

GUI;

Элемент, который появляется в графическом интерфейсе пользователя программы, назы­
вается

-------

а)

гаджетом;

б)

элементом интерфейса;

672

Глава 13. Программирование графического пользовательского интерфейса

--------_ · .-В)_
г)

6.

7.

.!i.llструментом;
объектом, свернутым в значок на рабочем столе.

Этот модуль используется в
а)

GUI;

б)

PythonGui;

в)

tkinter;

г)

tgui.

Python для

создания программ с

GUI.

Этот элемент интерфейса представляет собой область, в которой выводится одна строка
текста.

8.

а)

Label;

б)

Entry;

в)

TextLine;

г)

Canvas.

Этот элемент интерфейса представляет собой область, в которой пользователь может
ввести одну строку, набираемую с клавиатуры.

9.

а)

Label;

б)

Entry;

в)

TextLine;

г)

Input.

Этот элемент интерфейса представляет собой контейнер, который может содержать
другие элементы интерфейса.

1О.

а)

Grouper;

б)

Composer;

в)

Fence;

г)

Frame.

Этот метод размещает элемент интерфейса в своей соответствующей позиции и делает
его видимым при выводе главного окна на экран.

а)

pack ();

б)

arrange ();

в)

posi tion ();

г)

show().
является функцией или методом, который вызывается, когда происходит

11.

определенное событие.

а)

функция обратного вызова;

б)

автоматическая функция;

в)

функция запуска;

г)

исключение.

Глава 13. Программирование графического пользовательского интерфейса

12.

13.

14.

Функция showinfo находится в модуле

а)

tkinter;

б)

tkinfo;

в)

sys;

г)

tkinter .messagebox.

______

Этот метод следует вызывать для закрытия программы с
а)

метод destroy () корневого элемента интерфейса;

б)

метод cancel () любого элемента интерфейса;

в)

функция sys. shutdown;

г)

метод Tk. shutdown ().

Метод

________

673

GUI.

следует вызывать для извлечения данных из элемента интер-

фейса Entry.

15.

а)

gata_entry ();

б)

data ();

в)

get ();

г)

retrieve ().

Объект этого типа может быть привязан к элементу интерфейса Label, и любые данные,
хранящиеся в этом объекте, будут выводиться в элементе Label.

16.

а)

StringVar;

б)

LabelVar;

в)

Label Val ue;

г)

DisplayVar.

Если в контейнере имеется группа таких элементов, то только один из них может быть
выбран в любой момент времени.

17.

а)

CheckЬutton;

б)

Radiobutton;

в)

Mutualbutton;

г)

Button.

Элемент интерфейса
мерных фигур.
а)

Shape;

б)

Draw;

в)

Palette;

г)

Canvas.

_____

предоставляет

методы для

рисования

простых дву-

674

Глава 13. Программирование графического пользовательского интерфейса

Истина или ложь
1.

Язык

2.

Каждый элемент интерфейса имеет метод

Python

имеет встроенные ключевые слова для создания программ с

qui t (),

GUI.

который можно вызывать с целью

закрытия программы.

3.

Данные, извлекаемые из элемента интерфейса

4.

Среди всех элементов интерфейса

Entry,

Radiobutton,

всегда имеют тип

int.

находящихся в том же самом контейнере,

автоматически создается взаимоисключающая связь.

5.

Среди всех элементов интерфейса CheckЬutton, находящихся в том же самом контейнере,
автоматически создается взаимоисключающая связь.

Короткий ответ
1.

Что определяет порядок, в котором все происходит, когда программа выполняется в тек-

стоориентированной среде, такой как интерфейс командной строки?

2.

Что делает метод

3.

Что делает функция

4.

Каким образом будут расположены элементы интерфейса в их родительском элементе

pack ()

элемента интерфейса?

mainloop

модуля

tkinter?

интерфейса, если создать эти два элемента и вызвать их методы

5.

pack ()

без аргументов?

Каким образом указать, что элемент интерфейса должен быть расположен в максималь­
ной левой позиции в своем родительском элементе интерфейса?

6.

Как извлечь данные из элемента интерфейса

7.

Каким образом используется объект
интерфейса

8.

StringVar

для обновления содержимого элемента

Label?

Каким образом используется объект
был выбран в группе элементов

9.

Entry?

IntVar для
Radiobutton?

Каким образом используется объект

IntVar

определения, какой элемент

Radiobutton

для определения, был ли выбран элемент

CheckЬutton или нет?

Алгоритмический тренажер
1.

Напишите инструкцию, которая создает элемент интерфейса

Label.

элементом

должен

должен

'Программировать

2.

Допустим, что

-

быть
это

элемент
круто!

self. labell

и

и

он

Его родительским
содержать

текст

ссылаются на два элемента интерфейса

Label.

self .main_ window,

'.

self. label2

Напишите фрагмент кода, который упаковывает эти два элемента таким образом, чтобы
они были расположены в своем родительском элементе интерфейса максимально слева.

3.

Напишите инструкцию, которая создает элемент интерфейса
элементом должен быть элемент

4.

Frame.

Его родительским

self .main_ window.

Напишите инструкцию, которая выводит на экран информационное диалоговое окно с за­
головком "Программа приостановлена" и сообщением "Нажмите ОК, когда будете гото­
вы продолжить".

Глава 13. Программирование графического пользовательского интерфейса

5.

675

Напишите инструкцию, которая создает элемент интерфейса Button. Его родительским
элементом должен быть self .button_frame, его текст должен содержать строковый
литерал

'вычислить ',

и

его

функцией

обратного

вызова

должен

быть

метод

self. calculate ().

6.

Напишите
программу

инструкцию,
при

его

se l f . bu t ton_ f r ame,

7.

которая

нажатии.

создает элемент

Его

родительским

и он должен содержать текст

интерфейса
элементом

Button, закрывающий
должен

быть

элемент

' Выйти' .

Допустим, что переменная data entry ссылается на элемент интерфейса Entry. Напи­
шите инструкцию, которая извлекает значение из этого элемента, приводит его к типу

и присваивает его переменной с именем

8.

int

var.

Допустим, что в программе приведенная ниже инструкция создает элемент интерфейса

Canvas и присваивает его переменной self. canvas:
self.canvas = tkinter.Canvas(self.main_window, width=200, height=200)
Напишите инструкции, которые делают следующее:



чертят синюю прямую из левого верхнего угла элемента Canvas в его правый нижний

угол, прямая должна быть шириной



3 пиксела;

чертят прямоугольник с красным контуром и черным заполнением, углы прямоуголь­
ника должны располагаться на холсте в приведенных ниже позициях:



0

левый верхний:

0

правый верхний:

0

левый нижний:

0

правый нижний:

(50, 50);
(100, 50);

(50, 100);
(100, 100);

чертят зеленый круг, центральная точка круга должна быть в координатах
а ее радиус должен равняться



чертят заполненную синим

цветом дугу,

заданную

ограничивающим

ком, чей левый верхний угол находится в координатах
угол

Зад

и

1.

о

-

в координатах

огр

(100, 100),

50;

(180, 180).

Дуга должна начинаться в

прямоугольни­

(20, 20), правый
0° и простираться

нижний
на

90°.

ованию

ФИО и адрес. Напишите программу с

GUI,

которая при нажатии кнопки выводит на

экран ваше полное имя и адрес. При запуске программы ее окно должно выглядеть так,

как на эскизе с левой стороны рис.

13.42.

Когда пользователь нажимает кнопку Показать

инфо, программа должна вывести на экран ваше имя и адрес, как показано на эскизе справа.
Видеозапись "Задача с ФИО и адресом''

(The Name and Address

РrоЬ/ет)

162390, Россия Вологодская обл,
г. Великий Устюг.
Почта Деда Мороза

1 Пока:1ат~. инфо J

РИС.

13.42.

Программа "ФИО и адрес"

В~.1йти

1 Показат~.

инфо\

1

В~.1йти

676

Глава 13. Программирование графического пользовательского интерфейса

2.

Переводчик с латинского. Взгляните на приведенный в табл.

13.12

список латинских

слов и их значений.
Таблица

13.12

Латинский

Русский

sinister

Левый

dexter

Правый

medium

Центральный

Напишите программу с

GUI,

которая переводит латинские слова на русский язык. Окно

должно иметь три кнопки, по одной для каждого латинского слова (рис.

13.43).

Когда

пользователь нажимает кнопку, программа должна выводить на экран русский перевод

в элемент интерфейса Label.

о

tk

Введите кол11 честео галлонов:

о

tk

х

r.........................

РИС.

13.43.

5

Введ1пе количество м>1ль: -23---]г­

прааый

Мил•1 на галлон

(MPG) " 4.6

········~

l.........~.~-~E..."....!

sinister

х

n1ediun1

Окно программы-переводчика

РИС.

13.44.

Окно программы-калькулятора

экономичности автомобиля

3.

Калькулятор миль на галлон бензина. Напишите программу с

GUI,

которая вычисляет

экономичность автомобиля. Окно программы должно содержать элементы интерфейса

Entry, которые позволяют пользователю вводить объем бензина в галлонах, заправленно­
го в
(рис.

автомобиль,

13.44).

и количество

миль,

которые он

При нажатии кнопки Вычислить

MGP

может пройти с

полным

баком

программа должна вывести на экран

количество миль, которые автомобиль может пройти в расчете на галлон бензина.
Для вычисления показателя количества миль на галлон примените приведенную ниже

формулу:
Показатель миль на галлоны

мили

=- - - галлоны

4.

Из шкалы Цельсия в шкалу Фаренгейта. Напишите программу с

GUI,

которая преоб­

разует показания температуры по шкале Цельсия в температуру по шкале Фаренгейта.
Пользователь должен иметь возможность вводить температуру по шкале Цельсия, нажи­
мать

(рис.

кнопку

13.45).

и

затем

получать

эквивалентную

температуру

по

шкале

мулу:

9
F=-C+32,
5
где

F-

Фаренгейта

Для выполнения этого преобразования примените приведенную ниже фор­

это температура по Фаренгейту; С

-

температура по шкале Цельсия.

Глава 13. Программирование графического пользовательского интерфейса

о

tk
~

о

х

В11ед1пе сто 11мость ~1t.rущества :

В11ед11rе темпер атуру 11 rpa сах Цельсия: [zs
r:·

Т емnера

ра

РИС.

13.45.

Налог на ш"1ущест110:

."""" _______",_,_,

!21?~0~Р..~~О~.~!~.!!.1?~~-~~-~е~~~~~

х

S.._2_5000
_ __

Оценочна11 сто11мость: S15000. О

шкале Фаренгейта :

no

677

iВь;::;11С.11-;1т
;/
1.--·---··
·-----·--

Выйr11
РИС.

Окно программы-калькулятора температур

13.46.

5112.5

Выйпt

Окно программы-калькулятора стоимости

недвижимости и налога на нее

5.

Налоr на недвижимость. Территориальный округ собирает налоги на недвижимое иму­
щество, опираясь на оценочную стоимость имущества, которая составляет

ской стоимости недвижимого имущества. Если акр земли оценивается в

60% фактиче­
$1 О ООО, то его

оценочная стоимость составляет

$6000. Налог на имущество в таком случае составит
$0. 75 для каждого $100 оценочной стоимости.Налог на акр, оцененный в $6000, составит
$45.00. Напишите программу с GUI, которая выводит на экран оценочную стоимость

и налог на недвижимое имущество при вводе пользователем фактической стоимости
недвижимого имущества (рис.

6.

13.46).

Авторемонтная фирма "Автоцех". Авторемонтная фирма "Автоцех" предлагает услуги
по регламентному техобслуживанию:



замена масла



смазочные работы



промывка радиатора-



замена жидкости в трансмиссии



осмотр



замена глушителя выхлопа-



перестановка шин

-

-

500.00 руб.;

800.00

-

300.00 руб.;
руб.;

700.00

-

1000.00 руб.;

руб.;

1300.00 руб.;

1300.00 руб.

-

Напишите программу с

GUI

с использованием флаговых кнопок, которые позволяют

пользователю выбирать любые из этих видов услуг. При нажатии пользователем кнопки
должна быть выведена общая стоимость услуг (рис.

о

tk

0

13.47).

х

Замена маСJ\а - 500.00 1?

О Смазочные работь1 -

300.001!'

х

Общая сто11мость

О Промывка рад11атора - 700.00 !?

!;21

Замена ж~-~дкостL·t в трансмиссшt - 1000.00

0 !о.~~iо..;р=~:~воо:оо-~

о Ваши 3ЗТраты :

2300.00 f'

О Замена глушитеп11 выхлопа - ВОО.00 f'
О Перестановка ш11н - 1300.00
ок

Пока3ать стоимость
а

РИС.

13.47.

Окно программы выбора услуг (а) и расчета общей стоимости (б)

б

678

Глава 13. Программирование графического пользовательского интерфейса

7.

Междугородные звонки. Провайдер междугородних звонков взимает плату за телефон­
ные вызовы в соответствии с приведенными в табл.
Таблица

13 .13

тарифами.

13.13
Тариф в минуту, руб.

Категория тарифа

Дневное время (с

6:00 до 17:59)

Вечернее время (с

10

18:00 до 23:59)

Непиковый период (с полуночи до

Напишите приложение с

GUI,

12
5:59)

5

которое позволяет пользователю выбирать категорию

уровня (из набора радиокнопок) и вводить в элемент интерфейса Entry продолжитель­
ность вызова в минутах. Информационное диалоговое окно должно выводить на экран
стоимость вызова (рис.

13.48).

D

tk
О Днееное еремя (б:
Вечернее время

@
(

х

- 1 :59)

(18:

Неnикоеь1й nер~1од

(

х

Общая сто~1мос1'ь

О

Baw11

Jатраты = 324.

- 5:59)
о

Пока?.ать стоимость
а

РИС.

13.48.

f'

б

Программа-тарификатор

8.

Рисунок старого дома. Примените элемент интерфейса Canvas, с которым вы познако­
мились в этой главе, чтобы нарисовать дом. Рисунок дома должен содержать по меньшей

мере два окна и дверь. Можно добавить и другие объекты, такие как небо, солнце и даже
облака (рис.

13.49).
о

х

о

D D
РИС.

13.49.

Нарисованный программой дом

Глава 13. Программирование графического пользовательского интерфейса

9.

679

Возраст дерева. Подсчет годичных колец дерева дает довольно точное представление

о возрасте дерева. Каждое годичное кольцо образуется за один год. Примените элемент

интерфейса Canvas, чтобы показать на рисунке, как могли бы выглядеть годичные коль­
ца 5-летнего дерева.

Затем, используя метод

crea te_ text (), пронумеруйте каждое

годичное кольцо, начиная с центра и далее продолжая наружу, указывая возраст в годах,

связанный с этим кольцом (рис.

13.50).

~ tk

РИС.

о

х

13.50. Подсчет годичных колец дерева

10.

Голливудская звезда. Создайте собственную звезду на Аллее славы в Голливуде.
Напишите программу, которая выводит на экран звезду, похожую на приведенную на

рис.

11.

13.51, с

вашим именем в середине.

Контур транспортного средства. Используя геометрические фигуры, создавать кото­
рые вы научились в этой главе, начертите контур транспортного средства по своему

выбору (автомобиль, грузовик, самолет и т. д.)-рис.
;

-(/

РИС.

13.51.

D

13.52.
о

tk

х

Голливудская звезда

РИС.

13.52.

Контур транспортного средства

х

680

Глава 13. Программирование графического пользовательского интерфейса

12.

Солнечная система. Примените элемент интерфейса

Canvas для создания рисунка всех

планет Солнечной системы. Сначала нарисуйте Солнце, затем остальные планеты в со­
ответствии с расстоянием от него (Меркурий, Венеру, Землю, Марс, Юпитер, Сатурн,
Уран,

Нептун

и

карликовую

надпись, используя метод

'

планету

Плутон).

Возле

о

tk

1е~р~Р з!~!рс
l!енера

Солнце

РИС.

13.53.

каждой

Рисунок Солнечной системы

планеты

create text () (рис. 13.53).

Юпитер

Са турн

Уран

х

Олуrон

Неп ту н

разместите

~

14.1

ипы

нк

ионального программировани

lllllllllll___ КЛЮЧЕВЫЕ ПОЛОЖЕНИЯ
Функциональное программирование представляет собой методику написания программ­
ного обеспечения, в центре внимания которой находятся функции. Функции могут при­

сваиваться переменным, передаваться в другие функции и порождать новые функции.

Python

имеет богатый и мощный арсенал инструментов, которые облегчают разработку

функционально-ориентированных программ.
В последние годы почти все известные процедурные и объектно-ориентированные языки
программирования стали поддерживать средства функционального программирования (ФП).
И язык

Python

не исключение.

Когда говорят о ФП, прежде всего имеют в виду следующее:

+ функции -

это объекты первого класса, т. е. все, что можно делать с "данными", можно

делать и с функциями (вроде передачи функции другой функции в качестве аргумента);

+ использование

рекурсии в качестве основной структуры контроля потока управления.

В некоторых языках не существует иной конструкции цикла, кроме рекурсии;

+ акцент

на обработке последовательностей. Списки с рекурсивным обходом подсписков

часто используются в качестве замены циклов;

+

"чистые" функциональные языки избегают побочных эффектов. Это исключает почти
повсеместно распространенный в императивных языках подход, при котором одной и той
же переменной последовательно присваиваются различные значения для отслеживания
состояния программы;

+ ФП

не одобряет или совершенно запрещает инструкции, используя вместо этого вычис­

ление выражений (т. е. функций с аргументами). В предельном случае, одна программа
есть одно выражение (плюс дополнительные определения);

+ ФП акцентируется на том, что должно быть вычислено, а не как;
+ большая часть ФП использует функции "более высокого порядка"

(функции, оперирую-

щие функциями, оперирующими функциями).
Функциональное программирование представляет собой методику написания программного
обеспечения, в центре внимания которой находятся функции. В парадигме ФП объектами

первого класса являются функции. Они обрабатываются таким же образом, что и любой
другой примитивный тип данных, такой как строковый и числовой. Функции могут полу­

чать другие функции в виде аргументов и на выходе возвращать новые функции. Функции,

682

Глава 14. Основы функционального программирования

имеющие такие признаки, называются функциями более высокого порядка из-за их высокой
выразительной мощи. И вам непременно следует воспользоваться их чудесной выразитель­
ностью.

Программистам чаще приходится работать с последовательностями значений, такими как

списки и кортежи, или же контейнерами, такими как словари и множества. Как правило,
в файлах хранятся большие объемы текстовых или числовых данных, которые затем загру­
жаются в программу в соответствующие структуры данных и обрабатываются.

Python

имеет

богатый и мощный арсенал инструментов, которые облегчают их обработку в функциональ­
ном стиле.

Далее будут представлены несколько таких встроенных функций.

~

ператор

14.2

нкци

~

lambda

т

til

duce

г

е

Прежде чем продолжить, следует познакомиться с еще одним ключевым словом языка

Python.

Он позволяет определять еще один тип функций.

Оператор

lambda

Помимо стандартного определения функции, которое состоит из заголовка функции с клю­
чевым словом

def и блока инструкций, в Python имеется возможность создавать короткие

однострочные функции с использованием оператора lamЬda, которые называются ля.нбда­

функциями. Вот общий формат определения лямбда-функции:
lamЬda

список_аргументов;

В данном

формате

выражение -

выражение

список_аргументов- это

список аргументов,

отделенных

запятой,

значение либо любая порция программного кода, которая в результате дает

значение. Например, следующие два определения функций эквивалентны:

def standard_function(x,
return х + у

у):

и

lamЬda

х,

у:

х

+

у

Но в отличие от стандартной функции, после определения лямбда-функции ее можно сразу
же применить, к примеру, в интерактивном режиме:

>>>

(lamЬda

х,

у:

х+у)

(5, 7)

12
Либо, что более интересно, присвоить ее переменной, передать в другую функцию, вернуть
из функции, разместить в качестве элемента последовательности или применить в програм­
ме, как обычную функцию. Приведенный ниже интерактивный сеанс это отчасти демонст­
рирует. (Для удобства добавлены номера строк.)

1 >>>
2 >>>
3 12

lamЬda

function

=

lamЬda

lamЬda_function(S,7)

х,

у:

х

+

у

Глава 14. Основы функционального программирования

683

4 >>> func = lamЬda f unction
5 >>> func(3,4)
6 7
7 >>> dic = { 'функцияl': lamЬda function}
8 >>> di с [ 1 функция1 1 ] ( 7 ' 8)
9 15
Здесь в строке

1 определяется

лямбда-функция и присваивается переменной, которая теперь

ссылается на лямбда-функцию. В строке

2 она применяется

с двумя аргументами. В строке

4

ссылка на эту функцию присваивается еще одной переменной, и затем, пользуясь этой пере­
менной, данная функция вызывается еще раз. В строке

7

создается словарь, в котором

в качестве значения задана ссылка на эту функцию, и затем, обратившись к этому значению
по ключу, эта функция применяется в третий раз.
Нередко во время написания программы появляется необходимость преобразовать некую

последовательность в другую. Для этих целей в

Python

имеется встроенная функция map.

Функция тар
При написании программы очень часто возникает задача, которая состоит в том, чтобы при­

менить специальную функцию для всех элементов в последовательности. В функциональ­
ном программировании она называется отображением (от англ. тар ).
Встроенная в

Python

функция

map -

это функция более высокого порядка, которая предна­

значена для выполнения именно такой задачи. Она позволяет обрабатывать одну или не­

сколько последовательностей с использованием заданной функции. Вот общий формат
функции

map:

mар(функция,

последовательности)

В данном формате функция -

это ссылка на стандартную функцию либо лямбда-функция,

последовательности- это одна или несколько отделенных запятыми итерируемых после­

довательностей, т. е. списки, кортежи, диапазоны или строковые данные.

1
2
3
4
5
6
7

>>> seq = (1, 2, 3, 4' 5, 6, 7, 8, 9)
>>> seq2 = (5, 6, 7, 8, 9, О, 3, 2, 1)
>>> result = map(lamЬda_function, seq, seq2)
>>> result

>>> list(result)
[ 6, 8, 10, 12, 14, 6, 10, 10, 10]

В приведенном выше интерактивном сеансе в строках

seq и seq2,
присваиваются две итерируемые последовательности. В строке 3 переменной resul t при­
сваивается результат применения функции map, в которую в качестве аргументов были пере­

1

и

2

двум переменным,

даны ранее определенная лямбда-функция и две последовательности. Обратите внимание,
что функция

map

возвращает объект-последовательность

бенность объекта-последовательности

map

map,

о чем говорит строка

5.

Осо­

состоит в том, что он может предоставлять свои

элементы, только когда они требуются, используя ленивые вычисления. Ленивые вычисле­
ния

-

это стратегия вычисления, согласно которой вычисления следует откладывать до тех

пор, пока не понадобится их результат. Программистам часто приходится обрабатывать
последовательности, состоящие из десятков тысяч и даже миллионов элементов. Хранить их

684

Глава 14. Основы функционального программирования

в оперативной памяти, когда в определенный момент нужен всего один элемент, не имеет
никакого смысла. Ленивые вычисления позволяют генерировать ленивые последовательно­

сти, которые при обращении к ним предоставляют следующий элемент последовательности.
Для того чтобы показать ленивую последовательность, в данном случае результат работы
примера, необходимо эту последовательность "вычислить". В строке

6

объект map вычисля­

ется во время преобразования в список.

Функция

filter

Функции более высокого порядка часто используются для фильтрации данных. Языки ФП

предлагают универсальную функцию filter, получающую набор элементов для фильтрации,
и фильтрующую функцию, которая определяет, нужно ли исключить конкретный элемент из

последовательности или нет. Встроенная в

Python

функция filter выполняет именно такую

задачу. В результирующем списке будут только те значения, для которых значение функции

для элемента последовательности истинно. Вот общий формат функции filter:
filtеr(предикативная_функция,

последовательность)

В данном формате предикативная функция- это ссылка на стандартную функцию либо
лямбда-функция, которая возвращает истину либо ложь, последовательность -

это итери­

руемая последовательность, т. е. список, кортеж, диапазон или строковые данные.

Например, в главе

5

была описана функция

is _ even для определения четности числа. Приве­

дем ее еще раз в сжатом виде:

is even =

lamЬda х:

х

% 2 ==

О

Для того чтобы отфильтровать все числа последовательности и оставить только четные,

применим функцию

>>> seq

filter:

(1, 2, 3, 4, 5, 6, 7, 8, 9)
>>> filtered = filter(is_even, seq)
>>> list(filtered)
=

[2, 4, 6, 8]
Приведенный

выше

фрагмент

кода

можно

переписать

по-другому,

поместив

лямбда­

функцию в качестве первого аргумента:

>>> filtered = filter(lamЬda
>>> list(filtered)

х:

х

% 2 ==

О,

seq)

[2, 4, 6, 8]
И снова в обоих случаях функция

filter возвращает ленивый объект-последовательность,

который нужно вычислить, чтобы увидеть результат. В иной ситуации в программе может
иметься процесс, который потребляет по одному элементу за один раз. В этом случае в него

можно подавать по одному элементу, вызывая встроенную функцию

>>> next (filter)
2

>>> next (filter)

4

next.

Глава 14. Основы функционального программирования

685

ПРИМЕЧАНИЕ
Для предотвращения выхода за пределы ленивой последовательности необходимо отслеживать
возникновение ошибки

Stopiteration.

Например,

seq = sequence
try:
total = next(seq)
except Stopiteration:
return

Функция

reduce

Когда требуется обработать список значений таким образом, чтобы свести процесс к един­
ственному результату, используется функция

functools

reduce.

Функция

reduce

находится в модуле

стандартной библиотеки. Чтобы показать, как она работает, приведем ее целиком.

def reduce(fn, seq, initializer=None):
it = iter (seq)
value = next(it) if initializer is None else initializer
for element in it:
value = fn(value, element)
return value
Вот общий формат функции

reduce

(функция,

reduce:

последовательность,

инициализатор)

В данном формате функция- это ссылка на редуцирующую функцию, ею может быть стан­
дартная функция либо лямбда-функция, последовательность- это итерируемая последова­
тельность, т. е. список, кортеж, диапазон или строковые данные, инициализатор- это пара­

метрическая переменная, которая получает начальное значение для накопителя. Начальным

значением может быть значение любого примитивного типа данных либо мутирующий
объект

-

список, кортеж и т. д. Начальное значение инициирует накапливающую перемен­

ную, которая до своего возвращения будет обновляться редуцирующей функцией по каж­
дому элементу в списке.

Переданная при вызове функция вызывается в цикле для каждого элемента последователь­
ности. Например, функция

reduce

может применяться для суммирования числовых значе­

ний в списке. Скажем, вот так:

>>> seq = (1, 2, 3, 4, 5, 6, 7, 8, 9)
>>> get_sum =

Ь: а + Ь
reduce(get_sum, seq)

lamЬda а,

>>> summed

numЬers

>>> summed

numЬers

45
Вот еще один пример. Если

sentences -

это список предложений, и требуется подсчитать

общее количество слов в этих предложениях, то можно написать, как показано в приведен­
ном ниже интерактивном сеансе:

>>> sentences

["Варкалось.",

>>>

"Хливкие шорьки пырялись

>>>

"хрюкотали

зелюки,

по наве,

и",

как мюмзики в мове."]

686

Глава 14. Основы функционального программирования

>>> wsum = lamЬda асс, sentence: асс+ len(sentence.split())
>>> numЬer of words = reduce(wsum, sentences, 0)
>>> numЬer of words
13
В лямбда-функции, на которую ссылается переменная wsum, строковый метод split разбива­
ет предложение на список слов, функция len подсчитывает количество элементов в полу­
чившемся списке и прибавляет его в накапливающую переменную.
В чем преимущества функций более высокого порядка?

+ Они нередко состоят из одной строки.
+ Все важные компоненты итерации - объект-последовательность, операция и возвращае­
мое значение

-

находятся в одном месте.

+ Программный код в обычном цикле может повлиять на переменные, определенные перед
ним или следующие после него. По определению функции более высокого порядка не
имеют побочных эффектов.

+ Они

представляют собой элементарные операции. Глядя на цикл for, нужно построчно

отслеживать его логику. При этом в качестве опоры для создания своего понимания про­
граммного кода приходится отталкиваться от нескольких структурных закономерностей.

Напротив, функции более высокого порядка одновременно являются строительными
блоками, которые могут быть интегрированы в сложные алгоритмы, и элементами, кото­
рые читатель кода может мгновенно понять и резюмировать в уме. "Этот код преобразует
каждый элемент в новую последовательность. Этот отбрасывает некоторые элементы.

А этот объединяет оставшиеся элементы в результат".

+ Они

имеют большое количество похожих функций, которые предоставляют возмож­

ности, служащие дополнением к их основному поведению. Например,

any, all или собст­

венные их версии.

Приведем еще пару полезных функций.

Функция

zip

Встроенная функция zip объединяет отдельные элементы из каждой последовательности
в кортежи, т. е. она возвращает итерируемую последовательность, состоящую из кортежей.

Вот общий формат функции zip:

zip

(последовательность,

последовательность,

В данном формате последовательность кортеж,

диапазон

или

строковые

... )

это итерируемая последовательность, т. е. список,

данные.

Функция

zip возвращает ленивый объект­

последовательность, который нужно вычислить, чтобы увидеть результат. Приведенный
ниже интерактивный сеанс это демонстрирует:

>>> х = 'абв'
>>> у = 'эюя'
>>> zipped = zip(x,
>>> list(zipped)
[('а',

'э'),

('б',

у)

'ю'),

В сочетании с оператором

('в',

*

'я')]

эта функция используется для распаковки объединенной после­

довательности (в виде пар, троек и т. д.) в отдельные кортежи. Приведенный ниже интерак­
тивный сеанс это демонстрирует:

Глава 14. Основы функционального программирования

>>>
>>>

х2,

у2

zip(*zip(x,

=

687

у))

х2

('а',

'б',

'в')

»> у2
( 'э', 'ю', 'я')
>>> х == ' ' .join(x2) and
True

Функция

у

'' .join(y2)

enumerate

Встроенная функция enumerate возвращает индекс элемента и сам элемент последователь­
ности в качестве кортежа. Вот общий формат функции enumerate:
еnumеrаtе(последовательность)

В данном формате последовательность -

это итерируемая последовательность, т. е. список,

кортеж, диапазон или строковые данные. Функция

enumerate возвращает ленивый объект­

последовательность, который нужно вычислить, чтобы увидеть результат.
Например, в приведенном ниже интерактивном сеансе показано применение этой функции

к списку букв. В результате ее выполнения будет получена ленивая последовательность со
списком кортежей, где каждый кортеж представляет собой индекс и значение буквы.

1 >>> lazy = enumerate(('a',
2 »> list (lazy)
З

((0,

'а'),

В строке

2

'б'),

(1,

(2,

'б', 'в'])

'в')]

применена функция list, которая преобразут ленивую последовательность

в список. Функция enumerate также позволяет применять заданную функцию к каждому
элементу последовательности с учетом индекса:

1 >>> convert = lamЬda tup: tup(l] .upper() + str(tup[O])
2 >>> lazy = map(convert, enumerate(('a', 'б', 'в']))
З >» list (lazy)
4 ( 'АО' ,

'Бl'

Функция

convert в строке 1 переводит строковое значение второго элемента кортежа

,

'В2'

]

в верхний регистр и присоединяет к нему преобразованное в строковый тип значение перво­
го элемента. Здесь

tup -

это кортеж, в котором

tup [о J -

это индекс элемента,

tup [ 1 J -

строковое значение элемента.

111111111111

14.3

.....

Операции отображения и фильтрации встречаются так часто, что во многих языках про­
граммирования предлагаются способы написания этих выражений в более простых формах.
Например, в языке
sguared_numЬers

=

Python
[х*х

возвести список чисел в квадрат можно следующим образом:

for

х

in

numЬers]

Python поддерживает концепцию под названием "включение в последовательность" (от англ.
comprehension, в информатике эта операция также называется генератором последователь­
ности или описанием последовательности), которая суть изящный способ преобразования

Глава 14. Основы функционального программирования

688

одной последовательности в другую. Во время этого процесса элементы могут быть условно
включены и преобразованы заданной функцией. Вот один из вариантов общего формата
включения в список, или спискового включения:

for

[выражение

переменная

in

список

В данном общем формате выражение которые

возвращают

значение,

if

выражение2]

это выражение или функция с участием переменной,

переменная

-

это обрабатываемый список, и выражение2 -

это

элемент

последовательности,

список

-

это логическое выражение или предикативная

функция с участием переменной. Для того чтобы все стало понятно, приведем простой при­
мер возведения списка в квадрат без условия:

[1, 2, 3, 4, 5]
= [х*х for

>>>

nшnЬers

>>>

squared_numЬers

>>>

squared_nшnЬers

=

х

in

numЬers]

[1, 4, 9, 16, 25]
Приведенное выше списковое включение эквивалентно следующему фрагменту программ­
ного кода:

>>>

squared_numЬers

[]

х

>>>

squared_nшnЬers.append(x*x)

>>>

in

=

>>> for

numЬers:

squared_nшnЬers

[1, 4, 9, 16, 25]
Такая форма записи называется синтаксическим сахаром, т. е. добавленная синтаксическая
конструкция, позволяющая записывать выражения в более простых и кратких формах.
Полезное свойство конструкций включения в последовательность состоит еще и в том, что
они легко читаются на обычном языке, благодаря чему программный код становится чрез­
вычайно понятным.

В конструкции включения в последовательность используется математическая запись по­
строения последовательности. Такая запись в теории множеств и логике называется опреде­
лением интенсионала множества и описывает множество путем определения условия, кото­

рое должно выполняться для всех его членов. В сущности, в терминах этих областей науки,
выполняя данную операцию в

Python,

мы "описываем интенсионал" соответственно списку,

словарю, множеству и итерируемой последовательности. В табл.
Таблица

14.1.

for

{х:х*х
{х*х

х

for

for

х

set(x*x for
(х*х

for

х

приведены примеры.

Формы описания интенсионала

Выражение
[х*х

14.1

Описание

in

nшnЬers]

in

х

in
х

in

nшnЬers}

nшnЬers}

in

Описание списка

Описание словаря
Описание множества

nшnЬers)

nшnЬers)

Описание последовательности. Такая форма записи создает генератор последовательности. Генератор

-

это объект, который можно

последовательно обойти (обычно при помощи инструкции

for),

но чьи значения предоставляются только тогда, когда они требуются,
с помощью ленивого вычисления

Глава 14. Основы функционального программирования

689

Отметим, что приведенные в таблице выражения (за исключением описания словаря) отли­
чаются только ограничивающими символами: квадратные скобки применяются для описа­
ния списка, фигурные скобки

-

для описания словаря или множества и круглые скобки

-

для описания итерируемой последовательности.

Таким образом, примеры из разделов о функциях

map и fil ter легко можно переписать

с использованием включения в последовательность. Например, в строке

ниже интерактивного сеанса вместо функции

1
2
3
4
5

3

приведенного

map применено списковое включение:

>>>
>>>
>>>
>>>

seq = (1, 2, 3, 4, 5, 6, 7, 8, 9)
seq2 = (5, 6, 7, 8, 9, О, 3, 2, 1)
result = [х + у for х, у in zip(seq, seq2)]
result
(6, 8, 10, 12, 14, 6, 10, 10, 10]

Обратите внимание на квадратные скобки в определении

-

они сигнализируют, что в ре­

зультате этой операции будет создан список. Также стоит обратить внимание, что при
использовании в данной конструкции нескольких последовательностей применяется встро­

енная функция

zip, которая в данном случае объединяет соответствующие элементы каждой

последовательности в двухэлементные кортежи. (Если бы последовательностей было три, то
они объединялись бы в кортежи из трех элементов и т. д.)
Списковое включение применено и в приведенном ниже примере вместо функции

>>> result =
>>> result
(2, 4, 6, 8]



for

х

filter:

in seq if is_even(x)]

Квадратные скобки в определении сигнализируют, что в результате этой операции будет
создан список. Какой способ обработки последовательностей применять

-

с использовани­

ем функций более высокого порядка или включений, зачастую является предметом личных
предпочтений.

~

14.4
~

Зам

ание

Функции более высокого порядка не только получают функции на входе, но и могут порож­
дать новые функции на выходе. Кроме того, они в состоянии запоминать значения из своего
лексического контекста, даже когда поток управления программы больше не находится
в этом контексте. Это называется лексическим замыканием, или просто замыканием. Функ­
ция, имеющая замыкание, может "запоминать" и получать доступ к среде вложенных в нее
значений.

Используя замыкания, можно разделить исполнение функции со многими аргументами на
большее количество шагов. Эта операция называется каррингом. Карринг (или каррирова­
ние,

curring) -

это преобразование функции многих аргументов в функцию, берущую свои

аргументы по одному. Например, предположим, ваш программный код имеет приведенную

ниже стандартную функцию

def adder (n, m) :
return n + m

adder:

690

Глава 14. Основы функционального программирования
Для того чтобы сделать ее каррированной, она должна быть переписана следующим об­
разом:

def adder (n) :
def fn (m):
return n + m
return fn
Это же самое можно выразить при помощи лямбда-функций:

adder

=

lamЬda

Обратите

n:

lamЬda

внимание,

что

m: n + m
в

последнем

примере

используются две

вложенные лямбда­

функции, каждая из которых принимает всего один аргумент. В такой записи функция

adder
adder (3) возвращает не
число, а новую, каррированную функцию. Во время вызова функции adder со значением 3

теперь может быть вызвана всего с одним аргументом. Выражение

в качестве первого аргумента ссылка на значение

3 запоминается

в каррированной функции.

А дальше происходит следующее:

>>> sum three
adder(3)
>>> sum three

>>> sum_three(l)
4
В приведенном выше примере каррированная функция

adder (3) присваивается переменной
sum_ three, которая теперь на нее ссылается. Если вызвать функцию sum_ three, передав ей

второй аргумент, то она вернет результат сложения двух аргументов

3 и 1.

Замыкания также используются для генерирования набора связанных функций по шаблону.
Использование шаблона функции помогает делать программный код более читаемым и из­
бегать дублирования. Давайте посмотрим на приведенный ниже пример:

def power_generator(base):
return lamЬda х: pow(x, base)
Функция

power generator может применяться для генерации разных функций, которые вы­

числяют степень:

>>> square = power_generator(2)
>>> square(2)

#

функция возведения

в

квадрат

#

функция возведения

в

куб

4

>>> cube = power_generator(3)
>>> cube(2)
8
Отметим, что функции

square и cube сохраняют значение переменной base. Эта переменная
power_generator, несмотря на то, что эти возвращенные функ­
ции абсолютно независимы от функции power generator. Напомним еще раз: замыкание существовала только в среде

это функция, которая имеет доступ к некоторым переменным за пределами собственной
среды.

Замыкания могут также использоваться для управления внутренним состоянием функции.
Давайте предположим, что требуется функция, которая накапливает сумму всех чисел, кото-

Глава 14. Основы функционального программирования

691

рые ей предоставляются. Один из способов это сделать состоит в использовании глобальной
переменной:

COUNT = О
def count_add(x):
global COUNT
COUNT += х
return COUNT
Как мы убедились, применения глобальных переменных следует избегать, потому что они
загрязняют пространство имен программы. Более чистый подход состоит в использовании

замыкания, чтобы включить ссылку на накапливающую переменную:

def make adder():
n

=

О

def fn (х):
nonlocal n
n +=

х

return n
return fn
Такой подход позволяет создавать несколько счетчиков без применения глобальных пере­
менных. Обратите внимание, что в этом примере использовано ключевое слово

nonlocal,
которое объявляет, что переменная n не является локальной для вложенной функции fn.
В приведенном ниже интерактивном сеансе показано, как это работает:

>>> my_adder = make_adder()
>>> print(my_adder(5))
#напечатает 5
>>> print(my_adder(2))
# напечатает 7 (5 + 2)
>>> print(my_adder(З))
# напечатает 10 (5 + 2 + 3)
5
7

10
Некоторые языки программирования строго функциональны; весь код эквивалентен чистым
математическим функциям. Эти языки заходят настолько далеко, что являются вневремен­
ными, причем порядок операторов в программном коде не вмешивается в поведение кода.

В этих языках все присвоенные переменным значения могут изменяться, т. е. мутировать.

Программисты называют это однократным присваиванием. Поскольку состояние програм­
мы отсутствует, то и нет момента времени, когда переменная может измениться. Вычисле­

ния в строгой функциональной парадигме просто сводятся к вычислению функций и сопос­
тавлению с шаблоном.

~

14.5
111111111111

нк

ио

ное я

оп

о

а

на основе конвеие

а

Функциональный стиль программирования очень близок к тому, как размышляет человек во
время решения задачи. "Пусть дано х. Для того чтобы решить задачу, необходимо выпол­

нить с этими данными серию преобразований. Сначала применить к ним функцию /и полу­
чить результирующие данные х'. Затем применить к новым данным другую функцию,
и получить новые результирующие данные х" и т. д."

}2,

692

Глава 14. Основы функционального программирования

Как оказалось, такой образ мыслей отлично укладывается в то, что называется конвейеро.ч

обработки данных. Конвейер обработки данных состоит из связанных между собой узлов,
т. е. функций. Узел характеризуется набором входных и выходных каналов, по которым мо­
гут передаваться объекты. Узел ожидает появления определенного набора объектов на своем
входном канале, после чего проводит вычисления и порождает объект (объекты) на своем
выходном канале, которые передаются в следующий узел в конвейере.

В функциональных языках конвейеры находят широкое применение, и для их реализации
даже существуют специальные синтаксические конструкции. Вот как выглядит конвейер

в языке

F#:

2

1>
1>
1>

fun
fun
fun

х
х
х

-> х + 5)
-> х * х)
-> x.ToString()

Здесь входные данные, в нашем случае число

2,

последовательно обрабатываются серией

лямбда-функций. Аналогичный конвейер можно реализовать на языке

Python,

но для этого

нужно написать специальную функцию, и, разумеется, это будет функция более высокого
порядка:

#

Конвейер обработки данных

def pipe(data, *fseq):
for fn in fseq:
data = fn(data)
return data
Приведенный ниже пример демонстрирует работу конвейера:

pipe(2,
х:

х

lamЬda

х:

х

lamЬda

х:

Число

'49'.

+ 5,
* х,
str (х))

lamЬda

2

проходит серию преобразований, и в результате будет получено строковое значение

По сравнению с функцией

reduce, в которой переданная в качестве аргумента одна­

единственная редуцирующая функция по очереди применяется к последовательности дан­
ных, в функции

pipe, наоборот, последовательность функций применяется к обновляемым

данным.

Функция

pipe получает два аргумента: входные данные data и последовательность функ­
ций fseq. Во время первой итерации цикла for данные передаются в первую функцию из
последовательности. Эта функция обрабатывает данные и возвращает результат, замещая
переменную

data

новыми данными. Затем эти новые данные отправляются во вторую функ­

цию и т. д. до тех пор, пока не будут выполнены все функции последовательности. По за­
вершению своей работы функция

pipe возвращает итоговые данные. Это и есть конвейер

обработки данных.
ПРИМЕЧАНИЕ
В приведенном выше примере функции
контекста оператор

*

pipe

использован оператор упаковки

*.

В зависимости от

служит для упаковки получаемых нескольких аргументов в одну параметри­

ческую переменную либо распаковки списка передаваемых в функцию арrументов.

Глава 14. Основы функционального программирования

693

Когда он используется в параметре функции, как в приведенном выше примере, он служит
для упаковки всех аргументов в одну параметрическую переменную. Например,

def my_sum(*args): #
return sum(args)

Упаковка в

список

my_sum (1, 2, 3, 4, 5)
Когда он используется при вызове функции, он служит для разложения передаваемого
списка на отдельные аргументы. Например,

def fun(a, Ь, с, d):
print(a, Ь, с, d)
my_list = [1, 2, 3, 4]
fun(*my_list) # Разложение

на четыре аргумента

В следующих рубриках "В центре внимания" будут рассмотрены примеры использования

конвейера обработки данных на основе функциональной парадигмы программирования.

Функциональная реализация вычисления факториала числа
В главе

12,

посвященной рекурсии, была приведена рекурсивная реализация алгоритма на­

хождения факториала числа. В приведенном далее примере показана нерекурсивная версия
алгоритма вычисления факториала

(factorial) и его рекурсивная версия на основе более
эффективной хвостовой рекурсии (factorial_rec). Детали реализации обеих функций
в данном случае не важны. Они приводятся в качестве примеров, на которых будет проде­

монстрирована работа конвейера обработки данных. Результат выполнения программы по­
казан ниже.

Программа 14.1
1 #
2 #

] (factorial_functional.py)

Эта программа демонстрирует
функциональную версию функции

factorial

из главы

12

3

4 def main () :
# Конвейер (ядро с нерекурсивным алгоритмом факториала)
5
6
pipe(int(input('Bвeдитe неотрицательное целое число: ')),
7
lamЬda n:
(n, reduce(lamЬda х, у: х *у, range(l, n + 1))),
8
lamЬda tup:
9
рrint(f'Факториал числа (tup[O]} равняется (tup[l] }'))
# Вызвать
main ()

главную функцию

Вывод программы
Введите неотрицательное целое число :
Факториал числа

4

равняется

24

4 (Enter)

694

Глава 14. Основы функционального программирования
В строке

8 лямбда-функция

в последнем узле конвейера получает кортеж, состоящий из вве­

денного пользователем числа и полученного результата.

В приведенную ниже расширенную версию программы вычисления факториала добавлена
валидация входных данных, и алгоритмы выделены в отдельные функции. Чуть позже будет
дано пояснение.

Программа

1 #
2 #

14.2

(factorial_functional2.py)

Эта программа демонстрирует
функциональную версию функции

factorial

из

главы

12

3
4 def get_int(msg=' '):
5
return int(input(msg))
6

7 def main () :
8
#Алгоритм 1. Рекурсивная
9
def factorial rec(n):
10
fn = lamЬda n, acc=l:
11
return n, fn(n)
12
13
14

return n,

17
18
19

#Ввод данных

22
23
24
25
26

асс

# Алгоритм 2. Нерекурсивная
def factorial(n):

15
16

20
21

версия

#

if n --

О

else fn(n - 1,

х,

у:

х

*у,

range(l, n + 1))

Валидация входных данных

if not isinstance(n, int):
raise ТуреЕrrоr("Число

должно быть

целым.")

if not n >= О:
raise ValueError("Чиcлo должно быть >=
return n
msg = 'Введите неотрицательное целое число:
return pipe(get_int(msg), validate)

О.")

27

28
29
30
31
32
33
34
35
36
37
38
39

# Вывод данных
def outdata():
def fn(data):
n, fact = data
рrint(f'Факториал числа

{n}

равняется

{fact}')

return fn
# Конвейер (функциональное
pipe (indata (),
# вход:
factorial,
outdata())

асс

версия

reduce(lamЬda

def indata():
def validate(n):

с хвостовой рекурсией

ядро)

-

выход:

int

#

вход:

int

выход:

кортеж

#

вход:

кортеж

выход:

-

* n)

Глава 14. Основы функционального программирования

1

695

40 # Вызвать главную функцию
41 main ()
Вывод программы
Введите неотрицательное целое число :

4

Факториал числа

равняется

4 (Enter)

24

Функциональным ядром программы

14.2 являются

строки

36-38:

pipe(indata(),
factorial,
outdata())
Они представлены конвейером из трех узлов, т. е. функциями indata, factorial и outdata.
Функция

indata занимается получением данных от пользователя, которые затем передаются
factorial является собственно обрабатывающим алгорит­

по конвейеру дальше. Функция

мом, в данном случае нерекурсивной функцией вычисления факториала, которая получает
данные, их обрабатывает и передает по конвейеру дальше. И функция outdata получает
данные и показывает их пользователю. Обратите внимание, что функция indata имеет соб­
ственный конвейер, который состоит из получения данных от пользователя и их валидации.

Следует отметить два важных момента. Во-первых, передаваемые от узла к узлу данные
должны соответствовать какому-то определенному протоколу. Во-вторых, количество узлов

может быть любым.
Такая организация программного кода:

+ позволяет менять узлы конвейера на другие с целью тестирования различных и более эф­
фективных реализаций алгоритмов. Например, вместо нерекурсивной функции factorial
можно поместить рекурсивную функцию

factorial _ rec.

pipe(indata(), factorial rec, outdata())

+ облегчает проведение отладки программы, позволяя на каждом стыке вставлять отладоч­
ный код с целью проверки промежуточных результатов и тестирования производитель­
ности отдельных узлов.

Например, рассмотрим вторую возможность

вспомогательную функцию

-

отладку. В этом случае можно написать

check:

def check(data):
print(data)
return data
И затем ее вставить в конвейер, чтобы проверить результаты работы отдельных узлов кон­
вейера:

pipe(indata(), check, factorial, check, outdata())
Если выполнить программу в таком варианте, то будут получены следующие результаты.
Вывод программы
Введите

неотрицательное целое

4

(4 , 24)
Факториал числа

4

равняется

24

число :

4 (Enter)

696

Глава 14. Основы функционального программирования

Как видно из результатов, на вход в функцию
значение

4, а на выходе
(4, 24). Этот

зультатом

factorial поступает введенное пользователем

из нее возвращается кортеж с исходным числом и полученным ре­

результат показывает, что программа работает, как и ожидалось.

Альтернативно вместо проверочной функции можно написать функцию-таймер, которая
могла бы хронометрировать отдельные узлы конвейера.

ПРИМЕЧАНИЕ
В приведенном выше примере в функции

outdata применен форматированный строковый лите­
3.6 вводит функционал форматированных строковых литералов,
которые предваряются буквой "f'. Синтаксис форматирования аналогичен методу форматирова­
ния строковых данных методом str. format (). Строковое значение содержит одно или несколько
рал f-string.

Python

версии

полей для замены, встроенных в строковый литерал. Поля, которые нужно заменить, окружены

фигурными скобками

{ }.

Фигурные скобки и "код" внутри будут заменены отформатированным

значением одного из аргументов. Все остальное, что не содержится в фигурных скобках, будет
напечатано без каких-либо изменений. Поля для замены представляют собой выражения, кото­
рые вычисляются во время выполнения, а затем форматируются с использованием протокола
метода

format

().Это проще всего понять на конкретном примере:

>>> price = 11.23
>>>
Цена

f"Цена
в

в

евро:

евро:

9.77

{price}"

Приведем еще пару примеров с аналогичной организацией программного кода на основе

функционального ядра в видеконвейера.

Функциональная реализация вычисления

последовательности Фибоначчи
Программа

#
#

14.3

(fibonacci_functional.py)

Эта программа демонстрирует
функциональную версию функции

fibonacci

из главы

12

def main():
# Алгоритм
def fibonacci(n, х=О, y=l):
# Функция fib возвращает n-e число последовательности.
fib = lamЬda n, х=О, y=l: х if n 10:
raise Valt1eError("Чиcлo

быть

целым.")

должно

быть

нулем или

положительным.")

должно

быть

не

10.")

больше

return n
# Ввод данных
def indata():
msg = 'Введите неотрицательное целое
return pipe(get int(msg), validate)
#

число

не

больше

10: '

Вывод данных

def outdata ():
def fn (data):
n, seq = data
msg = f'Первые {n)
print(msg)

чисел

последовательности Фибоначчи:'

[print(el) for el in seq]
return fn
# Конвейер (функциональное ядро)
pipe(indata(), fibonacci, outdata())

1

1

Вызвать главную функцию.

#
main ()

Вывод nроrраммы
Введите неотрицательное целое число не больше
Первые

1
1

2
3
5
8

13
21
34
55

10

чисел последовательности Фибоначчи :

10 : 10 (Enter)

697

Глава 14. Основы функционального программирования

698

Функциональная реализация
суммирования диапазона значений последовательности

Программа 14.4
#
#

1

(range_sum_functional.py)

Эта программа демонстрирует
функциональную версию функции

range_sum

из главы

12

def main ():
#

Алгоритм

def range sum(data):
seq, params = data
fn = lamЬda start, end:

О

if start > end \
else seq[start] + fn(start + 1, end)

return fn(*params)
#

Ввод данных

def indata():
seq = [ 1, 2, 3, 4, 5, 6, 7 , 8, 9]
params = (2,5)
# params - это параметры start, end
return seq, params
#

Вывод данных

def outdata () :
def f (data) :
msg = 'Сумма значений со 2 по 5 позицию
print(msg, format(data), sep=' ')
return f

равняется

'

# Конвейер (функциональное ядро)
pipe(indata(), range sum, outdata())
# Вызвать
main ()

главную функцию.

Вывод программы
Сумма значений со

2

по

5

позицию равняется

18

Приведенный в настоящей главе материал имеет ознакомительный характер и предназначен

для того, чтобы продемонстрировать возможности функциональной парадигмы программи­
рования на

Python

с целью дальнейших самостоятельных исследований и побудить начи­

нающих программистов заняться языком

Python

углубленно. Вопросы для повторения в на­

стоящей главе отсутствуют, а некоторые расширенные возможности языка

Python,

такие как

мемоизация, ленивые вычисления, генераторы, сопоставление с шаблоном, мультиметоды и
прочие темы, не рассмотрены. Основная задача этой главы

Python

-

познакомить с возможностями

по работе с функциями, которыми можно манипулировать точно так же, как и лю­

быми другими объектами: присваивать переменным, передавать в качестве аргументов
в другие функции, возвращать из функций и включать в последовательности в качестве их
элементов.

Ска

а Р

ние

thon

Для того чтобы выполнить приведенные в этой книге программы, вам потребуется устано­
вить

Python 3.0 или более позднюю версию. Вы можете скачать последнюю версию Python
www.python.org/downloads. В этом приложении рассматривается процесс уста­
новки Python в операционной системе Windows. Python также доступен для Мае OS Х, Linux
и некоторых других платформ. Ссылки на скачивание версий Python, предназначенных
для этих операционных систем, приводятся на сайте для скачивания Python по адресу
www.python.org/downloads.
по адресу

СОВЕТ
Следует иметь в виду, что существует два семейства языка

Python

З.х и

Установка Р

Python

Python,

которые вы можете скачать:

2.х. Программы в этой книге работают только с семейством

thon

З.х в

Python

З.х.

Windows

Когда вы посетите сайт для скачивания

www.python.org/downloads, вам
необходимо скачать последнюю из имеющихся версий Python 3.х. На рис. Пl .1 показано, как
выглядела веб-страница сайта, с которой можно скачать Python, в момент написания этого
приложения. Как видно из рисунка, последней версией в это время был Python 3.6.4.
Python

по адресу

После того как вы скачали установщик

Python, следует его запустить. На рис. П 1.2 пред­
Python 3.6.4. Настоятельно рекомендуем поставить флажки напротив
обеих опций внизу экрана: Install launcher for all users (У становить средство запуска для
всех пользователей) и Add Python 3.х to РАТИ (Добавить Python 3.х в системный путь).
Сделав это, щелкните по ссылке Install Now (У становить сейчас).
ставлен установщик

Появится сообщение

"Do you want to allow this

арр

to make changes to your device?"

(Хотите

разрешить этому приложению внести изменения в ваше устройство?) Нажмите кнопку Да,
чтобы продолжить установку. Когда процесс установки завершится, вы увидите сообщение

"lnstallation was successful."

(Установка завершилась успешно). Нажмите на кнопке закрытия

окна для выхода из установщика.

700

Приложение 1. Установка языка Python

РИС. П1.1. Скачайте последнюю версию языка

L':,io Р

hon 3.6.4

(6·.\-Ьit)

Python

х

Setup

lnstall Python 3.6.4 (64-bit)
Select 1 stall O'.'J о install
о \'1ith de'ault se ings. or
Cus oмize о е аЫе or disaЫe 'eatures.

са

Prcg

ам

Р

n

с

oose

llon

--7 Custon' ze ·'1sta latl0'1
~hoose оса ~1'

pyth n
~

wind ws
РИС. П1 .2. Установщик

Python

0

anCI

· еа»иеs

ns all la nc er 'or all users (recom

0Add Ру ho

3.6 to РТ

ended)
Cancel

IDLE (lntegrated Development Environment) -

это интегрированная среда разработки, кото­

рая сочетает в одной программе несколько инструментов разработки, в том числе:

+ оболочку
Python

Python,

работающую в интерактивном режиме. Можно набирать инструкции

напротив подсказки оболочки и сразу же их исполнять. Кроме того, можно вы­

полнять законченные программы

+ текстовый

Python;

редактор, который выделяет цветом ключевые слова

Python

и другие части

программ;

+ модуль проверки, который проверяет программу Python на наличие синтаксических оши­
бок без выполнения программы;

+ средства поиска, которые позволяют находить текст в одном или нескольких файлах;
+ инструменты форматирования текста, которые помогают поддержать в программе Python
единообразные уровни отступов;

+ отладчик,

который позволяет выполнять программу

в пошаговом режиме и сле-

Python

дить за изменением значений переменных по ходу исполнения каждой инструкции;

+ несколько других продвинутых инструментов для разработчиков.
Среда
среда

IDLE
IDLE

поставляется в комплекте с

введение в среду

граммы

Python.

Во время установки интерпретатора

IDLE

и описание основных шагов создания, сохранения и выполнения про­

Python.

боло

IDL
После того как

Python

был установлен в вашей операционной системе, в списке программ

меню Пуск операционной системы появится группа программ
в группе программ будет озаглавлен

IDLE (Python

этого окна интерпретатор

Python

Python.

Один из элементов

3.х 64(32)-Ьit). Для запуска

ните по этому элементу, и вы увидите окно оболочки

Python

3.х

Shell

Подсказка



щелк­

выполняется в интерактивном режиме. Вверху окна распо­

IDLE.

говорит о том, что интерпретатор ожидает от вас ввода инструкции

Когда вы набираете инструкцию напротив подсказки»> и нажимаете клавишу

инструкция

IDLE

(рис. П2.1 ). Внутри

ложена строка меню, которая предоставляет доступ ко всем инструментам

Python

Python

устанавливается автоматически. В этом приложении предоставлены краткое

немедленно

исполняется.

Например, на рис. П2.2

показано

Python.
, эта

окно оболочки

после того, как были введены и исполнены три инструкции.

Когда вы набираете начало многострочной инструкции, в частности инструкцию i f или
цикл,

каждая

последующая

строка автоматически

располагается

с

отступом.

Нажатие

702

Приложение

2.

l!-

Введение в среду

P;1hon 3.б.J Shell

File

Edit

PL-,;;ho:":
6~

Shell
з.t."

Ь1~

х

о

Debug
t ··з . t

(J.М~i , );

~y=.:..-;::t. 11 ,

:yp'I!: " ...

.>>

IDLE

Opt1ons

, •1ndow

Help

. .:::1.;.:~c~t, :~с_!--.::_"", ~t :5t;:"%: )
:: ~1::3:
"-=re d.:..:-.! " с. .: t•:.:...:e::"er}" ! :: rr.:rre-

МS1:

" __ ;J)

lntorП".at,,:.:.::

З

ln:
РИС. П2.1. Окно оболочки

l_..

.

1

Col J

IDLE
Р hon З.б.4 Shell

File

Ed1t

Shell

fy~:'l·::

3. i . ~

€-1 b 1t.

( АН

"'"'

::r~~

о

Debug

Opt1ons

'i1ndo w

(•J3 . 6.~:j~:e-el::,

i-SJ j

х

Help

е~

-~: :о _-,

jt: :S~:, :1

:11s.:

·-.~S

?
@
А
в

с

D
Е

F
G

72
73
74
75
76

н

77

м

1

J
к

L

о
р

Q
R

s
т

u
v

w
х
у

z
[
\

]
л

а

ь
с

d
е

f
g

о
р

q
r

s
t
и

v

w
х
у

z
{
1

}

DEL

В табл. П4.1 перечислены предопределенные названия цветов, которые могут использовать­
ся с библиотекой черепашьей графики, пакетами

matplotlib

и

tkinter.

Таблица П4.1

'snow'

'ghost white'

'white smoke'

'gainsboro'

'floral white'

'old lace'

'linen'

'antique white'

'рарауа

'Ьisque'

'peach puff'

'navajo white'

'lemon chiffon'

'mint cream'

'azure'

'alice

'lavender'

almond'

'Ьlanched

Ыuе'

whip'

'misty rose'

'dark slate gray'

'dim gray'

'slate gray'

'light slate gray'

'gray'

'light grey'

'midnight

'navy'

'cornflower

'lavender

'slate

Ыush'

Ыuе'

'medium slate

'medium

Ыuе'

'royal

'dodger

Ыuе'

'deep sky

'light sky
'light

Ыuе'

Ыuе'

Ыuе'

'steel

Ыuе'

Ыuе'
Ыuе'

Ыuе'

'powder

Ыuе'

Ыuе'

'dark slate
'light slate

Ыuе'
Ыuе'

'Ыuе'

'sky

Ыuе'

'light steel

Ыuе'

'pale turquoise'

'medium turquoise'

'turquoise'

'cyan'

'light cyan'

'cadet

'medium aquamarine'

'aquamarine'

'dark green'

'dark olive green'

'dark sea green'

'sea green'

'medium sea green'

'light sea green'

'pale green'

'spring green'

'lawn green'

'medium spring green'

'green yellow'

'lime green'

'yellow green'

'forest green'

'olive drab'

'dark khaki'

'khaki'

'pale goldenrod'

'light goldenrod yellow'

'light yellow'

'yellow'

'gold'

'dark turquoise'
~

Ыuе'

71 О

Приложение 4. Предопределенные именованные цвета

Таблица П4.1

(продолжение)

'light goldenrod'

'goldenrod'

'dark goldenrod'

'rosy brown'

'indian red'

'saddle brown'

'sandy brown'

'dark salmon'

'salmon'

'light salmon'

'orange'

'dark orange'

'coral'

'light coral'

'tomato'

'orange red'

'red'

-

--

-----

-

----- -

'hot pink'

1
1

---------·-

'deep pink'

'pink'

'pale violet red'

'maroon'

'violet red'

'medium orchid'

'light pink'

1

·---- -------

'medium violet red'
'dark orchid'

1

-----·-

--

'dark violet'

'Ыuе

violet'

'purple'

'medium purple'

'thistle'

'snow2'

'snowЗ'

'snow4'

'seashell2'

'seashellЗ'

'seashell4'

'AntiqueWhite2'

'AntiqueWhiteЗ'

'Ьisque2'

'ЬisqueЗ'

'PeachPuff2'

'PeachPuffЗ'

- -

---

1
t

-----

------

'AntiqueWhitel'
'AntiqueWhite4'
- - -

- - - -

'Ьisque4'

'PeachPuff4'

~

1

'NavajoWhite2'

'NavajoWhiteЗ'

'NavajoWhite4'

'LemonChiffon2'

'LemonChiffonЗ'

'LemonChiffon4'

'cornsilk2'

'cornsilkЗ'

'ivory2'

'ivoryЗ'

'honeydew2'

'honeydewЗ'

'LavenderBlush2'

'LavenderBlushЗ'

- -

----'cornsilk4'

- - - -

'ivory4'
- - -

----

---

- - - - -

'honeydew4'
------

r 'LavenderBlush4'
- ---

- - - - - - - -

~

'MistyRose2'

'MistyRoseЗ'

'azure2'

'azureЗ'

'MistyRos~ _____

1
1

'azure4'

---

'SlateBluel'

'SlateBlue2'

'SlateВlu~-- ___

------~--

'SlateBlue4'

'RoyalBluel'
- - - - -f---

'RoyalBlueЗ'

-- -

~

----

-----

---

---

'DodgerBlue4'

------

----

'Roya1Blue4'

'Ыuе2'

'DodgerBlue2'

'DodgerBlueЗ'

-

-----------

---

--

- - -

-

'SteelBlueЗ'

~~----

- -

tee1Вlue4'

- - - - - - - -

---

--

--

'SkyBlue2'
-------

------------

----------- ----

-1
'

----

'LightSkyВluel'

'LightSkyBlue4'

1

-

'DeepSkyBlueЗ'

---

~~

----------

1

- - - -

-

------

-----

---·

---------

---

'SlateGrayl'
----

-

-

-----

l --

----т

'LightSkyВlue2'

1 'SlateGray4'

-

--

-

-

-

--

--

---

--

-

'SkyBlue4'

------------- --

- -

-

'SkyBluel'

'SkyBlueЗ'

---

--

- - - -

'DeepSkyBlue2'

- - - - ------·-----· -----

'DeepSkyBlue4'
--

----

-

'SteelBlue2'

~teelBluel'

------------

'SlateGrayЗ'

-------

---

'Ыuе4'

--

------

'RoyalBl ue2'

----------

-------- ---

- - - -

--

--·

----

--

l

- - - -

-----

--

--

---

'LightSkyBlueЗ'
-----

-

-

-

'SlateGray2'
---

--

----

- -

'LightSteelBluel'

--·

----

-

Приложение 4. Предопределенные именованные цвета
Таблица П4.1

711

(продолжение)

'LightSteelBlue2'

'LightSteelBlueЗ'

'LightSteelBlue4'

'LightBluel'

'LightBlue2'

'LightBlueЗ'

'LightBlue4'

'LightCyan2'

'LightCyanЗ'

'LightCyan4'

'PaleTurquoisel'

'PaleTurquoise2'

'PaleTurquoiseЗ'

'PaleTurquoise4'

'CadetBluel'

'CadetBlue2'

'CadetBlueЗ'

'CadetBlue4'

'turquoisel'

'turquoise2'

'turquoiseЗ'

'turquoise4'

'cyan2'

'суаnЗ'

'cyan4'

'DarkSlateGrayl'

'DarkSlateGray2'

'DarkSlateGrayЗ'

'DarkSlateGray4'

'aquamarine2'

'aquamarine4'

'DarkSeaGreenl'

'DarkSeaGreen2'

'DarkSeaGreenЗ'

'DarkSeaGreen4'

'SeaGreenl'

'SeaGreen2'

'SeaGreenЗ'

'PaleGreenl'

'PaleGreen2'

'PaleGreenЗ'

'PaleGreen4'

'SpringGreen2'

'SpringGreenЗ'

'SpringGreen4'

'green2'

'greenЗ'

'green4'

'chartreuse2'

'chartreuseЗ'

'chartreuse4'

'Oli veDraЫ'

'OliveDrab2'

'OliveDrab4'

'DarkOliveGreenl'

'DarkOliveGreen2'

'DarkOliveGreenЗ'

'DarkOliveGreen4'

'khakil'

'khaki2'

'khakiЗ'

'khaki4'

'LightGoldenrodl'

'LightGoldenrod2'

'LightGoldenrodЗ'

'LightGoldenrod4'

'LightYellow2'

'LightYellowЗ'

'LightYellow4'

'yellow2'

'yellowЗ'

'yellow4'

'gold2'

'goldЗ'

'gold4'

'goldenrodl'

'goldenrod2'

'goldenrodЗ'

'goldenrod4'

'DarkGoldenrodl'

'DarkGoldenrod2'

'DarkGoldenrodЗ'

'DarkGoldenrod4'

'RosyBrownl'

'RosyBrown2'

'RosyBrownЗ'

'RosyBrown4'

'IndianRedl'

'IndianRed2'

'IndianRedЗ'

'IndianRed4'

'siennal'

'sienna2'

'siennaЗ'

'sienna4'

'burlywoodl'

'burlywood2'

'burlywoodЗ'

'burlywood4'

'wheatl'

'wheat2'

'wheatЗ'

'wheat4'

'tanl'

'tan2'

-

712

Приложение 4. Предопределенные именованные цвета

Таблица П4.1

(продолжение)

'tan4'

'chocolatel'

'chocolate2'

'chocolateЗ'

'firebrickl'

'firebrick2'

'firebrickЗ'

'firebrick4'

'brownl'

'brown2'

'brownЗ'

'brown4'

'salmonl'

'salmon2'

'salmonЗ'

'salmon4'

'LightSalmon2'

'LightSalmonЗ'

'LightSalmon4'

'orange2'

'orangeЗ'

'orange4'

'DarkOrangel'

'Dark0range2'

'DarkOrangeЗ'

'Dark0range4'

'corall'

'coral2'

'coralЗ'

'coral4'

'tomato2'

'tomatoЗ'

'tomato4'

'OrangeRed2'

'OrangeRedЗ'

'OrangeRed4'

'red2'

'redЗ'

'red4'

'DeepPink2'

'DeepPinkЗ'

'DeepPink4'

'HotPinkl'

'HotPink2'

'HotPinkЗ'

'HotPink4'

'pinkl'

'pink2'

'pinkЗ'

'pink4'

'LightPinkl'

'LightPink2'

'LightPinkЗ'

'LightPink4'

'PaleVioletRedl'

'PaleVioletRed2'

'PaleVioletRedЗ'

'PaleVioletRed4'

'maroonl'

'maroon2'

'maroonЗ'

'maroon4'

'VioletRedl'

'VioletRed2'

'VioletRedЗ'

'VioletRed4'

'magenta2'

'magentaЗ'

'magenta4'

'orchidl'

'orchid2'

'orchidЗ'

'orchid4'

'pluml'

'plum2'

'plumЗ'

'plum4'

'MediumOrchidl'

'Medium0rchid2'

'MediumOrchidЗ'

'Medium0rchid4'

'DarkOrchidl'

'Dark0rchid2'

'DarkOrchidЗ'

'Dark0rchid4'

'purplel'

'purple2'

'purpleЗ'

'purple4'

'MediumPurplel'

'MediumPurple2'

'MediumPurpleЗ'

'MediumPurple4'

'thistlel'

'thistle2'

'thistleЗ'

'thistle4'

'grayl'

'gray2'

'grayЗ'

'gray4'

'gray5'

'grayб'

'gray7'

'gray8'

Приложение 4. Предопределенные именованные цвета
Таблица П4.1

(окончание)

'gray9'

'graylO'

'grayll'

'grayl2'

'graylЗ'

'grayl4'

'graylS'

'graylб'

'grayl7'

'grayl8'

'grayl9'

'gray20'

'gray21'

'gray22'

'gray23'

'gray24'

'gray25'

'gray26'

'gray27'

'gray28'

'gray29'

'gray30'

'gray31'

'gray32'

'gray33'

'gray34'

'gray35'

'gray36'

'gray37'

'gray38'

'gray39'

'gray40'

'gray42'

'gray43'

'gray44'

'gray45'

'gray46'

'gray47'

'gray48'

'gray49'

'gray50'

'gray51'

'gray52'

'gray53'

'gray54'

'gray55'

'gray56'

'gray57'

'gray58'

'gray59'

'grayбO'

'grayбl'

'gray62'

'grаубЗ'

'gray64'

'gray65'

'grаубб'

'gray67'

'gray68'

'gray69'

'gray70'

'gray71'

'gray72'

'gray73'

'gray74'

'gray75'

'gray76'

'gray77'

'gray78'

'gray79'

'gray80'

'gray81'

'gray82'

'gray83'

'gray84'

'gray85'

'gray86'

'gray87'

'gray88'

'gray89'

'gray90'

'gray91'

'gray92'

'gray93'

'gray94'

'gray95'

'gray97'

'gray98'

'gray99'

713

Модуль

-

это файл с исходным кодом на языке

Python, который содержит функции и/или
Python хранятся в модулях. Например,

классы. Многие функции в стандартной библиотеке
математический

random -

модуль

math содержит различные математические функции, а модуль

функции для работы со случайными числами.

Для того чтобы применять функции и/или классы, которые хранятся в модуле, нужно им­
портировать модуль. Для этого вверху своей программы следует поместить инструкцию

import. Вот пример инструкции import, которая импортирует модуль math:
import math
Эта инструкция приводит к тому, что интерпретатор

Python

загрузит содержимое модуля

math в оперативную память, делая функции и/или классы, которые хранятся в модуле math,
доступными программе. Для того чтобы использовать любой элемент, который находится
в модуле, следует использовать по.?Ностью определенное имя элемента. Это означает, что
перед именем элемента надо поставить имя модуля и затем точку. Например, модуль

math

содержит функцию с именем sqrt, которая возвращает квадратный корень числа. Для того
чтобы вызвать функцию

sqrt, следует написать имя math. sqrt. Следующий ниже интер­

активный сеанс демонстрирует этот пример:

>>> import math
>>>

х

=

math.sqrt(25)

>» print(x)
5.0
>>>
и

а

Ранее показанная форма инструкции import загружает все содержимое модуля в оператив­
ную память. Иногда требуется импортировать из модуля только конкретную функцию или

класс. В подобном случае можно воспользоваться ключевым словом from вместе с инструк­
цией

import:

from math import sqrt
Эта инструкция приводит к импортированию из модуля

math только функции sqrt. Такой

подход также позволяет вызывать функцию sqrt, не ставя имя модуля перед именем функ­
ции. Вот пример:

>>> from math import sqrt

sqrt(25)
>>> print(x)
5.0
>>>

>>>

х

=

716

Приложение 5. Подробнее об инструкции import

При использовании этой формы инструкции

import

можно указать имена нескольких эле­

ментов, разделенных запятыми. Например, инструкция

тивном сеансе импортирует из модуля

import в следующем
math только функции sqrt и radians:

ниже интерак­

>>> from math import sqrt, radians
>>> х = sqrt(25)
>>>а= radians(l80)
>>> print(x)
5.0
>» print (а)
3.141592653589793
>>>

Инструкция

с подстановочным символом загружает все содержимое модуля. Вот

import

пример:

from math import *
Разница между этой инструкцией и инструкцией

import

import math

состоит в том, что инструкция

с подстановочным символом не требует использования в модуле полностью опреде­

ленных имен элементов. Например, вот интерактивный сеанс, который демонстрирует при­
менение инструкции

import

с подстановочным символом:

>>> from math import *
»> х = sqrt (25)
>>> а
radians(l80)
>>>
А вот интерактивный сеанс, который использует обычную инструкцию

import:

>>> import math
>>> х = math.sqrt(25)
>>>а= math.radians(l80)
>>>
Как правило, следует избегать использования инструкции

import

с подстановочным симво­

лом, потому что она может привести к конфликту имен во время импортирования несколь­
ких модулей. Конфликт имен происходит, когда программа импортирует два модуля, кото­
рые имеют функции или классы с одинаковыми именами. Конфликт имен не возникает при
использовании полностью определенных имен функций и/или классов модуля.

Использовани
Ключевое слово

псев онимов
as

может использоваться для присвоения модулю псевдонима во время его

импортирования. Вот пример:

import math as mt
Эта инструкция загружает в оперативную память модуль
псевдоним

math, присваивая этому модулю
mt. Для того чтобы использовать любой элемент, который находится в модуле,

перед именем элемента следует поставить псевдоним и после него точку. Например, для

Приложение 5. Подробнее об инструкции import
вызова функции

717

sqrt следует использовать имя mt. sqrt. Следующий ниже интерактивный

сеанс демонстрирует пример:

>>> import math as mt
>>> х = mt.sqrt(25)
>>>а= mt.radians(l80)
>>> print (х)
5.0
>>> print(a)
3.141592653589793
>>>
Псевдоним также можно присвоить определенной функции или классу во время их импор­
тирования. Следующая ниже инструкция импортирует функцию
сваивает этой функции псевдоним

sqrt из модуля math и при­

square root:

from math import sqrt as square_root
После применения этой инструкции import для вызова функции sqrt будет использоваться
имя

square_root. Следующий интерактивный сеанс показывает пример:

>>> from math import sqrt as square_root
>>> х = square root(25)
>>> print (х)
5.0
>>>
В приведенном далее интерактивном сеансе мы импортируем из модуля
ции, давая каждой из них псевдоним. Функция

а функция

tan -

как

sqrt

import две функ­
square_ root,

импортируется как

tangent:

>>> from math import sqrt as square_root, tan as tangent
>>> х = square_root(25)
>>>у= tangent(45)
>>> print(x)
5.0
>» print (у)
1.6197751905438615

Стандартная библиотека

Python

предоставляет классы и функции, которые ваши программы

могут использовать для выполнения базовых операций, а также многих продвинутых задач.

Вместе с тем существуют операции, которые стандартная библиотека выполнить не сможет.
Когда нужно сделать нечто, выходящее за рамки стандартной библиотеки, то существуют

два варианта выбора: написать программный код самому или использовать программный
код, который уже кем-то был создан.
К счастью, существуют тысячи модулей

написанных независимыми программиста­

Python,

ми, предлагающие возможности, которые отсутствуют в стандартной библиотеке

Python.

Они называются сторонними модулями. Огромная коллекция сторонних модулей существу­
ет на веб-сайте

pypi.python.org,

так называемом каталоге пакетов

Python,

или

PyPI (Python

Package Index).
Имеющиеся в

PyPI

модули организованы в пакеты. Пакет

-

это просто коллекция из одно­

го или нескольких связанных между собой модулей. Самый простой способ скачать и уста­
новить любой пакет предполагает использование менеджера пакетов pip. Менеджер пакетов

pip является составной частью стандартной установки

Python,

начиная с

чтобы установить необходимый пакет в операционной системе

Python 3.4. Для того
Windows менеджером паке­

тов pip, следует открыть окно командной оболочки и ввести команду в следующем формате:

pip install

имя_пакета

где имя_пакета

-

это имя пакета, который вы хотите скачать и установить. Если вы работа­

те в среде операционной системы Мае

OS

Х или

Linux,

вместо команды pip следует исполь­

зовать команду рiрЗ. Помимо этого, чтобы исполнить команду рiрЗ в операционной системе
Мае

OS

Х или

Linux,

потребуются полномочия суперпользователя, поэтому придется снаб­

дить эту команду префиксом в виде команды sudo:

sudo

рiрЗ

install

имя_пакета

После ввода команды менеджер пакетов pip начнет скачивать и устанавливать пакет. В за­
висимости от размера пакета выполнение всего процесса установки может занять несколько

минут. Когда этот процесс будет завершен, удостовериться, что пакет был правильно уста­
новлен, как правило, можно, запустив среду

>>> import

IDLE

и введя команду

имя_пакета

где имя_ пакета

-

это имя пакета, который вы установили. Если вы не видите сообщение

об ошибке, то можете считать, что пакет был успешно установлен.
В главе

7 вы

изучите популярный сторонний пакет под названием matplotlib. Он использу­

ется для построения диаграмм и графиков.

г ава

1
1.1.

Программа

-

это набор инструкций, который компьютер выполняет, чтобы решить

задачу.

1.2.

Аппаратное обеспечение

-

это все физические устройства, или компоненты, из кото­

рых состоит компьютер.

1.3.

Центральный процессор (ЦП), оперативная память, внешние устройства хранения,
устройства ввода и устройства вывода.

1.4.

ЦП.

1.5.

Основная память.

1.6.

Вторичная память.

1.7.

Устройство ввода.

1.8.

Устройство вывода.

1.9.

Операционная система.

1.10.

Вспомогательная программа.

1.11.

К прикладному программному обеспечению.

1.12.

Достаточно одного байта.

1.13.

Бит, или разряд.

1.14.

В двоичной системе исчисления.

1.15.

Схема кодирования

ASCII

использует набор из

128

числовых кодов для представления

английских букв, различных знаков препинания и других символов. Эти числовые
коды нужны для хранения символов в памяти компьютера. (Аббревиатура

ASCII

озна­

чает стандартный американский код обмена информацией.)

1.16.

Юникод.

1.17.

Цифровые данные
устройство

-

-

это данные, которые хранятся в двоичном файле, цифровое

это любое устройство, которое работает с двоичными данными.

1.18.

Этот язык называется машинным языком.

1.19.

Этот тип памяти называется основной памятью, или ОЗУ.

1.20.

Этот процесс называется циклом выборки-декодирования-исполнения.

722

Приложение 7. Ответы на вопросы в Контрольных точках

1.21.

Это альтернатива машинному языку. Вместо двоичных чисел ассемблер использует
в качестве инструкций короткие слова, которые называются мнемокодами.

1.22.

Высокоуровневый язык.

1.23.

Этот набор правил называется синтаксическими правилами.

1.24.

Компилятор.

1.25.

Интерпретатор.

1.26.

Они являются причинами синтаксической ошибки.

2.1.

Любой человек, группа или организация, которые поручают написать программу.

2.2.

Отдельная

Гла

функция,

которую

программа

должна выполнить для

удовлетворения

потребностей клиента.

2.3.

Набор четко сформулированных логических шагов, которые должны быть проделаны
для выполнения задачи.

2.4.

Неформальный язык, который не имеет каких-либо синтаксических правил и не пред­
назначен для компиляции или исполнения. Программисты используют псевдокод для

создания моделей или "макетов" программ.

2.5.

Диаграмма, которая графически изображает шаги, имеющие место в программе.

2.6.

Овалы

это терминальные символы. Параллелограммы

-

ные символы. Прямоугольники

-

-

это входные либо выход­

это обрабатывающие символы.

2.7.

рrint('Джимми Смит')

2.8.

pr in t ( "Python - лучше всех ! ")

2.9.

print ('Кошка сказала "мяу". ' )

2.10.

Имя, которое ссылается на значение в оперативной памяти компьютера.

2.11.

Имя 99bottles недопустимо, потому что оно начинается с цифры. Имя r&d недопусти­
мо, т. к. использовать символ

2.12.
2.13.

&

не разрешается.

Не являются, потому что имена переменных регистрочувствительны.
Недопустима, потому что переменная, которая получает присваивание (в данном слу­
чае amount), должна находиться с левой стороны от оператора

=.

2.14.

Значение равняется val

2.15.

Переменная valuel будет ссылаться на целочисленный тип int. Переменная value2
будет ссылаться на вещественный тип float. Переменная valueЗ будет ссылаться на
вещественный тип float. Переменная value4 будет ссылаться на целочисленный тип

int. Переменная valueS будет ссылаться на строковый тип str (string).

2.16.

о.

2.17. last_name
2.18. sales

=

=

input ("Введите фамилию клиента: ")

float (input ('Введите объем продаж за неделю:

'))

Приложение 7. Ответы на вопросы в Контрольных точках

2.19.

723

Вот заполненная таблица:
Выражение

Значение

6 + 3 * 5

21

12 / 2 - 4

2

9 + 14 * 2 - 6

31

(6 + 2) * 3

24

14 /

(11

- 4)

9 + 12 * (8 - 3)

2

69

2.20. 4.
2.21. 1.
2.22.

Если требуется, чтобы функция print не начинала новую строку вывода· по завер­
шении вывода данных, то следует передать в эту функцию специальный аргумент

end = '

'.

2.23.

Можно передать в функцию print аргумент sep=, указав нужный символ.

2.24.

Это экранированный символ новой строки, т. е. перевода на новую строку.

2.25.

Это оператор конкатенации строковых литералов, который соединяет два строковых
значения воедино.

2.26. 65. 43
2.27. 987, 654. 13
2.28.

Именованные константы:



делают программы более самоочевидными;



позволяют легко вносить большие изменения в программный код;



помогают избежать опечаток, которые часто случаются при использовании волшеб­
ных чисел.

О. 1

2.29.

DISCOUNT PERCENTAGE

2.30.

О градусов.

2.31.

При помощи команды turtle. forward.

2.32.

При помощи команды turtle. right ( 45).

2.33.

Сначала надо применить команду turtle. penup (), чтобы поднять перо.

2.34. turtle. heading ()
2.35. turtle. circle (100)
2.36. turtle.pensize (8)
2.37. turtle .pencolor ( 'Ьlue')
2.38. turtle .bgcolor ( 'Ыасk')
2.39. turtle.setup(500, 200)
2.40. turtle.goto (100, 50)

724

Приложение

7. Ответы на вопросы в Контрольных точках

2.41. turtle .pos ()
2.42. turtle. speed ( 1 О)
2.43. turtle. speed (О)
2.44.

Для того чтобы заполнить фигуру цветом, перед рисованием фигуры следует приме­
нить команду turtle.begin fill ().А после того как фигура нарисована, применить
команду turtle.end_fill ().Во время исполнения команды turtle.end_fill () фигура
будет заполнена текущим цветом заливки.

2.45.

При помощи команды t urtle. wr i te () .

Глава З

3.1.

Это логическая схема, которая управляет порядком, в котором исполняется набор
инструкций.

3.2.

Это структура программы, которая может исполнить ряд инструкций только при опре­
деленных обстоятельствах.

3.3.

Структура решения, которая обеспечивает единственный вариант пути исполнения.
Если проверяемое условие является истинным, то программа принимает этот вариант
пути.

3.4.

Выражение, которое в результате его вычисления может иметь только одно из двух
значений: истина либо ложь.

3.5.

Можно определить, является ли одно значение больше другого, меньше его, больше
или равно ему, меньше или равно ему, равно или не равно ему.

3.6.

i f у == 2 о
х

3.7.

:

о

=

i f sales >= 10000:

comrnissionRate

3.8.

= 0.2

Структура принятия решения с двумя альтернативными вариантами имеет два воз­
можных пути исполнения; один путь принимается, если условие является

а другой путь принимается, если условие является ложным.

3.9.

Инструкцию if-else.

3.10.

Когда условие является ложным.

3.11. z
3.12.

не меньше а.

Бостон
Нью-Йорк

3.13. if

numЬer == 1:

print
elif

print
elif

('Один')

numЬer

numЬer

print
else:
print

== 2:

('Два')

== 3:

('Три')

('Неизвестное')

истинным,

Приложение 7. Ответы на вопросы в Контрольных точках

3.14.

725

Это выражение, которое создается при помощи логического оператора для объедине­
ния двух булевых подвыражений.

3.15.

л
и

л
л
и
и
и
л

л
и

3.16.

и
л
и
и
и

3.17.

Оператор and: если выражение слева от оператора and ложное, то выражение справа
от него не проверяется. Оператор or: если выражение слева от оператора or является
истинным, то выражение справа от него не проверяется.

3.18. if speed >=
print

3.19.

О and speed

('Допустимое