Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

363 строки
14 KiB
Markdown

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# Отчет по теме 8
Ефимова Людмила, А-03-23
# Модули и структурирование программы
## 1. Установка рабочего каталога
```py
import importlib
import os,sys
os.getcwd() #Контролируем корректность установки текущего каталога
'H:\\study\\ПОАС'
```
## 2. Создание и использование модулей в среде Python
Модулем в среде Python называется любая часть программного кода на этом языке, записанная в
отдельном файле
### 2.1. Запуск модуля на выполнение путем его импорта
Создала файл Mod1.py с содержимым:
```py
perm1=input('Mod1:Введите значение = ')
print('Mod1:Значение perm1=',perm1)
```
Запустила модуль Mod1.py
```py
import Mod1
Mod1:Введите значение = 3
Mod1:Значение perm1= 3
type(Mod1)
<class 'module'>
dir(Mod1)
['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'perm1']
Mod1.perm1 # Обращение к переменной perm из модуля Mod1
'3'
```
При повторном вызове через import ничего не происходит
```py
import Mod1
importlib.reload(Mod1) # для повторного вызова модуля используем reload
Mod1:Введите значение = 5
Mod1:Значение perm1= 5
<module 'Mod1' from 'H:\\study\\ПОАС\\Mod1.py'>
Mod1.perm1
'5'
```
### 2.2. Вывод импортированных модулей
Импортированные модули заносятся в словарь - значение атрибута sys.modules, поэтому их можно увидеть с помощью инструкции keys().
```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', '_suggestions', '_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
print(sorted(sys.modules.keys()))
['__future__', '__main__', '_abc', '_ast', '_bisect', '_bz2', '_codecs', '_collections', '_collections_abc', '_colorize', '_compat_pickle', '_compression', '_datetime', '_frozen_importlib',...]
import Mod1 # еще раз импортировали модуль
Mod1:Введите значение = 4
Mod1:Значение perm1= 4
sys.modules.pop('Mod1') # еще раз удалили модуль
<module 'Mod1' from 'H:\\study\\ПОАС\\Mod1.py'>
```
### 2.3. Запуск модуля на выполнение с помощью функции exec()
Для запуска через exec() не трубуется импортировать модуль, но модуль при этом не создается, все созданные при выполнении модуля объекты становятся объектами главной программы
```py
exec(open('Mod1.py').read())
Mod1:РведиСРµ Р·РЅР°Сение = 11111
Mod1:РРЅР°Сение perm1= 11111
exec(open("Mod1.py", encoding = "utf-8").read()) # изменили кодировку
Mod1:Введите значение = 11111111
Mod1:Значение perm1= 11111111
perm1
'11111111'
exec(open("Mod1.py", encoding = "utf-8").read())
Mod1:Введите значение = 777
Mod1:Значение perm1= 777
perm1
'777'
```
### 2.4. Использование инструкции from … import …
В одном модуле может содержаться несколько программных единиц (функций, объектов).
Можно осуществить частичный импорт объектов
```py
'777'
from Mod1 import perm1
Mod1:Введите значение = 1111
Mod1:Значение perm1= 1111
dir()
['__annotations__', '__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__', '__warningregistry__', 'importlib', 'os', 'perm1', 'sys']
"Mod1" in dir() # Модуль Mod1 не появился в памяти
False
perm1 # переменная модуля стала переменной программы
'1111'
```
Создала второй модуль 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)
g
535.4916555247646
"Mod2" in dir()
False
alpha() # Функция alpha не была импортировна, поэтому к ней нельзя обращаться
Traceback (most recent call last):
File "<pyshell#205>", line 1, in <module>
alpha() # Функция alpha не была импортировна, поэтому к ней нельзя обращаться
NameError: name 'alpha' is not defined
```
Импортируем alpha из Mod2
```py
from Mod2 import alpha as al # присвоили имя al
al()
****ALPHA****
Значение t=5
'5'
from Mod2 import alpha as al, beta as bt # можем импортировать обе функции
dir()
['__annotations__', '__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__', 'al', 'bt', 'g', 'importlib', 'os', 'perm1', 'sys']
del al,beta # удалили импортированные объекты
from Mod2 import * # импорт всего содержимого
tt=alpha() #На запрос введите значение 0.12
****ALPHA****
Значение t=0.12
uu=beta(float(tt))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)
```
Программа состоит из нескольких модудей
```py
sys.modules.pop("Mod1") # удалили лишние модули
<module 'Mod1' from 'H:\\study\\ПОАС\\Mod1.py'>
sys.modules.pop("Mod2")
<module 'Mod2' from 'H:\\study\\ПОАС\\Mod2.py'>
import Mod0
Mod1:Введите значение = 111
Mod1:Значение perm1= 111
perm1= 111
****ALPHA****
Значение t=77
tt= 77
qq= 1.1401952983082614e+105
Mod0.tt; Mod0.qq; Mod0.Mod1.perm1
'77'
1.1401952983082614e+105
'111'
```
### 3.2. Создание многомодульной программы на примере функций из Темы 7
Создала модуль MM1.py в который записала модель системы из темы 7
```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):
return 0
elif xtt >= gran:
return xtt - gran
elif xtt <= (-gran):
return xtt + gran
```
Ввод параметров сохранила в модуль MM2.py
```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.py
```py
import MM2
print("y =", MM2.vyhod)
```
Запуск многомодульной программы
```py
import MM0
k1, T, k2, Xm, A, F, N = 8, 5, 3, 5, 3, 50, 20
y = [0, 0, 0, 0, 0, 0, -0.5901518991576866, 3.452634704774537, 0.3642909010247486, -28.2151620053697, 26.675026712827304, 51.21473287127543, -172.66693667770392, 78.76799406127618, 417.8318242176528, -859.8658159198188, -43.91966881153879, 2710.4996464065, -3753.6472426408995, -2892.354195893288]
```
### 3.3. Области действия объектов в модулях
Обратимся из одной функции к другой в модуле Mod2.py
Вставим в функцию alpha обращение к функции beta и, наоборот, из beta – к alpha.
```py
def alpha():
print("****ALPHA****")
print("Вызов функции beta из функции alpha:", beta(0))
t = input("Значение t = ")
return t
```
Запуск модуля
```py
import Mod2
Mod2.alpha()
****ALPHA****
Вызов функции beta из функции alpha: 1.0
Значение t = 202020
'202020'
```
Для функции beta в модуле Mod2.py
```py
def beta(q):
print("****BETA****")
print("Вызов функции alpha из функции beta:", alpha())
import math
expi = q * math.pi
return math.exp(expi)
```
Запустим модуль
```py
import Mod2
Mod2.beta(4)
****BETA****
****ALPHA****
Значение t = 5
Вызов функции alpha из функции beta: 5
286751.31313665316
```
Отобразим на экране в модуле Mod0 значения объектов t и expi
Модуль Mod1
```py
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 =", t)
print("expi =", expi)
```
```py
import Mod0
Mod1: Введите значение = 1
Mod1: Значение perm1 = 1
perm1 = 1
****ALPHA****
Значение t = 2
tt = 2
****BETA****
qq = 535.4916555247646
Traceback (most recent call last):
File "<pyshell#252>", line 1, in <module>
import Mod0
File "H:\\study\\ПОАС\\Mod0.py"
print("t =", t, " expi =", expi)
NameError: name 't' is not defined. Did you mean: 'tt'?
```
При обращении к переменной t, будет ошибка, так как переменная определена в другом модуле и к ней нельзя обратиться напрямую
аналогично с переменной expi
Попробуем в модуле Mod0 увеличить в 3 раза значение объекта perm1 и отобразить его после
этого на экране.
```py
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.perm1 *= 3
print("perm1 * 3 =", Mod1.perm1)
```
Запустим
```py
import Mod0
Mod1: Введите значение = 1
Mod1: Значение perm1 = 1
perm1 = 1
****ALPHA****
Значение t = 2
tt = 2
****BETA****
qq = 535.4916555247646
perm1 * 3 = 111
```
Попробуем в командной строке (в главном модуле) увеличить в 2 раза значения объектов
perm1, tt, qq.
```py
perm1 *= 2
Traceback (most recent call last):
File "<pyshell#254>", line 1, in <module>
perm1 *= 2
NameError: name 'perm1' is not defined
tt *= 2
Traceback (most recent call last):
File "<pyshell#255>", line 1, in <module>
tt *= 2
```
аналогично
Эти переменные локальные для модулей и обращение к ним из командной строке выводит ошибку.
## 4. Завершила работу со средой