Сравнить коммиты

..

18 Коммитов

Автор SHA1 Сообщение Дата
e1d0599622 zadanie 2025-12-08 16:55:43 +03:00
e67b412977 ris 2025-12-08 16:30:07 +03:00
69a9d61875 zadanie1 2025-12-08 16:27:43 +03:00
7c1552aa67 zadanie 2025-12-08 15:24:08 +03:00
b3bd732ba8 zadanie 2025-12-08 15:11:01 +03:00
6053fbe787 16 2025-12-08 14:28:39 +03:00
bdeb1c27f1 9 2025-12-07 22:52:02 +03:00
f6ed84af3d task 2025-12-07 22:47:22 +03:00
d8f5f5b631 txt 2025-12-07 22:46:08 +03:00
b643e0a0b2 modul 2025-12-07 22:45:00 +03:00
f1e43207fc mod 2025-12-07 22:42:24 +03:00
c5bca092a1 task 2025-12-07 22:37:24 +03:00
0bb5224e01 Mod3.py 2025-12-07 22:23:33 +03:00
4bfdf950b8 9 2025-12-07 22:12:21 +03:00
d5e5e9b5d3 8.md 2025-12-07 15:56:56 +03:00
3920c08f52 16 2025-11-24 14:24:51 +03:00
6de200f325 test 2025-11-24 11:56:10 +03:00
ce72d1f7b1 Figurem1 2025-11-24 11:55:41 +03:00
23 изменённых файлов: 1355 добавлений и 3 удалений

23
TEMA7/1111.md Обычный файл
Просмотреть файл

@@ -0,0 +1,23 @@
16. Разработайте функцию с 2 аргументами, которая для заданного словаря (аргумент функции) с любыми ключами и с числовыми значениями создаёт новый словарь с теми же ключами и со значениями, равными синусам от значений из входного словаря с заданным именами. Проверьте функцию на примере двух разных входных словарей.
```py
>>> import math
>>> def f(a):
... result = {}
... for k, v in a.items(): # Перебираем все пары ключ-значение из входного словаря
... result[k] = math.sin(v)
... return result
...
>>> def test():
... print("Тест 1", f({'a': 0, 'b': 1.57, 'c': 3.14}))
...
>>> def test2():
... print("Тест 2", f({'x': 0.5, 'y': 1.0, 'z': 2.0}))
...
>>> test
<function test at 0x0000016467AAAAC0>
>>> test()
Тест 1 {'a': 0.0, 'b': 0.9999996829318346, 'c': 0.0015926529164868282}
>>> test2()
Тест 2 {'x': 0.479425538604203, 'y': 0.8414709848078965, 'z': 0.9092974268256817}
```

Двоичные данные
TEMA7/Figure_1.png Обычный файл

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 15 KiB

89
TEMA7/test.md Обычный файл
Просмотреть файл

@@ -0,0 +1,89 @@
Разработайте и проверьте функцию, реализующую для момента времени t расчет выхода y(t) для
устройства задержки: на вход поступает сигнал, а на выходе повторяется этот сигнал с задержкой на
заданное время Т.
```py
def delays (signal, T):
for i in range(len(signal)):
signal[i] += T
return signal
```
Входной сигнал:
```py
>>> y = [random.gauss(3, 1.5) for _ in range(40)]
>>> y
[0.9991072002742722, 1.5968849542569137, 2.3438553070732215, 3.5914160170650784, 4.037092622456526,
2.918114740779675, 4.802139541704564, 3.2313443629034646, 2.329031244833026, 4.450860002446187,
1.4135232524868848, 5.914364290743276, 3.7898798373923634, 2.364244259128151, 4.9786840892253235,
1.4351490690602144, 2.351122955511408, 1.8798309616294469, 0.7931480954519166, 3.811575392065204,
2.524732026173494, 2.8373060222940696, 4.497504412830464, 3.406940931674363, 3.876506913067825,
1.7529616032820314, 2.6542411737897087, 1.948604542902865, 6.138099312505814, 1.4111492356181103,
3.736820673744037, 4.509373750771566, 1.7486314440126465, 4.70122140759552,
-0.6513915222680815, 0.171219291885647, 2.2079783562880486, 4.390489704586708, 0.9670198540727273,
1.6420724788248429]
>>> yd = delays(y, 4)
>>> yd
[4.999107200274272, 5.596884954256914, 6.3438553070732215, 7.591416017065079, 8.037092622456527,
6.918114740779675, 8.802139541704564, 7.231344362903465, 6.3290312448330255, 8.450860002446188,
5.413523252486884, 9.914364290743276, 7.7898798373923634, 6.364244259128151, 8.978684089225323,
5.435149069060214, 6.351122955511408, 5.879830961629446, 4.793148095451917, 7.811575392065204,
6.524732026173494, 6.83730602229407, 8.497504412830464, 7.406940931674363, 7.876506913067825,
5.752961603282031, 6.654241173789709, 5.948604542902865, 10.138099312505814, 5.41114923561811,
7.736820673744036, 8.509373750771566, 5.748631444012647, 8.70122140759552,
3.3486084777319185, 4.171219291885647, 6.207978356288049, 8.390489704586708, 4.967019854072728, 5.642072478824843]
```
Разработайте и проверьте функцию, реализующую расчет гистограммы по выборке случайной величины с каким-то
распределением. Гистограмма при выводе на экран представляется в виде таблицы: границы интервала, число элементов
выборки в интервале. Аргументы функции: выборка, число интервалов разбиения диапазона изменения
случайной величины. Возвращаемый результат функции: список с числами элементов выборки в интервалах разбиения.
```py
import numpy as np
import random
import matplotlib.pyplot as plt
def histo(data, num):
minval, maxval = min(data), max(data)
parts = np.linspace(minval, maxval, num + 1)
rows = [0] * num
for now in data:
for i in range(num):
if parts[i] <= now < parts[i + 1]:
rows[i] += 1
break
if now == maxval:
rows[-1] += 1
plt.hist(data, bins=parts)
plt.xlabel('Значения выборки')
plt.ylabel('Число элементов')
plt.title('Гистограмма выборки')
plt.show()
return rows
sample = [random.gauss(random.random(), random.random()) for _ in range(random.randint(10,200))]
intervals = int(input("Введите количество интервалов разбиения: "))
output = histo(sample, intervals)
======================= RESTART: D:/STUDY/POAS/Тема7/hist.py ======================
Введите количество интервалов разбиения: 12
[1, 0, 3, 4, 11, 21, 43, 57, 22, 6, 2, 3]
```
Разработайте и проверьте анонимную функцию, вычисляющую значение оценки отклика Y линейной регрессии при значении переменной Х
Y=b1+b2*X
и имеющую аргументы b1, b2 и X.
```py
linreg = lambda b1, b2, x: b1 + b2 * x
b1 = float(input("Введите коэффициент b1 линейной регрессии: "))
b2 = float(input("Введите коэффициент b2 линейной регрессии: "))
x_val = float(input("Введите значение x: "))
print(linreg(b1, b2, x_val))
Введите коэффициент b1 линейной регрессии: 2
Введите коэффициент b2 линейной регрессии: 3
Введите значение x: 5
17.0
```

42
TEMA8/16.md Обычный файл
Просмотреть файл

@@ -0,0 +1,42 @@
Разработайте функцию с 2 аргументами, которая для заданного словаря (аргумент функции) с любыми ключами и с числовыми значениями создаёт новый словарь с теми же ключами и со значениями, равными синусам от значений из входного словаря с заданным именами. Проверьте функцию на примере двух разных входных словарей.
Через модуль:
Модуль1
```py
import math
def f(a):
"""Функция f."""
result = {}
for k, v in a.items(): # Перебираем все пары ключ-значение
result[k] = math.sin(v)
return result
def test():
"""Первая тестовая функция."""
print("Тест 1", f({'a': 0, 'b': 1.57, 'c': 3.14}))
if __name__ == "__main__":
test()
print("mode1.py работает корректно")
```
Модуль2:
```py
from mode1 import f
def test2():
"""Вторая тестовая функция."""
print("Тест 2", f({'x': 0.5, 'y': 1.0, 'z': 2.0}))
if __name__ == "__main__":
test2()
print("mode2.py работает корректно")
```
```py
>>> os.chdir('C:\\Users\\Admin\\Documents\\Tsvetkova\\python-labs\\TEMA8')
>>> import mode1
>>> import mode2
>>> mode1.test()
Тест 1 {'a': 0.0, 'b': 0.9999996829318346, 'c': 0.0015926529164868282}
>>> mode2.test2()
Тест 2 {'x': 0.479425538604203, 'y': 0.8414709848078965, 'z': 0.9092974268256817}
```

111
TEMA8/1819.md Обычный файл
Просмотреть файл

@@ -0,0 +1,111 @@
16. Разработайте функцию с 2 аргументами, которая для заданного словаря (аргумент функции) с любыми ключами и с числовыми значениями создаёт новый словарь с теми же ключами и со значениями, равными синусам от значений из входного словаря, и записывает новый словарь в бинарный файл с заданным именем (аргумент функции). Проверьте функцию на примере двух разных входных словарей.
Модуль 1
```py
import math
import pickle
def slov_sin(input_dict, filename):
new_dict = {key: math.sin(value) for key, value in input_dict.items()}
with open(filename, 'wb') as f:
pickle.dump(new_dict, f)
print(f"Файл записан: {filename}")
return new_dict
def read_slov(filename):
try:
with open(filename, 'rb') as f:
loaded_dict = pickle.load(f)
print(f"Файл прочитан: {filename}")
return loaded_dict
def test1():
dict1 = {'a': 0, 'b': math.pi / 2, 'c': math.pi, 'd': 3 * math.pi / 2}
file1 = 'sin_values_1.bin'
saved = slov_sin(dict1, file1)
loaded = read_slov(file1)
print(f"Исходный: {dict1}")
print(f"Загруженный: {loaded}")
if saved == loaded:
print("OK")
else:
print("ERROR")
return loaded
def test2():
dict2 = {'x': 1.0, 'y': 2.0, 'z': -0.5}
file2 = 'sin_values_2.bin'
saved = slov_sin(dict2, file2)
loaded = read_slov(file2)
print(f"Исходный: {dict2}")
print(f"Загруженный: {loaded}")
if saved == loaded:
print("OK")
else:
print("ERROR")
return loaded
if __name__ == "__main__":
print("Тесты запущены")
test1()
test2()
print("\n" + "="*60)
print("АВТОТЕСТЫ ЗАВЕРШЕНЫ")
print("="*60)
```
Модуль 2
```py
import slov_module
def run_tests():
"""Запустить все тесты"""
print("Тест 1:")
slov_module.test1()
print("\nТест 2:")
slov_module.test2()
print("\nТест 3 (свой):")
d = {'x': 0.5, 'y': 1.0, 'z': 2.0}
f = 'my_test.bin'
s = slov_module.slov_sin(d, f)
print(f"Исходный: {d}")
print(f"Синусы: {s}")
l = slov_module.read_slov(f)
print(f"Из файла: {l}")
if __name__ == "__main__":
run_tests()
```
```py
>>> import slov_module
>>> import test_module
>>> slov_module.test1()
Файл записан: sin_values_1.bin
Файл прочитан: sin_values_1.bin
Исходный: {'a': 0, 'b': 1.5707963267948966, 'c': 3.141592653589793, 'd': 4.71238898038469}
Загруженный: {'a': 0.0, 'b': 1.0, 'c': 1.2246467991473532e-16, 'd': -1.0}
OK
{'a': 0.0, 'b': 1.0, 'c': 1.2246467991473532e-16, 'd': -1.0}
>>> slov_module.test2()
Файл записан: sin_values_2.bin
Файл прочитан: sin_values_2.bin
Исходный: {'x': 1.0, 'y': 2.0, 'z': -0.5}
Загруженный: {'x': 0.8414709848078965, 'y': 0.9092974268256817, 'z': -0.479425538604203}
OK
{'x': 0.8414709848078965, 'y': 0.9092974268256817, 'z': -0.479425538604203}
```

362
TEMA8/8.md Обычный файл
Просмотреть файл

@@ -0,0 +1,362 @@
# 1. Запуск интерактивной оболочки IDLE
```py
>>> import os,sys,importlib #Импорт трёх важных вспомогательных модулей
>>> os.chdir('C:\\Users\\Admin\\Documents\\Tsvetkova\\python-labs\\TEMA8')
>>> os.getcwd() #Контролируем корректность установки текущего каталога
'C:\\Users\\Admin\\Documents\\Tsvetkova\\python-labs\\TEMA8'
```
# 2. Создание и использование модулей в среде Python
Большие программы делятся на части-модули, записываемые в отдельные файлы. Это делается для удобства отладки, обеспечения возможности коллективной разработки, создания возможности повторного использования программ. Модулем в среде Python называется любая часть программного кода на этом языке, записанная в отдельном файле.
## 2.1 Запуск модуля на выполнение путём его импорта
После импорта модуль становится объектом в пространстве имен той части программы, где осуществлен импорт. Модуль получает имя или псевдоним, заданные в инструкции импорта, а также набор атрибутов. При этом появляется возможность использования всех приемов, применяемых при работе с модулями. Создадим и откроем в текущем каталоге файл с именем Mod1.py, который будет содержать следующее:
```py
perm1=input('Mod1:Введите значение = ')
print('Mod1:Значение perm1=',perm1)
```
Пока введённый или изменённый текст в окне редактора с текстом модуля не сохранён в файле, в заголовке перед именем файла будет стоять символ "*".
```py
>>> import Mod1 # Запуск модуля
Mod1:Введите значение = 5
Mod1:Значение perm1= 5
>>> type(Mod1) # Модуль имеет класс объекта типа модуль
<class 'module'>
>>> dir(Mod1)
['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'perm1']
>>> Mod1.perm1 # Получим доступ к значению объекта, созданного в модуле
'5'
```
При импорте модуля управление передаётся от модуля __main__ к модулю Mod1, который ищется в рабочем каталоге. Если бы данного модуля там не было, то при импорте пришлось бы ещё указать каталог, где он находится.
При повторном импорте модуля, запуска программы не происходит. Чтобы это исправить, применим функцию reload из модуля importlib:
```py
>>> importlib.reload(Mod1)
Mod1:Введите значение = 3
Mod1:Значение perm1= 3
<module 'Mod1' from 'C:\\Users\\Admin\\Documents\\Tsvetkova\\python-labs\\TEMA8'>
>>> Mod1.perm1
'3'
```
## 2.2 Импортированные модули заносятся в словарь - значение атрибута sys.modules
```py
>>> print(sorted(sys.modules.keys()))
['Mod1', '__future__', '__main__', '_abc', '_ast', '_bisect', '_bz2', '_codecs', '_collections', '_collections_abc', '_colorize', '_compat_pickle', '_compression', '_datetime', '_frozen_importlib', '_frozen_importlib_external', '_functools', '_heapq', '_imp', '_io', '_lzma', '_opcode', '_opcode_metadata', '_operator', '_pickle', '_pyrepl', '_pyrepl.pager', '_queue', '_random', '_signal', '_sitebuiltins', '_socket', '_sre', '_stat', '_string', '_struct', '_sysconfig', '_thread', '_tkinter', '_tokenize', '_typing', '_warnings', '_weakref', '_weakrefset', '_winapi', '_wmi', 'abc', 'ast', 'bdb', 'binascii', 'bisect', 'builtins', 'bz2', 'codecs', 'collections', 'collections.abc', 'configparser', 'contextlib', 'copyreg', 'datetime', 'dis', 'encodings', 'encodings.aliases', 'encodings.cp1251', 'encodings.utf_8', 'enum', 'errno', 'fnmatch', 'functools', 'genericpath', 'heapq', 'idlelib', 'idlelib.autocomplete', 'idlelib.autocomplete_w', 'idlelib.calltip', 'idlelib.calltip_w', 'idlelib.config', 'idlelib.debugger', 'idlelib.debugger_r', 'idlelib.debugobj', 'idlelib.debugobj_r', 'idlelib.hyperparser', 'idlelib.iomenu', 'idlelib.macosx', 'idlelib.multicall', 'idlelib.pyparse', 'idlelib.rpc', 'idlelib.run', 'idlelib.scrolledlist', 'idlelib.stackviewer', 'idlelib.tooltip', 'idlelib.tree', 'idlelib.util', 'idlelib.window', 'idlelib.zoomheight', 'importlib', 'importlib._abc', 'importlib._bootstrap', 'importlib._bootstrap_external', 'importlib.machinery', 'importlib.util', 'inspect', 'io', 'ipaddress', 'itertools', 'keyword', 'linecache', 'lzma', 'marshal', 'math', 'nt', 'ntpath', 'opcode', 'operator', 'os', 'os.path', 'pickle', 'pkgutil', 'platform', 'plistlib', 'posixpath', 'pydoc', 'pyexpat', 'pyexpat.errors', 'pyexpat.model', 'queue', 'random', 're', 're._casefix', 're._compiler', 're._constants', 're._parser', 'reprlib', 'select', 'selectors', 'shlex', 'shutil', 'site', 'socket', 'socketserver', 'stat', 'string', 'struct', 'sys', 'sysconfig', 'tempfile', 'textwrap', 'threading', 'time', 'tkinter', 'tkinter.constants', 'token', 'tokenize', 'traceback', 'types', 'typing', 'urllib', 'urllib.parse', 'warnings', 'weakref', 'winreg', 'xml', 'xml.parsers', 'xml.parsers.expat', 'xml.parsers.expat.errors', 'xml.parsers.expat.model', 'zipimport', 'zlib']
```py
Для повторного импорта модуля и выполнения программы, удалим модуль из этого словаря. Затем снова повторим импорт и убедимся в выполнении программы.
```py
>>> sys.modules.pop('Mod1')
<module 'Mod1' from 'C:\\Users\\Admin\\Documents\\Tsvetkova\\python-labs\\TEMA8'>
>>> print(sorted(sys.modules.keys()))
['__future__', '__main__', '_abc', '_ast', '_bisect', '_bz2', '_codecs', '_collections', '_collections_abc', '_colorize', '_compat_pickle', '_compression', '_datetime', '_frozen_importlib', '_frozen_importlib_external', '_functools', '_heapq', '_imp', '_io', '_lzma', '_opcode', '_opcode_metadata', '_operator', '_pickle', '_pyrepl', '_pyrepl.pager', '_queue', '_random', '_signal', '_sitebuiltins', '_socket', '_sre', '_stat', '_string', '_struct', '_sysconfig', '_thread', '_tkinter', '_tokenize', '_typing', '_warnings', '_weakref', '_weakrefset', '_winapi', '_wmi', 'abc', 'ast', 'bdb', 'binascii', 'bisect', 'builtins', 'bz2', 'codecs', 'collections', 'collections.abc', 'configparser', 'contextlib', 'copyreg', 'datetime', 'dis', 'encodings', 'encodings.aliases', 'encodings.cp1251', 'encodings.utf_8', 'enum', 'errno', 'fnmatch', 'functools', 'genericpath', 'heapq', 'idlelib', 'idlelib.autocomplete', 'idlelib.autocomplete_w', 'idlelib.calltip', 'idlelib.calltip_w', 'idlelib.config', 'idlelib.debugger', 'idlelib.debugger_r', 'idlelib.debugobj', 'idlelib.debugobj_r', 'idlelib.hyperparser', 'idlelib.iomenu', 'idlelib.macosx', 'idlelib.multicall', 'idlelib.pyparse', 'idlelib.rpc', 'idlelib.run', 'idlelib.scrolledlist', 'idlelib.stackviewer', 'idlelib.tooltip', 'idlelib.tree', 'idlelib.util', 'idlelib.window', 'idlelib.zoomheight', 'importlib', 'importlib._abc', 'importlib._bootstrap', 'importlib._bootstrap_external', 'importlib.machinery', 'importlib.util', 'inspect', 'io', 'ipaddress', 'itertools', 'keyword', 'linecache', 'lzma', 'marshal', 'math', 'nt', 'ntpath', 'opcode', 'operator', 'os', 'os.path', 'pickle', 'pkgutil', 'platform', 'plistlib', 'posixpath', 'pydoc', 'pyexpat', 'pyexpat.errors', 'pyexpat.model', 'queue', 'random', 're', 're._casefix', 're._compiler', 're._constants', 're._parser', 'reprlib', 'select', 'selectors', 'shlex', 'shutil', 'site', 'socket', 'socketserver', 'stat', 'string', 'struct', 'sys', 'sysconfig', 'tempfile', 'textwrap', 'threading', 'time', 'tkinter', 'tkinter.constants', 'token', 'tokenize', 'traceback', 'types', 'typing', 'urllib', 'urllib.parse', 'warnings', 'weakref', 'winreg', 'xml', 'xml.parsers', 'xml.parsers.expat', 'xml.parsers.expat.errors', 'xml.parsers.expat.model', 'zipimport', 'zlib']
>>> import Mod1
Mod1:Введите значение = 5
Mod1:Значение perm1= 5
>>> sys.modules.pop('Mod1')
<module 'Mod1' from 'C:\\Users\\Admin\\Documents\\Tsvetkova\\python-labs\\TEMA8'>
```
Отличие importlib.reload() от sys.modules.pop() заключается в том, что importlib.reload() перезагружает модуль, выполняя его код заново, но не удаляет модуль из словаря. Он имеет тот же адрес в памяти и все зависимости от него остаются в силе. sys.modules.pop() убирает модуль из словаря, при повторном импорте он уже будет иметь другой адрес.
## 2.3 Запуск модуля на выполнение с помощью функции exec()
Здесь модуль не требуется импортировать. Функция exec действует так, как будто на месте обращения к ней в программу вставлен код из объекта-аргумента функции. Но объект-модуль при этом не создается. Созданные при выполнении модуля объекты становятся объектами главной программы!
```py
>>> exec(open('Mod1.py').read())
Mod1:РведиСРµ Р·РЅР°Сение = 5
Mod1:РРЅР°Сение perm1= 5
# Здесь наблюдается проблема с кодировкой символов, файл был сохранён в одной кодировке, а Python хочет его прочитать в другой. Поэтому укажем явно кодировку
>>> exec(open('Mod1.py', encoding='utf-8').read())
Mod1:Введите значение = 5
Mod1:Значение perm1= 5
>>> exec(open('Mod1.py', encoding='utf-8').read())
Mod1:Введите значение = 1
Mod1:Значение perm1= 1
>>> exec(open('Mod1.py', encoding='utf-8').read())
Mod1:Введите значение = 9
Mod1:Значение perm1= 9
>>> perm1
'9'
```
## 2.4 Использование инструкции from ... import ...
В одном модуле может содержаться несколько функций или пользовательских объектов. Тогда можно осуществлять импорт модуля не целиком, а только часть содержащихся в нем объектов.
Пример 1:
```py
>>> from Mod1 import perm1
Mod1:Введите значение = 5
Mod1:Значение perm1= 5
>>> print(sorted(sys.modules.keys()))
['Mod1', '__future__', '__main__', '_abc', '_ast', '_bisect', '_bz2', '_codecs', '_collections', '_collections_abc', '_colorize', '_compat_pickle', '_compression', '_datetime', '_frozen_importlib', '_frozen_importlib_external', '_functools', '_heapq', '_imp', '_io', '_lzma', '_opcode', '_opcode_metadata', '_operator', '_pickle', '_pyrepl', '_pyrepl.pager', '_queue', '_random', '_signal', '_sitebuiltins', '_socket', '_sre', '_stat', '_string', '_struct', '_sysconfig', '_thread', '_tkinter', '_tokenize', '_typing', '_warnings', '_weakref', '_weakrefset', '_winapi', '_wmi', 'abc', 'ast', 'bdb', 'binascii', 'bisect', 'builtins', 'bz2', 'codecs', 'collections', 'collections.abc', 'configparser', 'contextlib', 'copyreg', 'datetime', 'dis', 'encodings', 'encodings.aliases', 'encodings.cp1251', 'encodings.utf_8', 'enum', 'errno', 'fnmatch', 'functools', 'genericpath', 'heapq', 'idlelib', 'idlelib.autocomplete', 'idlelib.autocomplete_w', 'idlelib.calltip', 'idlelib.calltip_w', 'idlelib.config', 'idlelib.debugger', 'idlelib.debugger_r', 'idlelib.debugobj', 'idlelib.debugobj_r', 'idlelib.hyperparser', 'idlelib.iomenu', 'idlelib.macosx', 'idlelib.multicall', 'idlelib.pyparse', 'idlelib.rpc', 'idlelib.run', 'idlelib.scrolledlist', 'idlelib.stackviewer', 'idlelib.tooltip', 'idlelib.tree', 'idlelib.util', 'idlelib.window', 'idlelib.zoomheight', 'importlib', 'importlib._abc', 'importlib._bootstrap', 'importlib._bootstrap_external', 'importlib.machinery', 'importlib.util', 'inspect', 'io', 'ipaddress', 'itertools', 'keyword', 'linecache', 'lzma', 'marshal', 'math', 'nt', 'ntpath', 'opcode', 'operator', 'os', 'os.path', 'pickle', 'pkgutil', 'platform', 'plistlib', 'posixpath', 'pydoc', 'pyexpat', 'pyexpat.errors', 'pyexpat.model', 'queue', 'random', 're', 're._casefix', 're._compiler', 're._constants', 're._parser', 'reprlib', 'select', 'selectors', 'shlex', 'shutil', 'site', 'socket', 'socketserver', 'stat', 'string', 'struct', 'sys', 'sysconfig', 'tempfile', 'textwrap', 'threading', 'time', 'tkinter', 'tkinter.constants', 'token', 'tokenize', 'traceback', 'types', 'typing', 'urllib', 'urllib.parse', 'warnings', 'weakref', 'winreg', 'xml', 'xml.parsers', 'xml.parsers.expat', 'xml.parsers.expat.errors', 'xml.parsers.expat.model', 'zipimport', 'zlib']
>>> perm1
'5'
>>> from Mod1 import perm1
>>> from Mod1 import perm1
```
Объект Mod1 появился в памяти, программа на выполнение вызвалась, аналогично использованию import. При последующем повторении команды ничего не происходит. Python хранит загруженные модули в sys.modules, при первом импорте выполняется весь код модуля, при повторном импорте Python просто берёт модуль из кэша.
Пример2: С помощью текстового редактора создадим ещё один модуль Mod2, содержащий две функции:
```py
def alpha():
print('****ALPHA****')
t=input('Значение t=')
return t
def beta(q):
import math
expi=q*math.pi
return math.exp(expi)
```
Импортируем из этого модуля только функцию beta:
```py
>>> from Mod2 import beta
>>> g=beta(2)
****BETA****
>>> g
535.4916555247646
>>> print(sorted(sys.modules.keys()))
['Mod2', '__future__', '__main__', '_abc', '_ast', '_bisect', '_bz2', '_codecs', '_collections', '_collections_abc', '_colorize', '_compat_pickle', '_compression', '_datetime', '_frozen_importlib', '_frozen_importlib_external', '_functools', '_heapq', '_imp', '_io', '_lzma', '_opcode', '_opcode_metadata', '_operator', '_pickle', '_pyrepl', '_pyrepl.pager', '_queue', '_random', '_signal', '_sitebuiltins', '_socket', '_sre', '_stat', '_string', '_struct', '_sysconfig', '_thread', '_tkinter', '_tokenize', '_typing', '_warnings', '_weakref', '_weakrefset', '_winapi', '_wmi', 'abc', 'ast', 'bdb', 'binascii', 'bisect', 'builtins', 'bz2', 'codecs', 'collections', 'collections.abc', 'configparser', 'contextlib', 'copyreg', 'datetime', 'dis', 'encodings', 'encodings.aliases', 'encodings.cp1251', 'encodings.utf_8', 'enum', 'errno', 'fnmatch', 'functools', 'genericpath', 'heapq', 'idlelib', 'idlelib.autocomplete', 'idlelib.autocomplete_w', 'idlelib.calltip', 'idlelib.calltip_w', 'idlelib.config', 'idlelib.debugger', 'idlelib.debugger_r', 'idlelib.debugobj', 'idlelib.debugobj_r', 'idlelib.hyperparser', 'idlelib.iomenu', 'idlelib.macosx', 'idlelib.multicall', 'idlelib.pyparse', 'idlelib.rpc', 'idlelib.run', 'idlelib.scrolledlist', 'idlelib.stackviewer', 'idlelib.tooltip', 'idlelib.tree', 'idlelib.util', 'idlelib.window', 'idlelib.zoomheight', 'importlib', 'importlib._abc', 'importlib._bootstrap', 'importlib._bootstrap_external', 'importlib.machinery', 'importlib.util', 'inspect', 'io', 'ipaddress', 'itertools', 'keyword', 'linecache', 'lzma', 'marshal', 'math', 'nt', 'ntpath', 'opcode', 'operator', 'os', 'os.path', 'pickle', 'pkgutil', 'platform', 'plistlib', 'posixpath', 'pydoc', 'pyexpat', 'pyexpat.errors', 'pyexpat.model', 'queue', 'random', 're', 're._casefix', 're._compiler', 're._constants', 're._parser', 'reprlib', 'select', 'selectors', 'shlex', 'shutil', 'site', 'socket', 'socketserver', 'stat', 'string', 'struct', 'sys', 'sysconfig', 'tempfile', 'textwrap', 'threading', 'time', 'tkinter', 'tkinter.constants', 'token', 'tokenize', 'traceback', 'types', 'typing', 'urllib', 'urllib.parse', 'warnings', 'weakref', 'winreg', 'xml', 'xml.parsers', 'xml.parsers.expat', 'xml.parsers.expat.errors', 'xml.parsers.expat.model', 'zipimport', 'zlib']
>>> alpha()
Traceback (most recent call last):
File "<pyshell#6>", line 1, in <module>
alpha()
NameError: name 'alpha' is not defined
```
Модуль Mod2 появился в списке. Функция alpha не была импортирована, поэтому и вышла ошибка. Теперь импортируем только функцию alpha, используя для неё псевдоним al:
```py
>>> from Mod2 import alpha as al
>>> al()
****ALPHA****
Значение t=5
'5'
>>> del al,beta # Удаление импортированных объектов
>>> from Mod2 import alpha as al, beta as bt # Импорт двух функций одной инструкцией
>>> sys.modules.pop('Mod1') # Удаление импортированных объектов
<module 'Mod1' from 'C:\\Users\\Admin\\Documents\\Tsvetkova\\python-labs\\TEMA8'>
>>> sys.modules.pop('Mod2')
<module 'Mod2' from 'C:\\Users\\Admin\\Documents\\Tsvetkova\\python-labs\\TEMA8'>
>>> from Mod2 import * # Импорт всего содержимого модуля
>>> tt=alpha()
****ALPHA****
Значение t=0.12
>>> uu=beta(float(tt))
****BETA****
>>> uu
1.4578913609506803
```
# 3. Создание многомодульных программ
## 3.1 Пример простой многомодульной программы
Создадим модуль Mod0 со следующим содержанием:
```py
#Модуль Mod0
import Mod1
print('perm1=',Mod1.perm1)
from Mod2 import alpha as al
tt=al()
print('tt=',tt)
from Mod2 import beta
qq=beta(float(tt))
print('qq=',qq)
```
Данный модуль содержит программу, вызывающую на выполнение ранее созданные модули Mod1, Mod2. Теперь программа будет состоять из 5 частей: главная программа, которой является командная строка IDLE и из которой будет вызываться модуль Mod0, и 3 модуля, вызываемых из модуля Mod0.
```py
>>> import Mod0
Mod1:Введите значение = 3
Mod1:Значение perm1= 3
perm1= 3
****ALPHA****
Значение t=10
tt= 10
****BETA****
qq= 44031505860631.98
>>> Mod0.tt;Mod0.qq;Mod0.Mod1.perm1
'10'
44031505860631.98
'3'
```
Переменная perm1 находится в пространстве имен модуля Mod1, а не модуля Mod0. Поэтому пришлось указывать не только имя модуля Mod0, но и имя модуля Mod1, в котором локализован объект.
## 3.2 Пример
Создадим модуль MM1, включив в него разработанные при выполнении предыдущей темы функции, реализующие усилитель, реальный двигатель, тахогенератор и нелинейное звено типа «зона нечувствительности». Затем создадим модуль ММ2, включив в него инструкции, обеспечивающие ввод параметров задачи, формирование входного сигнала, импорт модуля ММ1 и реализацию модели при расчете выходного сигнала. Модуль MM1:
```py
def realdvig(xtt,kk1,TT,yti1,ytin1):
#Модель реального двигателя
yp = kk1 * xtt #усилитель
yti1 = yp + yti1 #Интегратор
ytin1 = (yti1+TT*ytin1)/(TT+1)
return [yti1, ytin1]
def tahogen(xtt,kk2,yti2):
#Модель тахогенератора
yp = kk2 * xtt #усилитель
yti2 = yp + yti2 #интегратор
return yti2
def nechus(xtt,gran):
if (xtt < gran) and (xtt > (-gran)):
ytt = 0
elif xtt >= gran:
ytt = xtt - gran
elif xtt <= (-gran):
ytt = xtt + gran
return ytt
```
Модуль MM2:
```py
znach=input('k1,T,k2,Xm,A,F,N=').split(',')
k1=float(znach[0])
T=float(znach[1])
k2=float(znach[2])
Xm=float(znach[3])
A=float(znach[4])
F=float(znach[5])
N=int(znach[6])
import math
vhod=[]
for i in range(N):
vhod.append(A*math.sin((2*i*math.pi)/F))
import MM1 as mod
yi1=0;yin1=0;yi2=0
vyhod=[]
for xt in vhod:
xt1=xt-yi2 #отрицательная обратная связь
[yi1,yin1]=mod.realdvig(xt1,k1,T,yi1,yin1)
yi2=mod.tahogen(yin1,k2,yi2)
yt=mod.nechus(yin1,Xm)
vyhod.append(yt)
```
Теперь создадим главную программу - модуль MM0, которая запускает на выполнение модуль MM2 и выводит полученный выходной сигнал:
```py
import MM2
print('y=',MM2.vyhod)
```
Запустим модуль MM0:
```py
>>> import MM0
k1,T,k2,Xm,A,F,N=8,5,3,10,2,0.5,1000
y=[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1.0183086292055208, 0, 26.39885775889784, -36.65029553691161, -34.19982663883278, 196.29963397615063, -151.6919482160481, -388.32493988337274, 1057.8073200868555, -308.3186572590445, -2798.051869998873, 5004.749701095182, 1362.331454336744, ...]
```
## 3.3 Области действия объектов в модулях
В ранее созданных модулях вводятся и используются следующие объекты: Mod1: perm1 Mod2: функции alpha, beta; переменные t, expi Mod0: переменные tt,qq
Исходя из примеров, приведенных ниже, можно сказать, что объекты входящие в один модуль будут локализованы в этом модуле и доступны в нем. К переменным из другого модуля, даже импортированного в главный (выполняемый) модуль, прямого доступа не будет.
## 3.3.1 Добавление в функцию alpha обращение к функции beta и, наоборот, из beta – к alpha. Изменим содержание файла Mod2.py:
```py
def alpha():
print('****ALPHA****')
t=input('Значение t=')
beta(int(t))
return t
def beta(q):
import math
expi=q*math.pi
return math.exp(expi)
```
Запустим программу:
```py
>>> from Mod2 import *
>>> alpha()
****ALPHA****
Значение t=5
153552935.39544657
'5'
```
Теперь добавим в функцию beta вызов функции alpha():
```py
def alpha():
print('****ALPHA****')
t=input('Значение t=')
return t
def beta(q):
import math
expi=q*math.pi
alpha()
return math.exp(expi)
```
Протестируем выполнение:
```py
>>> beta(6)
****ALPHA****
Значение t=5
153552935.39544657
```
## 3.3.2 Отобразим на экране в модуле Mod0 значения объектов t и expi
Изменим содержание Mod0:
```py
#Модуль Mod0
import Mod1
print('perm1=',Mod1.perm1)
from Mod2 import alpha as al
tt=al()
print('tt=',tt)
from Mod2 import beta
qq=beta(float(tt))
print('qq=',qq)
print(t, expi)
```
Запустим на выполнение:
```py
>>> import Mod0
perm1= 5
****ALPHA****
Значение t=10
tt= 10
qq= 44031505860631.98
Traceback (most recent call last):
File "<pyshell#16>", line 1, in <module>
import Mod0
File 'C:\Users\Admin\Documents\Tsvetkova\python-labs\TEMA8'\Mod0.py", line 10, in <module>
print(t, expi)
NameError: name 't' is not defined. Did you mean: 'tt'?
```
Выходит ошибка, потому что переменные t и expi определены в разных областях видимости и не доступны в модуле Mod0. В модуле Mod2: t - это локальная переменная функции alpha(), expi - это локальная переменная функции beta(). В модуле Mod0: мы пытаемся обратиться к переменным t и expi, которые никогда не были объявлены в этом модуле.
## 3.3.3 Увеличение в модуле Mod0 в 3 раза значение объекта perm1 и отобразить его после этого на экране.
Изменим содержание Mod0:
```py
#Модуль Mod0
import Mod1
print('perm1=',Mod1.perm1)
Mod1.perm1 = str(int(Mod1.perm1)*3)
print('Увеличение perm1 в 3 раза:', Mod1.perm1)
from Mod2 import alpha as al
tt=al()
print('tt=',tt)
from Mod2 import beta
qq=beta(float(tt))
print('qq=',qq)
```
Тестирование программы:
```py
>>> import Mod0
perm1= 30
Увеличение perm1 в 3 раза: 90
****ALPHA****
Значение t=10
tt= 10
qq= 44031505860631.98
```
## 3.3.4 В командной строке необходимо увеличить в 2 раза значения объектов perm1, tt, qq
```py
>>> import Mod0
perm1= 5
****ALPHA****
Значение t=10
tt= 10
qq= 44031505860631.98
>>> Mod0.Mod1.perm1=str(int(Mod0.Mod1.perm1)*2)
>>> Mod0.Mod1.perm1
'10'
>>> Mod0.tt=str(int(Mod0.tt)*2)
>>> Mod0.tt
'20'
>>> Mod0.qq=Mod0.qq*2
>>> Mod0.qq
88063011721263.95
```
# 4. Завершение сеанса работы с IDLE

2
TEMA8/MM0.py Обычный файл
Просмотреть файл

@@ -0,0 +1,2 @@
import MM2
print('y=',MM2.vyhod)

22
TEMA8/MM1.py Обычный файл
Просмотреть файл

@@ -0,0 +1,22 @@
def realdvig(xtt,kk1,TT,yti1,ytin1):
#Модель реального двигателя
yp = kk1 * xtt #усилитель
yti1 = yp + yti1 #Интегратор
ytin1 = (yti1+TT*ytin1)/(TT+1)
return [yti1, ytin1]
def tahogen(xtt,kk2,yti2):
#Модель тахогенератора
yp = kk2 * xtt #усилитель
yti2 = yp + yti2 #интегратор
return yti2
def nechus(xtt,gran):
#зона нечувствительности
if (xtt < gran) and (xtt > (-gran)):
ytt = 0
elif xtt >= gran:
ytt = xtt - gran
elif xtt <= (-gran):
ytt = xtt + gran
return ytt

23
TEMA8/MM2.py Обычный файл
Просмотреть файл

@@ -0,0 +1,23 @@
znach=input('k1,T,k2,Xm,A,F,N=').split(',')
k1=float(znach[0])
T=float(znach[1])
k2=float(znach[2])
Xm=float(znach[3])
A=float(znach[4])
F=float(znach[5])
N=int(znach[6])
import math
vhod=[]
for i in range(N):
vhod.append(A*math.sin((2*i*math.pi)/F))
import MM1 as mod
yi1=0;yin1=0;yi2=0
vyhod=[]
for xt in vhod:
xt1=xt-yi2 #отрицательная обратная связь
[yi1,yin1]=mod.realdvig(xt1,k1,T,yi1,yin1)
yi2=mod.tahogen(yin1,k2,yi2)
yt=mod.nechus(yin1,Xm)
vyhod.append(yt)

Просмотреть файл

@@ -4,8 +4,7 @@ def alpha():
return t
def beta(q):
print('****BETA****')
import math
expi=q*math.pi
alpha()
return math.exp(expi)

7
TEMA8/Modul1.py Обычный файл
Просмотреть файл

@@ -0,0 +1,7 @@
def read (file):
""""Чтение данных из файла"""
nums = []
with open(file, 'r') as file: # Открытие файла для чтения
for line in file:
nums.extend(map(float, line.split())) # Добавление всех элементов в список
return nums

16
TEMA8/Modul2.py Обычный файл
Просмотреть файл

@@ -0,0 +1,16 @@
def correlation(list1, list2):
"""Расчёт коэффициента корреляции"""
n = min(len(list1), len(list2)) # Общая длина
list1 = list1[:n]
list2 = list2[:n]
mean1 = sum(list1) / n
mean2 = sum(list2) / n
chislitel = sum((list1[i] - mean1) * (list2[i] - mean2) for i in range(n))
#Числитель формулы корреляции
znamenatel1 = sum((x - mean1) ** 2 for x in list1)
znamenatel2 = sum((y - mean2) ** 2 for y in list2)
if znamenatel1 == 0 or znamenatel2 == 0:
return 0
return chislitel/(znamenatel1 * znamenatel2) ** 0.5

8
TEMA8/Modul3.py Обычный файл
Просмотреть файл

@@ -0,0 +1,8 @@
import Modul1
import Modul2
file1 = input("Введите имя первого файла: ")
file2 = input("Введите имя второго файла: ")
list1 = Modul1.read(file1)
list2 = Modul1.read(file2)
corr = Modul2.correlation(list1, list2)
print("Коэффициент корреляции:", corr)

4
TEMA8/data1.txt Обычный файл
Просмотреть файл

@@ -0,0 +1,4 @@
1 2 3
4 5
6 7 8
9

3
TEMA8/data2.txt Обычный файл
Просмотреть файл

@@ -0,0 +1,3 @@
2 4 6
8
10 11

71
TEMA8/task.md Обычный файл
Просмотреть файл

@@ -0,0 +1,71 @@
# Общее контрольное задание по теме 8
# Задание:
1. Разработать программу, состоящую из трех модулей:
Модуль 1 содержит функцию считывания числового списка из текстового файла с заданным именем (аргумент функции – имя файла). Элементы в файле могут располагаться по несколько на строке с разделением пробелом. Числа элементов в строках могут быть разными. Полученный список должен возвращаться в вызывающую программу.
Модуль 2 содержит функцию расчета коэффициента корреляции по двум числовым спискам (аргументы функции – имена двух списков). Числа элементов в списках могут различаться. Значение коэффициента должно возвращаться в вызывающую программу.
Модуль 3 запрашивает у пользователя и вводит имена двух файлов с исходными данными, дважды вызывает функцию из модуля 1 и считывает два списка из двух текстовых файлов. Затем вызывает функцию расчета коэффициента корреляции с помощью функции из модуля 2 и отображает рассчитанное значение на экране с округлением до трех цифр после точки.
Подготовить два текстовых файла с числовыми данными и проверить по ним работу программы.
# Решение
## 1. Модуль 1 - Чтение данных из файла
```py
def read (file):
""""Чтение данных из файла"""
nums = []
with open(file, 'r') as file: # Открытие файла для чтения
for line in file:
nums.extend(map(float, line.split())) # Добавление всех элементов в список
return nums
```
## 2. Модуль 2 - Расчёт коэффициента корреляции
```py
def correlation(list1, list2):
"""Расчёт коэффициента корреляции"""
n = min(len(list1), len(list2)) # Общая длина
list1 = list1[:n]
list2 = list2[:n]
mean1 = sum(list1) / n
mean2 = sum(list2) / n
chislitel = sum((list1[i] - mean1) * (list2[i] - mean2) for i in range(n))
#Числитель формулы корреляции
znamenatel1 = sum((x - mean1) ** 2 for x in list1) # Знаменатель формулы корреляции
znamenatel2 = sum((y - mean2) ** 2 for y in list2)
if znamenatel1 == 0 or znamenatel2 == 0: # Проверка деления на 0
return 0
return chislitel/(znamenatel1 * znamenatel2) ** 0.5
```
## 3. Модуль 3 - Запрос у пользователя и ввод имён файлов с исходными данными
```py
import Modul1
import Modul2
file1 = input("Введите имя первого файла: ")
file2 = input("Введите имя второго файла: ")
list1 = Modul1.read(file1)
list2 = Modul1.read(file2)
corr = Modul2.correlation(list1, list2)
print("Коэффициент корреляции:", corr)
```
Были подготовлены два файла с данными data1.txt и data2.txt
## 4. Тестирование
```py
>>> import Modul3
Введите имя первого файла: data1.txt
Введите имя второго файла: data2.txt
Коэффициент корреляции: 0.9960784162656539
```

323
TEMA9/9.md Обычный файл
Просмотреть файл

@@ -0,0 +1,323 @@
# 2 Создание классов и их наследников
## 2.1 Создание автономного класса
```py
>>> class Class1: #Объявление класса
... def zad_zn(self,znach): #Метод 1 класса1 – задание значения data
... self.data=znach # self - ссылка на экземпляр класса
... def otobrazh(self): # Метод 2 класса1
... print(self.data)#Отображение данных экземпляра класса
...
```py
Создали 2 экземпляра этого класса
```py
>>> z1=Class1()
>>> z2=Class1()
```
С помощью первого метода задали разные значения атрибута у двух экземпляров
```py
>>> z1.zad_zn('экз.класса 1')
>>> z2.zad_zn(-632.453)
```
Для контроля отобразили его значения с помощью второго метода
```py
>>> z1.otobrazh()
экз.класса 1
>>> z2.otobrazh()
-632.453
```
Изменили значение атрибута у первого экземпляра и отобразили его
```py
>>> z1.data='Новое значение атрибута у экз.1'
>>> z1.otobrazh()
Новое значение атрибута у экз.1
```
## 2.2 Создание класса-наследника
В объявлении класса после его имени в скобках перечисляются его «родительские классы»
```py
>>> class Class2(Class1): #Class2 - наследник класса Class1
... def otobrazh(self): # Метод класса Class2 – переопределяет метод родителя
... print('значение=',self.data)#Отображение данных экземпляра
...
```
Создали экземпляр второго класса
```py
>>> z3=Class2()
>>> dir(z3)
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__firstlineno__', '__format__', '__ge__', '__getattribute__', '__getstate__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__static_attributes__', '__str__', '__subclasshook__', '__weakref__', 'otobrazh', 'zad_zn']
```
Задали у него значение данного data (унаследовано от Class1)
```py
>>> z3.zad_zn('Совсем новое')
>>> z3.otobrazh()
значение= Совсем новое
>>> z1.otobrazh()
Новое значение атрибута у экз.1
>>> del z1,z2,z3
```
3 Использование классов, содержащихся в модулях
Содержимое Mod3
```py
class Class1: #Объявление класса Class1 в модуле
def zad_zn(self,znach): # 1 Метод класса
self.data=znach # self - ссылка на экземпляр класса Class1
def otobrazh(self): # 2 Метод класса
print(self.data)#Отображение данных экземпляра
class Class2(Class1): #Class2 - наследник класса Class1
def otobrazh(self): # Метод класса Class2
print('значение=',self.data)#Отображение данных экземпляра
def otobrazh(objekt): #Объявление самостоятельной функции
print('значение объекта=',objekt)
```
Импортировали первый класс из модуля
```py
>>> from Mod3 import Class1 #Частичный импорт содержимого модуля
>>> z4=Class1()
>>> z4.otobrazh()
Traceback (most recent call last):
File "<pyshell#20>", line 1, in <module>
z4.otobrazh()
File "C:\Users\uprkt\Desktop\ПО\python-labs\TEMA9\Mod3.py", line 5, in otobrazh
print(self.data)#Отображение данных экземпляра
AttributeError: 'Class1' object has no attribute 'data'
```
Ошибка возникает потому, что атрибут data еще не был создан для объекта z4.
```py
>>> from Mod3 import Class1
>>> z4=Class1()
>>> z4.data='значение данного data у экз.4'
>>> z4.otobrazh()
значение данного data у экз.4
```
Удалим экземпляр z4 и импортируем модуль
```py
>>> del z4
>>> import Mod3
```
Создали экземпляр класса теперь инструкцией
```py
>>> z4=Mod3.Class2()
>>> z4.zad_zn('Класс из модуля')
>>> z4.otobrazh()
значение= Класс из модуля
>>> Mod3.otobrazh('Объект')
значение объекта= Объект
```
Вызывается самостоятельная функция из модуля, а не метод класса
## 4 Использование специальных методов
Имена специальных методов предваряются одним или двумя подчерками и имеют вид: __<имя специального метода>__
Для примера создали класс, содержащий два специальных метода
```py
>>> class Class3(Class2): #Наследник класса Class2, а через него – и класса Class1
... def __init__(self,znach): #Конструктор-вызывается при создании нового экземпляра класса
... self.data=znach
... def __add__(self,drug_zn): #Вызывается, когда экземпляр участвует в операции «+»
... return Class3(self.data+drug_zn)
... def zad_dr_zn(self,povtor): #А это - обычный метод
... self.data*=povtor
...
```
Метод __add__ - это один из методов, осуществляющих так называемую «перегрузку» операторов.
Для иллюстрации работы этих методов создали экземпляр класса Class3 и отобразили его
```py
>>> z5=Class3('abc')
>>> z5.otobrazh()
значение= abc
```
А теперь выполнили операцию «+» (должен сработать специальный метод __add__)
```py
>>> z6=z5+'def'
>>> z6.otobrazh()
значение= abcdef
```
Обратились к обычному методу класса:
```py
>>> z6.zad_dr_zn(3)
>>> z6.otobrazh()
значение= abcdefabcdefabcdef
```
5 Присоединение атрибутов к классу
```py
>>> dir(Class3)
['__add__', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__firstlineno__', '__format__', '__ge__', '__getattribute__', '__getstate__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__static_attributes__', '__str__', '__subclasshook__', '__weakref__', 'otobrazh', 'zad_dr_zn', 'zad_zn']
```
Создали новый атрибут
```py
>>> Class3.fio='Иванов И.И.'
>>> dir(Class3)
['__add__', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__firstlineno__', '__format__', '__ge__', '__getattribute__', '__getstate__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__static_attributes__', '__str__', '__subclasshook__', '__weakref__', 'fio', 'otobrazh', 'zad_dr_zn', 'zad_zn']
```
Создали экземпляр
```py
>>> z7=Class3(123)
>>> dir(z7)==dir(Class3)
False
>>> z7.fio
'Иванов И.И.'
```
Обновили новый атрибут у созданного экземпляра
```py
>>> z7.rozden='1987'
>>> dir(z7)
['__add__', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__firstlineno__', '__format__', '__ge__', '__getattribute__', '__getstate__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__static_attributes__', '__str__', '__subclasshook__', '__weakref__', 'data', 'fio', 'otobrazh', 'rozden', 'zad_dr_zn', 'zad_zn']
>>> dir(Class3)
['__add__', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__firstlineno__', '__format__', '__ge__', '__getattribute__', '__getstate__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__static_attributes__', '__str__', '__subclasshook__', '__weakref__', 'fio', 'otobrazh', 'zad_dr_zn', 'zad_zn']
```
## 6 Выявление родительских классов
Такое выявление делается с помощью специального атрибута __bases__, например, вывели родительский класс для созданного класса Class3
```py
>>> Class3.__bases__
(<class '__main__.Class2'>,)
>>> Class2.__bases__
(<class '__main__.Class1'>,)
>>> Class1.__bases__
(<class 'object'>,)
```
Для получения всей цепочки наследования использовали атрибут __mro__:
```py
>>> Class3.__mro__
(<class '__main__.Class3'>, <class '__main__.Class2'>, <class '__main__.Class1'>, <class 'object'>)
```
Получили всю цепочку наследования для встроенного класса ошибок «деление на ноль»:
```py
>>> ZeroDivisionError.__mro__
(<class 'ZeroDivisionError'>, <class 'ArithmeticError'>, <class 'Exception'>, <class 'BaseException'>, <class 'object'>)
```
## 7 Создание свойства класса
Свойство (property) класса – это особый атрибут класса, с которым можно производить операции чтения или задания его значения, а также удаление значения этого атрибута.
Создали новый класс с определенным в нем свойством
```py
>>> class Class4:
... def __init__(sam,znach):
... sam.__prm=znach
... def chten(sam):
... return sam.__prm
... def zapis(sam,znch):
... sam.__prm=znch
... def stiran(sam):
... del sam.__prm
... svojstvo=property(chten,zapis,stiran)
...
```
Обратили внимание на то, что здесь имеется 3 метода: chten, zapis, stiran, которые обслуживают созданное свойство, реализуя операции, соответственно, чтения, записи или удаления значений свойства. Теперь попробобавали некоторые операции с этим свойством
```py
>>> exempl=Class4(12)
>>> exempl.svojstvo
12
>>> exempl.svojstvo=45
>>> print(exempl.svojstvo)
45
>>> del exempl.svojstvo
```
После этого попробовали еще раз отобразить значение свойства
```py
>>> exempl.svojstvo
Traceback (most recent call last):
File "<pyshell#61>", line 1, in <module>
exempl.svojstvo
File "<pyshell#55>", line 5, in chten
return sam.__prm
AttributeError: 'Class4' object has no attribute '_Class4__prm'
```
Свойство было удалено. exempl.svojstvo → вызывает chten(). chten() пытается вернуть sam.__prm. Python ищет _Class4__prm (после преобразования). Атрибут удален → AttributeError
## 8 Пример представления в виде класса модели системы автоматического регулирования (САР)
```py
class SAU:
def __init__(self,zn_param):
self.param=zn_param
self.ypr=[0,0]
def zdn_zn(self,upr):
self.x=upr
def model(self):
def inerz(x,T,yy):
return (x+T*yy)/(T+1)
y0=self.x-self.ypr[1]*self.param[3] #Обр.связь с усилителем 2
y1=self.param[0]*y0 #Усилитель1
y2=inerz(y1,self.param[1],self.ypr[0]) #Инерционное звено1
y3=inerz(y2,self.param[2],self.ypr[1]) #Инерционное звено2
self.ypr[0]=y2
self.ypr[1]=y3
def otobraz(self):
print('y=',self.ypr[1])
```
Проверка работы:
```py
prm=[2.5,4,1.3,0.8] #Параметры модели: коэф.усиления, 2 пост.времени, обратная связь
from SAU import *
xx=[0]+[1]*20 #Входной сигнал – «ступенька»
SAUe=SAU(prm) # Создаём экземпляр класса
yt=[]
for xt in xx: # Прохождение входного сигнала
SAUe.zdn_zn(xt)
... SAUe.model()
... SAUe.otobraz()
... yt.append(SAUe.ypr[1])
...
y= 0.0
y= 0.2173913043478261
y= 0.4763705103969754
y= 0.686594887811293
y= 0.8199324616478645
y= 0.8837201137353929
y= 0.8994188484874774
y= 0.8892777072047301
y= 0.870097963179993
y= 0.8518346102696789
y= 0.8387499784485772
y= 0.8314204114211459
y= 0.8286051955249649
y= 0.8285656555914835
y= 0.8297915186846528
y= 0.8312697736438287
y= 0.8324765218921963
y= 0.8332456979978418
y= 0.8336163607592184
y= 0.8337101315489143
y= 0.833654237067147
>>> import pylab
>>> pylab.plot(yt)
[<matplotlib.lines.Line2D object at 0x0000028C363DA710>]
>>> pylab.show()
>>> prm=[5.5,2,6.3,0.9]
>>> SAUe=SAU(prm)
>>> yt=[]
>>> for xt in xx: # Прохождение входного сигнала
... SAUe.zdn_zn(xt)
... SAUe.model()
... SAUe.otobraz()
... yt.append(SAUe.ypr[1])
...
y= 0.0
y= 0.2511415525114155
y= 0.5785429828402243
y= 0.8608684291527201
y= 1.0405548889736682
y= 1.1123698572088563
y= 1.1026104028422206
y= 1.0485692602883017
y= 0.9837333929415083
y= 0.9303020862487426
y= 0.8979490324812144
y= 0.8865131776531742
y= 0.8902188772938274
y= 0.9016293565437798
y= 0.9143726153161045
y= 0.9244204691700071
y= 0.9301876457452414
y= 0.931925085592902
y= 0.9308720026158589
y= 0.9284995249411967
y= 0.9260125207356777
>>> pylab.plot(yt)
[<matplotlib.lines.Line2D object at 0x0000028C385FB110>]
>>> pylab.show()
lin1
```
![](Ris1.png)

Двоичные данные
TEMA9/Figure_1.png Обычный файл

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 15 KiB

10
TEMA9/Mod3.py Обычный файл
Просмотреть файл

@@ -0,0 +1,10 @@
class Class1: #Объявление класса Class1 в модуле
def zad_zn(self,znach): # 1 Метод класса
self.data=znach # self - ссылка на экземпляр класса Class1
def otobrazh(self): # 2 Метод класса
print(self.data)#Отображение данных экземпляра
class Class2(Class1): #Class2 - наследник класса Class1
def otobrazh(self): # Метод класса Class2
print('значение=',self.data)#Отображение данных экземпляра
def otobrazh(objekt): #Объявление самостоятельной функции
print('значение объекта=',objekt)

Двоичные данные
TEMA9/Ris1.png Обычный файл

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 14 KiB

21
TEMA9/SAU.py Обычный файл
Просмотреть файл

@@ -0,0 +1,21 @@
class SAU:
def __init__(self,zn_param):
self.param=zn_param
self.ypr=[0,0]
def zdn_zn(self,upr):
self.x=upr
def model(self):
def inerz(x,T,yy):
return (x+T*yy)/(T+1)
y0=self.x-self.ypr[1]*self.param[3] #Обр.связь с усилителем 2
y1=self.param[0]*y0 #Усилитель1
y2=inerz(y1,self.param[1],self.ypr[0]) #Инерционное звено1
y3=inerz(y2,self.param[2],self.ypr[1]) #Инерционное звено2
self.ypr[0]=y2
self.ypr[1]=y3
def otobraz(self):
print('y=',self.ypr[1])

65
TEMA9/task.md Обычный файл
Просмотреть файл

@@ -0,0 +1,65 @@
Создать и записать в модуль класс, содержащий следующие компоненты:
конструктор, задающий четырем атрибутам (fio, otdel, dolzhnost, oklad), представляющим фамилии сотрудников, название отделов, названия должностей сотрудников и размеры их окладов, некоторые начальные значения;
метод для обеспечения операции повышения оклада сотрудника на заданное значение;
метод для обеспечения перевода сотрудника из одного отдела в другой;
метод для изменения должности сотрудника;
свойство, содержащее перечень (список) поощрений сотрудника.
Создать 2 экземпляра класса, задать им некоторые значения атрибутов и свойства. Отобразить эти значения. Попробовать с этими экземплярами операции перевода из отдела в отдел, изменения должности и оклада, объявления благодарности.
Решение
```py
>>> class Employee:
... def __init__(self, fio="", otdel="", dolzhnost="", oklad=0):
... self.fio = fio
... self.otdel = otdel
... self.dolzhnost = dolzhnost
... self.oklad = oklad
... self._pooshchreniya = [] # исправлено на единое имя
...
... def povyshenie_oklad(self, summa):
... if summa > 0:
... self.oklad += summa
... return self.oklad
... else:
... print("Сумма для повышения оклада должна быть больше нуля.")
...
... def perevod(self, new_otdel):
... self.otdel = new_otdel
... return self.otdel
...
... def cmena_dolzhnosty(self, new_dolzhnost):
... self.dolzhnost = new_dolzhnost
... return self.dolzhnost
...
... @property
... def pooshchrenia(self):
... return self._pooshchreniya # исправлено на единое имя
...
... def add_pooshchrenie(self, pooshchrenie):
... self._pooshchreniya.append(pooshchrenie) # исправлено на единое имя
... print(f"Сотрудник {self.fio} теперь имеет поощрение: {pooshchrenie}")
...
...
>>> emp_1=Employee ("Толчеев В.О.", "Кафедра Управления и информационных технологий", "Профессор", 150000)
>>> emp_2=Employee ("Бобряков А.В.", "Кафедра Управления и информационных технологий", "Заведующий кафедрой", 1000000)
>>> print(f"{emp_1.fio}, {emp_1.otdel}, {emp_1.dolzhnost}, оклад: {emp_1.oklad}")
Толчеев В.О., Кафедра Управления и информационных технологий, Профессор, оклад: 150000
>>> print(f"{emp_2.fio}, {emp_2.otdel}, {emp_2.dolzhnost}, оклад: {emp_2.oklad}")
Бобряков А.В., Кафедра Управления и информационных технологий, Заведующий кафедрой, оклад: 1000000
>>> emp_2.perevod("МТУСИ")
'МТУСИ'
>>> emp_2.povyshenie_oklad(10000)
1010000
>>> emp_1.cmena_dolzhnosty("Заведующий кафедрой")
'Заведующий кафедрой'
>>> emp_2.add_pooshchrenie("Выслуга лет")
Сотрудник Бобряков А.В. теперь имеет поощрение: Выслуга лет
>>> emp_1.add_pooshchrenie("Лучший проект")
Сотрудник Толчеев В.О. теперь имеет поощрение: Лучший проект
>>> print(f"Поощрения {emp_1.fio}: {emp_1.pooshchrenia}")
Поощрения Толчеев В.О.: ['Лучший проект']
>>> print(f"Поощрения {emp_2.fio}: {emp_2.pooshchrenia}")
Поощрения Бобряков А.В.: ['Выслуга лет']
```

151
TEMA9/zadanie1.md Обычный файл
Просмотреть файл

@@ -0,0 +1,151 @@
M3_1
1)Создайте модуль М1, содержащий две функции:
функция 1: аргумент - список или кортеж с выборкой; функция должна произвести расчет по выборке оценки её дисперсии DX, а также наименьшего и наибольшего значений и вернуть эти значения в вызывающую программу в виде списка;
функция 2: аргументы - два списка или кортежа с выборками X и Y; функция должна произвести с помощью функции 1 расчет статистик по выборкам и рассчитать статистику Фишера:
F=DX/DY
2)Создайте еще один модуль М2, в котором должны выполняться следующие операции:
запрашивается имя бинарного файла с выборками X и Y, проверяется его наличие и при отсутствии - повторяется запрос;
выборки считываются из файлов;
с помощью функции 1 по выборкам рассчитываются их статистики,
с помощью функции 2 рассчитывается значение статистики Фишера,
если числа элементов в выборках одинаково, графически отображается поле рассеивания для Х и Y;
результаты расчета с соответствующими заголовками выводятся в текстовый файл.
3)Создайте модуль М0 - главную программу, которая вызывает М2 и отображает результаты расчета на экране.
4)Создайте 2 бинарных файла: с выборками одинакового размера и с выборками разного размера. Проверьте программу с использованием этих файлов.
Модуль 1
```py
import math
def disp(s): # функция рассчета дисперсии
if len(s) == 0:
return [0, 0, 0]
sr = sum(s) / len(s)
v = sum((x - sr) ** 2 for x in s) / len(s) # среднее квадратов отклонений от среднего
m_n = min(s)
m_x = max(s)
return [v, m_n, m_x]
def fisher_stat(sample_x, sample_y): # статистика фишера
stats_x = disp(sample_x)
stats_y = disp(sample_y)
dx = stats_x[0] # дисп х
dy = stats_y[0] # дисп у
if dy == 0:
return 0, stats_x, stats_y
else:
f = dx / dy
return f, stats_x, stats_y
```
Модуль 2
```py
import pickle
import matplotlib.pyplot as plt
import M1
def load_samples(filename): #Загружаем выборки х и у
while True:
try:
with open(filename, 'rb') as f:
data = pickle.load(f)
x = data['X']
y = data['Y']
print(f"Файл {filename} успешно загружен!")
return x, y
except FileNotFoundError:
print(f"Файл {filename} не найден!")
filename = input("Введите имя файла снова: ")
except Exception as e:
print(f"Ошибка чтения файла: {e}")
filename = input("Введите имя файла снова: ")
def analysis():
x, y = load_samples(input("Введите имя бинарного файла: "))
f, stats_x, stats_y = M1.fisher_stat(x, y)
print("\nРЕЗУЛЬТАТЫ РАСЧЕТА:")
print(f"Размер выборки X: {len(x)}, Y: {len(y)}")
print(f"X: Дисперсия={stats_x[0]:.4f}, мин={stats_x[1]:.4f}, макс={stats_x[2]:.4f}")
print(f"Y: Дисперсия={stats_y[0]:.4f}, мин={stats_y[1]:.4f}, макс={stats_y[2]:.4f}")
print(f"Статистика Фишера F = {f:.4f}")
if len(x) == len(y): # График размеры одинаковые
plt.figure(figsize=(8, 6))
plt.scatter(x, y, alpha=0.7, color='blue')
plt.xlabel('X')
plt.ylabel('Y')
plt.title('Поле рассеивания X-Y')
plt.grid(True)
plt.show()
# Сохраняем в текстовый файл
with open('results.txt', 'w') as f: # Сохраняем в файл
f.write("РЕЗУЛЬТАТЫ СТАТИСТИЧЕСКОГО АНАЛИЗА\n")
f.write(f"Размер выборки X: {len(x)}\n")
f.write(f"Размер выборки Y: {len(y)}\n\n")
f.write(f"СТАТИСТИКИ ПО X:\n")
f.write(f" Дисперсия DX = {stats_x[0]:.6f}\n")
f.write(f" Минимум = {stats_x[1]:.6f}\n")
f.write(f" Максимум = {stats_x[2]:.6f}\n")
f.write(f"СТАТИСТИКИ ПО Y:\n")
f.write(f" Дисперсия DY = {stats_y[0]:.6f}\n")
f.write(f" Минимум = {stats_y[1]:.6f}\n")
f.write(f" Максимум = {stats_y[2]:.6f}\n")
f.write(f"СТАТИСТИКА ФИШЕРА:\n")
f.write(f" F = DX/DY = {f:.6f}\n")
print("Результаты сохранены в файл results.txt")
return f, stats_x, stats_y
if __name__ == "__main__":
analysis()
```
Модуль 0
```py
import M2
def main():
print("СТАТИСТИЧЕСКИЙ АНАЛИЗ")
results = M2.analysis() # Запускаем анализ
print("АНАЛИЗ ЗАВЕРШЕН!")
if __name__ == "__main__":
main()
```
```py
>>> import os
>>> os.chdir('C:\\Users\\Admin\\Documents\\Tsvetkova\\python-labs\\TEMA9')
>>> import M1
>>> import M2
>>> import M0
>>> M0.main()
СТАТИСТИЧЕСКИЙ АНАЛИЗ
Введите имя бинарного файла: same_size.bin
Файл same_size.bin успешно загружен!
РЕЗУЛЬТАТЫ РАСЧЕТА:
Размер выборки X: 20, Y: 20
X: Дисперсия=4.7969, мин=1.4282, макс=9.9043
Y: Дисперсия=3.2402, мин=2.1279, макс=7.5406
Статистика Фишера F = 1.4804
```
![](Figure_1.png)