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

374 строки
18 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
Киреев Юрий А-02-23
## 1. Запуск оболочки IDLE
```py
>>> import os,sys,importlib
>>> os.chdir("C:\\Users\\user\\Desktop\\ПОАС\\python-labs\\TEMA8")
>>> os.getcwd()
'C:\\Users\\user\\Desktop\\ПОАС\\python-labs\\TEMA8'
```
## 2. Создание и использование модулей
### 2.1 Запуск модуля на выполнение путем его импорта
С помощью текстового редактора оболочки IDLE создал в своем текущем каталоге файл с именем Mod1.py и записал в него программу со следующим содержанием:
```py
>>> perm1=input('Mod1:Введите значение = ')
>>> print('Mod1:Значение perm1=',perm1)
```
Запустим модуль из командной строки оболочки IDLE:
```py
>>> import Mod1
Mod1:Введите значение = 8
Mod1:Значение perm1= 8
>>> type(Mod1)
<class 'module'>
>>> dir(Mod1)
['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'perm1']
>>> Mod1.perm1 #получили доступ к значению созданного в модуле объекта
'8'
```
Попробуем повторно выполнить модуль с помощью инструкции импорта:
```
>>> import Mod1 #ничего не проиходит
>>> importlib.reload(Mod1) #импорт модуля с помощью функции reload
Mod1:Введите значение = 3
Mod1:Значение perm1= 3
<module 'Mod1' from 'C:\\Users\\user\\Desktop\\ПОАС\\python-labs\\TEMA8\\Mod1.py'>
>>> Mod1.perm1
'3'
```
### 2.2. Проверка модулей в словарях
Импортированные модули заносятся в словарь – значение атрибута sys.modules. Их можно увидеть по инструкции:
```py
>>> print(sorted(sys.modules.keys()))
['Mod1', '__main__', '_abc', '_ast', '_bisect', '_bz2', '_codecs', '_collections', '_collections_abc', '_compat_pickle', '_compression', '_datetime', '_distutils_hack', '_frozen_importlib', '_frozen_importlib_external', '_functools', '_heapq', '_imp', '_io', '_locale', '_lzma', '_opcode', '_operator', '_pickle', '_queue', '_random', '_sha512', '_signal', '_sitebuiltins', '_socket', '_sre', '_stat', '_string', '_struct', '_thread', '_tkinter', '_warnings', '_weakref', '_weakrefset', '_winapi', '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', 'itertools', 'keyword', 'linecache', 'lzma', 'marshal', 'math', 'msvcrt', 'nt', 'ntpath', 'opcode', 'operator', 'os', 'os.path', 'pickle', 'pkgutil', 'platform', 'plistlib', 'posixpath', 'pydoc', 'pyexpat', 'pyexpat.errors', 'pyexpat.model', 'queue', 'random', 're', 'reprlib', 'select', 'selectors', 'shlex', 'shutil', 'signal', 'site', 'socket', 'socketserver', 'sre_compile', 'sre_constants', 'sre_parse', 'stat', 'string', 'struct', 'subprocess', 'sys', 'sysconfig', 'tempfile', 'textwrap', 'threading', 'time', 'tkinter', 'tkinter.constants', 'token', 'tokenize', 'traceback', 'types', 'urllib', 'urllib.parse', 'warnings', 'weakref', 'winreg', 'xml', 'xml.parsers', 'xml.parsers.expat', 'xml.parsers.expat.errors', 'xml.parsers.expat.model', 'zipimport', 'zlib']
```
Для обеспечения возможности повторного импорта и, следовательно, выполнения программы из модуля, его надо удалить из этого словаря:
```py
>>> sys.modules.pop('Mod1')
<module 'Mod1' from 'C:\\Users\\user\\Desktop\\ПОАС\\python-labs\\TEMA8\\Mod1.py'>
```
Еще раз отобразим словарь, убедитесь, что модуль Mod1 из него исчез:
```py
>>> print(sorted(sys.modules.keys()))
['__main__', '_abc', '_ast', '_bisect', '_bz2', '_codecs', '_collections', '_collections_abc', '_compat_pickle', '_compression', '_datetime', '_distutils_hack', '_frozen_importlib', '_frozen_importlib_external', '_functools', '_heapq', '_imp', '_io', '_locale', '_lzma', '_opcode', '_operator', '_pickle', '_queue', '_random', '_sha512', '_signal', '_sitebuiltins', '_socket', '_sre', '_stat', '_string', '_struct', '_thread', '_tkinter', '_warnings', '_weakref', '_weakrefset', '_winapi', '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', 'itertools', 'keyword', 'linecache', 'lzma', 'marshal', 'math', 'msvcrt', 'nt', 'ntpath', 'opcode', 'operator', 'os', 'os.path', 'pickle', 'pkgutil', 'platform', 'plistlib', 'posixpath', 'pydoc', 'pyexpat', 'pyexpat.errors', 'pyexpat.model', 'queue', 'random', 're', 'reprlib', 'select', 'selectors', 'shlex', 'shutil', 'signal', 'site', 'socket', 'socketserver', 'sre_compile', 'sre_constants', 'sre_parse', 'stat', 'string', 'struct', 'subprocess', 'sys', 'sysconfig', 'tempfile', 'textwrap', 'threading', 'time', 'tkinter', 'tkinter.constants', 'token', 'tokenize', 'traceback', 'types', '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:Введите значение = 4
Mod1:Значение perm1= 4
>>> sys.modules.pop('Mod1')
<module 'Mod1' from 'C:\\Users\\user\\Desktop\\ПОАС\\python-labs\\TEMA8\\Mod1.py'>
```
### 2.3. Запуск модуля на выполнение с помощью функции exec()
Пример
```py
exec(open('Mod1.py').read())
Mod1:РведиСРµ Р·РЅР°Сение = 6
Mod1:РРЅР°Сение perm1= 6
```
При использовании import Python по умолчанию считает, что файл имеет кодировку UTF-8, а также учитывает псевдокомментарии. При использовании open() Python считает, что у файла «системная» кодировка, которая в Linux обычно UTF-8, а в Windows — UTF-16. Передадим open() доп. аргумент.
```py
>>> exec(open("Mod1.py", encoding = "utf-8").read())
Mod1:Введите значение = 7
Mod1:Значение perm1= 7
>>> Mod1.perm1
`4`
perm1
'7'
>>> exec(open("Mod1.py", encoding = "utf-8").read())
Mod1:Введите значение = 8
Mod1:Значение perm1= 8
>>> Mod1.perm1
'4'
perm1
'8'
>>> exec(open("Mod1.py", encoding = "utf-8").read())
Mod1:Введите значение = 4674
Mod1:Значение perm1= 4674
>>> Mod1.perm1
'4'
perm1
'4674'
```
### 2.4. Использование инструкции from … import …
В одном модуле может содержаться несколько программных единиц (например, функций или пользовательских объектов). Тогда можно осуществлять импорт модуля не целиком, а только часть содержащихся в нем объектов.
Пример 1.
```py
>>> from Mod1 import perm1
Mod1:Введите значение = 666
Mod1:Значение perm1= 666
>>> dir()
['__annotations__', '__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__', '__warningregistry__', 'importlib', 'os', 'perm1', 'sys'] #модуль Mod1 не появился в памяти
>>> perm1
'666'
```
Пример 2.
С помощью текстового редактора создал еще один модуль Mod2, содержащий две функции.
```py
>>> def alpha():
>>> print('****ALPHA****')
>>> t=input('Значение t=')
>>> return t
>>> def beta(q):
>>> print('****BETA****')
>>> import math
>>> expi=q*math.pi
>>> return math.exp(expi)
```
Импортируем из этого модуля только функцию beta:
```py
>>> from Mod2 import beta
>>> g=beta(2)
****BETA****
>>> g
535.4916555247646
>>> dir()
['Mod1', '__annotations__', '__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__', '__warningregistry__', 'beta', 'g', 'importlib', 'os', 'perm1', 'sys']
>>> alpha() #функция alpha не была импортирована
Traceback (most recent call last):
File "<pyshell#51>", line 1, in <module>
alpha()
NameError: name 'alpha' is not defined
```
Теперь импортируем функцию alpha из Mod2:
```py
>>> from Mod2 import alpha as al
>>> al()
****ALPHA****
Значение t=1
'1'
>>> del al,beta
```
Повторим импорт двух функций одной инструкцией:
```py
>>> from Mod2 import alpha as al, beta as bt
>>> del al, bt
>>> from Mod2 import *
>>> tt=alpha() #На запрос введите значение 0.12
****ALPHA****
Значение t=0.12
>>> uu=beta(float(tt))
****BETA****
>>> uu
1.4578913609506803
```
## 3. Создание многомодульных программ.
### 3.1. Пример простой многомодульной программы.
С помощью редактора создадим ещё один модуль:
```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)
```
Теперь наша программа будет состоять из 5 частей: главная программа, которой является команд-ная строка IDLE и из которой будет вызываться модуль Mod0, и 3 модуля, вызываемых из модуля Mod0. Проверим нашу программу:
```py
>>> sys.modules.pop("Mod1")
<module 'Mod1' from 'C:\\Users\\user\\Desktop\\ПОАС\\python-labs\\TEMA8\\Mod1.py'>
>>> sys.modules.pop("Mod2")
<module 'Mod2' from 'C:\\Users\\user\\Desktop\\ПОАС\\python-labs\\TEMA8\\Mod2.py'>
>>> import Mod0
Mod1:Введите значение = 55
Mod1:Значение perm1= 55
perm1= 55
****ALPHA****
Значение t=52
tt= 52
****BETA****
qq= 8.862788791286627e+70
>>> Mod0.tt;Mod0.qq;Mod0.Mod1.perm1
'52'
8.862788791286627e+70
'55'
```
### 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)
```
Наконец, создадим главную программу – модуль ММ0, запускающую на выполнение модуль ММ2 и выводящую полученный выходной сигнал:
```py
import MM2
print('y=',MM2.vyhod)
```
Пример работы этой программы:
```py
>>> import MM0
k1,T,k2,Xm,A,F,N=10,5,2,2,2,40,20
>>> y= [0, 0, 0, 0, 0, 0.9866886115016662, -1.9732935348876697, -3.091965522675575, 13.830506004312246, 0.4743498602389664, -45.654123345832254, 28.379844851189542, 111.82759196582377, -175.83865168130015, -187.57768045826674, 661.5418706401588, 23.17293107123487, -1938.4588367997728, 1453.5699160588447, 4465.240774231551]
```
### 3.3. Области действия объектов в модулях.
Попробуем вставить в функции alpha обращение к функции beta и, наоборот, из beta – к alpha.
```py
>>> def alpha():
>>> print("****ALPHA****")
>>> print("Вызов функции beta:", beta(5))
>>> t = input("Значение t = ")
>>> return t
>>> import Mod2
>>> Mod2.alpha()
****ALPHA****
****BETA****
Вызов функции beta: 6635623.99934113
Значение t = 6
'6'
```
Теперь из beta - к alpha:
```py
>>> def beta(q):
>>> print('****BETA****')
>>> import math
>>> expi=q*math.pi
>>> print('обращение к alpha:', alpha())
>>> return math.exp(expi)
>>> importlib.reload(Mod2)
<module 'Mod2' from 'C:\\Users\\user\\Desktop\\ПОАС\\python-labs\\TEMA8\\Mod2.py'>
>>> Mod2.beta(52)
****BETA****
****ALPHA****
Значение t = 16
обращение к alpha: 16
8.862788791286627e+70
```
Попробуем отобразить на экране в модуле Mod0 значения объектов t и expi:
```py
#Модуль Mod0
>>> import Mod1
>>> print('perm1=',Mod1.perm1)
>>> from Mod2 import alpha as al
>>> tt=al()
>>> print
>>> print('tt=',tt)
>>> from Mod2 import beta
>>> qq=beta(float(tt))
>>> print('qq=',qq)
>>> print("t =", t)
>>> print("expi =", expi)
>>> import Mod0
Mod1:Введите значение = 16
Mod1:Значение perm1= 16
perm1= 16
****ALPHA****
Значение t = 52
tt= 52
****BETA****
qq= 8.862788791286627e+70
Traceback (most recent call last):
File "<pyshell#31>", line 1, in <module>
import Mod0
File "C:\Users\user\Desktop\ПОАС\python-labs\TEMA8\Mod0.py", line 11, in <module>
print("t =", t)
NameError: name 't' is not defined. Did you mean: 'tt'?
```
Т.к. переменные определены в другом модуле, доступа напрямую к ним нет.
Попробуем в модуле Mod0 увеличить в 3 раза значение объекта perm1 и отобразить его после этого на экране.
```py
#Модуль Mod0
>>> import Mod1
>>> print('perm1=',Mod1.perm1)
>>> Mod1.perm1 = str(int(Mod1.perm1) * 3) #изменение переменной Mod1.perm1
>>> print ('обновленная переменная:', Mod1.perm1)
>>> from Mod2 import alpha as al
>>> tt=al()
>>> print('tt=',tt)
>>> from Mod2 import beta
>>> qq=beta(float(tt))
>>> print('qq=',qq)
>>> import Mod0
Mod1:Введите значение = 10
Mod1:Значение perm1= 10
perm1= 10
обновленная переменная: 30
****ALPHA****
Значение t = 52
tt= 52
****BETA****
qq= 8.862788791286627e+70
```
Попробуем в командной строке (в главном модуле) увеличить в 2 раза значения объектов perm1, tt, qq.
```py
>>> import Mod0
Mod1:Введите значение = 10
Mod1:Значение perm1= 10
perm1= 10
****ALPHA****
Значение t = 5
tt= 5
****BETA****
qq= 6635623.99934113
>>> import Mod1
>>> Mod1.perm1 = str(int(Mod1.perm1) * 2) #увеличили Mod1.perm1 в 2 раза
>>> print(Mod1.perm1)
20
>>> Mod0.tt = float(Mod0.tt) * 2
>>> print(Mod0.tt)
10.0
>>> Mod0.qq = Mod0.qq * 2
>>> print(Mod0.qq)
13271247.99868226
```
Если обращаться к переменным напрямую, без указания модуля, в котором они определены - будет ошибка.
## 4. Закончил сеанс работы с IDLE