# Отчёт по теме 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) >>> 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 >>> 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') ``` Еще раз отобразим словарь, убедитесь, что модуль 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') ``` ### 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 "", line 1, in 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") >>> sys.modules.pop("Mod2") >>> 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): 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) >>> 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 "", line 1, in import Mod0 File "C:\Users\user\Desktop\ПОАС\python-labs\TEMA8\Mod0.py", line 11, in 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