Вы находитесь на странице: 1из 129

Дальневосточный федеральный университет

П о л и те хн и ч е с к и й и н с ти ту т

Г.П. Озерова
ОСНОВЫ ПРОГРАМ М И РОВАНИЯ
НА ЯЗЫ КЕ PYTHON
В П РИ М ЕРАХ И З А Д А Ч А Х
Учебное электронное издание
Учебное пособие для вузов

.objects.active
+ str(aodifierob))
o b .s e le c t - Ѳ

Гі Ъгщ co n te x t.se le c te d objectsjV


>• e6 Jects[one.nam e).'.elect - 1

0 .. I ‘ please select exactly two ob

I ЯЛТОЙ CLASSES

Владивосток

d i f ie r jo b i se iec t^ l
*. context, scene.
Дальневосточный федеральный университет
Политехнический институт

Г.П. Озерова

ОСНОВЫ ПРОГРАММИРОВАНИЯ НА ЯЗЫКЕ PYTHON


В ПРИМЕРАХ И ЗАДАЧАХ
Учебное электронное издание
Учебное пособие для вузов

Владивосток
Издательство Дальневосточного федерального университета
2022
УДК 004.42
ББК 32.973.26-018.1
О-46

Рецензенты: И.Е. Воронина, д.т.н, профессор кафедры программного обеспечения и


администрирования информационных систем (Воронежский государственный университет,
Воронеж); О.Н. Любимова, д.ф.-м.н., профессор отделения машиностроения, морской техники и
транспорта Инженерного департамента (Дальневосточный федеральный университет, Владивосток).

Автор: Озерова Галина Павловна, к.т.н, доцент


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

Озерова Г.П. Основы программирования на языке Python в примерах и задачах: учебное


пособие для вузов / Политехнический институт ДВФУ. - Владивосток: Изд-во Дальневост. федерал.
ун-та, 2022. - 1 CD. [128 с.]. - Систем. требования: Acrobat Reader, Foxit Reader либо другой их
аналог. - ISBN 978-5-7444-5217-9. - Текст: электронный.

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


применение на примерах решения задач из различных сфер деятельности. При этом студентам
предлагаются минимальные теоретические аспекты программирования, необходимые для решения
конкретной задачи. Кроме того, в научно-популярной форме объясняется физическая,
математическая или экономическая суть каждой задачи. Использование возможностей языка
проиллюстрировано большим числом примеров. Предусмотрены варианты заданий для самостоя­
тельного решения.
Пособие предназначено для студентов младших курсов инженерных специальностей,
изучающих информационные технологии и программирование.
Ключевые слова: алгоритм, программа, операторы, графика, символьные вычисления, модули
math, matplotlib, numpy, sympy.
Keywords: algorithm, program, operators, graphics, symbolic calculations, modules math, matplotlib,
numpy, sympy.

Редактор Т.В. Рябкова


Компьютерная верстка Г.П. Озеровой
Дизайн CD Г.П. Писаревой

Опубликовано: 14.04.2022
Объем 3,7 МБ [Усл. печ. л. 14,9]
Тираж 10 экз.

Издание подготовлено редакционно-издательским отделом


Политехнического института ДВФУ
[Кампус ДВФУ, корп. С, каб. 714]

Дальневосточный федеральный университет


690022, Владивосток, о. Русский, пос. Аякс, 10

Изготовитель CD: Дальневосточный федеральный университет


(типография Издательства ДВФУ
690091, Владивосток, ул. Пушкинская, 10)

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

ISBN 978-5-7444-5217-9 © ФГАОУ ВО «ДВФУ», 2022


О главление

ВВЕДЕНИЕ..................................................................................................................................................... 5
1. ОСНОВЫ ВЫЧИСЛЕНИЙ НА ЯЗЫКЕ PYTHON............................................................................. 6
1.1. Переменные и типы............................................................................................................................ 6
1.2. Основные конструкции языка........................................................................................................... 7
1.3. Решение простой вычислительной задачи..................................................................................... 12
1.4. Математические вычисления, модуль math................................................................................... 17
1.5. Обработка исключительных ситуаций........................................................................................... 20
1.6. Функции............................................................................................................................................ 22
1.7. Форматный вывод............................................................................................................................ 24
1.8. Задача, вычисления на плоскости................................................................................................... 25
1.9. Варианты заданий для самостоятельного решения....................................................................... 31
2. ОБРАБОТКА ТАБЛИЧНЫХ ДАННЫХ И ИХ ВИЗУАЛИЗАЦИЯ.................................................... 34
2.1. Списки............................................................................................................................................... 34
2.2. Задача, формирование таблицы значений функции...................................................................... 41
2.3. Построение графиков и диаграмм.................................................................................................. 45
2.4. Задача, построение графиков функций одной переменной.......................................................... 50
2.5. Задача: построение графиков функций одной переменной c точками разрыва......................... 52
2.6. Рисование плоских фигур................................................................................................................ 55
2.7. Задача, рисование фигуры из геометрических примитивов......................................................... 59
2.8. Варианты заданий для самостоятельного решения....................................................................... 62
3. МАТРИЦЫ И ВЕКТОРЫ........................................................................................................................ 72
3.1. Массивы............................................................................................................................................ 72
3.2. Задача о движении по различным участкам дороги...................................................................... 78
3.3. Многомерные массивы.................................................................................................................... 80
3.4. Задача, матричные вычисления....................................................................................................... 86
3.5. Задача: решение системы линейных уравнений............................................................................ 89
3.6. Тренды............................................................................................................................................... 90
3.7. Задача о выстреле из пушки............................................................................................................ 92
3.8. Варианты заданий для самостоятельного решения....................................................................... 95
4. СИМВОЛЬНЫЕ ВЫЧИСЛЕНИЯ......................................................................................................... 101
4.1. Символьные преобразования........................................................................................................ 102
4.2. Решение уравнений........................................................................................................................ 104
4.3. Дифференцирование и интегрирование....................................................................................... 109
4.4. Предел функции.............................................................................................................................. 115
4.5. Задача: исследование функции и построение ее графика.......................................................... 117
4.6. Варианты заданий для самостоятельного решения..................................................................... 122
ЗАКЛЮЧЕНИЕ.......................................................................................................................................... 125
СПИСОК ЛИТЕРАТУРЫ.......................................................................................................................... 126
Приложение А. Описание работы в среде IDLE(Python)....................................................................... 127
Приложение Б. Установка библиотек Python.......................................................................................... 128
Приложение В. Стили библиотеки matplotlib.pyplot............................................................................... 129

4
ВВЕДЕНИЕ

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


к преимуществам которого относят высокую производительность программных решений и
структурированный хорошо читаемый код. Синтаксис Питона максимально облегчен, что
позволяет изучить его за сравнительно короткое время. Ядро имеет очень удобную
структуру, а широкий перечень встроенных библиотек позволяет применять широкий набор
полезных функций и возможностей. Язык Python может использоваться для реализации
прикладных приложений, а также для разработки W EB-сервисов. Правильное русское
произношение названия языка программирования - «Пайтон», но чаще используется
искаженное - «Питон».
История языка программирования Python началась в конце 1980-х. Создатель языка
Гвидо ван Россум задумал Python в 1980-х годах, а приступил к его созданию в декабре 1989
года в центре математики и информатики в Нидерландах. Ван Россум является основным
автором Python и продолжал выполнять центральную роль в принятии решений
относительно развития языка вплоть до 12 июля 2018 года.
Язык программирования позаимствовал название у популярного в 70-е годы шоу
Monty Python’s Flying Circus. Но большая часть пользователей об этом не знают и
ассоциируют название со змеей. Одна из целей создателей Python - сделать
программирование простым и забавным.
Питон - не самый «молодой» язык программирования, но и не слишком старый. К
моменту его создания уже существовали такие «монстры», как Паскаль или Си. И поэтому
при создании языка авторы старались взять лучшее из различных платформ для
разработчиков. Фактически Python представляет собой своеобразное сочетание удачных
решений более чем из 8 различных языков.
В настоящее время Python является одним из самых востребованных языков
программирования. В соответствии с индексом TIOBE (это один из самых известных
рейтингов языков программирования) на ноябрь 2020 года Python занимал второе место в
рейтинге самых популярных языков программирования в мире. Его обогнал только С.
После изучения языка Python легко освоить другие языки программирования.
Существует классическая техника изучения языков программирования: сначала типы
данных, потом конструкции, затем сложные структуры, классы, объекты и т.д. Как
следствие, решаемые в качестве примеров задачи демонстрируют возможности
определенного элемента языка и не имеют никакого прикладного значения. Но в жизни все
совсем не так: есть задача, ее нужно решить, желательно - средствами, которые не
потребуют глубоких знаний по программированию.
В данном учебном пособии минимальные теоретические аспекты программирования
предлагаются читателю, только если этого потребует решаемая задача. Кроме того, в научно­
популярной форме объясняется физическая, математическая или экономическая суть каждой
задачи. В пособии рассматриваются:
• решение вычислительных задач с использованием библиотеки m a th ;
• представление и обработка табличных данных с помощью списков;
• визуализация данных средствами библиотеки m a t p l o t l i b ;
• решение задач с массивами с помощью библиотеки numpy;
• символьные вычисления и преобразования средствами модуля sym py.
Каждый параграф завершается заданием для самостоятельного решения, в конце
каждой главы предлагаются варианты индивидуальных заданий.

5
1. О С Н О В Ы В Ы Ч И С Л Е Н И Й НА Я ЗЫ К Е PY THO N

1.1. П еременны е и типы


Для хранения данных в программе используются переменные. Простыми словами,
переменная - это некоторый объект, который имеет имя, тип и значение.
Правила для выбора имен переменных:
• имя должно состоять из букв, цифр и знаков подчеркивания, начинаться с буквы,
не может совпадать с ключевыми словами языка;
• Python различает большие и маленькие буквы в имени (переменные x и X - разные
переменные).
Также есть несколько рекомендаций, которые позволяют сделать программу более
читабельной:
• имя переменной должно быть записано строчными буквами;
• имя переменной должно максимально точно соответствовать хранимым в ней
данным;
• если имя переменной состоит из нескольких слов, то слова разделяются
подчеркиванием.
Например, следующие имена переменных являются верными и могут использоваться
для описания возраста человека:
ag e, u s e r ag e, p e rso n ag e, u s e r 1 ag e.
Имена следующих переменных записаны неверно:
1 2 _ a g e - начинается с цифры;
u s e r - a g e - содержит недопустимый символ «-»;
f ( x ) - содержит недопустимые символы «(» и «)»;
i f - является ключевым словом языка.
В Python не предусмотрено явное описание типа переменных, тип определяется в
процессе выполнения программы в зависимости от данных, которые заносятся в
переменную. В переменную можно занести:
• строки текста, которые в программе заключаются в двойные или одинарные
кавычки ( "P y th o n ", 'Я изучаю P y th o n ');
• целые значения (1 7 , - 4 , 0 );
• вещественные числа; при вводе значений этого типа в качестве разделителя целой
и дробной части используется точка ( - 1 5 . 4 , 1 2 . 0 , 3 1 8 .5 3 0 2 ).

Задания для сам опроверки


1. Выберите верные имена переменных:
name u s e
nam e+ user
1 user
user 1 1
user
2. Укажите тип, который соответствует следующим значениям (для строковых
данных - string, для целых чисел - integer, для вещественных float, если значение записано
неверно - укажите error):
"П ривет"
1 ,6 7
- 7 .9 0
0
24
1 2 /0 9 /2 0 2 2

6
1.2. О сновны е конструкции я зы к а

1.2.1. Операторы ввода и вывода


Для ввода данных используется оператор i n p u t ( ) , который считывает строку
текста, введенную пользователем с консоли, и заносит ее в переменную. Следующий
оператор вводит строку текста и заносит ее в переменную nam e:
name = i n p u t ()
Для вывода значения переменной используется оператор p r i n t ( ) , оператор выведет
на экран значение переменной nam e:
p r i n t (name)
С помощью оператора p r i n t ( ) можно выводить строки в кавычках и значения
переменных одновременно, при выводе они разделяются запятой.
p r i n t ( "П ривет, " , nam e, " 1 " )
Для ввода числовых значений в переменные необходимо перед оператором ввода
i n p u t ( ) указать тип значения (int или float). Следующий оператор вводит целое значение в
переменную age:
ag e = i n t (i n p u t ())
Кроме того, Python допускает использование подсказки пользователю
непосредственно в операторе i n p u t ( ) . При использовании такой подсказки ввод данных
пользователем при выполнении программы будет осуществляться сразу после текста
подсказки на той же строке. Следующий оператор вводит целое значение в переменную a g e ,
выдавая пользователю подсказку:
ag e = i n t (i n p u t ( "С колько Вам полных л е т ? " ))
П ример. Спросить у пользователя его имя и сколько ему лет. Вывести приветствие
пользователю.
Код:
name = i n p u t ( "Ваше имя? " )
age = i n t (i n p u t ( "Сколько Вам полных лет? " ))
p r i n t ( "П ривет,", name, "1 Ваш в о з р а с т " , a g e , " . " )
Результат:
Ваше имя? Алина
Сколько Вам полных лет? 2 0
Привет, Алина ! Ваш возраст 20 .

Задания для сам опроверки


1. Все перечисленные ниже операторы являются неверными, укажите ошибку и
исправьте каждый оператор:
name = p r i n t ( "Ваше имя? " )
name = i n p u t ( "Ваше имя? ')
x = i n p u t (i n t ( "x="))
p r i n t ( "x=" x )
2. Напишите программу, которая спрашивает у пользователя его имя, возраст и рост
(в метрах). Вывести приветствие пользователю, указав его возраст и рост.

1.2.2. Оператор присваивания


Вычисление выражения и занесение его значения в некоторую переменную
осуществляется с помощью оператора присваивания. Например, следующий оператор
заносит в переменную nam e значение «Алина»:
name = "Алина"

7
В выражениях допустимо использовать арифметические операции:
• сложение «+»,
• вычитание «-»,
• умножение «*»,
• деление «/»,
• целочисленное деление «//»,
• остаток от деления «%», возведение в степень «**».
Python поддерживает привычный порядок выполнения операций: сначала возведение
в степень, затем умножение, деление, целочисленное деление и остаток (все они имеют
одинаковый приоритет, применяются последовательно слева направо), последним
выполняется сложение или вычитание. Для изменения приоритета используются круглые
скобки.
Примеры выражений:
3 + 2 * 5 ** 2 - 1 = 52
(3 + 2) * 5 ** 2 - 1 = 124
5 ** 2 / 2 = 12.5
63 % 10 = 3
63 % 10 + 4 = 7
63 % (10 + 4) = 7
63 / / 10 = 6
63 / / 10 + 4 = 10
63 / / (10 + 4) = 4

П ример. Спросить у пользователя его имя и его год рождения. Вычислить сколько
лет сейчас пользователю и вычислить результат (считаем, что текущим является 2022 год).
Код:
name = i n p u t ( "Ваше имя? " )
y ear b i r t h = i n t (i n p u t ( "B каком году Вы родились? " ))
age = 2022 - y ear b i r t h
p r i n t ( "Привет, " , name, "! Ваш возраст " , a g e , " . " )
Результат:
Ваше имя? Алина
В каком году Вы родились? 2002
Привет, Алина ! Ваш возраст 20 .

Задания для сам опроверки


1. Вычислите значения следующих выражений для заданных x и у:
x = 5
y = 3
x + y ** 2 =
y ** 2 * x =
x ** y - x =
x ** (y - 2 ) =
x / y + 3 =
x / y * 3 =
x // y =
x %y =
2. Запишите операторы присваивания, которые описывают следующие выражения:

у = 4 •х 2 —5

(х — 2 )2 — 1
z = х + 4:

8
1.2.3. Условный оператор
Для реализации возможности выполнения различных действий в зависимости от
условия в Python используется условный оператор i f . . . e l i f . . . e l s e , синтаксис которого
следующий (разделы e l i f и e l s e могут отсутствовать):
i f условие 1 :
операторы 1
e l i f условие 2 :
операторы 2

e ls e :
операторы
В ы полняется этот оператор так:
• проверяется у с л о в и е _ 1 после i f , если условие истинно, то выполняются
операторы _1;
• в противном случае проверяется у с л о в и е _ 2 после первого e l i f , если оно
истинно, то выполняются о п е р а т о р ы _ 2 ;
• аналогично обрабатываются все e l i f ;
• в случае если все условия ложны, то выполняются о п е р а т о р ы после e l s e .
Особенности синтаксиса оператора if:
1. ключевые слова ( i f , e l i f , e l s e ) записываются строчными буквами;
2. после условия в операторах i f и e l i f , а также после e l s e обязательно ставится
знак двоеточия «:», который означает наличие вложенных конструкций;
3. все операторы после знака «:» считаются вложенными и записываются с отступом
(ставится два или четыре пробела перед каждым вложенным оператором).
Вложенные инструкции в Python записываются в соответствии с одним и тем же
шаблоном, когда основная инструкция завершается двоеточием, вслед за которым
располагается вложенный блок кода, с отступом под строкой основной конструкции.
Вложенные инструкции объединяются в блоки по величине отступов. Отступ может
быть любым, главное, чтобы в пределах одного вложенного блока отступ был одинаков
(обычно это 4 пробела).
В следующем примере оператор 1 и оператор 2 относятся к вложенному блоку
основной конструкции, а оператор 3 находится на уровне основной конструкции.
осн о в н ая к о н с т р у к ц и я :
о п ер а то р 1
о п ер а то р 2
о п ер а то р 3
Условия в операторе i f являются логическими выражениями и могут включать:
• знаки отношений (равно «==» (два подряд равенства), не равно «!=», больше «>»,
меньше «<», больше или равно«>=», меньше или равно «<=»),
• логические операции (И «an d » , ИЛИ « o r» , НЕ « n o t» );
Результатом вычисления логических выражений является либо Истина (T ru e ),
другими словами, в этом случае выражение «верно», либо Ложь ( F a l s e ) - выражение
«неверно».
При использовании логической операции И (a n d ) выражение верно, если все его
элементы верны. При использовании логической операции ИЛИ ( o r ) выражение верно, если
хотя бы один его элемент верен.
Примеры:
3 > 5 результат F a lse
3 == (1 + 2) результат True
3 >= (1 + 2) результат True
3 != (1 + 2) результат F a lse

9
3 < 5 and 3 >= 4 результат F a lse
3 < 5 o r 3 >= 4 результат True
3 < 5 and n o t (3 >= 4) результат True
П ример. Дана сторона квадрата a (вещественное число). Если введено
положительное значение a, то посчитать площадь и периметр квадрата. В противном случае
вывести сообщение об ошибке.
Код:
a = f l o a t (i n p u t ( "a = " ))
i f a <= 0 :
p r i n t ( "Длина должна быть положительной")
e ls e :
p = 4 * a
s = a * a
p r i n t ( "p = " , p , "s = " , s )
Результат:
Тест 1
a = 4
p = 16.0 s = 16.0
Тест 2
a = -2
Длина должна быть положительной

1.2.4. Комментарии в Python


Комментарии - это способ описания того, что делает программа на самом высоком
уровне. Это специальные отмеченные строчки, которые комментируют код. Это
неисполняемые, но все равно важные части кода. Комментарии делают код более понятым и
читаемым.
В Python строка с комментарием начинается с символа «#». Все, что написано после
этого символа, при выполнении программа пропускает.
Например, если в программе встречается следующий оператор:
incom e = x * ( 1 + k / ( 12*1 0 0 )) ** n - x
совершенно непонятно, что именно он делает. Если же добавить комментарий, то его
назначение становится прозрачным:
#доход от вклада x на n месяцев под k% годовых с капитализацией процентов
incom e = x * ( 1 + k / ( 12*1 0 0 )) ** n - x

1.2.5. Встроенные функции Python


В языке Python реализовано много встроенных функций, использующихся для
различных целей, вот некоторые из них:
a b s ( x ) - вычисляет модуль числа x;
r o u n d ( x , n) - округляет число x до n знаков после запятой;
m i n ( x , y , z , ...) - находит минимальное из списка значений;
m a x (x , y , z , ...) - находит максимальное из списка значений.
Примеры:
a b s ( - 4) = 4
abs (5) = 5
ro u n d (3.141569) = 3
ro u n d (3.141569, 4) =3.1416
m in (3 , 4 , 6 .8 , - 3 , - 1 .8 9 ) = - 3
max(3 , 4 , 6 .8 , - 3 , - 1 .8 9 ) = 6.8
Важно помнить, что в языке Python для округления чисел используется банковский
способ округления, который отличается от математического, если в следующей позиции
после позиции округления стоит 5. При математическом округлении в этом случае число

10
округляется в большую по модулю сторону, при банковском - к ближайшему чётному.
Например:
ro u n d (2 .6 5 , 1) = 2.6
ro u n d (2 .7 5 , 1) = 2.8
П ример. Всего в группе учится n студентов, из них проживает в общежитии k
человек. Проверить входные данные и вывести процент студентов, проживающих в
общежитии. При выводе результат округлить до двух знаков после запятой.
Код:
n = i n t (i n p u t ( "n = " ))
k = i n t (i n p u t ( "k = " ))
# количества студентов - положительное число, также количество
# проживающих в общежитии не может быть больше общего количества
i f n <= 0 o r k <= 0 o r k > n :
p r i n t ( "Ошибочные входные данные")
e ls e :
p e rc e n t = k / n * 100
p r i n t ( "проживает в общежитии:", ro u n d (p e r c e n t, 2) , "%")
Результат:
тест 1
n = 23
k = 17
проживает в общежитии: 7 3.91 %
тест 2
n = 20
k = 21
Ошибочные входные данные

Задания для сам опроверки


1. Какое значение получит переменная y после программы:
x = 3
i f x <= 0 :
y = x
e l i f x <= 5 :
y = x ** 2
e ls e :
y = -x
2. Вычислите значения следующих логических выражений:
x == y o r (x - 4) >= 1
x != 2 and y <= 5
3. Какие значения получатся после выполнения следующих встроенных функций?
ro u n d (3 .8 9 ) =
ro u n d ( - 2.4 9) =
ro u n d (4 .9 9 9 , 2) =
abs ( - 5) =
a b s (6 .1 ) =
max(1 .9 , - 2 , - 3 .1 , 0 .2 ) =
a b s (m in (3 , - 2 , - 3 .1 , 0 .2 )) =
m in (3 , a b s ( - 2) , a b s ( - 3 .1 ) , 0 .2 ) =
4. Напишите программу для решения следующей задачи:
Ракета запускается с точки на экваторе и развивает скорость v км/с. Каков
результат запуска?
Указание: если v < 7.8 км/с, то ракета упадет на Землю (вывести 0), если 7.8 <v
<11.2, то ракета станет спутником Земли (вывести 1), если 11.2 < v < 16.4 , то ракета

11
станет спутником Солнца (вывести 2), если v > 16.4, то ракета покинет Солнечную
Систему (вывести 3).
Если будет введено значение, меньшее или равное 0, то вывести "error".

1.3. Реш ение простой вы чи слительн ой задачи


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

Т аблица 1 - И нтерпретация индекса массы тела

Индекс массы тела Описание


Меньше 18,5 недостаточная масса тела
От 18,5 до 24,99 нормальная масса тела
От 25 до 29,99 избыточная масса тела
Больше или равно 30 ожирение

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


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

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


Прежде всего, необходимо ответить на вопрос: «Какая информация нам нужна, чтобы
решить поставленную задачу?» Мы должны знать вес человека, точнее, его массу в
килограммах и его рост в метрах. Иногда при расчете индекса массы тела учитывается
возраст. Это входные данны е программы. Для всех входных данных нужно указать, какие
значения считаются в данной задаче недопустимыми.
При вводе возраста, так как в задаче учитывается количество полных лет, верным
будет целое число, например 23 или 45. Однако представить человека в возрасте -1 0 лет мы
не можем, также считаем, что тем, кто еще не достиг 10-летнего возраста, знание индекса
массы тела совсем необязательно. Поэтому, если пользователь введет число меньше 10,
считаем этот ввод неверным. Для роста верным считаем интервал от 0 до 2.5 метров, для
веса - от 0 до 300 килограмм. Это условные значения и они могут быть пересмотрены
разработчиком программы. В таблице 2 приведено описание входных данных.

Т аблица 2 - Входные данны е

Описание Пример Недопустимые значения


Возраст (количество полных лет) 23, 45,16 <10
Рост (м) 1.78, 1.65, 1.85 0 < или > 2.5
Вес (кг) 65, 58.7, 80.3, 75 <0 или > 300

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

Описание Пример
Индекс массы тела 18.45, 24.12, 27.1
Заключение недостаточная масса тела
нормальная масса тела
избыточная масса тела
ожирение

На следующем этапе неформальной постановки задачи необходимо определиться с


алгоритм ам и и ф ормулами, которые нам понадобятся в процессе реализации. Индекс
массы тела вычисляется как отношение массы в килограммах к квадрату роста человека,
выраженного в метрах:
т
Ьті = —гг,
h2
где Ь т і- индекс массы тела в кг/м2,
т - масса тела в килограммах,
h - рост в метрах.
Последним шагом неформальной постановки задачи является описание
ф ункциональны х возможностей программы. Наша программа должна:
• спросить у пользователя его рост и вес;
• вычислить индекс массы тела;
• вывести индекс массы тела на экран;
• вывести заключение по посчитанному индексу.

1.3.2. Проектирование и реализация программы


Для реализации программы мы вы бираем я зы к Python, и не только потому, что он
стоит в названии этого пособия. В соответствии с индексом TIOBE (это один из самых
известных рейтингов языков программирования) на ноябрь 2020 года Python занимал второе
место в рейтинге самых популярных языков программирования в мире. Его обогнал только С.
Также на этом этапе нужно выбрать среду, в которой будет разрабатываться
программа. Среду можно выбрать любую, например в Приложении А приведено описание
работы в среде IDLE(Python), которая устанавливается автоматически при установке Python
с официального сайта.
Следующий шаг - вы бор имен переменны х и их типов для входных и выходных
данных в терминах выбранного языка программирования. В таблице 4 приведено их
формальное описание.

Т аблица 4 - О писание переменных

Описание Имя Тип


Возраст (количество полных лет) age in t
Рост(м) h e ig h t flo a t
Вес (кг) w e ig h t flo a t
Индекс массы тела bmi flo a t
Заключение d e s c rip tio n s trin g

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

1. Написать фрагмент программы для ввода входных данных. Для проверки


правильности ввода вывести результат. Эту т.н. промежуточную печать после запуска и
проверки программы удаляют.
Код:
age = i n t (i n p u t ( "Ваш возраст? " ))
h e ig h t = f l o a t (i n p u t ( "Ваш рост? " ))
w eight = f l o a t (i n p u t ( "Ваш вес? " ))
# вывод значений для проверки
p r i n t ( "age = " , a g e , " h e ig h t = " , h e i g h t , "w eight = " , w e ig h t)
Результат:
Ваш возраст? 22
Ваш рост? 1.72
Ваш вес? 65
age = 22 h e ig h t = 1.72 w eight = 65.0

2. Выполнить проверку входных данных, если они ошибочные - вывести сообщение


об ошибке (какие данные считаются ошибочными, описано в таблице 2).
Код:
age = i n t (i n p u t ( "Ваш возраст? " ))
h e ig h t = f l o a t (i n p u t ( "Ваш рост? " ))
w eight = f l o a t (i n p u t ( "Ваш вес? " ))
i f age < 10 o r h e ig h t <= 0 o r h e ig h t > 2 .5 o r w eight <= 0 o r w eight > 300:
p r i n t ( "Ошибочные входные данные")
e ls e :
p r i n t ( "Верные входные данные")
Результат:
Тест 1
Ваш возраст? 20
Ваш рост? 1.72
Ваш вес? 65
Верные входные данные
Тест 2
Ваш возраст? 20
Ваш рост? 172
Ваш вес? 65
Ошибочные входные данные

3. Вычислить значение индекса массы тела и округлить результат до 2 знаков после


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

14
Код:
age = i n t (i n p u t ( "Ваш возраст? " ))
h e ig h t = f l o a t (i n p u t ( "Ваш рост? " ))
w eight = f l o a t (i n p u t ( "Ваш вес? " ))
i f age < 10 o r h e ig h t <= 0 o r h e ig h t > 2 .5 o r w eight <= 0 o r w eight > 300:
p r i n t ( "Ошибочные входные данные")
e ls e :
bmi = w eight / h e ig h t ** 2
bmi = ro u n d (bm i, 2)
p r i n t ( "Ваш индекс массы т е л а :" , bmi)
Результат:
Тест 1
Ваш возраст? 20
Ваш рост? 1.72
Ваш вес? 65
Ваш индекс массы тела: 21.97
Тест 2
Ваш возраст? 25
Ваш рост? 1.65
Ваш вес? 70
Ваш индекс массы тела: 25.71

4. Объяснить пользователю результат вычисления в соответствии с таблицей 1. При


этом на экран предполагается вывести сообщение типа «Вы относитесь к группе с
нормальной массой тела», поэтому в переменную d e s c r i p t i o n словосочетание заносится
в творительном падеже.
Код:
age = i n t (i n p u t ( "Ваш возраст? " ))
h e ig h t = f l o a t (i n p u t ( "Ваш рост? " ))
w eight = f l o a t (i n p u t ( "Ваш вес? " ))
i f age < 10 o r h e ig h t <= 0 o r h e ig h t > 2 .5 o r w eight <= 0 o r w eight > 300:
p r i n t ( "Ошибочные входные данные")
e ls e :
bmi = w eight / h e ig h t ** 2
bmi = ro u n d (bm i, 2)
p r i n t ( "Ваш индекс массы т е л а :" , bmi)
i f bmi < 1 8 .5 :
d e s c r ip tio n = "недостаточной массой те л а."
e l i f bmi < 2 5 :
d e s c r ip tio n = "нормальной массой т е л а."
e l i f bmi < 30:
d e s c r ip tio n = "избыточной массой т е л а."
e ls e :
d e s c r ip tio n = "ожирением."
p r i n ^ ^ Li относитесь к группе людей с " , d e s c r ip ti o n )
Результат:
Тест 1
Ваш возраст? 20
Ваш рост? 1.72
Ваш вес? 65
Ваш индекс массы тела: 21.97
Вы относитесь к группе людей с нормальной массой тела.
Тест 2
Ваш возраст? 25
Ваш рост? 1.65
Ваш вес? 70
Ваш индекс массы тела: 25.71
Вы относитесь к группе людей с избыточной массой тела.

15
1.3.3. Отладка и тестирование
На этом этапе после того, как найдены и исправлены все ошибки (то есть программа
запускается и выдает результат), необходимо проверить работоспособность программы для
различных входных данных. Естественно, невозможно перебрать все возможные варианты
ввода пользователя, но необходимо их систематизировать и выделить те, которые позволяют
проверить все вычисления и условные переходы.
Описание процесса тестирования можно оформить в виде таблицы (таблица 5). В ней
привести вариант входных данных, правильный результат, который должна выдать
программа, а также предусмотреть поле, в котором отметить совпадает ли реальный
результат с верным.

Т аблица 5 - Тестирование програм м ы для различны х входных данны х

Набор входных
Правильный результат Верно?
данных
age : -4
h e ig h t :1 .5 Ошибочные входные данные ✓
w eight : 6
age : 9
h e ig h t :- 1 .5 Ошибочные входные данные ✓
w eight : 65
age : 25
h e ig h t :3 .8 Ошибочные входные данные ✓
w eight : 60
age : 40
h e ig h t :1 .8 Ошибочные входные данные ✓
w eight : -5
age : 30
h e ig h t :1 .8 Ваш индекс массы тела: 27.78

w eight : 90 Вы относитесь к группе людей с избыточной массой тела.
age : 25
Ваш индекс массы тела: 17.58
h e ig h t :1 .6 ✓
w eight : 45 Вы относитесь к группе людей с недостаточной массой тела.
age : 30
h e ig h t :1 .7 Ваш индекс массы тела: 21.8

w eight : 63 Вы относитесь к группе людей с нормальной массой тела.
age : 16;
h e ig h t :1 .7 Ваш индекс массы тела: 56.06

w eight : 162 Вы относитесь к группе людей с ожирением.

Задание для сам опроверки


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

Т аблица 6 - И нтерпретация индекса массы тела с учетом возраста

Индекс массы тела, Индекс массы тела,


Описание
возраст < 45 возраст >= 45
Меньше 18,5 Меньше 22 недостаточная масса тела
От 18,5 до 24,99 От 22 до 26,99 нормальная масса тела
От 25 - 29.99 От 27до 31.99 избыточная масса тела
Больше или равно 30 Больше или равно 32 ожирение

Возраст: 35
Рост: 1.8

16
Вес: 12 0.71
bmi = 37.26 Вы относитесь к группе людей с ожирением.
Тест 2
Возраст: 18
Рост: 1.68
Вес: 82.79
bmi = 2 9.33 Вы относитесь к группе людей с избыточной массой тела.
Тест 3
Возраст: 50
Рост: 1.97
Вес: 98.67
bmi = 25.42 Вы относитесь к группе людей с нормальной массой тела.

1.4. М атем атические вы чи слен и я, модуль m ath


В программах можно выполнять достаточно сложные вычисления, в которых
используются математические функции, такие как логарифм, экспонента, синус, косинус и
т.д. Для вычисления этих и многих других математических функций в Python предусмотрена
библиотека m a th (или по-другому модуль m a th ). Библиотека является встроенным модулем
Python, поэтому для ее использования никакой дополнительной установки не требуется.

1.4.1. Модуль math


Модуль m a th содержит множество функций для работы с числовыми данными, а
также математические константы. В таблице 7 приведены некоторые из них.

Т аблица 7 - Ф ункции модуля m ath

Функция Описание Пример


Округление до ближайшего большего c e il( 4 .2 ) = 5
c e il(x )
числа c e il( - 5 .8 ) = - 5
Округление до ближайшего меньшего f lo o r ( 4 .2 ) = 4
flo o r(x )
числа f lo o r ( - 5 .8 ) = - 6
e x p (x ) Экспонента от x (ex) e x p ( 3 )= 2 0 .0 8 ...
Логарифм x по основанию base, если
lo g (x , b a s e ) base не указан, вычисляется натуральный lo g ( 1 2 5 , 5 )= 3 .0
логарифм
lo g 1 0 ( 1 0 0 ) = 2 .0
lo g 1 0 (x ) Логарифм x по основанию 10 l o g 1 0 ( 0 .0 1 ) = - 2 .0
lo g 2 ( 6 4 ) = 6 .0
lo g 2 (x ) Логарифм x по основанию 2 l o g 2 ( 0 .1 2 5 ) = - 3 .0
p ow (x, y) xy p o w (3 , 4 )= 8 1 .0
s q r t(4 ) = 2 .0
s q rt(x ) Квадратный корень из x s q r t( 2 ) = 1 .4 1 ...
Арккосинус x (x в интервале от -1 до 1), a c o s ( 0 ) = 1 .5 7 ...
a co s(x )
Результат - значение в радианах a c o s ( 1 ) = 0 .0
Арксинус x (x в интервале от -1 до 1), a s in ( 0 )= 0 .0
a s in (x )
Результат - значение в радианах a s in ( 1 ) = 1 .5 7 ...
Арктангенс x, a t a n ( 0 ) = 0 .0
a ta n ( x )
Результат - значение в радианах a ta n ( 1 ) = 0 .7 8 ...
c o s(x ) Косинус x (x задается в радианах) c o s ( 0 ) = 1 .0
s in (x ) Синус x (x задается в радианах) s in ( 0 ) = 0 .0
ta n (x ) Тангенс x (x задается в радианах) ta n ( 0 ) = 0 .0
d e g re e s(x ) Конвертирует радианы в градусы d eg re es(3 ) = 1 7 1 .8 ...
ra d ia n s (x ) Конвертирует градусы в радианы r a d ia n s ( 1 8 0 ) = 3 .1 4 ...
pi pi = 3.1415926...
e e = 2.718281...
in f да

17
Практически все функции модуля m ath возвращают значения в вещественном
формате. В некоторых случаях может получиться такой результат:
c o s ( 1 .5 7 0 7 9 6 3 ) = 2 .6 7 9 4 8 9 6 5 8 5 e -0 8
Число вида 2 .6 7 9 4 8 9 6 5 8 5 e - 0 8 является записью вещественного числа в
экспоненциальной форме, переписать его можно так:
2.6794896585е —08 = 2.6794896585 • 10-8 = 0.000000026794896585,
то есть это практически ноль или, точнее, число равно нулю с точностью 7 знаков после
запятой.
В программе, где предполагается использование модуля, применяется оператор:
im p o r t m ath
Этот оператор должен располагаться до первого обращения к функциям модуля. Как
правило, все импортируемые модули перечисляются в начале программы.
В выражениях при использовании функций из этого модуля перед именем функции
вставляется префикс m ath и точка. В таблице 8 приведены примеры выражений, для
вычисления которых необходимы функции из модуля m a th .

Т аблица 8 - П ри м еры описания вы раж ений с яв н ы м указанием имени модуля

Выражение Код программы


sm (x) + cos(x) m ath. s i n (x ) + m ath. c o s (x )
CSI

m ath. l o g (x * m ath. e x p (2 * x ) , 5)
*)
w
LO
(

m ath. s q r t (b ** 2 - 4 * a ** 2)
Vb2 —4 • a 2
m ath. s q r t (m ath. pow(b , 2) - 4 * m ath. pow(a , 2))
sin(40o) m ath. s i n (m ath. r a d i a n s (40))
n m ath. p i

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


можно их перечислить при подключении модуля и уже в тексте программы не использовать
префикс m a th :
fro m m ath im p o r t функция 1 , функция 2 , . . .
В таблице 9 приведены примеры описания выражений в программе, если все
необходимые функции перечислены при импорте:
fro m m ath im p o r t s i n , c o s , l o g , e x p , pow , r a d i a n s , p i

Т аблица 9 - П рим еры описания вы раж ений без явного у казан и я имени модуля

Выражение Код программы


sm (x) + cos(x) s i n (x ) + c o s (x )
log5(x • e 2 x) l o g (x * exp (2 * x ) , 5)
s q r t (b ** 2 - 4 * a ** 2)
Vb2 —4 • a 2
s q r t (pow(b , 2) - 4 * pow(a , 2))
sin(40o) s i n (r a d i a n s (4 0))
n pi

Задания для сам опроверки


1. Какие функции из модуля math записаны неверно? Исправьте ошибки в неверных
выражениях.
m ath. l o g (10, 2)
m ath. exp (3 , 5)
m ath. s i n ( - 16)
m ath. d e g r e e s (16)
math s i n (3)
m ath. r a d i a n (3)

18
2. Используя функции модуля m a th , запишите следующие выражения:
—Ь ± ѴЬ2 —4ас
-----------------------, п г 2.

3. Написать программу, которая вычисляет расстояние между двумя точками на
плоскости А (х 0, у 0) и В (х 1, у 1). Координаты точек ввести с клавиатуры, результат округлить
до 4 знаков после запятой. Формула для вычисления расстояния:

г = Ѵ(х і —х о)2 + (Уі —Уо)2,


Проверить программу для следующих входных данных:
Тест 1
x_0 = -4 .5
y_0 = 2.7
x_1 = 1
y_1 = 3.1
Результат: 5.5145
Тест 2
x_0 = 1
y_0 = 1
x_1 = 2
y_1 = 2
Результат: 1.4142

1.4.2. Рекомендации по записи сложных выражений


Рекомендуется перечислить все используемые ф ункции для вычисления выражения
при подключении модуля m a th , чтобы запись формул была короче и понятнее.
П ример. Вычислить значение выражения:

у = J e sin(x) + ln(2 + cos(x))


при x = 4.5.

Код:
Вариант 1
im p o rt math
x = 4.5
y = m ath. s q r t (m ath. e x p (m ath. s i n (x )) + m ath. l o g (2 + m ath. c o s (x )))
p r i n t (y)
Вариант 2
from math im p o rt s q r t , e x p , s i n , l o g , cos
x = 4.5
y = s q r t (e x p (s i n (x )) + l o g (2 + cos (x)) )
p r i n t (y)
Результат:
0.9787799339565816
Сравните два варианта программы, обе программы выдают одинаковый результат, но
способ с перечислением функций выглядит более удобочитаемым читабельным.
При записи сложных математических выражений можно допустить ошибки,
например, забыть поставить скобку или пропустить операцию. Поэтому рекомендуется
разбить вы раж ение на части, занести их в отдельные переменные, а затем вычислить
полное выражение.
П ример. Вычислить значение выражения:

19
при x = 3.6 , y = -4.1 , z =5.
Решение
Из данного выражения целесообразно выделить две части и вычислить их отдельно
(рисунок 1), сохранив результаты в переменные eq_1 и eq_2, а затем получить результат,
используя эти переменные.
eq_2

Рисунок 1. Пример выделения частей выражения


Код:
from math im p o rt l o g , s q r t , s i n , p i , c o s , ta n

x = 3.6
y = - 4.1
z = 5
eq 1 = s q r t (s i n (x + p i / 3) ** 2)
eq~2 = c o s (t a n (1/ ( ( z+1) ** (1/ 3)) ) ** 2)
eq = l o g (a b s (y - eq 1) + eq 2)
p r i n t ( "eq = " , eq)
Результат:
eq = 1.796391214837781
Задание для сам опроверки
Написать программу для вычисления следующего выражения, значения x и y ввести с
клавиатуры, результат округлить до 5 знаков после запятой:

Проверить программу для следующих входных данных:


Тест 1
x = -2 .3
y = 8.72
Результат: 0.03134

Тест 2
x = -7 .1
y = 12.8
Р езу л ьтат: 0.00417

1.5. О бработка и склю чи тельны х ситуаций


При вычислении выражений для некоторых значений могут возникать ошибки при
выполнении программы, такие как деление на ноль, переполнение и пр. Например, при
вычислении выражения:
y = 1 / x
если x будет иметь значение 0, то возникнет ошибка «Деление на ноль» и программа
закончит свое выполнение.
Подобные ошибки необходимо обработать при реализации программы. Можно найти
область определения выражения (в нашем случае x не должно равняться 0), а в программу
включить условный оператор, в котором проверить значение x, если значение равно 0 -
вывести ошибку, в противном случае выполнить вычисление:

20
i f x == 0 :
p r i n t ( "Деление на ноль")
e ls e :
y = 1 / x
Однако, если выражение сложное, описать область ее определения часто не
представляется возможным. Тогда можно использовать блок обработки исключений t r y ...
e x c e p t . С его помощью осуществляется отслеживание и обработка ошибок, возникающих в
процессе вычисления выражений. Блок обработки исключений состоит из двух частей:
• раздел t r y , где размещаются операторы, в которых может возникнуть ошибка;
• раздел e x c e p t , в нем размещаются операторы, выполняемые при возникновении
ошибок в разделе t r y , также в нем можно реализовать различные действия для различных
типов ошибок.
Выполняется блок обработки исключений следующим образом:
• вычисляются операторы, размещенные в разделе t r y , если в каком-то из них
возникает ошибка, управление передается блоку e x c e p t , в противном случае выполняется
первый оператор после блока обработки исключений;
• если управление передается в раздел e x c e p t , то выполняются операторы в этом
блоке, затем управление передается первому оператору после блока обработки исключений.
С использованием блока обработки исключений наш пример будет выглядеть
следующим образом:
x = i n t (i n p u t ( ”x = ”))
try :
y = 1 / x
e x c e p t:
p r i n t ( "Деление на ноль")
p r i n t ( "y = " , y)
Протестируем нашу программу на различных входных данных:
Тест 1
x = 6
y = 0.16666666666666666
Тест 2
x = 0
Деление на ноль
Traceback (most re c e n t c a l l l a s t ) :
F ile " t e s t .p y " , l i n e 6, in <module>
p r i n t ( " y = ", y)
NameError: name 'y ' i s n o t d e fin e d

Программа выдает ошибку при вводе значения 0, так как при таком использовании
блока обработки исключений после него осуществляется вывод вычисленного значения y,
которое не определено.
Исправить ошибку можно, поместив вывод в разделе t r y :
x = i n t (i n p u t ( "x = " ))
try :
y = 1 / x
p r i n t ( "y = " , y)
e x c e p t:
p r i n t ( "Деление на ноль")
Тогда оба теста проходят.
Тест 1
x = 6
y = 0.16666666666666666
Тест 2
x = 0
Деление на ноль

21
Такой вариант подходит, если в дальнейшем переменную y нигде не нужно
использовать. Если же результат (бесконечность), который получается при делении на ноль,
важен для вычислений, можно занести в переменную константу i n f , которая определена в
модуле m ath. Наша программа в этом случае будет выглядеть следующим образом:
im p o rt math
x = i n t (i n p u t ( "x = " ))
try :
y = 1 / x
e x c e p t:
y = m ath. i n f
p r i n t ( "y = " , y)
Протестируем программу на различных входных данных:
Тест 1
x = 6
y = 0.16666666666666666
Тест 2
x = 0
y = in f
Задание для сам опроверки
Написать программу для вычисления следующего выражения, значения x и y ввести с
клавиатуры. В случае возникновения ошибок вычисления вывести i n f .
arccos(x) + 1.2 J y
z = ---------------------- -—
x 2 — (y + 1 )2
Проверить программу для следующих входных данных:
Тест 1
x = 0.5
y =6
z = -0.08177610753920843
Тест 2
x = 0.5
y =-5
z = in f
Тест 3
x = 1
y =0
z = in f
Тест 4
x = 2
y = 1
z = in f

1.6. Ф ункции
Программа - это последовательность операторов. Часто случается, что какая-то часть
программы неоднократно повторяется. Например, если в задаче требуется вычислить
попарное расстояние между тремя точками на плоскости А (хА,у А), В (хв ,у в ) и С(хс,у с) , то
одна и та же формула применяется для вычисления трех расстояний.
Код:
from math im p o rt s q r t

# здесь нужно ввести или задать координаты трех точек

r a b = s q r t ( ( x a - x b ) ** 2 + (y a - y b ) ** 2)
r_bc = s q r t ( ( x_b - x_ c ) ** 2 + (y_b - y_ c ) ** 2)
r_ ac = s q r t ( ( x_ c - x_ a ) ** 2 + (y_ c - y_ a ) ** 2)

22
Чтобы устранить подобного рода избыточность программного кода, используют
понятие функции. Повторяющийся (да и не только) блок программного кода обозначают
некоторым уникальным именем, чтобы потом при необходимости обратиться к нему по
этому имени.
Для определения функции используется ключевое слово d e f , после которого
указывается ее имя, круглые скобки и двоеточие.
Функции, вычисляющей расстояние между двумя точками, дадим имя
c o m p u te _ le n , ее объявление имеет вид:
d e f compute l e n ():
Внутри функции можно использовать любые операторы языка, в нашем случае
должна вычисляться длина стороны:
d e f compute l e n ():
le n l i n e = s q r t ( ( x b - x a ) ** 2 + (y b - y a ) ** 2)
Но реализованная таким образом функция вычисляет только расстояние между
точками A и B. Для того чтобы вычислить расстояние между двумя произвольными точками
с координатами (x0, y0) и (xb yj), необходимо в заголовке функции указать параметры
(аргументы), с которыми она будет работать, а внутри функции использовать эти параметры
как обычные переменные:
d e f compute l e n (x 0 , y 0 , x 1 , y 1):
le n l i n e = s q r t ( ( x 1 - x 0 ) ** 2 + (y 1 - y 0 ) ** 2)
Расстояние между точками вычислено. Для того чтобы результат стал известен вне
функции, используется оператор r e t u r n , после которого указывается переменная (или
выражение), значение которой является результатом выполнения функции (говорят, что это
значение «возвращается» из функции):
d e f compute l e n (x 0 , y 0 , x 1 , y 1):
le n l i n e = s q r t ( ( x 1 - x 0 ) ** 2 + (y 1 - y 0 ) ** 2)
r e tu r n le n l in e
Данная функция реализована и может быть использована для вычисления расстояния
между двумя точками на плоскости, заданными своими координатами. Для этого к ней
обращаются (вызывают ее) с конкретными значениями координат, а результат заносят в
некоторую переменную. Например, чтобы вычислить расстояние между точками А(хА,у А) и
В (хв , у в у.
С помощью функции c o m p u t e _ l e n можно вычислить расстояние между тремя
точками на плоскости А(хА,у А), В( х в , у в ) и С(хС, у С).
Код:
from math im p o rt s q r t

d e f compute l e n (x 0 , y 0 , x 1 , y 1):
le n l i n e = s q r t ( ( x 1 - x 0 ) ** 2 + (y 1 - y 0 ) ** 2)
r e tu r n le n l in e

xa = f l o a t (i n p u t ( "x a = " ))
ya = f l o a t (i n p u t ( "y a = " ))
x~b = f l o a t (i n p u t ( "x~b = " ))
y_b = f l o a t (i n p u t ( "y_b = " ))
x_c = f l o a t (i n p u t ( "x_c = " ))
y_c = f l o a t (i n p u t ( "y_c = " ))

r a b = compute l e n (x a , y a , x b , y b )
r bc = compute l e n (x b , y b , x c , y c )
r a c = compute l e n (x a , y a , x c , y c )

p r i n t ( " r ab = " , ro u n d (r a b , 4))


p r i n t ( " r bc = " , ro u n d (r b c , 4))
p r i n t ( " r ac = " , ro u n d (r a c , 4))

23
Результат:
x_a = 4
y_a = 1
x_b = 8 .2
y b = -3
x_c = 4.5
y_c = -1
r_ab = 5 .8
r_bc = 4.2059
r_ac = 2.0616
Задания для сам опроверки
1. Какое значение получит переменная re s после выполнения следующего
фрагмента программы:
d e f compute r e s i s t (r 1 , r 2 ):
r = r _1_ * r_2 / ( r _ 1 + r_ 2 )
r e tu r n r
re s = compute r e s i s t (1 5 .0 , 1 1 .0 )
2. Описать функцию, которая вычисляет прибыль от вложения суммы x руб на n
месяцев под k процентов годовых с капитализацией процентов. Формула для вычисления
прибыли:

Заголовок функции должен иметь вид:


# d e p o s it - сумма вклада, i n t e r e s t r a t e -процентная ставка,
# amount months - количество месяцев
d e f compute incom e(d e p o s i t , i n t e r e s t r a t e , amount m onths):
С помощью этой функции посчитать прибыль от вложения для различных входных
данных:
Тест 1
x = 100000
k = 4
n = 18
Прибыль: 617 3.0 6
Тест 2
x = 50600
k = 4.5
n = 36
Прибыль: 7298.94
Тест 3
x = 1000000
k = 5
n = 6
Прибыль: 25261.868

1.7. Ф орм атн ы й вы вод


Для наглядного представления выходных данных в Python используется форматный
вывод.
Форматный вывод осуществляется с помощью оператора % , который используется в
операторе p r i n t () :
p r i n t ( "шаблон вы вода" %(с п и со к вы вода))
С писок вы вода - это перечисленные через запятую переменные, которые выводятся
на экран. Ш аблон вы вода - строка текста со вставленными туда элементами
форматирования для отображения каждого элемента списка вывода. Допускается форматный

24
вывод как числовых значений, так и строк. В таблице 10 приведены форматы для вывода
наиболее распространённых типов данных.

Т аблица 10 - О писание ф орматов

Тип данных Формат Описание


Целое число %8d Целое число размещается в 8 позициях, прижато к правому краю
Целое число %-8d Целое число размещается в 8 позициях, прижато к левому краю
Вещественное число размещается в 8 позициях, выводится 4 знака
Вещественное
со

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

после запятой заполняются 0


Вещественное число размещается в 8 позициях, выводится 4 знака
Вещественное
%

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


і
8
4
f

число
запятой заполняются 0
Если длина строки меньше 8 символов, то она размещается в 8
Строка текста %8s позициях, прижата к правому краю, в противном случае формат не
учитывается
Если длина строки меньше 8 символов, то она размещается в 8
Строка текста %-8s позициях, прижата к левому краю, в противном случае формат не
учитывается

На рисунке 2 показано соответствие между форматом и переменной. Так, первый


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

вывод значения у
Рисунок 2. Форматный вывод

В строке шаблонов на рисунке 2 заданы строковые константы, которые должны


быть выведены на экран ( " f ( " , ") = " ) , а также форматы для двух переменных:
% 4 .2 f - вещественное число, выводится в 4 позициях, количество знаков после
запятой - 2, используется как формат для вывода переменной t ;
% 6 .3 f - вещественное число выводится в 6 позициях, количество знаков после
запятой - 3, используется как формат для вывода значения y.
Задание для сам опроверки
Дан фрагмент программы:
r = 5.9247836
v = 1.9747316
p r i n t ( " r = %___, v = %___ " % (r , v ))
В операторе p r i n t укажите форматы для каждой переменной так, чтобы в консоли
был выведен следующий результат:
r = 5.925, v = 1.9747

1.8. Задача, вы чи слен и я на плоскости


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

25
• площадь;
• величины углов в градусах.

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


Для наглядности нарисуем треугольник на плоскости (рисунок 3). Каждая его
вершина представляет собой точку. Для описания точки на плоскости используются две
координаты, например, точка А на рисунке 3 имеет координаты 8 по оси ОХ и 4 по оси OY.

Рисунок 3. Треугольник ABC

Следовательно, входными данными нашей задачи будут 3 пары переменных, каждая


пара - это координаты x и у вершины треугольника. Примерами координат являются числа 3
или -4.98. Ограничений на ввод координат треугольника нет.
Но есть ограничения на расположение точек. Так треугольник построить нельзя, если:
• или все его вершины совпадают,
• или две любые вершины совпадают,
• или все вершины лежат на одной прямой.
В этом случае никакие характеристики треугольника посчитать нельзя, поскольку это
либо точка, либо отрезок.
Все эти случаи можно учесть с помощью признака существования треугольника:
«треугольник существует, если сумма длин двух любых его сторон больше третей».
В таблице 11 приведены входные данные задачи. Также (для сокращения записи,
чтобы не повторять таблицу в разделе проектирования) в этой таблице укажем имена
переменных и их тип. Например, координату x точки A назовем x _ a , координату точки A -
y _ a . Все переменные имеют тип f l o a t .

Таблица 11 - В ходные данны е

Описание Имя Тип Пример Недопустимые значения


x a f l o a t
in

Координата x точки А Нет


,5-

Координата у точки А y a flo a t -15.1, 6.5 Нет


Координата x точки B x b flo a t 0, 1 Нет
Координата у точки B y b f l o a t -1.1, 9.45 Нет
Координата x точки C x c flo a t 2.55, 5.1 Нет
flo a t
VO
Г'

Координата у точки C y c Нет


2-,
-

Условие существования треугольника: сумма двух любых его сторон больше третьей

Результатом выполнения нашей программы (выходными данными) должны стать


различные характеристики треугольника: длины его сторон, площадь и периметр, величины
углов в градусах. Имена переменным выберем, как это принято в геометрии. Длину стороны
назовем маленькой буквой, которая соответствует вершине, лежащей напротив стороны.
Например, сторона АВ, ее длина c, так как эта сторона лежит напротив вершины С. Площадь

26
и периметр назовем s и p. Величины узлов обозначаются специальным знаком угла «Z»,
после которого пишется имя вершины. Использовать символ угла в имени мы не можем,
поэтому вместо него напишем a n g l e , для соединения с именем вершины воспользуемся
подчеркиванием. Типы результатов - вещественные числа. В таблице 12 приведены
выходные данные задачи.
Таблица 12 - В ыходные данны е

Описание Имя Тип Пример


Длина стороны AB c flo a t 2.704, 16.6623
Длина стороны BC a flo a t 13.327, 16.3218
Длина стороны AC b flo a t 14.866, 6.2412
Периметр ABC p flo a t 30.897, 39.2253
Площадь ABC s flo a t 15.6, 50.46
Величина угла A a n g le A flo a t 9.061, 82.1801
Величина угла B a n g le B flo a t 50.906, 76.0373
Величина угла C a n g le C flo a t 120.033, 21.7826

На следующем этапе неформальной постановки задачи необходимо определиться с


алгоритмами и формулами, которые нам понадобятся в процессе реализации. Эти формулы
можно найти в справочнике по геометрии или на любом информационном ресурсе,
посвященном аналитической геометрии.
1. Длины сторон :
АВ = с = V (*в - ха ) 2 + (Ув - Уа ) 2,
ВС = а = V ( xc - x b)2 + (Ус - У в )2,
AC = b = V ( xc - xa) 2 + (ус - Уа ) 2.
2. Периметр:
р = а + b + с.
3. Площадь (формула Герона):

‘ = Л - ( Н - ( И - ( И -
4. Для вычисления углов используется теорема косинусов:
с2 = а2 + Ь2 — 2 • а • b • cos(AC).
Выразим величины углы (значения будут получены в радианах):
' с2 + Ь2
а А = arccos
2^ с • b )
\ 2 + а2 — Ь2\
аВ = arccos
к 2 •с •а )
U 2 + Ъ2 - с2\
аС = arccos
У 2^ а^ b J
Последним шагом неформальной постановки задачи является описание
ф ункциональны х возможностей программы. Наша программа должна:
• ввести координаты точки A;
• ввести координаты точки B;
• ввести координаты точки C;
• вычислить длины сторон треугольника;
• проверить условие существования треугольника; если треугольник не существует,
вывести сообщение;

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

1.8.2. Проектирование и реализация программы


Для реализации программы мы по-прежнему выбираем язык Python, именование
входных и выходных данных, выбор типов данных уже выполнено на этапе неформальной
постановки задачи. Сразу перейдем к описанию проекта программы:
о п и сать функцию вы числения длины стороны по координатам е е вершин
о п и сать функцию вы числения площади по длинам тр ех сторон
о п и сать функцию вы числения у г л а по длинам тр ех сторон
в в е с т и входные данные
вы числить длины сторон тр е у го л ь н и к а
е с л и входные данные неверны е
то
вы вести сообщение об ошибке
и н ач е
вы числить площадь
вы числить перим етр
вы числить углы
вы вести р е з у л ь т а т ы
Ниже приведен код программы, последовательность реализации программы описана в
виде комментариев.
Код:
• Импортировать функцию для перевода радиан в градусы,
• арккосинуса и квадратного корня.
from math im p o rt s q r t , a c o s , deg rees

#Реализовать функцию для вычисления длины отрезка


#с координатами концов (x0, y0) и (x1, y1).
d e f compute l e n (x 0 , y 0 , x 1 , y 1):
le n l i n e = s q r t ( ( x 1 - x 0 ) ** 2 + (y 1 - y 0 ) ** 2)
r e tu r n le n l in e

#Реализовать функцию для вычисления площади треугольника


• по трем сторонам a 1 , a 2 , a 3 .
d e f compute a r e a (a 1 , a 2 , a 3):
p = (a 1 + a 2 + a 3 ) / 2
a re a = s q r t (p * (p - a 1 ) * (p - a 2 ) * (p - a 3 ))
r e tu r n a re a

#Реализовать функцию для вычисления угла треугольника в градусах,


• если известны длины сторон a 1 , a 2 , a 3 .
d e f compute a n g le (a 1 , a 2 , a 3):
a n g le_ rad = a c o s ( ( a_ l ** 2 + a_2 ** 2 - a_3 ** 2) / ( 2 * a_1 * a_ 2))
r e tu r n d e g r e e s (an g le ra d )

#Ввести координаты вершин треугольника с подсказкой пользователю.


x a = f l o a t (i n p u t ( "x a = " ))
y a = f l o a t (i n p u t ( "y a = " ))
x~b = f l o a t (i n p u t ( "x~b = " ))
y_b = f l o a t (i n p u t ( "y_b = " ))
x_c = f l o a t (i n p u t ( "x_c = " ))
y_c = f l o a t (i n p u t ( "y_c = " ))

28
# Вычислить длины сторон треугольника.
c = compute l e n (x a , y a , x b , y b)
a = compute l e n (x b, y b , x c , y c )
b = compute l e n (x a, y a , x c , y c )

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


# если нет - выдать сообщение пользователю.
i f a + b <= c o r b + c <= a o r a +c <= b :
p r i n t ( "Треугольник не сущ ествует")
# В противном случае вычислить площадь, периметр, величины углов.
e ls e :
s = compute a r e a (a , b , c )
p = a + b + c
an g le A = compute a n g le (c , b , a )
an g le B = compute a n g le (c , a , b )
an g le C = compute a n g le (a , b , c )

# Вывести результаты вычисления на экран,


# округлив их до 3 знаков после запятой.
p r i n t ( "Стороны:", ro u n d (a , 3) , ro u n d (b , 3) , ro u n d (c , 3))
p r i n t ( "Площадь: " , ro u n d (s , 3))
p r i n t ( "Периметр: " , ro u n d (p , 3))
p r i n t ( "У глы:", ro u n d (an g le A, 3) , ro u n d (an g le B, 3) , ro u n d (an g le C, 3))
Результат:
тест 1
x a = 5
y a = -1 5 .1
x~b = 0
y_b = -1 .1
x c = 2.55
y c = -2
Стороны: 2.704 13.327 14.866
Площадь: 15.6
Периметр: 30.897
Углы : 9.061 50.906 120.033
тест 2
x_a = 1
y_a = 1
x_b = 2
y_b = 2
x_c = 3
y_c = 3
Треугольник не существует

1.8.3. Отладка и тестирование


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

Задание для сам опроверки


Решить следующую задачу:
Дан треугольник ABC на плоскости, заданный координатами своих вершин. Для
этого треугольника вычислить:
• радиус вписанной в треугольник окружности;
• радиус описанной вокруг треугольника окружности;
• сумму длин трех медиан треугольника.
Результаты округлить до 4 знаков после запятой.

29
Таблица 13 - Тестирование п рограм м ы для разли чны х входных данны х

Набор входных
Правильный результат Верно?
данных
xa = 0
y_a = 0
x_b = 9
yb = 1 Т реуго л ьн и к не сущ ествует ✓
x_c = 9
yc = 1
xa = 0
y_a = 1
x_b = 0
yb = 2 Т реуго л ьн и к не сущ ествует ✓
x_c = 0
yc = 5
= = = = = =
c c b b a a
y x y x y x

0 5 0 - 1 0

Стороны: 10.0 11.18 11.18


сл о

Площадь: 50.0

______

Периметр: 32.361
Углы: 53.13 63.435 63.435

xa = 0
y_a = 1 Стороны: 1 .0 1 .4 1 4 1 .0
x_b = 0 Площадь: 0 .5
yb = 0 П ериметр: 3 .4 1 4 ✓
x_c = 1 Углы: 4 5 .0 9 0 .0 4 5 .0
yc = 0
xa = 1
y_a = -5 Стороны: 9 .0 5 5 1 4 .3 1 8 8 .0 6 2
xb = 5 Площадь: 3 .5
y_b = -1 П ериметр: 3 1 .4 3 5 ✓
x_c = 6 Углы: 3 5 .4 8 1 1 3 .4 0 5 3 1 .1 1 5
yc = 8

Проверить программу для следующих входных данных:

Тест 1
x_a = 1
y_a = 1
x_b = 0
y_b = 0
x_c = 1
y_c = 1
Результат: Треугольник не существует

Тест 2
x a = -1 2 .8
y_a = 3.4
x~b = -7 .7
y_b = 8.6
x_c = -1 4 .6
y c = -3 .5
Результат: 0.9113 14.0042 22.8319

30
Ф орм улы для вы числений
1. Радиус вписанной окружности вычисляется:

( 2 - a ) ^( 2 - b ) ^( 2 - c )
р .
2
2. Радиус описанной вокруг треугольника окружности:
а •b •с
й = ^ 4------
•s ■
3. Длины медиан вычисляются по формулам:
1 ________________
Ма = —• ^ 2 • (с 2 + Ь2) —а 2,
1 __________________
Мь = —• ^ 2 • (с 2 + а 2) —Ь2,
1
Мс = —• ^ 2 • ( а 2 + Ь2) — с2.

1.9. В арианты заданий для самостоятельного реш ения


Вариант 1
1. Найти уравнение прямой, проходящей через две различные точки, заданные своими
координатами.
2. Определить, имеет ли функция у = sin (x) единственный корень на отрезке [x,x+1]. Если
функция имеет единственный корень на данном интервале, то ее значения на его границах имеют
разные знаки.

Вариант 2
1. Дан катет и гипотенуза прямоугольного треугольника. Найти величины острых углов
треугольника (в градусах).
2. Даны два вещественных числа. Вычислить коэффициенты приведенного квадратного
уравнения, корнями которого являются эти числа.

Вариант 3
1. Вычислить длину окружности, площадь круга и объем шара одного и того же заданного
радиуса.
2. Идет k-ая секунда суток. Определить сколько полных часов и полных минут прошло к
этому моменту суток.
Вариант 4
1. Дана окружность радиуса r и величина центрального угла (в градусах). Найти длину дуги
и площадь сектора, ограниченных этим углом.
2. Составить программу для решения уравнения a-x = b, где a и b - заданные
действительные числа.

Вариант 5
1. Дан цилиндр, заданный радиусом основания и высотой. Найти объем, площадь боковой и
полной поверхностей цилиндра.
2. Даны три действительных числа a, b, c. Определить, являются ли они последовательными
членами арифметической прогрессии.

Вариант 6
1. Дана равнобедренная трапеция, заданная длинами оснований и высотой. Найти площадь
и периметр этой трапеции.
2. Составьте программу, которая для целого числа k (от 1 до 99), введенного вами,
напечатает фразу «Мне k лет», при этом в нужных случаях слово «лет» заменяя на «год» или «года».

31
Вариант 7
1. Дан ромб со стороной a и острым углом а. Найти площадь ромба и длины его
диагоналей.
2. Составить программу для решения уравнения x2+b^x+c= 0, где c и b - заданные
действительные числа. Определить сколько корней имеет уравнение.

Вариант 8
1. Даны координаты центров двух окружностей (x1,y1) и (x2,y2), а также их радиусы r 1 и r2
(r 1>r 2). Определить взаимное расположение окружностей.
2. На поле (k, p) шахматной доски расположен слон. Угрожает ли он полю (m, n)?

Вариант 9
1. Даны координаты двух точек A(x1,y1) и B(x2,y2). Какая из этих точек находится дальше от
начала координат?
2. На поле (k, p) шахматной доски расположена ладья. Угрожает ли она полю (m, n)?

Вариант 10
1. Даны координаты трех вершин треугольника. Определить тип этого треугольника
(прямоугольный, остроугольный или тупоугольный).
2. Составить программу для решения неравенства a • x < b, где a и b - любые
действительные числа.

Вариант 11
1. Найти координаты точек пересечения прямой y=kx+b и окружности радиуса R с центром
в начале координат.
2. Составьте программу, которая по введенному вами k - числу грибов печатает фразу «Мы
нашли в лесу k грибов», причем согласовывает окончание слова «гриб» с числом k.

Вариант 12
1. Даны координаты двух точек A(x1,y1) и B(x2,y2). Пересекает ли отрезок AB оси
координат?
2. На поле (k, p) шахматной доски расположен ферзь. Угрожает ли он полю (m, n)?

Вариант 13
1. Выяснить, принадлежит ли точка с координатами (x,y) кольцу с центром в начале
координат с внешним радиусом a и с внутренним радиусом b.
2. Вычислить значение выражения (x, y, z - вводятся с клавиатуры):
max(х,y, z)2 - 2min(x,y, z)
y =■ max( x , y , z )
sin(2) + ----- v J
min( x , y , z )

Вариант 14
1. Даны координаты центров двух окружностей (0, 0) и (x2,y2), а также их радиусы r 1 и r2.
Найти точки пересечения этих окружностей.
2. Составить программу для решения уравнения a • |x| = b, где a и b - заданные
действительные числа.

Вариант 15
1. Даны координаты двух точек A(x1,y1) и B(x2,y2). Определить, параллелен ли этот отрезок
AB одной из осей координат, если параллелен - вывести какой именно.
2. Составить программу для решения неравенства a • |x| < b, где a и b - заданные
действительные числа.

32
Вариант 16
1. Дана точка O(x,y) на плоскости и длина диагонали квадрата a. Считая, что точка O является
точкой пересечения диагоналей, отрезок a параллелен оси ОХ, найти координаты вершин квадрата,
площадь и периметр квадрата.
2. Даны координаты двух точек A(x1,y1) и B(x2,y2). Найти уравнение прямой, являющейся
серединным перпендикуляром к этому отрезку.

Вариант 17
1. Даны координаты двух точек A(x1,y1) и B(x2,y2). Определить, проходит ли отрезок AB
через начало координат.
2. Даны три действительных числа a, b, c. Определить, являются ли они последовательными
членами геометрической прогрессии.

Вариант 18
1. Дана точка O(x,y) на плоскости и длины двух диагоналей ромба a и b. Считая, что точка
O является точкой пересечения диагоналей, отрезок a параллелен оси ОХ, отрезок b параллелен оси
OY, найти координаты вершин ромба, длину стороны ромба и величины углов ромба.
2. Даны координаты точки A(x, y). Определить, в какой координатной плоскости она
расположена. Если точка лежит на осях координат - вывести, какой именно оси она принадлежит.

33
2. О БРА БО ТК А Т А Б Л И Ч Н Ы Х ДА Н Н Ы Х И ИХ ВИ ЗУ А ЛИ ЗА Ц И Я

2.1. С писки
Списки в Python - упорядоченные изменяемые коллекции объектов произвольных
типов (рисунок 4).

индексы
Рисунок 4. Список

Чтобы использовать списки, их нужно создать. Например, создадим пустой список:


x l i s t = []
или сразу сформируем список из нескольких элементов:
x_l i s t = [2 3 , 3 4 .4 , - 0 .4 5 , - 3 . 1 , 5]
Нумерация элементов в списке начинается с 0, для того чтобы обратиться ко второму
элементу списка x _ l i s t , используется запись:
x l i s t [1]
значение этого элемента равно 34.4.
Чтобы зам енить элемент списка x _ lis t номером 1, используется оператор
присваивания:
x_l i s t [1] = - 23.14
в результате наш список будет иметь вид:
[2 3 , - 2 3 .1 4 , - 0 .4 5 , - 3 .1 , 5]
Длину списка вычисляют с помощью встроенной функции l e n ():
n = (x l i s t
В данном случае в переменную n будет занесено значение 5.

2.1.1. Оператор цикла, диапазон


Для перебора элементов списка используется оператор цикла, с помощью которого
осуществляется заданное число повторений вложенного в цикл блока:
fo r ... :
операторы
Для управления перебором в цикле используется диапазон, который описывает
неизменяемую последовательность целых чисел от начального значения до границы (не
включая ее) с указанным шагом:
r a n g e (Ha4 з н а ч , г р а н и ц а , ш аг)
Формируется диапазон следующим образом:
1. первое число диапазона - это начальное значение;
2. второе (и последующие) вычисляется как предыдущее плюс шаг;
3. число большее или равное границе в диапазон не включается, заполнение
диапазона заканчивается.
Формирование значений диапазона рассмотрим на следующем примере:
r a n g e (3 , 1 1 , 2 )
В этом диапазоне начальное значение равно 3, граница 10, шаг 2:
• первое число диапазона - это начальное значение: 3

34
• второе число вычисляется как предыдущее плюс шаг 3 + 2 = 5: 3 5
• третье число вычисляется как предыдущее плюс шаг 5+2 = 7: 3 5 7
• четвертое число вычисляется как предыдущее плюс шаг 7 + 2 = 9: 3 5 7 9
• пятое число вычисляется как предыдущее плюс шаг 9+2 = 11, получили число
большее или равное границе, поэтому оно в диапазон не включается, заполнение диапазона
заканчивается: 3 5 7 9
Таким образом, получили диапазон, состоящий из четырех чисел.
Описание диапазона может включать 3, 2 и одно значение в качестве параметров.
Принято считать:
• если r a n g e () содержит 2 значения - пропущен шаг, который по умолчанию
равен 1;
• если r a n g e () содержит 1 значение - пропущен шаг, который по умолчанию
равен 1, и начальное значение, которое по умолчанию равно 0.
Например:
r a n g e (0 , 5 , 2 ) р е з у л ь т а т : 0 , 2 , 4
r a n g e ( 1 , 4) р е з у л ь т а т : 1 , 2 , 3
r a n g e (5 ) р е з у л ь т а т : 0 , 1 , 2 , 3 , 4
Диапазоны используются в цикле for, в котором на каждом шаге управляющей
переменной цикла присваивается очередное значение диапазона.
Рассмотрим, как работает цикл на следующем примере:
f o r i in ra n g e (0 , 4):
p r i n t (i )
Диапазон генерирует следующую последовательность чисел:
r a n g e ( 0 , 4) ^ 0 , 1 , 2 , 3
Выполняется цикл следующим образом:

Ш аг 1. Из диапазона выбирается первое значение и заносится в переменную i ( i = 0 ),


это значение становится доступным в теле цикла, с помощью оператора в консоль выводится
значение переменной i :
0

Ш аг 2. Из диапазона выбирается второе значение и заносится в переменную i ( i = 1),


это значение становится доступным в теле цикла, с помощью оператора в консоль выводится
значение переменной i :
0
1

Ш аг 3. Из диапазона выбирается третье значение и заносится в переменную i ( i = 2 ),


с помощью оператора в консоль выводится значение переменной i :
0
1

Ш аг 4. Из диапазона выбирается четвертое значение и заносится в переменную i ( i = 3),


с помощью оператора в консоль выводится значение переменной i :
0
1
2
3

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


Другими словами, в цикле последовательно перебираются числа от 0 до 3,
составляющие диапазон, последовательно заносятся в переменную i и выводятся в консоль.

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

Код:
• вводим параметры арифметической прогрессии
a = i n t (i n p u t ( "a = " ))
b = i n t (i n p u t ( "b = " ))
h = i n t (i n p u t ( "h = " ))

• формируем члены арифметической прогрессии и выводим их


f o r x in ra n g e (a , b + 1 , h ):
p r i n t (x )
Результат:
Тест 1
a = 6
b = 12
h = 3
6
9
12
Тест 2
a = 5
b = 12
h = 2
5
7
9
11
Задания для сам опроверки
1. Для каждой числовой последовательности напишите диапазон, который ее
формирует.
• 0, 2, 4, 6, 8;
• -6, -7, -8, -9, -10;
• 3, 6, 9, 12;
• 0, 1, 2, 3, 4, 5.
2. Заполните пропущенные фрагменты программы:
a =
f o r i in ra n g e (2 , ):
a = a + a %i
p r i n t (a )
так, чтобы в консоль был выведен следующий результат:
10
11
14
18
18
22

2.1.2. Генератор списка


Кроме явного создания списков как, например:
x l i s t = [3 , 6 , 23]
их можно создавать с помощью генератора.
Генератор списков - способ построить новый список, применяя выражение к
каждому элементу диапазона или другого списка.
36
Для создания списка, элементы которого формируются в зависимости от значения
переменной-диапазона i, используется следующий оператор:
сп и сок = [формула от i f o r i i n r a n g e (описание д и а п а з о н а ) ]
Формирование списка с помощью генератора списка рассмотрим на примере:
x l i s t = [i / ( i + 1) f o r i i n r a n g e ( 4) ]
Диапазон в генераторе имеет вид:
r a n g e (4) ^ 0 , 1 , 2 , 3
Последовательность генерации списка x _ l i s t :
• для формирования первого числа в списке из диапазона выбирается первое
значение и заносится в переменную i ( i = 0 ), затем для этой переменной вычисляется
выражение i / ( i + 1)= 0 / (0 + 1) = 0 :
x l i s t = [0]
• для формирования второго числа в списке из диапазона выбирается второе
значение и заносится в переменную i ( i = 1 ), затем для этой переменной вычисляется
выражение i / ( i + 1)= 1 / (1 + 1) = 0 . 5 :
x l i s t = [0 , 0 .5 ]
• для формирования третьего числа в списке из диапазона выбирается третье
значение и заносится в переменную i ( i = 2 ) , затем для этой переменной вычисляется
вы раж ениеi / ( i + 1)= 2 / (2 + 1) = 0 .6 6 6 6 67:
x_l i s t = [0 , 0 .5 , 0.666667]
• для формирования четвертого числа в списке из диапазона выбирается четвертое
значение и заносится в переменную i ( i = 3 ) , затем для этой переменной вычисляется
выражение i / ( i + 1)= 3 / (3 + 1) = 0 .7 5 :
x_l i s t = [0 , 0 .5 , 0.666667, 0 .7 5 ]
• элементы диапазона исчерпаны, это значит, что генерация списка заканчивается:
x_l i s t = [0 , 0 .5 , 0.666667, 0 .7 5 ]
Таким образом, получили список, состоящий из четырех чисел.

Генерация списков осуществляется с использованием диапазонов не только, но и


других списков:
новый сп и сок = [формула от x f o r x i n уже существующий с п и с о к ]
Формирование списка на основе другого списка рассмотрим на примере:
x l i s t = [5 , 8 , - 5 ]
y l i s t = [x ** 2 f o r x i n x l i s t ]
Последовательность генерации списка y _ l i s t :
• для формирования первого числа в списке y _ l i s t из списка x _ l i s t выбирается
первое значение и заносится в переменную x (x = 5 ) , затем для этой переменной
вычисляется выражение x ** 2 = 5 ** 2 = 2 5 :
y l i s t = [25]
• для формирования второго числа в списке y _ l i s t из списка x _ l i s t выбирается
второе значение и заносится в переменную x (x = 8 ), затем для этой переменной
вычисляется выражение x ** 2 = 8 ** 2 = 64:
Y _ lis t = [2 5 , 64]
• для формирования третьего числа в списке y _ l i s t из списка x _ l i s t
выбирается третье значение и заносится в переменную x (x = - 5 ) , затем для этой
переменной вычисляется выражение x ** 2 = -5 ** 2 = 2 5 :
y_l i s t = [2 5 , 64, 25]

37
# элементы списка x _ l i s t исчерпаны, значит генерация списка y _ l i s t
заканчивается:
y_l i s t = [2 5 , 64, 25]
Таким образом, получили список, состоящий из трех чисел.

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


x l i s t = [2 * i + 1 f o r i in ra n g e (5)] ^ [1 , 3 , 5 , 7 , 9]
x l i s t = [i f o r i in ra n g e (5 , 10, 2)] ^ [5 , 7 , 9]
x l i s t = [2*i f o r i in ra n g e (3 , - 3 , - 1)] ^ [6 , 4 , 2 , 0 , - 2 , - 4]
x l i s t = [3 , 2 , 7]
y l i s t = [x % 2 f o r x in x l i s t ] ^ [1 , 0 , 1]

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


каждый год, номер которого делится на 4, является високосным, за исключением тех,
которые делятся на 100 и при этом не делятся на 400. Создать новый список, каждый элемент
которого равен T ru e , если соответствующий год из списка високосный, F a l s e - если нет.
Код:
# список лет
y e a r _ l i s t = [1900, 1945, 1980, 2000, 2019, 2020, 2300]

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


le a p y ear = [y ear % 4 == 0 and n o t (y ear % 100 == 0 and y ear % 400 != 0)
f o r y ear in y ear l i s t ]

# выводим результаты
p r i n t (y ear l i s t )
p r i n t (le a p y e a r)
Результат:
[1900, 1945, 1980, 2000, 2019, 2020, 2300]
[F a ls e , F a ls e , True, True, F a ls e , True, F alse]

Задания для сам опроверки


1. Создайте следующие списки с помощью генератора:
# [0, 0.1, 0.001, 0.0001, 0.00001];
• [0.5, 0.25, 0.125, 0.0625, 0.03125];
• [2.1, 5.1, 8.1, 11.1 ,14.1].
2. Список y _ l i s t формируется на основе списка x _ l i s t . Заполните пропущенные
фрагменты кода:
x lis t = [ ]
y l i s t = [i + i / 10 f o r i in x l i s t ]
p r i n t (y l i s t )
так, чтобы в консоль был выведен следующий результат:
[1 6 .5 , 2 2 .0 , 1 9 .8 , 1 8 .7 , 35.2]

2.1.3. Основные операции со списками


В Python предусмотрено большое количество различных функций для работы со
списками. В таблице 14 приведены некоторые из них. В примерах функции применяются к
следующему списку:
x l i s t = [1 , 2 , 3 , 4 , 1 , 3]

38
Т аблица 14 - Ф ункции работы со списком

Функция Описание Пример


x l i s t . a p p e n d ( - 1)
x lis t.a p p e n d ( x ) Добавляет элемент в конец списка [1 , 2 , 3 , 4 , 1 , 3 , - 1]
Расширяет список x l i s t , добавляя в x l i s t . a p p e n d ( [ 0 , 5])
x lis t.e x te n d ( L )
конец все элементы списка L [1 , 2 , 3 , 4 , 1 , 3 , 0 , 5]
x l i s t . i n s e r t ( 2 , 7)
x l i s t . i n s e r t ( i , x) Вставляет в i -й элемент значение x [1 , 2 , 7 , 4 , 1 , 3]
Удаляет первый элемент в списке, x l i s t .r e m o v e ( 3)
x lis t.re m o v e (x )
имеющий значение x. [1 , 2 , 4 , 1 , 3]
Удаляет i -й элемент и возвращает его.
x l i s t .p o p ( 3 )
x lis t.p o p ( i) Если индекс не указан, удаляется [1 , 2 , 3 , 1 , 3]
последний элемент
Возвращает положение первого элемента
со значением x (при этом поиск ведется
x lis t.in d e x ( x , x l i s t . i n d e x ( 1 , 3 , 5)
s t a r t , end) от s t a r t до end). Если s t a r t и e n d 4
опущены, то поиск осуществляется по
всему списку
Возвращает количество элементов x l i s t . c o u n t ( 1)
x l i s t .c o u n t ( x )
со значением x 2'
x lis t.s o r t( )
x lis t.s o r t( ) Сортирует список по возрастанию [1 , 1 , 2 , 3 , 3 , 4]
x lis t.r e v e r s e ( )
x lis t.re v e rs e () Разворачивает список [3 , 1 , 4 , 3 , 2 , 1]
x lis t.c le a r ( )
x lis t.c le a r ( ) Очищает список []

П ример. В список занесен рост студентов группы. Найти самый маленький и самый
большой рост в группе. Посчитать, сколько студентов имеют самый маленький и самый
большой рост.
Код:
# создадим список с ростом студентов
h e i g h t _ l i s t = [ 1 .6 7 , 1 .8 5 , 1 .5 8 , 1 .8 9 , 1 .7 6 , 1 .8 9 , 1 .7 , 1 .8 9 ]
# отсортируем список по возрастанию
h e ig h t l i s t . s o r t ()
# первый элемент этого списка - самый маленький рост
h e ig h t min = h e ig h t l i s t [0]
# последний элемент отсортированного списка - самый большой рост
h e ig h t max = h e ig h t l i s t [l e n (h e ig h t l i s t ) - 1]
#посчитаем количество студентов с самым маленьким ростом
min count = h e ig h t l i s t . c o u n t(h e ig h t min)
#посчитаем количество студентов с самым большим ростом
max count = h e ig h t l i s t . c o u n t(h e ig h t max)
# выведем результат:
p r i n t ( "минимальный р о с т :" , h e ig h t m in, "к о л и ч еств о :", min c o u n t)
p r i n t ("максимальный р о с т :" , h e ig h t max, "к о л и ч еств о :", max c o u n t)
Результат:
минимальный рост: 1.5 8 количество: 1
максимальный рост: 1.8 9 количество: 3
Задание для сам опроверки
Решить следующую задачу:
В список занесены численности городов некоторого региона:
p o p u la tio n = [300125, 50000, 600050, 212000, 120000, 50000, 17000]

39
Из этого списка удалить одно максимальное и одно минимальное значения.

2.1.4. Вывод списка


Пусть список заполнен следующим образом:
x_l i s t = [2 3 , - 2 3 .1 4 , - 0 .4 5 , 15]
Для вывода этого списка можно использовать несколько способов:
• вывести список с помощью оператора p r i n t ():
p r i n t (x l i s t )
список будет выведен в одну строку в квадратных скобках через запятую:
[23, -2 3 .1 4 , -0 .4 5 , 15]
• вывести список в цикле:
f o r x in x l i s t :
p r i n t (x )
в этом случае каждый элемент будет размещен на новой строке:
23
-23.14
-0 .4 5
15
• вывести список с использованием его индексов:
f o r i in ra n g e (l e n (x l i s t ) ) :
p r i n t ( " x [ " , i + 1 , ” ] = " , x_l i s t [i ])
результат:
x[ 1 ] = 23
x[ 2 ] = -23.14
x[ 3 ] = -0 .4 5
x[ 4 ] = 15
Задание для сам опроверки
Написать фрагмент программы вывода списка [23, 76, 12, -6 , 50], чтобы
результат в консоли выглядел следующим образом.
Список:
2 3 - элемент с индексом 0
7 6 - элемент с индексом 1
12 - элемент с индексом 2
-6 - элемент с индексом 3
5 0 - элемент с индексом 4

2.1.5. Ввод списка


Ввод списка может быть осуществлен разными способами.
Первый способ - поэлементны й ввод, который реализуется по следующему
алгоритму:
• спросить у пользователя количество элементов списка, занести значение в
переменную n (или просто занести в n нужное значение);
• сформировать пустой список;
• реализовать перебор по переменной i в цикле для n элементов;
• ввести очередной элемент списка и занести его в переменную x;
• добавить x в конец списка.
П ример. Введем с клавиатуры 5 вещественных чисел и занесем их в список:
• количество элементов в списке
n = 5

• формируем пустой список


x l i s t = []

40
# цикл перебора индексов списка от 0 до 4
f o r i in ra n g e (n ):
# вводим очередной элемент списка
x = f l o a t (i n p u t ( "Введите элемент списка: " ))
# добавляем введенный элемент в конец списка
x l i s t . append(x )

#выводим список на экран


p r i n t (x l i s t )
Результат:
Введите элемент списка: 5.9
Введите элемент списка: -7 .2
Введите элемент списка: 2.1
Введите элемент списка: 12.45
Введите элемент списка: -2 .1 2
[5 .9 , - 7 .2 , 2 .1 , 12.45, -2 .1 2 ]

Вторым способом является ввод элементов списка в одну строку через пробел, а
затем формирование списка на основе введенной строки. Алгоритм формирования списка:
# попросить пользователя ввести элементы списка в одну строку через пробел;
# полученную строку преобразовать в список с помощью метода s p l i t ( ) , при этом
в список будет занесены введенные числа в виде строк;
# преобразовать элементы списка из строковых переменных в вещественные (или
целые).
П ример. Введем с клавиатуры вещественные числа и занесем их в список.
# вводим строку с числами
l i n e = i n p u t ( "Введите элементы списка через пробел: " )

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


s t r l i s t = l i n e . s p l i t ()
p r i n t ( "Список из с т р о к :" , s t r l i s t )

# создаем новый список на основе уже сформированного,


# переводя каждый элемент в вещественное число
x l i s t = [f l o a t (x ) f o r x s tr l is t
p r i n t ( "Список из ч и с е л :" , x l i s t )
Результат:
Введите элементы списка через пробел: 45.7 34.2 -3 2 .2 0.12 -3 .1
Список из строк: [ ' 4 5 . 7 ' , ' 3 4 . 2 ' , '- 3 2 . 2 ', '0 . 1 2 ', '- 3 . 1 ']
Список из чисел: [4 5 .7 , 3 4 .2 , -3 2 .2 , 0 .1 2 , -3 .1 ]
Задание для сам опроверки
Необходимо ввести два списка: первый список i n t _ l i s t состоит из целых чисел,
второй f l o a t _ l i s t из вещественных. Исправьте фрагмент программы, в котором эти
списки вводятся:
s t r _i n t = i n t (i n p u t ( " " ))
s tr _ f lo a t = in p u t("")
i n t l i s t = s t r i n t . s p l i t ()
f l o a t l i s t = s t r f l o a t . s p l i t ()
flo a t l i s t = [ (x ) f o r x flo a t l i s t
p r i n t (i n t l i s t )
p r i n t (f l o a t l i s t )

2.2. Задача, ф ормирование таблиц ы значений ф ункции


Задача. Построить таблицу значений функции f ( x ) на интервале [a, b], количество
значений в таблице n.

41
1 X
/( х ) =
х+1 х —3

2.2.1. Описание алгоритма


Алгоритм построения таблицы значений функции на интервале [a, b], количество
значений n:
# вычислить шаг h по формуле:
b —а
h = ------
п —1
# создать список x _ l i s t , содержащий все значения аргумента функции x, список
должен включать следующие значения:
а, а + h, а + 2 • h, а + 3 • h , ... , Ь;
# создать список y _ l i s t , содержащий все значения функции, вычисленные от
сформированных в списке аргументов, список должен включать:
/ (х гtSt[0]),/( *ii5t[l]), .. / ( ^iist[n-i]);
# вывести таблицу значений функции, в первом столбце которой будут
располагаться элементы списка x _ l i s t , во втором - соответствующие значения списка
y _ lis t.

2.2.2. Реализация
Для построения таблицы значений функции используется следующая программа,
пояснения к операторам даны в комментариях:
im p o rt math
# Опишем функцию f ( x ) :
d e f f x (x ):
try :
y = 1 / (x+1) + x / (x- 3)
e x c e p t:
y = m ath. i n f
r e tu r n y

# Введем границы интервала построения a, b


# и количество значений на интервале n:
a = f l o a t (i n p u t ( "a = " ))
b = f l o a t (i n p u t ( "b = " ))
n = i n t (i n p u t ( "n = " ))

# Выполним проверку правильности ввода:


# количество значений должно быть больше 0,
# нижняя граница должна быть меньше верхней
i f n < 0 o r a >= b :
p r i n t ( "Ошибочные входные данные")

# Если все введено верно


e ls e :
# вычислим шаг изменения аргумента функции:
h = (b - a ) / (n - 1)

# создадим список значений


x l i s t = [a + i * h f o r i in ra n g e (n )]

# вычислим значение функции для каждого значения из списка


f l i s t = [f x (x ) f o r x in x l i s t ]

# Выведем таблицу значений функции:


f o r i in ra n g e (n ):
p r i n t ( "%4.1f : %6.3f" % (x l i s t [i ] , f l i s t [i ]))

42
Результат:
a = -5
b = 5
n = 21
-5 .0 : 0 375
-4 .5 : 0 314
-4.0 : 0 238
-3 .5 : 0 138
-3 .0 : 0 000
-2 .5 : -0 212
-2 .0 : -0 600
-1 .5 : -1 667
-1 .0 : in f
-0 .5 : 2 143
0.0 1 000
0.5 0 467
1.0 0 000
1.5 -0 600
2 .0 : -1 667
2 .5 : -4 714
3.0 : in f
3.5 : 7 222
4.0 4 200
4.5 3 182
5.0 2 667

Оформим вывод в виде привычной таблицы (знак * при форматном выводе означает,
что строку нужно повторить указанное количество раз). Для этого заменим вывод
таблицы в программе на следующий код:
# вывод шапки таблицы
p r i n t ( "-" * 17)
p r i n t ( "| %4s | %6s |" % ( " x " , " f ( x ) " ))
p r i n t ( "-" * 17)
# вывод содержимого таблицы
f o r i in ra n g e (n ):
p r i n t ( "| %4.1f | %6.3f |" % (x_l i s t [i ] , f _l i s t [i ]))
# вывод подчеркивания
p r i n t ( "-" * 17)
Результат:
a = -5
b = 5
n = 21

x | f(x)

-5 0 0 .375
-4 5 0 .314
-4 0 0 .238
-3 5 0 .138
-3 0 0 .000
-2 5 -0 .212
-2 0 -0 .600
-1 5 -1 .667
-1 0 in f |
-0 5 2 .143
0 0 1 .000
0 5 0 .467
1 0 0 .000
1 5 -0 .600
2 0 -1 .667
2 5 -4 .714
3 0 in f |
3 5 7 .222
43
| 4 .0 | 4.2 0 0 |
| 4 .5 | 3.182 |
| 5 .0 | 2.6 6 7 |

З ад ан и е д л я сам о п р о в ер к и
Написать программу для решения следующей задачи:
Для вычисления и прогноза численности населения Земли С.П. Капица предложил
следующую формулу:
С /71 — t \
N( t ) = —• a rcc tg ( -------- ),
где t - год, для которого вычисляется численность населения;
С - 172 миллиарда человек/лет;
Ti - 2000 год;
т - 45 лет.
Вычислить численность населения в заданные годы.
Реализовать задачу на основе шаблона.
im p o rt math

d e f compute p o p u l a t i o n (t ) :
^вычислить численность населения для года t по формуле

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


l i n e = i n p u t ( "Введите список лет ч ер ез пробел: " )

# преобразовать строку в список из строковых значений годов


y e a rs s t r l i s t = l i n e . s p l i t ()

# вычислить количество элементов в списке


n = l e n (y e a rs s t r l i s t )

# сформировать список y e a r s _ l i s t на основе y e a r s _ s t r _ l i s t ,


#преобразовав строковые значения в целые

# созд ать список p o p u l a t i o n _ l i s t , каждый элемент которого вычисляется


# функцией c o m p u te _ p o p u la tio n от соответствую щ его года из y e a r s _ l i s t

# в цикле для каждого года вывести численность населения,


# для вывода использовать формат "%5d - % 6.3f м иллиард(ов)"

Результат
Введите список лет ч ер ез пробел: 1220 2369 2636 1032 2657 198 1118
122 0 - 0.22 0 миллиард(ов)
2369 - 11.544 миллиард(ов)
2 63 6 - 11.738 миллиард(ов)
1032 - 0.178 миллиард(ов)
2657 - 11.746 миллиард(ов)
198 - 0.095 миллиард(ов)
1118 - 0.195 миллиард(ов)

П о ясн ен и е
1. В модуле m a t h функции a r c c t g ( ) нет, но ее можно выразить через a r c t g ( )
следую щ им образом:
п
ar cc t g( x) = ——a c t g ( x ).
2. Для вычисления a r c t g () в модуле m a t h используется a t a n ( ) .

44
2.3. П остроен и е гр а ф и к о в и д и агр ам м
Для построения графиков и диаграмм используется библиотека m atplotlib.pyplot. Эта
библиотека не является стандартной, в больш инстве сред разработки (в том числе и
ID LE(Python)) ее необходимо установить. В П риложении Б приведена инструкция по
установке дополнительных модулей.
П еред первым применением библиотеки ее необходимо подключить. Чтобы
упростить обращ ение к функциям библиотеки, можно присвоить ей имя, например, p l t :
im p o rt m a t p l o t l i b . p y p lo t a s p l t
С помощью этой библиотеки создается графическая область, на которой
отображаю тся следую щ ие элементы:
• линии;
• оси координат;
• заголовок;
• легенды линий;
• многое другое.
Графическая область представляет собой прямоугольную сетку, координаты узлов
которой определяю тся либо автоматически, либо могут быть установлены пользователем.
В графическую область можно вывести точку с координатами ( x , у ) (рисунок 5). Значение
x увеличивается по горизонтали слева направо, значение у увеличивается по вертикали
снизу вверх, как это принято в декартовой системе координат.

А(-1 0, 5)

■20 -15 -10 -5 0 5 10 15 20


----------------------------- > X
Рисунок 5. Область рисования

2.3.1. Построение линий


Для построения линий по точкам на плоскости используется метод plot():
p l o t (x , у , параметры) ,
где x - список значений по оси X,
у - список значений по оси Y;
параметры - формат отображения линии на графике (ее характеристики).
Н апример, построим график по точкам, координаты которых представлены в виде
двух списков (последний оператор нужен, чтобы отобразить линию в области построения):
im p o rt m a t p l o t l i b . p y p lo t a s p l t
p l t . p l o t ( [ 1 , 5 , - 3 , - 0 .5 ] , [ 1 , 2 5 , 9 , 0 .2 5 ])
p l t . show ()
В результате будет построена ломаная линия (рисунок 6).

45
3 -2 -1 0 1 2 3 4 5

Рисунок 6. Линия, построенная по точкам

Библиотека m atplotlib.pyplot позволяет устанавливать следующ ие характеристики


линии (краткий справочник со значениями характеристик линий приведен в П риложении В):
• маркер точек, по которым строится линия, его размер;
• стиль (сплошная, пунктирная, отсутствует и пр);
• цвет (красный, зеленый и пр);
• толщ ина (в пикселях).
Это можно сделать, либо указав соответствую щ ие параметры в методе plot(), как
показано в таблице 15, либо использовать метод setp(), который устанавливает
характеристики заданной первым параметром линии.

Т аб л и ц а 15 - У с т а н о в к а х а р а к т е р и с т и к л и н и и в plot()

Метод с параметрами Описание


Создает линию, в которой используются
p l o t (x , y ) параметры отображения, установленные
по умолчанию
p l o t (x , y , "b o " ) Создает точки на графике, которые обозначаются
маркерами круглой формы синего цвета
Создает линию, в качестве значения x
p l o t (y ) используется интервал от 0 до количества
значений в списке у минус 1
Создает точки на графике , которые обозначаются
p l o t (y , " r + " )
маркером «+» красного цвета
Создает пунктирную линию зеленого цвета,
p l o t (x , y , " g o - - " , li n e w id th =2 ,
m a rk e r s iz e =12) толщиной 2, в качестве маркеров используются
круги радиусом 12 пикселей
p l o t (x , y , c o l o r = " g r e e n " , m a rk e r= " o " ,
l i n e s t y l e = " d a s h e d " , li n e w id th =2 , Другой способ описания предыдущей линии
m a rk e r s iz e =12)

Для того чтобы использовать метод s e t p () для установки характеристик линий,


необходимо
• дать линии имя:
l i n e = p l t . p l o t ( [ 1 , 5 , - 3 , - 0 .5 ] , [ 1 , 2 5 , 9 , 0 .2 5 ])
• задать необходимые характеристики для линии, которая указывается первым
параметром метода s e t p ( ) :
p l t . s e t p (l i n e , c o l o r = " r e d " , li n e w id th =2 , m a rk e r= "o" )
• показать линии в области построения:
p l t . show ()

46
Результат построения показан на рисунке 7.
2

о-
-3 -2 -1 0 1 2 3 4 5

Рисунок 7. Красная линия с маркерами, построенная по точкам

2.3.2. Оси координат


Для построения и настройки координатных осей используется метод g c a () . На
графике могут быть отображены 4 оси, обращ ения к которым осущ ествляю тся следующим
образом:
g c a ( ) . s p i n e s [ " l e f t " ] - л е в а я ось
g c a ( ) . s p i n e s [ " b o tto m " ] - нижняя ось
g c a ( ) . s p i n e s [ " to p " ] - верхняя ось
g c a ( ) . s p in e s [ " r i g h t " ] - правая ось
Для каждой из них можно указать ее р асп о л о ж ен и е с помощью функции:
s e t p o s i t i o n ( "зн ач ен и е")
где значение - положение оси на графике, при этом можно задать:
z e ro - в точке с координатой 0 по соответствую щ ей оси;
c e n t e r - по центру области вывода графиков.
Управление видимостью оси осущ ествляется с помощью метода:
s e t v i s i b l e (зн ачен и е)
в котором з н а ч е н и е может быть либо T r u e (если ось нужно показать, установлено по
умолчанию ), либо F a l s e (если ось нужно «спрятать»).
Например, нарисуем нашу ломаную в традиционной декартовой системе координат.
Для этого уберем верхнюю и правую ось, а левую и нижнюю установим в позицию z e r o :
im p o rt m a t p l o t l i b . p y p lo t a s p l t
# формируем линию
l i n e = p l t . p l o t ( [ 1 , 5 , - 3 , - 0 .5 ] , [ 1 , 2 5 , 9 , 0 .2 5 ])

# задаем формат ее вывода


p l t . s e t p (l i n e , c o l o r = " r e d " , li n e w id th =2 , m a rk e r= "o" )

# устанавливаем две оси в положение zero


p l t . g c a ( ) . s p in e s [ " l e f t " ] . s e t p o s i t i o n ( " z e r o " )
p l t . g c a ( ) . s p i n e s [ " b o tto m " ] . s e t p o s i t i o n ( " z e r o " )

# скрываем остальные две


p l t . g c a ( ) . s p in e s [ " to p " ] . s e t v i s i b l e (F a l s e )
p l t . g c a ( ) . s p i n e s [ " r i g h t " ] . s e t v i s i b l e (F a l s e )

# отображаем область построения


p l t . show ()
Результат выполнения программы показан на рисунке 8.

47
2.3.3. Заголовок
В область построения можно вывести заголовок с помощью метода:
t i t l e ("текст").
Если в нашу программу добавить оператор:
p l t . t i t l e ( "Пример рисования линий")
то в области построения появится новый элем ент - заголовок (рисунок 9)

2.3.4. Легенда
Л еген д а - это условное обозначение графиков. Легенда показывает названия и
маркеры линий, используемых при их отображении в области построения.
Для каждой линии задается параметр - ее подпись, которая будет выводиться в
качестве легенды. Это можно сделать двумя способами: либо задать параметр l a b e l при
создании линии:
l i n e b lu e = p l t . p l o t ( [ 1 , 5 , - 3 , - 0 .5 ] , [ 1 , 2 5 , 9 , 0 .2 5 ] , 1аЬе1= 'синяя линия')
либо задать этот параметр одновременно с установкой параметров стиля линии:
p l t . s e t p (l i n e r e d , c o l o r = " r e d " , li n e w id th =2 , l a b e l = ' красная л и н и я ')
Для вывода в область построения легенды используется метод l e g e n d ( ) . В этом
случае для расположения легенды выбирается «наилучш ее» ее положение в области
построения, то есть то, которое не перекрывает линии в области построения.
Если необходимо изменить положение вывода, используется метод:
le g e n d (1oc= "зн ач ен и е")

48
Параметр з н а ч е н и е определяет положение легенды на графике. Он может
принимать следующ ие значения: b e s t , u p p e r r i g h t , u p p e r l e f t , lo w e r l e f t ,
lo w e r r i g h t , rig h t, c e n te r l e f t , c e n te r r ig h t, lo w e r c e n t e r , upper
c e n te r, c e n te r.
Например, построим две ломаные линии, зададим для них легенду.
im p o rt m a t p l o t l i b . p y p lo t a s p l t

# создаем ломанные линии


li n e _ b lu e = p l t . p l o t ( [ 1 , 5 , - 3 , - 0 .5 ] , [ 1 , 2 5 , 9 , 0 .2 5 ] ,
l a b e l = ' синяя л и н и я ')
l i n e re d = p l t . p l o t ( [ - 6 , - 5 , 0 , 8] , [ - 5 , - 2 , - 3 , 4 ])

# задаем стили для линий


p l t . s e t p (l i n e b l u e , c o l o r = " b l u e " , li n e w id th =2 , m a rk e r= "v" )
p l t . s e t p (l i n e r e d , c o l o r = " r e d " , li n e w id th =2 , m a rk e r= " o " ,
l a b e l = 'к р а с н а я л и н и я ')

# отображаем легенду
p l t . le g e n d ()

# показываем область рисования


p l t . show ()
Результат выполнения программы показан на рисунке 10.

6 -4 -2 0 2 4 б 8

Рисунок 10. Вывод линий с легендой


З ад ан и я д л я сам о п р о вер к и
1. Дан фрагмент программного кода:
im p o rt m a t p l o t l i b . p y p lo t a s p l t
x l i s t = [ 1 , 5 , - 3]
y l i s t = [-5, 6, 1 ]
#функция создания линии
p l t . show ()
Вставить оператор вместо комментария, чтобы была выведена курсивная ломаная
линия зеленого цвета, маркеры отображаю тся в виде знака плюс.
2. Дан фрагмент программного кода, в котором строится линия по координатам
точек, занесенных в списки x _ l i s t и y _ l i s t .
im p o rt m a t p l o t l i b . p y p lo t a s p l t
p l t . p l o t (x l i s t , y l i s t , ' r o - - ' , li n e w id th =4 , m a rk e r s iz e =10)
Выберите фрагменты кода, с помощью которых можно построить линию с теми же
характеристиками:
a . p l t . p l o t (x , y , c o l o r = ' r e d ' , m a rk e r= ' o ' ,

49
l i n e s t y l e = 'd a s h e d ', li n e w id th =4 , m a rk e r s iz e =10)
b. p l t . p l o t (x , y , c o l o r = ' r e d ' , m a rk e r= ' o ' , li n e w id th =4 , m a rk e r s iz e =10)
c. p l t . p l o t (x , y , c o l o r = ' r e d ' , m a rk e r= ' o ' , l i n e s t y l e = ' s o l i d ' ,
li n e w id th =4 , m a rk e r s iz e =10)
d. l i n e = p l o t (x , y )
p l t . s e t p (l i n e , c o l o r = ' r e d ' , m a rk e r= ' o ' , l i n e s t y l e = 'd a s h e d ',
li n e w id th =4 , m a rk e r s iz e =10)

2.4. З ад ач а, построение гр а ф и к о в ф у н к ц и й одной перем енн ой


З ад ач а. П остроить графики двух функций на интервале [a,b]:
f ( x ) = х 3 — 6 х 2 + х + 5,
у (х ) = (х — 2)2 — 6.

2.4.1. Описание алгоритма


А лгоритм построения графика функции f (х ) на интервале [a, b]:
• определить количество точек построения n;
• вычислить ш аг h по формуле:
b —а
h = ------ - ;
п —1
• создать список x _ l i s t , содержащ ий все значения аргумента функции x , список
должен вклю чать следую щ ие значения:
а, а + h ,a + 2 • h, а + 3 • h , ... , b;
• создать список y _ l i s t , содержащий все значения функции, вычисленные от
сформированных в списке аргументов, список долж ен включать:
ist[0]), f ( x list[ 1]),. . f ( x list[n-1]};
• построить линию графика функции, задать характеристики;
• вывести координатные оси;
• при необходимости добавить заголовок и легенду;
• отобразить область построения.

2.4.2. Реализация
Для построения графиков двух функций используется следую щ ая программа,
пояснения к операторам даны в комментариях:
• подключим модуль для построения графиков функций, дадим ему имя p l t :
im p o rt m a t p l o t l i b . p y p lo t a s p l t

• создадим две функции:


d e f f x (x ) :
y = x ** 3 - 6 * x ** 2 + x + 5
re tu rn y

d e f y x (x ) :
y = (x - 2 ) ** 2 - 6
re tu rn y

• Зададим интервал построения функции и количество точек построения:


Вычислим шаг:
a = -2
b = 6
n =100

• Вычислим шаг:
h = (b - a ) / ( n - 1)

50
# Сформируем список со значениями аргум ента х:
х l i s t = [a + h * i f o r i i n r a n g e (n )]

# Сформируем списки со значениями функций f(x ) и (х ):


f l i s t = [ f х (х ) f o r х i n х l i s t ]
У_l i s t = [y_ х (х ) f o r х i n х l i s t ]

#Построим линии графиков функций, зададим подпись для вывода легенды:


l i n e f = p l t . p l o t (x l i s t , f l i s t , l a b e l = ' f ( x ) ' )
l i n e y = p l t . p l o t (x l i s t , y l i s t , l a b e l = ' у ( х ) ' )

#Зададим стили линий:


p l t . s e t p (l i n e f , c o l o r = " b l u e " , li n e w id th =2 )
p l t . s e tp (l i n e y , c o l o r = " r e d " , li n e w id th =2 )

#Выведем 2 оси, установим для них позицию z e ro :


p l t . g c a ( ) . s p in e s [" l e f t " ] . s e t p o s itio n ("z e ro ")
p l t . g c a ( ) . s p i n e s [ " b o tto m " ] . s e t p o s i t i o n ( " z e r o " )
p l t . g c a ( ) . s p i n e s [ " to p " ] . s e t v i s i b l e (F a l s e )
p l t . g c a ( ) . s p in e s [ " r i g h t " ] . s e t v i s i b l e (F a l s e )

#Выведем леген ду и заго л о во к в область построения:


p l t . le g e n d ()
p l t . t i t l e ( "Графики функций")

# Отобразим область построения:


p l t . show ()
Н а рисунке 11 показан результат выполнения программы.
Графики функций

ч 10 -

1 1/ х 1 1 1 ' / 1
-2 - і L l\ 2 3 >r 5 / 6

/ “5

/ -10

-15

/ -20

I -25 -
--- f(x)
--- у(х)
-30 -

Рисунок 11. Результат выполнения программы


З ад ан и е д л я сам о п р о в ер к и
П остройте графики следую щ их функций на интервале от -2 4 0 ° до 360°:
/ ( х ) = e cos(x) + ln(sin2( 0 .8х) + 1) • co s(x ),
у (х ) = —ln ((c o s (x ) + s in ( x ) ) 2 + 1.7) + 2.
Н а оси OX должны быть отмечены значения в градусах.
П оясн ени е. Для вычисления функций c o s ( ) и s i n ( ) значения x нужно перевести в
радианы.
П о графику ответьте на вопросы.
• В точке x = 71о сравните значения функции, вставьте знак: f ( x ) ___ y(x);
• Какая функция на этом интервале имеет наименьш ее значение? Укажите название
функции .

51
• Какая функция на данном интервале принимает только отрицательные значения?
Укажите функцию или слово « Н е т » ___ .
• Сколько реш ений имеет уравнение f(x)-y(x) = 0 на данном интервале? Для этого
посчитайте количество пересечений графиков Дх)и y ( x ) :___ .

2.5. З ад ач а: построение г р а ф и к о в ф у н к ц и й одной перем енн ой с т о ч к а м и р а з р ы в а


З ад ач а. П остроить график функции на интервале [ a , b ] :
1
f ( x ) = х + —.
X

2.5.1. Описание алгоритма


Функция / ( х ) имеет точку разрыва при хь = 0, так как в этой точке знаменатель
обращ ается в ноль. Если при описании функции вставить обработку исклю чений и при
делении на ноль вернуть константу m a t h . i n f , то можно использовать алгоритм построения
функции, описанный в предыдущ ем пункте. О писание функции в это случае будет иметь
вид:
im p o rt math

d e f f x (x ) :
try :
y = x + 1 / x
e x c e p t:
y = m a th . i n f
re tu rn y
Но при некоторых значениях n график будет построен неверно. Сравните результат
построения графика при n = 200 (рисунок 12а) и при n = 201 (рисунок 12б).

— f(x), n = 2 0 0 f(x). п = 2 0 1
60 -

40 -

20 -

---- 1----------- 1----------- 1-------- В-


-У -2 -1 > 1 2 3 4 5

-20

-40
а) б)
Рисунок 12. Результат построения функции: а) n = 200; б) n = 201

Другим способом построения графика такой функции является построение двух


частей графика на двух интервалах, если хъ £ [а, Ь] :
[а, хъ —е] и [хь —а, Ь],
где е - положительное число, которое выбирается произвольно, например, оно может быть
равно шагу построения функции.
А л го р и тм построения графика функции f ( x ) на интервале [a, b] с точкой разрыва х ъ,
хъ £ [а,Ь].
• определить количество точек построения n;
• вычислить ш аг h по формуле:

52
b —а
h = ------ - ;
n —1
• вычислить количество точек построения, расположенных до точки разрыва:
(Ху, —
(ХЪ
п г = int ( — -— ) — 1;
h
• вычислить количество точек построения, расположенных после точки разрыва:
п 2 = п —п 1 —2;
• создать список x _ l i s t _ 1 , содержащ ий значения аргумента функции x, на
интервале [а, хъ —h] список должен вклю чать следую щ ие значения, количество элементов в
этом списке щ :
а, а + h, a + 2^ h, a + 3 • h , ... , x b —h;
• создать список x _ l i s t _ 2 , содержащ ий значения аргумента функции x, на
интервале [xb + h,b] список должен вклю чать следую щ ие значения, количество элементов в
этом списке п 2 :
хъ + h, xb + 2 • h, xb + 3 • h , ..., b;
• создать список y _ l i s t _ 1 , содержащ ий все значения функции, вычисленные от
сформированных в списке x _ l i s t _ 1 аргументов, список должен включать:
f(x_list_1[0]), f(x_list_1[1]), . .f(x_List_1[n1 — 1]);
• создать список y _ l i s t _ 2 , содержащ ий все значения функции, вычисленные от
сформированных в списке x _ l i s t _ 2 аргументов, список должен включать:
f(x_list _2[0]), f(x_list_2[1]), . . f(x_list_2[n2 — 1]);
• построить две линии по спискам ( x _ l i s t _ 1 , f _ lis t_ 1 ) и (x _ lis t_ 2 ,
f _ l i s t _ 2 ) , задать одинаковые характеристики линиям;
• вывести координатные оси;
• при необходимости добавить заголовок и легенду для одной из линий;
• отобразить область построения.

2.5.2. Реализация
Для построения графиков двух функций используется следующ ая программа,
пояснения к операторам даны в комментариях:
• подключим модуль для построения графиков функций, дадим ему имя p l t :
im p o rt m a t p l o t l i b . p y p lo t a s p l t

• создадим функцию:
d e f f x (x ) :
y = x + 1 / x
re tu rn y

• Зададим интервал построения функции и количество точек построения


a = -6
b = 7

• Вычислим шаг:
n = 200

• Точка разрыва
x_b = 0

• Вычислим шаг:
h = (b - a ) / ( n - 1)

• Вычислим n1
n 1 = i n t ((x b - a ) / h) - 1

53
# Вычислим n2
n2 = n - n1 - 2

# Сформируем список со значениями аргум ента x до точки разры ва:


x l i s t 1 = [a + h * i f o r i i n r a n g e (n 1)]

# cформируем список со значениями аргум ента x до точки разры ва:


x l i s t 2 = [x b + h + h * i f o r i i n r a n g e (n 2 )]

# Cформируем списки со значениями двух ч астей функций f ( x ) :


f l i s t 1 = [ f x (x ) f o r x i n x l i s t 1]
f l i s t 2 = [ f x (x ) f o r x i n x l i s t 2 ]

#Построим линии графиков функций, зададим подпись для вывода легенды:


l i n e f 1 = p l t . p l o t (x l i s t 1 , f l i s t 1 , l a b e l = 'f ( x ) = x + 1 / x ')
l i n e f 2 = p l t . p l o t (x l i s t 2 , f l i s t 2 )

#Зададим стили линий:


p l t . s e t p (l i n e f 1 , c o l o r = " r e d " , li n e w id th =2 )
p l t . s e t p (l i n e f 2 , c o l o r = " r e d " , li n e w id th =2 )

#Выведем 2 оси, установим для них позицию z e ro :


p l t . g c a ( ) . s p in e s [ " l e f t " ] . s e t p o s i t i o n ( " z e r o " )
p l t . g c a ( ) . s p i n e s [ " b o tto m " ] . s e t p o s i t i o n ( " z e r o " )
p l t . g c a ( ) . s p in e s [ " to p " ] . s e t v i s i b l e (F a l s e )
p l t . g c a ( ) . s p i n e s [ " r i g h t " ] . s e t v i s i b l e (F a l s e )

#Выведем леген ду и заго л о во к в область построения:


p l t . le g e n d ()
p l t . t i t l e ( "График функции с разры вом ")

# Отобразим область построения:


p l t . show ()
Н а рисунке 13 показан результат выполнения программы.

Рисунок 13. Результат выполнения программы


З ад ан и е д л я сам о п р о в ер к и
П остройте график функции / (х ) с двумя точками разрыва интервале от [-3 , 3]:
1
/(х ) = F - T
Результат построения показан на рисунке 14.

54
------- f ( x ) = l / ( x * * 2 -1)

20­

-3 -2
J -
Г
10 -

' Л
1 2 3

-10 -
1

-20 -

Рисунок 14. Результат построения функции

2.6. Р и со в ан и е п л о ски х ф игур


Плоские геометрические фигуры создаю тся с помощью библиотеки m atplotlib.patches,
из которой можно импортировать ш аблоны для различных геометрических фигур (все
фигуры перечислить н а одной строке):
fro m m a t p l o t l i b . p a t c h e s i m p o r t C i r c l e , W edge, P o ly g o n , E l l i p s e ,
R e c ta n g le , A rc , P a th , P a th P a tc h
Для отображения фигур в области рисования используется библиотека
m atplotlib.pyplot:
im p o rt m a t p l o t l i b . p y p lo t a s p l t

2.6.1. Создание геометрической фигуры


Каждая геометрическая фигура создается методом библиотеки m atplotlib.patches,
который имеет два типа параметров:
• положение фигуры;
• характеристики фигуры.
Каждая фигура имеет свой набор параметров, описываю щ их полож ен ие ф и гу р ы в
области рисования. В зависимости от типа фигуры это могут быть координаты точек,
радиусы, величины углов и пр. Рассмотрим методы создания наиболее часто используемых
геометрических фигур.
R e c t a n g l e ( ( x , y ) , w i d t h , h e i g h t ) - создает прямоугольник, левый верхний
угол которого располагается в точке с координатами (x , y ) , высота которого равна
w i d t h , а длина - h e i g h t (рисунок 15а).
Rectangle((2, 1) ,3, 5)

^ ш и рина
■ч
/4

вы сота

г
(2 і )

і 4 j t> / В
а) б)
Рисунок 15. Фигуры: а) прямоугольник; б) окружность

55
C i r c l e ( ( x , y ) , r a d i u s ) - создает круг с центром в точке (x , y ) , радиуса
r a d i u s (рисунок 1 5б).
E l l i p s e ( ( x , y ) , w i d t h , h e i g h t ) - создает эллипс с центром в точке (x , У
диаметр которого по горизонтальной оси равен w i d t h , а диаметр по вертикальной -
h e i g h t (рисунок 1 6 а).
P o ly g o n ( [ ( x 0 , y 0 ) , (x 1 , y 1 ) , (x 2 , y 2 ) , ... ] , c l o s e d ) - создает
ломаную линию по точкам (x 0 , y 0 ) , (x 1 , y 1 ) , (x 2 , y 2 ) , . . . , если параметр
c l o s e d равен T r u e (или он отсутствует) , первая точка соединяется с последней, в
противном случае ( c l o s e d = F a l s e ), ломаная линия остается незамкнутой (рисунок 16а).

Рисунок 16. Фигуры: а) эллипс; б) полигон

Wedge ( ( x , y ) , r a d i u s , t 1 , t 2 ) - создает сектор с центром в точке (x , y


радиуса r a d i u s , ограниченный линиями углов t 1 и t 2 (рисунок 17a).
A rc ( ( x , y ) , w i d t h , h e i g h t , a n g l e , t 1 , t 2 ) - создает дугу с центром в точке
(x , y), диаметр которой по горизонтальной оси равен w i d t h , а диаметр по
вертикальной - h e i g h t , угол поворота дуги относительно центра a n g l e , дуга
ограничена линиями углов t 1 и t 2 (рисунок 1 7 б ).

Wedge ( ( 4 , 4), 3, 20, 120) A r c ((4, 4 ) , б, 4, 0, 20 , 220)

Г^імЗ

а)
Рисунок 17. Фигуры: а) сектор; б) дуга

Совокупность линии можно рисовать с помощью так называемых путей ( P a th ) . П уть


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

56
Коды - это числовые константы, определенные в модуле P a t h , которые могут
принимать значения:
• MOVETO (переместиться в точку без рисования линии);
• LINETO (провести линию в заданную точку);
• другие.
Коды можно записывать двумя способами:
• полной ссылкой ( m a t p l o t l i b . p a t h . P a th . MOVETO, m a t p l o t l i b . p a t h . P a th . LINETO);
• цифрой 1 или 2 соответственно.
Свойства, описываю щ ие с т и л ь в ы в о д а каждой фигуры, общ ие для всех фигур.
Основные свойства представлены в таблице, больш инство из них могут быть описаны в
полной или сокращ енной форме (таблица 16). Возможные значения характеристик
приведены в П рилож ении В.

Т аб л и ц а 16 - С т и л и в ы в о д а ф игур

Х арактеристика Описание
fa c e c o lo r= " ц в е т "
Ц вет заливки фигуры
^= "цвет"
lin e w id th = з н а ч е н и е
^= зн ачен и е Толщ ина границы фигуры
e d g e c o lo r = " ц в е т "
Ц вет границы фигуры
ec= "ц вет"
Ф игура закраш енная (True, по умолчанию )
^ !!= зн а ч е н и е
или незакраш енная(False)

2.6.2. Алгоритм рисования


Все геометрические объекты рисую тся в несколько шагов.
1. Импортирую тся все необходимые модули, функции, шаблоны:
from m a t p l o t l i b . p a tc h e s im p o rt C ir c le
im p o rt m a t p l o t l i b . p y p lo t a s p l t
2. О пределяю тся координаты окна, в котором будет создаваться изображение,
например, следую щ ие операторы создаю т окно, координаты которого изменяю тся от 0 до 12
по горизонтали и вертикали:
p l t . x l i m ( 0 , 12)
p l t . y l i m ( 0 , 12)
3. Создается область для рисования, связанная с осями координат с помощью метода
gca() :
ax = p l t . gca ()
4. Создается геометрическая фигура на основе описания из модуля m atplotlib.patches.
Н апример, следую щ ий оператор создает круг с центром в точке (6, 7) и радиусом 5 и заносит
результат в переменную c i r c l e :
c i r c l e = C i r c l e ( ( 6 , 7) , 5)
5. Созданная фигура добавляется в область a x с помощью метода a d d _ p a t c h ( ) :
a x . add p a t c h (c i r c l e )
6. Рисунок отображается в графическом окне:
p l t . show ()
Результат выполнения программы показан на рисунке 18.

57
0-10---------2---------4---------ft--------,в--------,10--------.12---

Рисунок 18. Результат выполнения программы

П р и м ер . Создадим рисунок (рисунок 19) с помощью линий, объединенных в пути.

0 1 2 3 4 5 6 7 8

Рисунок 19. Шаблон рисунка

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


# Импортируем необходимые функции и библиотеки:
from m a t p l o t l i b . p a tc h e s im p o rt P a t h , P a th P a tc h
im p o rt m a t p l o t l i b . p y p lo t a s p l t

# Настроим область рисования:


n = 8
m = 8
p l t . x l i m (0 , n )
p l t . y l i m ( 0 , m)
ax = p l t . gca ()

# Создадим список опорных точек:


v e r t i c e s = [ ( 0 , 6) , (2 , 8) , (2 , 4) , (4 , 6) , (4 , 2 ) , ( 6 , 4) , ( 6 , 0) , (8 , 2 )]

# Создадим список кодов (установить курсор в первую точку (0, 6) - MOVETO,


# провести линию во вторую (2, 8) - LINETO,
# установить курсор в третью (2, 4) - MOVETO,
# провести линию в четвертую (4, 6) - LINETO и т . д . ) :
codes = [ 1 , 2 , 1 , 2 , 1 , 2 , 1 , 2 ]

# Создадим переменную p a th c помощью метода m a t p l o t l i b . p a t c h e s . P a t h ,


# у к азав список вершин ( v e r t i c e s ) и список кодов ( codes ) :

58
p a t h = P a t h (v e r t i c e s , c o d e s )

# Создадим фигуру, представляющую собой совокупность линий, толщиной 3 px:


p a th p a tc h = P a th P a tc h (p a t h , lw=3)

#Добавим созданную фигуру в область ax , удалим оси и покажем рисунок


a x . add p a t c h (p a t h p a t c h )
a x . a x e s . s e t a x is o f f ()
p l t . show ()

Результат выполнения программы показан на рисунке 20.

Рисунок 20. Результат выполнения программы

З ад ан и е д л я сам о п р о в ер к и
В программе создаются плоские фигуры с помощью методов библиотеки
m a tp lo tlib .p a tc h e s :
from m a t p l o t l i b . p a tc h e s im p o rt C i r c l e , Wedge, E l l i p s e , A r c , R e c ta n g le
Выберите н е в ер н ы е операторы:
a . f i g u r e = wedge( ( 4 , 4) , 2 , - 9 0 , 90)
b. f i g u r e = Wedge( ( 4 , 4) , 2 , - 9 0 , 90)
c. f i g u r e = Wedge( ( 4 , 4) , 2 , - 90)
d. f i g u r e = R e c t a n g l e ( ( 1 0 , 12) , 5 , 8)
e. f i g u r e = E l l i p s e (5 , 1 , 2 , 3)

2.7. З ад ач а, р и со в ан и е ф и гу р ы из гео м етр и ч ески х п р и м и т и в о в

2.7.1. Алгоритм рисования изображения из геометрических фигур


1. Н арисовать изображение на клетчатом листе бумаге, пронумеровать клетки от 0 до
n по горизонтали, от 0 на m вертикали (в нашем случае от 0 до 13 и от 0 до 15), нумерация
клеток может начинаться с лю бых значений, но удобнее взять 0 (рисунок 21).
2. О бозначить координаты опорных точек, образую щ их плоские фигуры, при
необходимости указать другие характеристики (рисунок 21):
• полигон - координаты опорных точек (на рисунке туловищ е кота);
• круг - координаты центра и радиус (глаза, зрачки и нос);
• эллипс - координаты центра, диаметр по горизонтали и вертикали (передние
лапы);
• сектор - координаты центра, радиус, угол начала сектора, угол его завершения
(задние лапы);
• дуга - координаты центра, радиус по горизонтали, радиус по вертикали, угол
поворота, угол начала дуги, угол ее заверш ения (улыбка);
• набор линий - координаты опорных точек (усы, линия между носом и улыбкой).

59
О Н------- 1------- 1------- 1------- 1------- 1------- 1------- 1------- 1------- 1------- 1------- 1------- 1-------
О 1 2 3 4 5 6 7 8 9 10 11 12 13

Рисунок 21. Рисунок с опорными точками

3. О пределить стили вывода каждой фигуры:


• толщ ина границы набора линий - 1 пиксель, остальные - 4 пикселя;
• цвет границ всех фигур - черный;
• цвета закраски - черный (для зрачков и носа), белый - для глаз, серый - для
туловищ а и лап;
• все фигуры, кроме дуги и набора линий, - замкнутые.
4. Реализовать каждую фигуру с помощью шаблонов плоских фигур из
m atplotlib.patches.

2.7.2. Реализация
Для создания рисунка используется следую щ ий код, пояснения даны в комментариях:
# Импортировать необходимые фигуры рисования,
# подключить модуль для рисования:
from m a t p l o t l i b . p a tc h e s im p o rt C i r c l e , Wedge, P o ly g o n , E l l i p s e , A r c ,
P a t h , P a th P a tc h
im p o rt m a t p l o t l i b . p y p lo t a s p l t

# Реализовать функцию для рисования фигуры,


# параметром передать область рисования:
d e f draw c a t (a x ):
# туловище
p o ly = [ ( 3 , 1) , (4 , 14) , (5 , 11) , ( 8 , 11) , (9 , 14) , (1 0 , 1)]
poly g o n = P o l y g o n (p o l y , f c = " g r e y " , e c = " b la c k " , lw=4)
a x . add p a tc h (p o ly g o n )
# г л аза
c i r c l e = C i r c l e ( ( 5 . 3 , 8 . 5 ) , 1 . 2 , f c = " w h ite " , e c = " b la c k " , lw=4)
a x . add p a tc h (c i r c l e )
c i r c l e = C i r c l e ( ( 7 . 7 , 8 . 5 ) , 1 . 2 , f c = " w h ite " , e c = " b la c k " , lw=4)
a x . add p a tc h (c i r c l e )
# зрачки
c i r c l e = C i r c l e ( ( 6 , 8 . 3 ) , 0 . 1 , f c = " b l a c k " , e c = " b la c k " , lw=4)
a x . add p a tc h (c i r c l e )
c i r c l e = C i r c l e ( ( 7 , 8 . 3 ) , 0 . 1 , f c = " b l a c k " , e c = " b l a c k " , lw=4)
a x . add p a tc h (c i r c l e )

60
# нос
c i r c l e = C i r c l e ( ( 6 . 5 , 7 . 5 ) , 0 . 3 , f c = " b l a c k " , e c = " b l a c k " , lw=4)
a x . add p a tc h (c i r c l e )
# задние лапы
wedge = Wedge( ( 3 , 1) , 2 , 8 6 , 1 8 0, f c = " g r e y " , e c = " b l a c k " , lw=4)
a x . add p a tc h (w edge)

wedge = Wedge( ( 1 0 , 1) , 2 , 0 , 9 4 , f c = " g r e y " , e c = " b l a c k " , lw=4)


a x . add p a tc h (w edge)
# передние лапы
e l l i p s e = E l l i p s e ( ( 5 . 5 , 1 . 2 ) , 2 , 1 . 5 , f c = " g r e y " , e c = " b l a c k " , lw=4)
a x . add p a tc h (e l l i p s e )
e l l i p s e = E l l i p s e ( ( 7 . 5 , 1 . 2 ) , 2 , 1 . 5 , f c = " g r e y " , e c = " b l a c k " , lw=4)
a x . add p a tc h (e l l i p s e )
# улыбка
a r c = A r c ( ( 6 . 5 , 6 . 5 ) , 5 , 3 , 0 , 2 0 0 , 3 4 0 , lw=4 , f i l l =F a l s e )
a x . add p a t c h (a r c )
# линия между носом и улыбкой, усы
v e r t i c e s = [ ( 6 . 5 , 5) , ( 6 . 5 , 7 . 5 ) , ( 1 0 , 6) , ( 6 . 5 , 7 . 5 ) , ( 1 0 , 6 . 5 ) ,
(6 . 5 , 7 . 5 ) , (1 0 , 7) , (6 . 5 , 7 . 5 ) , (3 , 6) , ( 6 . 5 , 7 . 5 ) ,
(3 , 6 . 5 ) , (6 . 5 , 7 . 5 ) , (3 , 7)]
# число 1 с о о тв етств у ет команде ma t pl o t l i b. pa t h. Pa t h. MOVETO
# число 2 с о о тв етств у ет команде m a t p l o t l i b . p a t h . P a t h . L I N E T O
codes = [ 1 , 2 , 2 , 1 , 2 , 1 , 2 , 1 , 2 , 1 , 2 , 1 , 2 ]
p a t h = P a t h (v e r t i c e s , c o d e s )
p a t h p a tc h = P a t h P a t c h (p a t h , f i l l =F a l s e , lw=1)
a x . add p a t c h (p a t h p a t c h )

# Установить размер и координаты углов для области рисования


# в соответстви и с рисунком 21:
n = 13
m = 15
p l t . x l i m (0 , n )
p l t . y l i m ( 0 , m)

# Создать о б л асть, связанную с осями координат,


# куда будут выводиться плоские фигуры (ax):
ax = p l t . gca ()

# вызвать функцию рисования (draw c a t ) :


draw c a t (a x )

#Удалить оси координат и п о казать рисунок:


a x . a x e s . s e t a x i s o f f ()
p l t . show ()
Результат выполнения программы показан на рисунке 22.

Рисунок 22. Результат выполнения программы

61
З ад ан и е д л я сам о п р о в ер к и
Допиш ите программу так, чтобы в результате ее выполнения получалось
изображение, показанное на рисунке 23.
from m a t p l o t l i b . p a t c h e s im p o rt P a t h , P a t h P a t c h
im p o rt m a t p l o t l i b . p y p l o t a s p l t
n = # у к азать размер области
m = # у к азать размер области
p l t . x l i m (0 , n )
p l t . y l i m ( 0 , m)
ax = p l t . gca ()
# созд ать массив точек
v e r t i c e s = [ ( 1 , 3) , (7 , 2 ) , (6 , 1) , (3 , 1) , (1 , 3) , (4 , 2 . 5 ) , (4 , 6) ,
(7 , 3) , (4 , 2 . 5 )]
#создать список кодов для п оследовательн ости рисования:
codes = # зап и сать список
#создать объект p а t h
p a t h = P a t h (v e r t i c e s , c o d e s )
#создать фигуру
p a t h p a tc h = P a t h P a t c h (p a t h , lw=3)
# Добавить созданную фигуру в область ax:
p l t . show ()

o-l-------- 1-------- 1-------- .-------- 1-------- 1-------- 1-------- .--------


0 1 2 3 4 5 6 7 8

Рисунок 23. И зображение фигуры

2.8. В а р и а н т ы зад ан и й д л я сам о сто ятел ьн о го р еш ен и я


В ариант 1
1. Описать функцию f ( x , y , z ) , при создании вклю чить обработку исклю чительных
ситуаций:

f (x , y , z ) = У 1+ ICOS2 + sin (co s V (z + 1)2)

а) посчитать значения функции:


x = 4.5, у = V i, z = 4;
x = 1, у = 0, z = 5.
б) вывести таблицу значений функции f ( x , y , z ) , состоящ ей из N =20 строк, в точках
(x i, y i, z i) , i = 1..N, где

62
Xi = co s ( i ^ ) , y t = s i n ( i - ^ ) . Z i = ^j.
Таблицу вывести в следую щ ем виде (использовать форматный вывод), все числа в
таблице (кроме номера) вывести с 4 знаками после запятой:

N пп x У z f(x,y,z)
1

2. Построить график функции на интервале [ a , b] :


х 2 —3
f(x) = 7 + Т
3. Выбрать произвольный рисунок и нарисовать его средствами модуля
m atplotlib.patches.

В ариант 2
1. Описать функцию f ( x , y , a ), при реализации вклю чить обработку
исклю чительных ситуаций:
J e х — cos4( x 2a 5) + a r c t g 4(a —х 5)
f { x , у, a) = -------------------- ------------------ ;
J ^ + x y 41
а) посчитать значения функции:
х = 2п, у = 4.01, a = —1.6;
х = 1, у = 1, a = —1;
б) вывести таблицу значений функции f ( x , y , a ) , состоящ ей из N=15 строк, в точках
(x i, y i, a i) , i = 1..N, где
t a n ( i ^T) ( і \ i2
Хі = -------:------ , yi = ln I г— - ) , a t = —;—r.
1 i \ i + 1 / 1 e 1-1
Таблицу вывести в следую щ ем виде (использовать форматный вывод), все числа в
таблице (кроме номера) вывести с 3 знаками после запятой:

N пп x У a f(x,y,a)
1

2. Построить график функции на интервале [ a , b] :


( х — 1\
1
f(x) = h H •
3. Выбрать произвольный рисунок и нарисовать его средствами модуля
m atplotlib.patches.

В ариант 3
1. Описать функцию f (х, у, с) при реализации включить обработку исклю чительных
ситуаций:
t g ( x 4 — 6) —c os 3J c + х у
f (x , y , c ) =
cos4 |x 3c|
а) посчитать значения функции:
х = —1.2, у = —3.41, с = 1.6;
х = 1, у = 1 , с = ^;
б) вывести таблицу значений функции f ( x , y , c ) , состоящ ей из N=25 строк, в точках
( х і,Уі, сі) , i = 1..N, где

63
3 1 J _ П\ l0g5
log5 О2)
Xj = — , Vi = tan
1 \i + l ' 7 ) , C i ~
ъ i
Таблицу вывести в следую щ ем виде (использовать форматный вывод), все числа в
таблице (кроме номера) вывести с 5 знаками после запятой:

N пп x У c f(x,y,c)
1

2.Построить график функции на интервале [ a , b ] :


4 •х
f (x ) =
х 2 —4
3. Выбрать произвольный рисунок и нарисовать его средствами модуля
m atplotlib.patches.

В ариант 4
1. Описать функцию f ( x , y , c ) , при реализации вклю чить обработку исклю чительных
ситуаций:
3
•5 (f)'
+ ес
f ( x , y , c ) = lnlcos(x2 + 2)l +
sin2( y 2x 3)
а) посчитать значения функции:
х = ^ , у = —3.41, с = 1.6;
х = 1, у = 0, с = —10;
б) вывести таблицу значений функции f ( x , y , c ) , состоящ ей из N =18 строк, в точках
(x i, y i, c i) , i = 1..N, где
log2(i)
X,-
, y ‘ = s , n ( J h ^ ) , c‘ cos(i)
Таблицу вывести в следую щ ем виде (использовать форматный вывод), все числа в
таблице (кроме номера) вывести с 4 знаками после запятой:

N пп x У c f(x,y,c)
1

2.Построить график функции на интервале [ a , b ] :


х 2 —5
f (x) =
X
3. Выбрать произвольный рисунок и нарисовать его средствами модуля
m atplotlib.patches.

В ариант 5
1. Описать функцию f(x,y,b), при реализации вклю чить обработку
исклю чительных ситуаций:
c os6( b x 2) — ( c o s ( x 3 + 6) —s i n 3 у)
f (x , y , b ) = х
b 3a rc sin ( + b)
ІУ + 17
а) посчитать значения функции:
х = Щ^, у = —1, Ъ = 0.1;
x = 1, у = —17, b = —10;
б) вывести таблицу значений функции f (х,у, Ь), состоящ ей из N=23 строк, в точках
(x i, y i, b i), i = 1..N, где

64
Т (Г Т і) 13 t U\ fU \
X,- = ------------ , У,- = cos ----- ) A = sin ^ • І ).
1 I \ Лt + 1 6 / 1 V6 /

Таблицу вывести в следую щ ем виде (использовать форматный вывод), все числа в


таблице (кроме номера) вывести с 5 знаками после запятой:

N пп x y c f(x,y,b)
1

2. П остроить график функции на интервале [ a , b ] :


3 •х 3
/(х ) = — + 20.
х2 5
3. Выбрать произвольный рисунок и нарисовать его средствами модуля
m atplotlib.patches.

В ариант 6
1. Описать функцию / (х, у, Ь), (при реализации вклю чить обработку исключительных
ситуаций):
c o s 6(b x 2) — ( c o s ( x 3 + 6) —s t n 3 у )
/ (х ,у ,Ь ) = — х
b 3a r c s t n ( + Ь)
ѴУ+17
а) посчитать значения функции:
х = - ^ , у = —1, b = 0.1;
х = 1, у = - 1 7 , Ь = —10;
б) вывести таблицу значений функции / ( х , у , Ь), состоящ ей из N=23 строк, в точках
(* ;,У ;Л ) , t = 1 ..N , где

ѵ т і 3 t U\ /Ж \
= ---- :— ,Уі = cos Г + Г б Р ' = 51 п( б ’ ‘>

Таблицу вывести в следую щ ем виде (использовать форматный вывод), все числа в


таблице (кроме номера) вывести с 5 знаками после запятой:

N пп x y c f(x,y,b)
1

2. Построить график функции на интервале [ a , b ] :


X2 + 1
= — ■
3. Выбрать произвольный рисунок и нарисовать его средствами модуля
m atplotlib.patches.

В ариант 7
1. Описать функцию / ( х , у, Ь), при реализации вклю чить обработку
исклю чительных ситуаций:
s t n 5(b x 2) — (s tn ( х 2 • ^ —s t n 33 у )
/ (х , у , Ь) = х
b 2a r c o s ( )
Ѵ у + 4'
а) посчитать значения функции:

65
х = - ^ , у = —1, b = 0.1;
x = 1, у = —4, b = —10;
б) вывести таблицу значений функции f ( x , y , b ) , состоящ ей из N =26 строк, в точках
(x i, y i, b i), i = 1..N, где ____
Ѵі + 1 ( Ѵ 2 • п'
Хі -,Уі = sin I I • , bj = s i n e n i .
1 V 2
Таблицу вывести в следую щ ем виде (использовать форматный вывод), все числа в
таблице (кроме номера) вывести с 3 знаками после запятой:

N пп x У с f(x,y,b)
1

2. Построить график функции на интервале [ a , b] :


х 3 —8
f (x) = 2x
9 +I с6
3. Выбрать произвольный рисунок и нарисовать его средствами модуля
m atplotlib.patches.

В ариант 8
1. Описать функцию f(x,y,b), при реализации вклю чить обработку
исклю чительных ситуаций:

2.33 + In 11 + co s2 ( у +

f (x , y , b ) =
■ г2 ([х +,-----
s in Ь3\)
V У)
а) посчитать значения функции:
x = 2 , y = f 2, b = —29;
х = 4, у = 0, b = —3;
б) вывести таблицу значений функции f ( x , y , b ) , состоящ ей из N=28 строк, в точках
(x i, y i, b i), i = 1..N, где

^
зі. Я лЦ — 1 ( п д
= s i n ( J ''"б,
хі ^ -Ь У і = р , b i = c o s [~rz) ^1).
~
Таблицу вывести в следую щ ем виде (использовать форматный вывод), все числа в
таблице (кроме номера) вывести с 5 знаками после запятой:

N пп x У с f(x,y,b)
1

2. Построить график функции на интервале [ a , b] :


х
f (x ) =
I (х — 1)2'

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


m atplotlib.patches.

В ариант 9
1. Описать функцию f(x,y,a), при реализации вклю чить обработку
исклю чительных ситуаций:

66
ln a + ( y ) | - sin 4(y - a)
f (x , y , a ) —
3 (Х + У)
sin
( x —y )
а) посчитать значения функции:
x — 2, у — V b я — —6.1;
х — 4, у — —4, а — —3;
с) вывести таблицу значений функции / ( х , у , а ), состоящ ей из N =24 строк, в точках
(х і, у і , а і) , t — 1. . N, где
/ n \ Vt—
Vt — 11
Xj — e 3/7
, y i — log2 ( - 6 ^ / j , — ^3 .
vv6 ' Г
Таблицу вывести в следую щ ем виде (использовать форматный вывод), все числа в
таблице (кроме номера) вывести с 4 знаками после запятой:

N пп x У с f(x,y,a)
1

2. Построить график функции на интервале [ a , b] :


х —8
/ W —1 2 — 3 7 + 2 '
3. Выбрать произвольный рисунок и нарисовать его средствами модуля
m atplotlib.patches.

В а р и а н т 10
1. Описать функцию / ( х , у, а ), при реализации вклю чить обработку
исклю чительных ситуаций:
a rc c o s(a + х 3) — sin 4(y — a )
/ (х ,у ,а ) —-----
7 |s i n (x + у ) |
а) посчитать значения функции:
х — 2, у — V i, а — —6.1;
х — 4, у — —4, а — —3;
с) вывести таблицу значений функции / ( х , у , а ), состоящ ей из N =19 строк, в точках
(X j,y j,a j) , t — 1. . N, где
я я i
X / — cos It • —, у / — ta n It • —, a
1 J 3 Уі ЛІ 5 1 log5(t + 1)
Таблицу вывести в следую щ ем виде (использовать форматный вывод), все числа в
таблице (кроме номера) вывести с 4 знаками после запятой:

N пп x У с f(x,y,a)
1

2.Построить график функции на интервале [ a , b ] :



/ (Х) —
х 2 — 25"
3. Выбрать произвольный рисунок и нарисовать его средствами модуля
m atplotlib.patches.

В а р и а н т 11
1. Описать функцию / ( х , у, а ), при реализации вклю чить обработку
исклю чительных ситуаций:

67
c t g 3( x 3 —a) + a r c t g 2(y)
f (x , y , a ) =
^ e tg(x+y-a)
а) посчитать значения функции:
x = 7, у = ^й, а = —1.1;
х = 0, у = —4, а = —3.4;
б) вывести таблицу значений функции f ( x , y , a ), состоящ ей из N=33 строк, в точках
(x i, y i, a i) , i = 1..N, где

J ( i + 1) 3 i М . (п Л
ъ = — — , ^ = cosI J — 6), a*= sm U ^ >

Таблицу вывести в следую щ ем виде (использовать форматный вывод), все числа в


таблице (кроме номера) вывести с 5 знаками после запятой:

N пп x y c f(x,y,a)
1

2. Построить график функции на интервале [ a , b] :


4 —х
f(x) = — 4
3. Выбрать произвольный рисунок и нарисовать его средствами модуля
m atplotlib.patches.

В а р и а н т 12
1. Описать функцию f(x,y,a), при реализации вклю чить обработку
исклю чительных ситуаций:
^ е х — cos2( x 2a 5) + a r c t g 4(a —у 5)
f f r У, а) = -------------------- . ------------------ ;
^ а + х у 41
а) посчитать значения функции:
х = 7, у = Ѵп3, а = е 3
х = —10, у = 4, а = 5;
б) вывести таблицу значений функции f ( x , y , a ) , состоящ ей из N=33 строк, в точках
(х и уі, а і) , i = 1..N, г д е _________

sin(^ • i)
/ і одз (і) \ ■ f n л
Xi = yi = c o s l J — - ) , ai = s m & l).

Таблицу вывести в следую щ ем виде (использовать форматный вывод), все числа в


таблице (кроме номера) вывести с 5 знаками после запятой:

N пп x y c f(x,y,a)
1

2. Построить график функции на интервале [ a , b] :


4 •x 3
m = — 8
3. Выбрать произвольный рисунок и нарисовать его средствами модуля
m atplotlib.patches.

68
Вариант 13
1. Описать функцию f ( x , y , c ), при реализации включить обработку
исключительных ситуаций:
c 5 + s i n 4(y —c)
j ( x , y , z ) = — 5------------------------- ;
sin (х + у ) + |х — у|
а) посчитать значения функции:
х = е 2, у = 5.01, с = 1.6;
х = 0, у = 0, с = ^;
с) вывести таблицу значений функции f ( x , y , c ) , состоящ ей из N =27 строк, в точках
( х і,Уі, сі) , i = 1..N, где
i2 i —1 n \ lo g s( i2)
x i = 1 — т=,Уі = tan I г— - • т ) , сі = ~л----- 7ГТ.
1 J~i \ i + 1 61 1 log2(i)
Таблицу вывести в следую щ ем виде (использовать форматный вывод), все числа в
таблице (кроме номера) вывести с 5 знаками после запятой:

N пп x У с f(x,y,c)
1

2. Построить график функции на интервале [ a , b] :


х —3
т = W -2 S
3. Выбрать произвольный рисунок и нарисовать его средствами модуля
m atplotlib.patches.

В а р и а н т 14
1. Описать функцию f(x,y,c), при реализации вклю чить обработку
исклю чительных ситуаций:
s i n3x + ln(2y + 3х)
f (x , y , t ) =
t s —^х
а) посчитать значения функции:
х = е 2, у = 5.01, t = 1.6;
х = 1024, у = 0, t = 2;
б) вывести таблицу значений функции f ( x , y , c ) , состоящ ей из N=31 строк, в точках
(x i, y i, t i) , i = 1..N, где
2
log s (i 2) sin(4 l2)
Хі Уі = е Лі,
1 Л ’ ~ ’ cos(i)
Таблицу вывести в следую щ ем виде (использовать форматный вывод), все числа в
таблице (кроме номера) вывести с 4 знаками после запятой:

N пп x У с f(x,y,t)
1

2. Построить график функции на интервале [ a , b] :


ln(x 2 + ^
f (x ) =
3. Выбрать произвольный рисунок и нарисовать его средствами модуля
m atplotlib.patches.

69
Вариант 15
1. Описать функцию / (х, у, а ) при реализации включить обработку исключительных
ситуаций:
J 4 e x + s t n 2( x 3a 5) + a r c t g 4( a —у 5)
/ (х , у , а ) = -------------
V ia —х у 2|
а) посчитать значения функции:
х = 7, у = Ѵя5, а = е 2
х = 1, у = 1, а = 1;
б) вывести таблицу значений функции / ( х , у, а ), состоящ ей из N=31 строки, в точках
(X j,y j,a j) , t = 1. . N, где
ж ,л
c o s(4 • О |^Ogl0( t)
х,- -, У; = COSl I, aj = cos I
t2 + 1 ( 1 4

Таблицу вывести в следую щ ем виде (использовать форматный вывод), все числа в


таблице (кроме номера) вывести с 5 знаками после запятой:

N пп x y c f(x,y,a)
1

2.Построить график функции на интервале [ a , b ] :


,0.01-x
/ (x ) =
x 2 —8
3. Выбрать произвольный рисунок и нарисовать его средствами модуля
m atplotlib.patches.

В а р и а н т 16
1. Описать функцию / ( x , у, с), при реализации вклю чить обработку
исклю чительных ситуаций:
у • с 3 + s tn 2 (у — с)
/ (x ,y ,z ) =
c o s 3(x + у 2) + |х 2 —у | — 1 '
а) посчитать значения функции:
х = е 2, у = 6.01, с = 2.6;
х = 0, у = 0, с = | ;
б) вывести таблицу значений функции / ( х , у, с), состоящ ей из N=25 строк, в точках
(Х;,У;,С і ), t = 1. . N, где
co s( t 2) / t л\ lo g 5 (i2)
X; = 1 -------- ---- , V; = ctan I ----- - ^—■) , С; = ------ :---- .
1 VI Vi + 1 3 / 1
Таблицу вывести в следую щ ем виде (использовать форматный вывод), все числа в
таблице (кроме номера) вывести с 5 знаками после запятой:

N пп x y c f(x,y,c)
1

2. Построить график функции на интервале [ a , b] :


x 3 —1
/ w = 87—1 ­
3. Выбрать произвольный рисунок и нарисовать его средствами модуля
m atplotlib.patches.

70
Вариант 17
1. Описать функцию f(x,y,c), при реализации включить обработку
исключительных ситуаций:
s i n( x 4 — 6) —tan(3j c + xy)
f (x , y , c ) =
co s3|x 3c|
а) посчитать значения функции:
x = —0.2, у = —4.41, с = 1.2;
x = 1, у = 1 , с = ^;
с) вывести таблицу значений функции f ( x , y , c ), состоящ ей из N=25 строк, в точках
(x i, y i, c i) , i = 1..N, где
(і — 0 .5 )2 / і п\ i
x ‘ = - 7 f + + r ’y , = t g ( — i 7 ) ’ c‘ = 7 n -
Таблицу вывести в следую щ ем виде (использовать форматный вывод), все числа в
таблице (кроме номера) вывести с 5 знаками после запятой:

N пп x У с f(x,y,c)
1

2. Построить график функции на интервале [ a , b] :


5 •x
f(x =
3. Выбрать произвольный рисунок и нарисовать его средствами модуля
m atplotlib.patches.

В а р и а н т 18
1. Описать функцию f(x,y,a), при реализации вклю чить обработку
исклю чительных ситуаций:
t g 3( x y 2 — а) + a r c t g 2(y —x)
f (x , y , a ) =

а) посчитать значения функции:


x = 7, y = ^й, a = —1.1;
S\ Л ^
x = 0, y = —4, a = - ;
с) вывести таблицу значений функции f ( x , y , a ) , состоящ ей из N=33 строк, в точках
(x i, y i, a i) , i = 1..N, где
ЛІІ2 + 1 I І n\ rn \
x‘ = - i ^ ' y ‘ = s i n ( J r + 1 ^ J ' a ‘ = t g ( 6 ‘)-

Таблицу вывести в следую щ ем виде (использовать форматный вывод), все числа в


таблице (кроме номера) вывести с 5 знаками после запятой:

N пп x У с f(x,y,a)
1

2.Построить график функции на интервале [ a , b ] :


x + 5
f ( x = x r —9-
3. Выбрать произвольный рисунок и нарисовать его средствами модуля
m atplotlib.patches.

71
3. М А Т Р И Ц Ы И В Е К Т О Р Ы

3.1. М асси в ы
N um Py — это библиотека языка Python, предназначенная для создания и обработки
многомерных массивов числовых данных (векторов и матриц). Также N um Py включает
большую библиотеку высокоуровневых (и очень быстрых) математических функций для
операций с этими массивами. П одклю чение библиотеки:
i m p o r t numpy a s np
Для упрощ ения обращ ения к методам библиотеки модуль в программе будет
именоваться np.

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

Рисунок 24. Структура массива

Для обращ ения к элементу по индексу 5 используется запись a[5], изменить значение,
хранящ ееся по этому индексу, можно с помощью оператора присваивания:
a[5] = 47
С оздани е м асси ва
В N um Py сущ ествует много способов создать массив. П рощ е всего создать массив из
списка. Для этого используется метод a r r a y ( ) :
i m p o r t numpy a s np
a = n p . a r r a y ( [ - 4 , 5 , 2 ])
П ри создании массива из списка можно переопределить тип его элементов, например,
из списка, состоящ его из строк, представляю щ их собой числа, можно создать массив из
целых чисел.
a = n p . a r r a y ( [ ' - 4 ' , ' 5 ' , ' 2 ' ] , d t y p e =i n t )
Например, введем с клавиатуры строку, которая состоит из чисел, разделенных
пробелом. А затем создадим массив из них:
l i n e = i n p u t ( "В в ед и т е ч и с л а ч е р е з п р о б е л : " )
l i s t a = l i n e . s p l i t ()
a = n p . a r r a y ( l i s t a , d t y p e =i n t )
В ы вод м асси в а
Вывод массива осущ ествляется с помощью оператора p r i n t ( ) :
a = n p . a r r a y ( [ ' - 4 ' , ' 5 ' , ' 2 ' ] , d t y p e =i n t )
p r i n t ( ”a = ” , a )
Результат:
a = [-4 5 2]

72
З ад ан и е д л я сам о п р о в ер к и
Отметьте н е в ер н ы е операторы и объясните, в чем ошибка. В начале программы
модуль numpy импортирован следую щ им образом:
i m p o r t numpy a s np
П ри анализе операторов вывода считайте, что в переменной а хранится массив чисел.
• p rin t а
• a = a r r a y ( [ 1 , 2 , 3 ] , d t y p e =i n t )
• a = i n p u t (n p . a r r a y ( ))
• a = n p . a r r a y ( [ 1 , 2 , 3 ] , d T y p e=i n t )
• a = n p . a r r a y (1 , 2 , 3)
• p r i n t ( " a = %3d " % a )

3.1.2. Методы массивов


М одуль n u m p y предоставляет множество методов работы с массивами. Для
обращ ения к ним после имени массива ставится точка, затем записывается метод и круглые
скобки. В таблице 17 приведены некоторые методы, примененные к массиву с именем а.

Т аб л и ц а 17 - М ето д ы м асси вов

Метод Описание
a.sum() Сумма элементов массива a
a.prod() Произведение элементов массива a
а.mean() Среднее значение элементов массива a
a.max() Максимальное значение из элементов массива a
a.min() Минимальное значение из элементов массива a

Н апример, в следую щ ей программе методы массивов применяю тся для вычисления


суммы, произведения элементов массива, поиска среднего, максимального и минимального
элемента.
im p o rt numpy a s np

a = n p . a r r a y ( [ - 4 , 5 , 2 ])

p r i n t ( "a = ” , a )
p r i n t ( "Сумма = " , a . sum())
p r i n t ( "Произведение = " , a . p r o d ())
p r i n t ( "Среднее = " , a . mean())
p r i n t ( "Максимум = " , a . max())
p r i n t ( "Минимум = " , a . m i n ())
Результат:
a = [-4 5 2]
Сумма = 3
Произведение = -40
Среднее = 1.0
Максимум = 5
Минимум = -4
З ад ан и е д л я сам о п р о в ер к и
В ставьте в программу пропущ енные фрагменты так, чтобы в результате выполнения
программы получился следую щ ий результат:
[200. 6. -5. 1.]
Код программы:
im p o rt numpy a s np

a = n p . a r r a y ( [ - 5 , 5 , - 1 , 1 , 2 , 4])

73
b 0 = a.
b1 = a .___
b2 = a .___
b3 = a.

b = n p . a r r a y ( [ b 0 , b 1 , b 2 , b 3 ])
p r i n t (b )

3.1.3. Операции с массивами


М атематические операции: сложение (+), умножение (*), вычитание (-) , деление(/),
остаток от деления (%), целочисленное деление (//) - применяю тся непосредственно к
массивам. П ри их использовании создается новый массив, который заполняется
результатами действия математической операции с соответствую щ ими элементами массива.
М ассивы при этом должны быть одинакового размера.
В следую щ ей программе математические операции применяю тся к массивам a и b.
im p o rt numpy a s np

a = n p . a r r a y ( [ - 4 , 5 , 2 ])
b = n p . a r r a y ( [ 3 , 2 , 1])

c = a + b
p r i n t ( "a + b = " , c )

c = a - b
p r i n t ( "a - b = " , c )

c = a * b
p r i n t ( "a * b = " , c )

c = a / b
p r i n t ( "a / b = " , c )

c = a %b
p r i n t ( "a % b = " , c )

c = a // b
p r i n t ( "a / / b = " , c )

Результат:
a + b = [-1 7 3]
a - b = [-7 3 1]
a * b = [-12 10 2]
a / b = [-1 .3 3 3 3 3 3 3 3 2 .5 2. ]
a % b = [2 1 0]
a / / b = [-2 2 2]
З ад ан и е д л я сам о п р о в ер к и
Какую операцию нужно вставить в выражение для формирования массива с, чтобы
получился следую щ ий результат:
[3 7 2]
Код программы:
im p o rt numpy a s np

a = n p . a r r a y ( [ 5 , 5 , 2 ])
b = n p . a r r a y ( [ 2 , 7 , 1])

c = a .m i n ()+ a * (b + b .m i n ()) __ b
p r i n t (c )

74
3.1.4. Функции массивов
В модуле n u m p y реализованы математические функции, выполняемые над
массивами, в таблице приведены некоторые из них для массива с именем а. Перед вызовом
функций в программе необходимо указать префикс «np» (имя модуля n u m p y в текущ ей
программе) и точку.

Т аб л и ц а 18 - Ф у н к ц и и м асси вов

Функция Описание
round(a,k) Округляет значения элементов массива а до k знаков после запятой, результат -
массив
sin(a) Вычисляет синусы от каждого элемента массива а, результат - массив
cos(a) Вычисляет косинусы от каждого элемента массива а, результат - массив
tan(a) Вычисляет тангенсы от каждого элемента массива а, результат - массив
arcos(a) Вычисляет арккосинусы от каждого элемента массива а, результат - массив
arcsin(a) Вычисляет арксинусы от каждого элемента массива а, результат - массив
arctan(a) Вычисляет арктангенсы от каждого элемента массива а, результат - массив
degrees(a) Переводит каждый элемент массива а в градусы, результат - массив
radians(a) Переводит каждый элемент массива а в радианы, результат - массив
log(a) Вычисляет натуральный логарифм от каждого элемента массива а, результат -
массив
log10(a) Вычисляет десятичный логарифм от каждого элемента массива а, результат -
массив
exp(a) Вычисляет экспоненту от каждого элемента массива а, результат - массив
s u m( a ) Вычисляет сумму элементов массива а, результат - число
prod(a) Вычисляет произведение элементов массива а, результат - число
mean(a) Вычисляет среднее значение элементов массива а, результат - число
ma x ( a ) Вычисляет максимальное значение из элементов массива а, результат - число
min(a) Вычисляет минимальное значение из элементов массива а, результат - число
abs(a) Применяет функцию модуль для каждого элемента массива а, результат - массив
pi Число пи, размноженное на все элементы массива.
sqrt(a) Вычисляет корень от каждого элемента массива а, результат - массив

П р и м ер . Реш им задачу с вычислением численности населения по формуле Капицы,


используя массивы из модуля num py. Создадим массив с различными годами, а затем
посчитаем численность населения Земли в эти года по формуле:
С /Т-1 — t \
N( t ) = —• a rcc tg ( -------- ),
где t - год, для которого вычисляется численность населения;
С - 172 миллиарда человек/лет;
T 1 - 2000 год;
т- 45 лет.

Код программы:
im p o rt numpy a s np

d e f compute p o p u l a t i o n (t ):
c = 172
t _1 = 2000
t a u = 45
y = c / t a u * (n p . p i / 2 - n p . a r c t a n ( ( t 1- t ) / t a u ))
re tu rn y

t = n p . a r r a y ( [ 1000, 1500, 1800, 1850, 1900, 1950, 1990, 2 0 1 9 , 2030])

75
p r i n t ( "Годы:" , t )
p r i n t ( "Ч исленность: ” , n p . r o u n d (compute p o p u l a t i o n (t ) , 3))
Результат:
Годы: [1000 1500 1800 1850 1900 1950 1990 2019 2030]
Численность: [0. 172 0. 343 0. 846 1.114 1. 616 2. 801 5. 168 7. 531 8.251]

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