ответвлено от main/python-labs
Сравнить коммиты
18 Коммитов
4363aa2fa2
...
main
| Автор | SHA1 | Дата | |
|---|---|---|---|
| e1d0599622 | |||
| e67b412977 | |||
| 69a9d61875 | |||
| 7c1552aa67 | |||
| b3bd732ba8 | |||
| 6053fbe787 | |||
| bdeb1c27f1 | |||
| f6ed84af3d | |||
| d8f5f5b631 | |||
| b643e0a0b2 | |||
| f1e43207fc | |||
| c5bca092a1 | |||
| 0bb5224e01 | |||
| 4bfdf950b8 | |||
| d5e5e9b5d3 | |||
| 3920c08f52 | |||
| 6de200f325 | |||
| ce72d1f7b1 |
23
TEMA7/1111.md
Обычный файл
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
Обычный файл
Двоичные данные
TEMA7/Figure_1.png
Обычный файл
Двоичный файл не отображается.
|
После Ширина: | Высота: | Размер: 15 KiB |
89
TEMA7/test.md
Обычный файл
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
Обычный файл
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
Обычный файл
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
Обычный файл
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
Обычный файл
2
TEMA8/MM0.py
Обычный файл
@@ -0,0 +1,2 @@
|
||||
import MM2
|
||||
print('y=',MM2.vyhod)
|
||||
22
TEMA8/MM1.py
Обычный файл
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
Обычный файл
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
Обычный файл
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
Обычный файл
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
Обычный файл
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
Обычный файл
4
TEMA8/data1.txt
Обычный файл
@@ -0,0 +1,4 @@
|
||||
1 2 3
|
||||
4 5
|
||||
6 7 8
|
||||
9
|
||||
3
TEMA8/data2.txt
Обычный файл
3
TEMA8/data2.txt
Обычный файл
@@ -0,0 +1,3 @@
|
||||
2 4 6
|
||||
8
|
||||
10 11
|
||||
71
TEMA8/task.md
Обычный файл
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
Обычный файл
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
|
||||
```
|
||||

|
||||
Двоичные данные
TEMA9/Figure_1.png
Обычный файл
Двоичные данные
TEMA9/Figure_1.png
Обычный файл
Двоичный файл не отображается.
|
После Ширина: | Высота: | Размер: 15 KiB |
10
TEMA9/Mod3.py
Обычный файл
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
Обычный файл
Двоичные данные
TEMA9/Ris1.png
Обычный файл
Двоичный файл не отображается.
|
После Ширина: | Высота: | Размер: 14 KiB |
21
TEMA9/SAU.py
Обычный файл
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
Обычный файл
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
Обычный файл
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
|
||||
```
|
||||

|
||||
Ссылка в новой задаче
Block a user