Главная страница

ООП_на_Python_Учебное пособие_var5a. Учебнометодическое пособие по дисциплине Введение в компьютерные технологии Москва Физический факультет мгу имени М. В. Ломоносова 2022


Скачать 59.5 Kb.
НазваниеУчебнометодическое пособие по дисциплине Введение в компьютерные технологии Москва Физический факультет мгу имени М. В. Ломоносова 2022
Дата21.01.2023
Размер59.5 Kb.
Формат файлаdocx
Имя файлаООП_на_Python_Учебное пособие_var5a.docx
ТипУчебно-методическое пособие
#897314
страница5 из 5
1   2   3   4   5

class Body:
def __init__(self, mass, position, velocity): # конструктор
self.mass = mass # масса
self.position = position # радиус вектор положения в пространстве
self.velocity = velocity # вектор скорости

def update(self, force, dt): #
"Обновление положения и скорости под действием силы force"
self.velocity += force * dt / self.mass

self.position += self.velocity * dt
Функция gravity_force принимает на вход два небесных тела (экземпляра класса Body)

и возвращает вектор силы, с которой первое тело притягивает второе.
def gravity_force(A, B):
r_AB = B.position - A.position
return - G*A.mass*B.mass*r_AB / (r_AB.norm() ** 3)

41

Класс ThreeBodyProblem инкапслурует в себе три небесных тела, которых принимает
в конструкторе. Метод do_step вычисляет силы, действующие на каждое из тел, методом
compute_forces и обновляет положения и скорости этих тел. Метод compute_trajectories
вычисляет и возвращает траектории движения всех трех тел на интервале времени ??0, ??????.
class ThreeBodyProblem:
def __init__(self, body1, body2, body3):
self.body1 = body1
self.body2 = body2
self.body3 = body3

def compute_forces(self):
# вычисление сил попарного взаимодействия
F_12 = gravity_force(self.body1, self.body2)
F_13 = gravity_force(self.body1, self.body3)
F_23 = gravity_force(self.body2, self.body3)
# противоположные силы
F_21, F_31, F_32 = -F_12, -F_13, -F_23
# возвращаем кортеж результирующих сил
return F_21 + F_31, F_32 + F_12, F_13 + F_23

def do_step(self, dt): # сделать шаг по времени
F_1, F_2, F_3 = self.compute_forces() # рассчет силы
self.body1.update(F_1, dt)
self.body2.update(F_2, dt)
self.body3.update(F_3, dt)

def get_positions(self):
return [self.body1.position, self.body2.position,
self.body3.position]

def compute_trajectories(self, dt, t_final):
t = 0 # инициализации времени
trajectories = [self.get_positions()] # начальные положений
while t < t_final:
self.do_step(dt) # шаг по времени
trajectories.append(self.get_positions()) # обновленные положения
t += dt # приращение времени

return trajectories

42

21. Задания для самостоятельного решения
(1) Класс Vector3D
Экземляр класса задается тройкой координат в трехмерном пространстве (x,y,z).
Обязательно должны быть реализованы методы:
– приведение вектора к строке с выводом кооржинат (метод __str __),
– сложение векторов оператором `+` (метод __add__),
– вычитание векторов оператором `-` (метод __sub__),
– скалярное произведение оператором `*` (метод __mul__),
– умножение и деление на скаляр операторами `*` и `/` (метод __mul__ и __truediv__),
– векторное произведение оператором `@` (метод __matmul__),
– вычисление длинны вектора методом `norm`.

Пример
v1 = Vector3D(4, 1, 2)
print(v1)
v2 = Vector3D()
v2.read()
v3 = Vector3D(1, 2, 3)
v4 = v1 + v2
print(v4)
a = v4 * v3
print(a)
v4 = v1 * 10
print(v4)
v4 = v1 @ v3
print(v4)

(2) Класс «Прямоугольный треугольник»
Класс содержит два действительных числа – стороны треугольника. и включает

следующие методы:
− увеличение/уменьшение размера стороны на заданное количество процентов;
− вычисление радиуса описанной окружности,
− вычисление периметра,
− определение значений углов.
(3) Класс «Одномерный масив» TArray

Класс содержит поле для задания количества элементов и поле для хранения
элементов массива.
Методы:
– конструктор без параметров, конструктор с параметрами ,конструктор копирования,
– ввод и вывод даных,
– поиск максимального и минимального элементов,
– сортировка массива,
– поиск суммы элементов
– перегрузка оператора + (добавление элемента)
– перегрузка оператора * умножение элементов массива на число
(4) Класс «Автобус».

Класс содержит свойства:
– speed (скорость),
–capacity (максимальное количество пассажиров),
– maxSpeed (максимальная скорость),
– passengers (список имен пассажиров),
– hasEmptySeats (наличие свободных мест),

43

– seats (словарь мест в автобусе);
методы:
– посадка и высадка одного или нескольких пассажиров,
– увеличение и уменьшение скорости на заданное значение.
– операции "in", "+=" и "−=" (посадка и высадка пассажира(ов) с заданной фамилией)
(5) Класс «Снежинки» Snow

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

Класс также включает метод makeSnow(), который принимает сам объект и число
снежинок в ряду, а возвращает строку вида
"*****\n*****\n*****…",
где количество снежинок между '\n' равно переданному аргументу, а количество рядов
вычисляется, исходя из общего количества снежинок.
(6) Класс «Снежинка» (SnowFlake)

При инициализации класс принимает целое нечетное число – сторону квадрата, в
который вписана снежинка.
Методы:
– thaw() – таять, при этом на каждом шаге пропадают крайние звездочки со всех сторон;
параметр показывает, сколько шагов прошло.
– freeze(n) – намораживаться, при этом сторона квадрата, в который вписана снежинка,
увеличивается на 2 * n, одновременно добавляются звездочки в нужных местах, чтобы
правило соблюдалось.
– thicken() – утолщаться, ко всем линиям звездочек с двух сторон добавляются
параллельные (если перед этим снежинка таяла, то теперь звездочки восстанавливаются).
– show() – показывать (рисуется снежинка в виде квадратной матрицы со звездочками и
дефисами в пустых местах).

(7) Класс «Robot»

Класс инициализируется начальными координатами – положением Робота на
плоскости, обе координаты заключены в пределах от 0 до 100.

Робот может передвигаться на одну клетку вверх (N), вниз (S), вправо (E), влево (W).
Выйти за границы плоскости Робот не может.

Метод move() принимает строку – последовательность команд перемещения робота,
каждая буква строки соответствует перемещению на единичный интервал в направлении,
указанном буквой. Метод возвращает список координат – конечное положение Робота
после перемещения.

Метод path() вызывается без аргументов и возвращает список координат точек, по
которым перемещался Робот при последнем вызове метода move. Если метод не
вызывался, возвращает список с начальным положением Робота.
(8) Класс «Темы» (Themes)

Экземпляру класса при инициализации передается аргумент – список тем для
разговора.
Класс реализует методы:
– add_theme(value) – добавить тему в конец;
– shift_one() – сдвинуть темы на одну вправо (последняя становится первой, остальные
сдвигаются);
– reverse_order() – поменять порядок тем на обратный;

44

– get_themes() – возвращает список тем;
– get_first() – возвращает первую тему.
Пример 1
Ввод:
tl = Themes(['weather', 'rain'])
tl.add_theme('warm')
print(tl.get_themes())
tl.shift_one()
print(tl.get_first())
Вывод:
('weather', 'rain', 'warm')
warm
Пример 2
Ввод:
tl = Themes(['sun', 'feeding'])
tl.add_theme('cool')
tl.shift_one()
print(tl.get_first())
tl.reverse_order()
print(tl.get_themes())
Вывод:
cool
('feeding', 'sun', 'cool')
(9) Класс «ПчёлоСлон» (BeeElephant)

Экземпляр класса инициализируется двумя целыми числами: первое относится к
пчеле, второе – к слону.
Класс реализует следующие методы:
– fly() – может летать – возвращает True, если часть пчелы не меньше части слона, иначе
False;
– trumpet() – трубить – если часть слона не меньше части пчелы, возвращает строку:
“tu-tu-doo-doo!”, иначе “wzzzzz”.
– eat(meal, value) – есть – может есть только нектар (nectar) или траву (grass). Если съедает
нектар, то из части слона вычитается количество съеденного, пчеле добавляется, иначе
наоборот: у пчелы вычитается, а слону добавляется. Не может увеличиться выше 100 и
уменьшиться меньше 0;
– get_parts() – возвращает список из значений: [часть пчелы, часть слона].
Пример 1
Ввод:
be = BeeElephant(3, 2)
print(be.fly())
print(be.trumpet())
be.eat('grass', 4)
print(be.get_parts())
Вывод:
True
wzzzzz
(0, 6)
Пример 2
Ввод:
be = BeeElephant(13, 87)
print(be.fly())
print(be.trumpet())
be.eat('nectar', 90)
print(be.trumpet())
print(be.get_parts())
Вывод:

45

False
tu-tu-doo-doo!
wzzzzz
(100, 0)
(10) Класс «Разговор» (Talking)

Экземпляр класса инициализируется с аргументом name – именем котенка. Класс
реализует методы:
– to_answer() – ответить: котенок через один раз отвечает да или нет, начинает с да. Метод
возвращает “moore-moore”, если да, “meow-meow”, если нет. Одновременно
увеличивается количество соответствующих ответов;
– number_yes() – количество ответов да;
– number_no() – количество ответов нет.
Пример 1
Ввод:
tk = Talking('Pussy')
print(tk.to_answer())
print(tk.to_answer())
print(tk.to_answer())
print(f'{tk.name} says "yes" {tk.number_yes()} times, "no" {tk.number_no()}
times')
Вывод:
moore-moore
meow-meow
moore-moore
Pussy says "yes" 2 times, "no" 1 times
Пример 2
Ввод:
tk = Talking('Pussy')
tk1 = Talking('Barsik')
print(tk.to_answer())
print(tk1.to_answer())
print(tk1.to_answer())
print(tk1.to_answer())
print(f'{tk.name} says "yes" {tk.number_yes()} times, "no" {tk.number_no()}
times')
print(f'{tk1.name} says "yes" {tk1.number_yes()} times, "no"
{tk1.number_no()} times')
Вывод:
moore-moore
moore-moore
meow-meow
moore-moore
Pussy says "yes" 1 times, "no" 0 times
Barsik says "yes" 2 times, "no" 1 times
(11) Класс «Воздушный Замок» (AirCastle)

Экземпляр класса инициализируется с аргументами:
– высота;
– количество составляющих облаков;
– цвет.
Класс должен реализовывать методы:
– change_height(value) – изменить высоту на value, может уменьшаться только до нуля;
– сложить с числом, добавляется n облаков к замку, одновременно увеличивается высоту
на n // 5;
– экземпляр класса можно вызвать с аргументом – целым числом, означающим

46

прозрачность облаков; метод возвращает значение видимости замка, рассчитанное по
формуле: высота // прозрачность * количество облаков;
__str__ – возвращает строковое представление в виде:
The AirCastle at an altitude of <высота> meters is <цвет> with <количество облаков> clouds”.
– экземпляры можно сравнивать: сначала по количеству облаков, затем по высоте, затем
по цвету по алфавиту; для этого нужно реализовать методы сравнения: >, <, >=, <=, ==, !=.

(12) Класс Добрый Ифрит (GoodIfrit)
Экземпляр класса инициализируется с аргументами: высота, имя, доброта.

Класс должен реализовывать функциональность
– change_goodness(value) – менять доброту на указанную величину; не может стать
отрицательной, в этом случае становится равной 0;
– к экземпляру класса можно прибавить число: (gi1 = gi + number), создается новый
экземпляр с высотой, большей на величину number, остальные характеристики те же;
– экземпляр класса можно вызвать с аргументом, возвращается значение:
аргумент * доброта // высота
__str__() – возвращает строку вида:
Good Ifrit <имя>, height <высота>, goodness <доброта>”
– экземпляры можно сравнивать между собой: сначала по доброте, затем по высоте, затем
по имени по алфавиту; для этого нужно реализовать методы сравнения:
<, >, <=, >=, ==, !=.
Ввод:
gi = GoodIfrit(80, "Hazrul", 3)
gi.change_goodness(4)
print(gi)
gi1 = gi + 15
print(gi1)
print(gi(31))
Вывод:
Good Ifrit Hazrul, height 80, goodness 7
Good Ifrit Hazrul, height 95, goodness 7
2
Ввод:
gi = GoodIfrit(80, "Hazrul", 3)
gi1 = GoodIfrit(80, "Dalziel", 1)
print(gi < gi1)
gi1.change_goodness(2)
print(gi > gi1)
print(gi, gi1, sep='\n')
Вывод:
False
True
Good Ifrit Hazrul, height 80, goodness 3
Good Ifrit Dalziel, height 80, goodness 3


(13) Класс «Волшебник» (Wizard)
Экземпляр класса при инициализации принимает аргументы:

– имя;
– рейтинг;
– на какой возраст выглядит.
Класс должен обеспечивать функциональность:
– change_rating(value) – изменять рейтинг на значение value; не может стать больше 100 и
меньше 1, изменяется только до достижения экстремального значения; при увеличении

47

рейтинга уменьшается возраст на abs(value) // 10, но только до 18, дальше не уменьшается;
при уменьшении рейтинга возраст соответственно увеличивается;
– к экземпляру класса можно прибавить строку: (wd += string), значение рейтинга
увеличивается на ее длину, а возраст, соответственно, уменьшается на длину // 10, условия
изменения такие же;
– экземпляр класса можно вызвать с аргументом-числом; возвращает значение: (аргумент
- возраст) * рейтинг;
__str__() – возвращает строку:
Wizard with rating looks years old”
– экземпляры класса можно сравнивать: сначала по рейтингу, затем по возрасту, затем по
имени по алфавиту; для этого нужно реализовать методы сравнения: <, >, <=, >=, ==, !=.
(14) Класс «Сотрудник компании» Worker

Экземпляр класса при инициализации принимает аргументы:
имя, должность и стаж работы сотрудника,
метод print_info() выводит информацию о сотруднике в формате:
«Имя: Василий
Должность: Системный администратор
Стаж: 3 года»
При выводе стажа нужно учитывать, что «года» должно заменяться на «лет» или «год» в
зависимости от числа.
worker1 = Worker("Алексей", "Программист", 17)
worker1.print_info()
print()
worker2 = Worker("Анна", "Маркетолог", 2)
worker2.print_info()
print()
worker3 = Worker("Дмитрий", "Аналитик", 1)
worker3.print_info()
print()

(15) Класс Post
Класс описывает публикацию от пользователя в сети:

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

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

Добавить метод, позволяющий поставить лайк сообщению.

(16) Классы «Товар» и «Склад»
Класс «Товар»содержит следующие закрытые поля:

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

Класс «Склад» содержит закрытый массив товаров.
Обеспечить следующие возможности:
– вывод информации о товаре по номеру с помощью индекса
вывод информации о товаре, название которого введено с клавиатуры
– сортировку товаров по названию магазина, по наименованию и цене;
– перегруженную операцию сложения товаров, выполняющую сложение их цен.

48


(17) Классы «Клиент»(Client) и «Банк» (Bank)

Класс «Клиент» содержит поля: код клиента, ФИО, дата открытия вклада, размер
вклада, процент по вкладу.

Класс «Банк» (class Bank) содержит поле clientBase представляющем собой список
клиентов и методами:
– addClient(client) — принимает обьект клиента и помещает его в base.
– showByMoney(money) — принимает количество денег и выводит информацию о всех
клиентах у которых размер вклада больше
– showByCode(cod) — принимает код и выводит всю информацию клиенте с данным
кодом.
– showByProc(proc) — принимает процент и выводит информацию о всех клиентах у
которых процент по вкладу больше данного.
(18) Класс «Автомобиль» и дочерний класс «Автобус»

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

Реализуйте класс автомобиля, а также класс, который будет описывать автобус. Кроме
того, что имеется у автомобиля, у автобуса должны быть поля, содержащие число
пассажиров и количество полученных денег, изначально равные нулю. Также должны быть
методы «войти» и «выйти», изменяющие число пассажиров. Наконец, метод move должен
быть переопределён, чтобы увеличивать количество денег в соответствии с количеством
пассажиров и пройденным расстоянием.
(19) Классы «ПЕРСОНА», «АБИТУРИЕНТ», «СТУДЕНТ», «ПРЕПОДАВАТЕЛЬ»

Класс ПЕРСОНА, экземпляр класса инициализируется аргументами фамилия, дата
рождения и содержит методы, позволяющие вывести информацию о персоне, а также
определить ее возраст.

Дочерние классы: АБИТУРИЕНТ (фамилия, дата рождения, факультет),
СТУДЕНТ(фамилия, дата рождения, факультет, курс), ПРЕПОДАВАТЕЛЬ (фамилия, дата
рождения, факультет, должность, стаж), содержат свои методы вывода информации.

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

49

22. Литература
• Бизли Д., Python, подробный справочник, 4-е издание, 2010.
• Марк Лутц, Изучаем Python, Т. 1, 5-е издание, 2019.
• Марк Лутц, Изучаем Python, Т. 2, 5-е издание, 2020.
• Марк Лутц, Программирование на Python, 4-е издание, I том, 2011.
• Марк Саммерфилд, Программирование на Python 3. Подробное руководство, 2009.
• Майкл Доусон. Программируем на Python. 3-е издание, 2014.
• Swaroop Chitlur, A Byte of Python, 2020.

• Сайты:
• http://python.org/ Официальный сайт
• http://python.ru/
• http://python.su/
• http://programarcadegames.com Доходчиво описан язык на основе аркадных игр.
• http://younglinux.info/ Основы программирования на Python. Курс по информатике,

ООП, tkinter, алгоритмы, решение задач.
• http://pythonworld.ru/karta-sajta Язык программирования Python 3 для начинающих и

чайников.
• http://aliev.me/runestone/ Решение проблем c использованием алгоритмов и структур

данных
• https://www.programiz.com/python-programming очень полезный ресурс для

начинающих, все очень разжевано и с примерами, но на английском языке.
• https://www.youtube.com/channel/UCMcC_43zGHttf9bY-xJOTwA хороший YouTube

канал для начинающих изучать Python.
• Онлайн IDE/VM

• http://runnable.com/new/Python
• https://koding.com/IDE
• https://c9.io/

• Ресурсы о популярных дополнениях
IPython - улучшенная интерактивная оболочка

• Домашняя страница: http://ipython.org/
• Быстрый старт - Introducing IPython
• Распечатай и положи на рабочий стол - IPython Quick Reference
• Полная официальная документация


matplotlib - построение графиков в различных форматах в стиле, навеянном MATLAB

• Домашняя страница: http://matplotlib.org/
• Официальная документация
• Огромный каталог примеров
• Глава в книге The Architecture of Open Source Applications от создателей matplotlib


numpy - библиотека для научных расчётов

• Домашняя страница: http://www.numpy.org/
• Пособие для начинающих
• Полная официальная документация

https://docs.python.org/3/py-modindex.html - перечень модулей с описанием функций.
1   2   3   4   5


написать администратору сайта